feat(memory): 记忆召回加 Relevance —— Generative Agents 打分补齐第三项 (P1)
审计三真桩之一。记忆召回此前打分只有 Recency+Importance,缺 Relevance(对当前 任务的语义相关性)——注释写"待接 Milvus",但召回时甚至不知道当前问什么。 关键发现:dispatcher 注入点 fetchMemory(ctx,uid,_) 手上已有当前任务文本(b.query), 只是被 `_` 丢弃了。所以不是"接 Milvus"那么重,把 query 一路传下去 + 缓存嵌入即可。 设计(偏离注释的"接 Milvus"——用户偏好量小,不值当上向量库): - Profile 加 embedding 列(float32 小端打包存 bytea);Upsert 时对 value 向量化缓存 (value 没变不重算,失败留空不阻断)。 - memory 包定义 Embedder 小接口,gateway 注入 rag.Engine(复用同一控制面下发的 embedding 模型),不硬依赖 rag 内部;rag.Engine 加导出 Embed 方法。 - memory_get 工具加可选 query 入参;fetchMemory 停止丢弃 b.query 传下去。 - Get(ctx,uid,query):query 非空且 embedder 就绪 → embed(query) 对每条缓存向量 内存算余弦 → 三项打分 0.25R+0.35I+0.4Rel;否则回落两项(升级前行为)。 - 优雅降级贯穿:无 query/无 embedder/query 嵌入失败/行无向量 → 静默回落,绝不报错。 零 Milvus 依赖、零向量库同步问题、保住"没 embedding 也能跑"。 验证:单测(编解码往返/cosine 截0/三项模式相关性翻转顺序/降级返 nil)+ 端到端 (真 PG:写入即向量化、query=咖啡把低重要度的咖啡记忆翻到运动前面)。migration 加列已 live;embedding 复用 RAG 已验证基建。三模块 build/vet/test 全绿。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -446,8 +446,9 @@ func evalLevel(r harness.Result) string {
|
||||
}
|
||||
|
||||
// fetchMemory 经 MCP memory_get 工具召回用户常驻画像。
|
||||
// query = 当前任务/问题文本:传给 memory_get 按语义相关性(Relevance)优先召回;空则退回最近性+重要度。
|
||||
// 工具不可用/超时/无 user_id 时返回空串,降级为无记忆推理(不阻断主流程)。
|
||||
func (o *Orchestrator) fetchMemory(ctx context.Context, userID, _ string) string {
|
||||
func (o *Orchestrator) fetchMemory(ctx context.Context, userID, query string) string {
|
||||
if o.tools == nil || userID == "" {
|
||||
return ""
|
||||
}
|
||||
@@ -455,7 +456,7 @@ func (o *Orchestrator) fetchMemory(ctx context.Context, userID, _ string) string
|
||||
defer cancel()
|
||||
res, err := o.tools.CallTool(cctx, contract.ToolSubjectGo("memory_get"), &contract.ToolCall{
|
||||
Tool: "memory_get",
|
||||
Args: map[string]any{"user_id": userID},
|
||||
Args: map[string]any{"user_id": userID, "query": query},
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("[eino] memory_get unavailable for %s, degrade: %v", userID, err)
|
||||
|
||||
Reference in New Issue
Block a user