检索做得好,Agent就是能记住细节、连贯对话、精准响应的“智能助手”;检索做不好,就是只会瞎编、逻辑混乱的“人工智障”。
很多人踩的第一个坑,就是用「纯向量相似度检索」当万能药:把问题Embedding一下,去向量库找最近邻,直接塞给大模型。
但现实是:
- 语义相似≠用户关心:用户问“最近的项目进度”,你把半年前的旧方案全召回了;
- 时间越久越容易乱:Agent的记忆库越滚越大,旧记忆会干扰新对话;
- 重要信息被淹没:“用户是VIP”这种核心信息,可能因为语义不直接相关,永远不会被召回。
那怎么破?
今天就把这套可落地、可调参、工程化的方案,全部分解给你,看完就能直接用在你的Agent项目里。
本文参考斯坦福《Generative Agents》论文里给出的一个优雅到极致的三维评分模型。 arxiv.org/pdf/2304.03…
一、核心原理:三维评分模型,让Agent像人一样“记东西”
人类的记忆,从来不是只靠“相关性”:
- 昨天发生的事,比一年前的更容易想起(时近性);
- 和当前话题相关的事,会优先被唤醒(相关性);
- 刻骨铭心的大事,哪怕隔了很久,也会随时想起(重要性)。
Agent的记忆检索,本质就是模拟人类的记忆机制。三维评分模型,就是把这三个维度量化,加权得到最终的召回优先级。
三维评分模型总览
最终的召回得分公式,简单到一眼就能懂:
:三个权重,完全按业务场景调参,没有固定值;
- 三个维度分别量化记忆的「时间新鲜度」「语义相关性」「内容重要性」,最终得分越高,越优先被召回。
下面我们把每个维度拆开,讲透原理、实现方式、工程细节。
维度1:Recency(时间新鲜度)——越近的记忆,越重要
核心逻辑:人类的记忆有“近因效应”,Agent也一样。用户10分钟前说的话,比1个月前的需求重要100倍。
实现方式:用指数衰减函数,让时间越久的记忆,分数呈指数级下降。
公式:
:记忆创建时间到当前时间的时间差(单位:小时/天,按业务场景定);
:衰减系数,控制记忆的“遗忘速度”。
越大,遗忘越快,越重视近期记忆;
越小,记忆留存越久。
举个例子:
假设,时间差以天为单位:
- 刚创建的记忆():,满分;
- 1天前的记忆:;
- 7天前的记忆:;
- 30天前的记忆:,几乎被遗忘。
工程落地:
import math
from datetime import datetime
def calculate_recency(create_time: datetime, current_time: datetime, lambda_decay: float = 0.1) -> float:
"""
计算记忆的时间新鲜度分数
:param create_time: 记忆创建时间
:param current_time: 当前时间
:param lambda_decay: 衰减系数,默认0.1(天为单位)
:return: 0-1之间的分数
"""
delta_t = (current_time - create_time).total_seconds() / 3600 / 24 # 转换为天
return math.exp(-lambda_decay * delta_t)
调参技巧:
- 客服/对话场景:
调大(0.1-0.2),优先召回用户最近的对话;
- 知识库/问答场景:
调小(0.01-0.05),让旧知识也能被召回;
- 个人助理场景:
取中间值(0.05-0.1),兼顾近期和历史记忆。
维度2:Relevance(语义相关性)——和当前任务越相关,越优先
核心逻辑:这是向量检索的传统强项,保证召回的记忆,和用户当前的问题/任务语义匹配。
实现方式:用Embedding模型,把「用户当前Query」和「记忆条目」都映射到同一个向量空间,用余弦相似度衡量相关程度。
公式:
:用户当前Query的Embedding向量;
:记忆条目的Embedding向量;
- 余弦相似度范围:-1到1,越接近1,相关性越高。
优化技巧:
- 模型选型:中文场景优先用BGE系列、ERNIE系列,效果远好于通用模型;
- 向量库优化:用Milvus、FAISS等向量数据库,支持百万级记忆的毫秒级检索;
- 预过滤:在向量检索前,用用户ID、记忆类型、时间范围等元数据,筛掉90%的无效记忆,大幅提升检索效率。
维度3:Importance(重要性)——核心记忆,永远不被淹没
核心逻辑:有些记忆,哪怕时间很久、语义不直接相关,也必须被记住。比如:
- 用户的核心身份:“用户是VIP客户,需求优先级最高”;
- 项目的核心约束:“项目交付时间不能晚于2026年6月”;
- 系统的核心规则:“禁止向用户透露内部数据”。
如果只靠相关性,这些信息可能永远不会被召回,导致Agent犯低级错误。
实现方式:在记忆写入时,由LLM对记忆进行1-10分的重要性打分,也可以根据记忆被引用的频率动态调整。
工程落地:
from openai import OpenAI
client = OpenAI(api_key="your_api_key", base_url="your_base_url")
def calculate_importance(memory_content: str) -> float:
"""
用LLM给记忆打重要性分数(1-10分,归一化到0-1)
:param memory_content: 记忆条目内容
:return: 0-1之间的重要性分数
"""
prompt = f"""
你是一个记忆重要性评分专家,请给下面这条记忆打1-10分的重要性分数:
评分规则:
1分:无关紧要的闲聊、临时信息,遗忘不影响任何任务;
5分:普通的对话内容、一般信息,遗忘会影响上下文连贯性;
10分:核心规则、关键身份、项目约束、高优先级需求,遗忘会导致严重错误。
记忆内容:{memory_content}
请只返回一个1-10的数字,不要任何其他内容。
"""
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0
)
score = int(response.choices[0].message.content.strip())
# 归一化到0-1区间
return score / 10
动态优化技巧:
- 记忆被引用一次,重要性+0.5分(上限10分),让高频使用的记忆更难被遗忘;
- 重要性≥8分的记忆,设置永久留存,不参与时间衰减;
- 定期用LLM对记忆库做“重要性重评”,清理低价值记忆,优化存储。
二、权重调参:不同业务场景,怎么配α、β、γ?
三个权重的配比,直接决定了Agent的记忆风格。没有万能公式,只有最适合业务的调参。下面给你几个高频场景的参考配置:
| 业务场景 | 核心诉求 | α(时近性) | β(相关性) | γ(重要性) | 调参逻辑 |
|---|---|---|---|---|---|
| 在线客服 | 优先响应用户最新诉求,记住核心客户信息 | 0.4 | 0.3 | 0.3 | 高α保证上下文连贯,高γ不遗漏VIP信息 |
| 个人AI助理 | 兼顾近期日程和长期规划,记住核心偏好 | 0.3 | 0.4 | 0.3 | 高β保证任务匹配,平衡时间和重要性 |
| 企业知识库Agent | 精准召回知识,不受时间影响 | 0.1 | 0.7 | 0.2 | 高β保证知识匹配,低α弱化时间影响 |
| 智能陪伴Agent | 连贯对话,记住用户的喜好和经历 | 0.3 | 0.3 | 0.4 | 高γ记住核心偏好,提升陪伴感 |
| 代码助手Agent | 匹配当前代码上下文,记住项目规范 | 0.2 | 0.6 | 0.2 | 高β匹配代码语义,高γ记住项目规则 |
调参方法论:
- 先定核心:明确业务的第一优先级(是上下文连贯?还是知识精准?),给对应维度最高权重;
- A/B测试:用不同权重跑真实对话,统计召回准确率、用户满意度,迭代最优值;
- 动态调参:根据对话轮次、任务类型,实时调整权重(比如对话初期α高,任务执行期β高)。
三、工程化升级:从“能用”到“好用”的进阶策略
三维模型是基础,想要在生产环境稳定运行,还需要叠加这些成熟的优化策略,直接把Agent的记忆能力拉满。
3.1 元数据预过滤:先筛掉90%的无效记忆
在做向量检索、三维评分之前,先通过结构化元数据过滤,大幅缩小搜索空间:
- 用户维度:按用户ID过滤,只召回该用户的记忆;
- 时间维度:只召回近30天/90天的记忆,避免旧记忆干扰;
- 类型维度:按记忆类型(对话/知识/规则/项目)过滤,只召回对应类型;
- 标签维度:按自定义标签(VIP/高优先级/项目A)过滤,精准召回。
3.2 二阶段检索:粗召回+精排,兼顾效率和精度
这是RAG领域的成熟方案,直接搬到记忆检索上,效果拉满:
- 第一阶段(粗召回) :用向量相似度,从百万级记忆库中快速召回Top-50候选;
- 第二阶段(精排) :用Cross-Encoder交叉编码器,对50条候选做精细排序,最终取Top-5注入上下文。
核心优势:
- 粗召回保证效率,精排保证精度;
- Cross-Encoder能捕捉Query和记忆的深层语义关联,比纯向量相似度精准太多;
- 工程落地简单,直接用Hugging Face的预训练模型。
3.3 记忆分层:短期记忆+长期记忆,模拟人类记忆结构
人类的记忆分为短期记忆(工作记忆)和长期记忆,Agent也一样:
- 短期记忆:存储近几轮对话,直接注入上下文,保证对话连贯;
- 长期记忆:存储历史对话、核心知识、重要规则,用三维模型检索,按需召回;
- 记忆迁移:定期把短期记忆压缩、总结,写入长期记忆,避免短期记忆爆炸。
如果这篇文章对你有帮助,别忘了点赞、收藏、转发,你的支持是我持续输出干货的动力!