Agent长期记忆Embedding检索策略
检索策略兼顾时效性、相关性排序与噪声过滤
原题:在Agent系统中引入长期记忆机制时,如何设计记忆内容的Embedding表示与检索策略?请说明关键考量因素,如时效性、相关性排序和噪声过滤。
Agent · 高德真题
回答与解析
一、Embedding表示设计
多维度信息编码
- 语义内容:用预训练模型编码对话文本,捕捉主题意图
- 时间戳:绝对时间 + 相对时间(如"3天前")联合编码
- 重要性分数:基于LLM自动标注或用户显式反馈(收藏/编辑)
- 实体关联:提取关键实体(人/地点/任务)作为稀疏索引
技术实现
# 伪代码示意
memory_vector = concat([
text_embedding, # 768-dim
time_embedding(t), # 64-dim, 正弦编码或学习得到
importance_scalar, # 扩展为向量或作为后续加权
entity_sparse_vec # 用于快速过滤
])
二、检索策略:混合排序
三阶段检索
- 粗排:实体标签/关键词倒排索引快速过滤
- 精排:向量相似度(余弦/IP)+ 时间衰减函数
score *= exp(-λ·Δt) - 重排:访问频率加权 + 多样性去重(MMR算法避免冗余)
时效性建模
- 近期记忆:高权重,原始文本保留
- 中期记忆:中等权重,自动摘要压缩
- 远期记忆:低权重,仅保留关键事件节点
三、噪声过滤机制
| 问题 | 解法 |
|---|---|
| 闲聊噪声 | 用轻量分类器判断信息密度,过滤"好的/谢谢"等低价值内容 |
| 重复记录 | 语义去重:新记忆与现有记忆相似度>阈值则合并或更新 |
| 记忆膨胀 | 定期触发记忆反思:LLM总结提炼为更高层级的"洞察记忆" |
| 置信度低 | 检索时设置相似度阈值,低于阈值则触发"我不确定,需要确认" |
四、关键取舍
- 存储成本 vs 检索精度:原始对话存日志,记忆库只存摘要+关键片段
- 实时性 vs 准确性:高频交互走缓存(工作记忆),深度检索再走向量库
- 个性化 vs 泛化:用户专属记忆单独分区,通用知识走基座模型
学习建议
建议系统学习该知识点
口语版讲法(约4分钟)
- 一句话定位:长期记忆的本质是解决Agent的持续学习与上下文窗口限制
- Embedding设计:语义+时间+重要性+实体的多维度编码
- 检索策略:混合排序,粗排+精排+重排,时效性衰减
- 噪声过滤:闲聊过滤、去重、记忆反思、置信度阈值
- 落地取舍与风险:存储成本、实时性、个性化,以及常见失败场景
这道题其实问的是,当Agent需要记住很久以前的对话或事件时,怎么让它在海量记忆里快速找到最相关的那一条,同时不让垃圾信息污染结果。核心就两个东西:怎么把记忆存成机器好检索的形式,以及怎么从里面捞出最需要的信息。
先说Embedding表示。我肯定不会只用一句话的语义向量,那样太糙了。我会把记忆编码成一个多维度的混合向量。具体来说,语义部分用预训练模型把文本转成稠密向量,这没啥说的。但我会额外加三个维度:时间戳、重要性分数和实体关联。时间戳我不仅存绝对时间,还存相对时间,比如“3天前”,这样检索时就能做时效性衰减。重要性分数可以用LLM自动打,或者用户显式反馈,比如收藏、编辑,这个分数会作为后续排序的加权。实体关联就是抽取出人名、地名、任务ID这些,做成稀疏索引,方便快速过滤。最终把这些拼成一个向量存到Vector Database里。
检索策略上,我倾向用混合排序。先走粗排,用实体标签或关键词的倒排索引快速筛出候选集,这一步很快。然后精排,算向量相似度,但这里要加一个时间衰减函数,近期的记忆权重高,远期的低。最后重排,用访问频率加权,再跑一下MMR算法去重,避免返回一堆意思差不多的结果。你可以这么理解:粗排是拉网,精排是挑鱼,重排是让鱼不打架。
噪声过滤是落地时最容易被忽视的坑。比如用户说了句“好的谢谢”,这种低价值信息存进去就是噪声。我会在前端加一个轻量分类器,判断信息密度,低于阈值直接丢弃。重复记录也得去重,如果新记忆和已有的相似度超过某个值,就合并或者更新,而不是新增。还有一个关键点是记忆膨胀,长期运行下来记忆库会越来越大。我会上线一个定期任务,用LLM做记忆反思,把一堆琐碎记忆总结成一条高层级的洞察,比如“用户偏好用优惠券”这样的抽象知识。检索时设置相似度阈值,低于阈值就触发“我不确定,需要确认”,而不是硬给答案。
这里有个坑:存储成本和检索精度之间的平衡。原始对话日志我会存到廉价的存储里,记忆库只存摘要和关键片段。高频交互走缓存,也就是工作记忆,深度检索才走向量库。另外,个性化记忆和通用知识要分开,用户专属记忆单独分区,通用知识走基座模型。
说到时效性,其实有个更细的问题:有些记忆虽然时间久但重要性极高,比如用户的生日,这时候时间衰减反而会把它压下去。所以我会把重要性分数和时间衰减做联合调整,甚至允许用户手动固定某些长期记忆。
所以整体上,我更倾向于把长期记忆看成是一个分层缓存系统,而不是一个无差别的大池子。落地时我会特别关注一点:如果记忆库质量本身很差,再好的检索算法也救不回来。所以上线前会先跑一轮数据清洗,并且持续监控召回率,低于阈值就触发告警。
关键一句:时效性衰减与重要性分数的联合调整,以及用户手动固定长期记忆的必要性
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做一款客服助手Agent,用户连续几天咨询同一个订单状态变更,Agent得记住之前的沟通。你怎么设计记忆的存储和检索,才能让Agent在对话中快速想起相关细节,同时又不会把闲聊的“谢谢”也当成重要记忆?
- 问法 2 · 层层追问
Agent系统里你一般怎么处理长期记忆?……那记忆多了怎么高效检索?……如果用户几天前提过一个需求,现在又问类似问题,怎么在排序时把时间因素考虑进去?……还有怎么避免检索出一堆没用的重复信息?
- 问法 3 · 直球架构
设计Agent的长期记忆模块,重点讲Embedding表示和检索策略。要考虑时效性、相关性排序和噪声过滤。你从编码方式、索引结构到排序和去重,把方案串一遍。