精选·上下文与记忆

记忆召回怎么做?向量相似度、时间衰减和重要性怎么组合?

91学AI·2026/7/13·10 阅读

考察点

这道题是记忆系统设计题的召回侧深挖,Generative Agents(斯坦福小镇论文)带火之后成了标准问法。面试官想看你知道单一向量相似度不够——用户三个月前随口提过的事可能语义相关但早该忘掉,以及你能给出具体的打分公式和工程参数,而不是只说"综合排序"。

参考答案

为什么单一向量相似度不够

纯向量检索有三个盲区。第一,时效盲区:用户去年说"我在学 Java",今年已经是资深开发,这条记忆语义上和"技术栈"高度相关,但已过时。第二,重要性盲区:用户的生日、过敏史这类事实出现频率低、语义上和多数问题不直接相关,纯相似度排不上来,但真到用时缺一不可。第三,频率盲区:最近频繁交互的话题应该优先,向量距离体现不出访问频次。

所以主流方案是多信号加权,Generative Agents 论文里的经典形式是:

score = α · similarity + β · recency + γ · importance

三个系数按业务调,对话型 Agent 一般相关性权重最高,α 取 0.5-0.6,β 和 γ 各 0.2 左右起步再调。

三个信号各自的实现

相似度:记忆文本 embedding(用和 RAG 同一套 embedding 模型即可,别为记忆单独训)存向量库,查询时用当前用户消息或当前任务的描述做 query,cosine 相似度。注意 query 构造很关键——直接拿用户整句话查往往噪声大,可以先用 LLM 把当前意图改写成一个短查询再检索。

时间衰减:对 recency 做指数衰减,recency = exp(-Δt / τ),Δt 是距上次被访问的时间,τ 是衰减常数。τ 取多少看业务:客服场景几天,个人助理场景几周。注意用"上次访问时间"而不是"创建时间"——一条记忆每次被召回都刷新它的时间戳,重要的老记忆因此能活得久,这是 Generative Agents 里一个很妙的设计。

重要性:写入时由 LLM 打 1-10 分存下(写入策略那道题的内容),召回时归一化到 0-1 参与加权。生日、明确说"一定要记住"的事打 9 分以上,日常闲聊提炼打 3 分以下。

召回的工程细节

打分之外还有几层。元数据过滤先行:user_id、记忆类型、是否过期,在向量检索前就过滤掉,既保安全又提速。top-k 控制:一般取 5-10 条,再折算成 token 预算(比如记忆总共不超过 1500 token),条数服从预算。重排序:候选多时用 cross-encoder 或 LLM 重排一遍,向量粗排精度有限。注入格式:召回的记忆别原样堆进 prompt,组织成"关于用户已知信息"的结构化小节,每条带时间,模型才知道哪条新哪条旧。

效果评估

离线:构造"需要某条记忆才能答对"的测试集,看召回命中率和最终回答准确率。在线:记录每轮召回了哪些记忆、回答是否真的用到了(回答里是否引用了记忆内容),长期没人用的记忆就是清理对象。

可能的追问

  • 三个权重怎么调?——先用直觉值上线,离线测试集上跑网格搜索;不同记忆类型可以分池子用不同权重,画像类吃重要性,情景类吃相关性。
  • 召回想不起来该记的事(漏召)怎么办?——放宽 top-k 加 LLM 重排兜底;给模型一个 search_memory 工具让它主动翻记忆库,把被动召回补成主动查询。
  • 和 RAG 检索能共用一套管道吗?——排序框架可以复用,但记忆多了时间和重要性两个维度,且数据量级小得多(千级 vs 百万级),索引参数和过滤逻辑要分开调。

评论 (0)

暂无评论,快来抢沙发吧!

91学AI

© 2026 91学AI · 按岗位学 AI 与大数据. All rights reserved.