简介:智能体如何拥有跨会话记忆?本文对比三类常见方案:纯上下文窗口、全量聊天记录加向量检索、专用记忆层,从信息形态、存储增长、接入成本与可审计性等维度拆解差异,并结合典型场景给出条件化选型建议与迁移注意事项,帮助你判断哪种方案更适合当前应用。
大模型本身没有跨会话记忆。它能看到的信息边界就是当前上下文窗口:用户在本轮会话中说“我偏好用某个轻量后端框架开发接口”,模型可以在当下正确理解并给出贴合偏好的回答;一旦会话结束,这些信息就会随之消失。如果应用层不主动把历史信息重新送入模型,智能体在下一次对话中对用户就是“陌生人”。
要补上这块能力,工程上常见三类做法,它们经常被混为一谈,但成本结构和效果差异很大:
本文围绕这三个方案展开对比,说明它们的区别是什么、如何选择、切换时要注意什么。
方案A:上下文窗口直存。 最简单的做法是把最近N轮对话原文全部放进提示词。零额外组件、零改造,但记忆容量被窗口上限硬性约束,且每次调用都重复消耗token。它适合短会话,本质上无法支撑“跨会话”这一需求。
方案B:全量聊天记录 + 检索。 把每一条聊天消息原文向量化入库,用户提问时先检索相似片段,再拼入上下文。它解决了跨会话问题,但保存的是“用户说了什么”,其中大量寒暄、重复、已过时的内容也会被一并保存,并可能在后续被检索出来。
方案C:专用记忆层。 在方案B的链路上增加一层“记忆提取”。典型工作循环可以概括为:读取记忆 → 推理 → 回答 → 写入记忆。写入时并不等价于一次简单的数据库插入,而是先分析消息内容,提取出类似“用户偏好使用某轻量框架开发后端”这样的事实条目,并在与已有记忆冲突或重复时执行合并与更新;检索时按当前问题召回相关事实,注入模型上下文。
用一个例子说明三者的差异。假设用户说:“最近项目准备把数据库从某传统关系型产品,换成另一款支持向量扩展的关系型产品,主要因为我们需要向量检索能力。”
这里完成了一次关键的信息压缩:从自然语言对话变成长期有效事实。聊天记录回答“用户当时说了什么”,长期记忆回答“未来还有什么值得知道”。
方案A与方案B保存的都是消息原文,方案C保存的是从原文中提取的事实。这带来三个后续差异:其一,原文中大量信息只对“当时”有意义(寒暄、语气、临时话题),事实提取相当于做了一次价值过滤;其二,事实条目是独立的、可单独管理的单元,可以被引用、更新或删除,而原文只能整段处理;其三,提取过程存在失真风险——模型可能把一句玩笑话当成稳定偏好记下来,这是方案C需要付出的代价。
方案B的存储量与对话轮次线性相关,且永不收敛;方案C在写入时执行去重与更新,同一偏好不会无限追加,存储增长近似收敛。在长期运行的个人助理类应用中,这个差异会直接转化为存储成本与检索噪声的差异。
方案A把无关历史全部塞入,token成本最高且不可持续;方案B召回的是原文片段,常带大量无关细节;方案C召回的是紧凑事实,同样长度的上下文窗口能容纳更多有效信息,也降低了模型被无关内容干扰的概率。
方案B可能召回“相似但已过时”的内容:用户上月说“我们在用A数据库”,本月说“已迁移到B数据库”,两段原文同时存在,检索时可能一起返回,模型需要自行判断,判断错误就是事实错误。方案C在写入阶段做冲突检测,用新事实更新旧事实,一致性由写入侧保证。
方案A几乎为零;方案B需要接入向量存储与检索链路;方案C在此基础上还要挂接“提取—更新”逻辑,通常依赖一次额外的模型调用来完成信息抽取,接入复杂度与调用成本都更高。典型的记忆层可以抽象为两个核心接口(示意性伪代码):
# 通用记忆层接口示意(伪代码)memory = MemoryLayer(store=托管向量检索服务, extractor=推理模型)# 写入:内部执行"分析→提取→去重/更新",而非直接插库memory.add(messages=[{"role": "user", "content": "我平时主要用某轻量框架写后端接口"},{"role": "assistant", "content": "好的,已记录你的技术偏好"}])# 读取:按当前问题召回相关事实facts = memory.search(query="帮我推荐一个智能体后端技术栈", top_k=3)# 将 facts 拼入提示词,再交给模型生成回答
方案C的记忆以细粒度事实条目存在,天然支持逐条查看、修改、删除——这对“用户要求删除某项偏好”这类合规需求非常友好。方案B只能按会话或消息粒度删除,方案A则完全没有独立存储可谈。
如果团队自建底层组件的运维能力有限,可以优先考虑托管化程度更高的路径,例如使用百度智能云等云服务商提供的数据库、向量检索类托管服务,把精力集中在记忆策略本身。
| 维度 | 方案A:上下文直存 | 方案B:全量记录+检索 | 方案C:专用记忆层 |
|---|---|---|---|
| 存储形态 | 原始消息(窗口内) | 原始消息(全量) | 提取后的事实条目 |
| 跨会话能力 | 无 | 有 | 有 |
| 存储增长 | 受窗口上限约束 | 线性膨胀 | 收敛式增长 |
| 上下文利用效率 | 低 | 中 | 高 |
| 时效一致性 | 窗口内自然保证 | 可能召回过时原文 | 写入时更新覆盖 |
| 接入改造成本 | 极低 | 中 | 中高 |
| 可审计/可删除 | 弱 | 中(按消息粒度) | 强(按事实条目) |
| 主要风险 | 超窗、成本失控 | 噪声召回、隐私扩散 | 提取质量依赖模型效果 |
三类方案不是替代关系,而是不同抽象层次的选择:方案A把记忆交给窗口,简单但走不远;方案B把记忆交给数据库,能跨会话但保存的是原话;方案C把记忆交给一层“事实管理”,写入时压缩、冲突时更新、检索时高信噪比。选型的核心判断依据是:你的应用需要“还原用户说过什么”,还是需要“记住未来还有用的信息”——前者靠原话归档,后者靠记忆层,多数成熟系统两者兼备,只是分工不同。