构建生产级 Agent Memory 的系统¶
面试官问你 Agent 的记忆机制应该怎么设计,如果你脱口而出说"我会用向量数据库存历史对话,用户每次提问就用检索去库里捞相关内容,然后拼到 prompt 给大模型",恭喜你,你和 90% 的候选人一样,不仅拿不到高分,还会被打上缺乏真实工程经验、只会照搬开源 demo 的标签。
今天我们就来彻底扒一扒,到底怎么去构建一个生产级的 Agent Memory 架构。
纯向量检索的致命缺陷¶
首先我们一起看清楚,刚才提到的纯靠向量数据库来做记忆到底有哪些致命的缺陷,到底卡在了业务的哪一步?
现在大家做 Memory 第一反应往往就是直接上向量数据库,但是这里其实有一个很反直觉的事情:既然现在向量检索这么火,那为什么 OpenAI 他们自己做底层架构的时候,却放着这个"万能工具"不用呢?
不管是 AI 还是传统的软件,本质上都是去选对的工具,而不是为了证明我会用多么炫酷的技术。如果把向量数据库当成是 Agent 的唯一的记忆中枢,它在真实业务里是有两个致命缺陷的:
一个是模糊匹配和精确调用的冲突,另一个就是处理时间状态时的系统性困境。
我们拿个具体的业务场景来拆解一下:
假设你现在正在做一个旅行规划助手 Agent,用户跟你聊了半个月,从"我想出去度假"开始,比对了三亚、大理、丽江三个目的地,讨论了机票酒店,还纠结要不要带孩子一起去。这时候业务走到下一步,系统其实只需要确认一个关键信息:这个用户的最终预算到底是多少。
如果你用普通的向量检索,它会根据"预算"这些关键词,从历史记录里扒出一大堆的长篇大论,然后大模型还得再把这些废话读一遍,去猜到底是多少钱。这在业务线上不仅啰嗦,而且很容易出错。
但是在标准的业务开发里,事情不应该是这样。我们更需要的是精确调用——系统里面就应该有个字段,干脆叫做 trip_budget,用户的预算需要的时候直接去查,一键命中,没有一点歧义。对于要上线的生产级应用来说,这种百分之百的确定性才是最重要的。
如果说刚才我们讲的是个效率问题,那接下来要说的第二个缺陷就是个真正要命的逻辑漏洞了,也就是时间盲区的问题。
还是旅行规划这个例子:假设用户上周跟你说"我的假期预算最多 1 万",但是这周他升职加薪了,跑过来跟你说,"我的预算加到 1 万 5 了"。如果你靠纯向量检索,他处理信息的方式就好比你准备了一个大纸箱子,用户上周跟你说 1 万,系统记在一张纸上扔进去;这周变成 1 万 5 了,系统又写了一张新的纸条扔进去,让 Agent 需要确认预算的时候手一伸进去抓取——好家伙,两张纸条一起被摸出来了,这时候大模型就彻底懵了,他根本分不清这两句话的时间先后逻辑,到底应该听谁的?
正确的做法应该是什么样呢?其实很简单:既然是预算,那它就是一个动态的状态,我们需要的是状态复写——新数据进来了就直接把旧的给覆盖掉,整个系统里面永远只保留当前最新的唯一的那个真相。在工程上我们管这个叫做 single source of truth(单一事实来源)。
所以你看,如果不去解决这两个底层冲突,你的 Agent 就会显得很健忘,甚至逻辑混乱,根本没法承接稍微复杂一点的真实业务。
OpenAI 的分层记忆架构¶
那么既然靠纯向量检索走不通,那么像 OpenAI 这样头部玩家到底是怎么搭记忆架构的呢?
答案就两个字:分层。它的架构没有无脑堆料,而是极其克制的,分了四种类型:
第一层:会话元数据¶
这其实不算真正的记忆,它只是你当前的环境信息。比如你现在的时区是哪儿,用的是手机还是电脑,当前的网络状况怎么样,这些信息大模型当下需要知道,但是用完直接就扔了。就好比你出门之前看了一遍你的手机上的天气预报,你知道今天下雨就带把伞就行了,你不需要把这几天的天气预报都背进脑子里。所以它绝对不算长期记忆。
第二层:用户结构化档案卡¶
这个非常关键,正好解答了我们上一部分提到的"预算到底听哪句"的冲突。OpenAI 解决这种事实明确的方法就是建一个结构化的表格,也就是代码里面的 JSON 格式。比如说: - 你喜欢什么样的住宿类型 - 你对海鲜过不过敏 - 你的旅行预算是多少
只要你的喜好变了,它就随时更新,随时把旧数据给覆盖掉。它追求的是百分之百的精确读取,绝不可以模棱两可。
第三层:近期对话摘要¶
肯定有人问了:明确的属性可以用表格存,那长篇大论的聊天记录怎么办呢?那就到了第三层——近期对话摘要。对于大段大段的闲聊,GPT 不会傻乎乎的去存你说的每一句废话,它会在后台悄悄的把你聊过的主题浓缩成一个非常清爽的清单。
这其实特别像你看旅行日记,每天晚上花 2 分钟记一下今天去了哪里玩了什么。由这个清单注入到对话里,Agent 就能把话接上,根本就不需要去翻所有的原话记录。
第四层:滑动窗口¶
最后最底下这一层才是大模型真正处理当下对话的滑动窗口,这个大家应该都很熟了。就是你眼前的这几轮聊天,一旦聊的太多,超过了 token 的上限怎么办?非常简单粗暴:就是最老的信息直接丢弃。
这四层我们说完了,你有没有注意到:在这个堪称行业标杆的极其稳定高效的记忆系统里面,完全都没有这个向量数据库出场。这其实给我们在业务里做 Agent 提供了一个非常实用的参考:你一定要把明确的业务属性和模糊的对话上下文彻底的分开处理,你这个系统的可控性才会高。
主动型 Agent Memory 的三大核心命题¶
不过说到这里,可能有人会觉得:ChatGPT 这种还是有点偏被动了,基本上都是人聊一句它记一句。那如果我们真的想做一个能主动思考、主动帮你干活的 Agent,也就是所谓的 Agentic Memory,我们需要搞清楚什么呢?
这里面有三个非常核心的命题,也是我们真正在写代码之前必须要扭转的观念。
命题一:走出认知误区¶
首先第一个命题其实是个认知误区:你看现在市面上可能 90% 的人做 Memory,脑子里想的还是"外挂硬盘"——觉得大模型记不住上下文,那我就给他接一个大容量的数据库嘛,把聊过的东西全都塞进去。
但这其实是不对的。你想一下,如果 Agent 就像一个真实的旅行顾问,最大的价值难道是把全球所有酒店的价格都背下来吗?绝对不是。他真正的能力是:遇到一个具体的旅行规划需求时,能从过去的历史记录里面提取出对当下这个决策最有用的证据。
所以记忆系统的核心价值根本就不在于你存了多少 G 的数据,而在于历史数据转换成当前决策的这条通道到底通不通畅。
命题二:工程三件套¶
那具体怎么把这条通道给打通呢?那就到了第二个命题:我们在工程上必须要搭的一个系统三件套。
-
Ledger(原生账本):底层得有个基础叫做原生账本。这个特别像银行流水,它有个铁律就是只能追加,绝对不能修改。为什么一定要有这个?因为这个是底线,以后 Agent 要是出了 bug 开始胡言乱语推荐了离谱的酒店,我们得靠这个黑匣子一样的东西去溯源排错。
-
Views(派生视图):有了流水账本,大模型直接看是看不懂的,或者说是看不过来。所以第二步我们需要做派生视图——简单说就是把那些死板的底层数据加工成大模型能看懂的格式,比如说用户的旅行偏好图谱啦,或者是按时间线整理好的旅行历史小传。
-
Policy(控制策略):最后也是最关键的第三个组件叫控制策略。这其实才是整个记忆系统的大脑。他得负责决定 Agent 的什么时候该去查资料,什么时候该写记录,甚至什么时候需要主动去遗忘那些没用的信息。
如果没有这个控制大脑,那么你的系统不出几天绝对会变成一个巨大的数据垃圾场。对于我们做业务落地的来说,这意味着:一个真正的生产级系统,绝不可能仅仅是买个向量数据库加上几句 prompt 就能搞定的。
命题三:显式慢思考回路¶
有了这一套架构,大模型具体怎么去用它呢?这就到了第三个命题:我们得给 Agent 建立一个显式的慢思考回路。
大家都知道大模型本身是个直觉系统,也就是所谓的 System 1,你问他问题,它本能的顺着往下生成文字,速度是很快的。但是真正的 Agentic Memory 是把记忆变成一个它可以主动操作的工具,这就好比给大模型装了一个外置的机械臂——当遇到复杂任务的时候,大模型不会立刻去瞎猜,而是会触发一个 System 2 慢思考回路:
停下来想:等一下,这个用户的需求好像有点复杂,我得控制一下这个机械臂,去资料库里翻一翻这个用户的旅行历史和偏好,拿到证据了我再决定怎么推荐。
把对数据的读写变成 Agent 可以主动调用的工具,这才是智能体真正走向独立工作的核心。
高阶概念:时间约束与程序性记忆¶
不过当 Agent 真正拥有了这种主动调用的能力之后,在实际运行的过程中还是会遇到两个隐蔽的坑。这就到了我们最后一部分,这两个被很多人忽视的底层骨架:时间约束和程序性记忆。
时间约束:双时态机制解决时间盲区¶
第一个时间盲区,我们在最开始其实也稍微提过一嘴时间的问题。但是在旅行规划那个例子里,场景是比较简单的,直接把旧预算覆盖掉就行了。
可是在很多真实的系统里,你是绝对不能够直接删旧数据的。来看这个例子:假设系统里面记录了用户小明去年是住在北京,今年他搬到上海工作了。这时候如果你纯靠大模型去检索,他很容易把过去的历史当成现在的真相,开始疯狂推荐北京的酒店,产生幻觉。
那你可能会想了:那就像前面说的,我们直接把北京这条数据给删掉,给抹掉,换成上海不就行了吗?这是不行的,为什么呢?因为过两天用户可能会跑来问:"哎,我去年在北京住的那家胡同民宿叫什么名字来着?"你要是抹掉了,Agent 就彻底失忆了。
那我们怎么解决这种冲突呢?工程上有一个专门的保命机制叫做双时态:简单来说就是我们得给每一条记忆打上两个截然不同的时间戳:
- 一个是这条记录在现实世界是什么时候生效的
- 另一个是它什么时候被写进系统的
以后 Agent 每次去查资料,系统都会在底层给它套上一个时间切片的硬约束。这就等于明确告诉大模型:你看这是小明现在的居住地,那这个呢是他过去的居住地,你按时间线理清楚,别搞混了。有了这个机制,Agent 处理复杂时间线才不会精神错乱。
程序性记忆:记住"怎么做"而不是"是什么"¶
好,解决了时间问题,我们再来看另一个,也是决定你的 Agent 到底是个新手顾问还是资深专家的关键——这个叫程序性记忆。
平时我们做检索,绝大多数情况是在做陈述性记忆——就是让 Agent 去捞点资料,比如"三亚的天气怎么样"、"丽江的海拔是多少"。这种收益其实是有限的。
真正高级的记忆系统不仅要记住是什么,更要记住怎么干。
你看:假设 Agent 遇到一个需求是"帮我规划一个带 3 岁孩子的 7 天云南之旅",他去查资料、问问题、改方案,折腾了五六轮,最后终于拿出了一个用户满意的方案。如果只有普通的记忆系统,下次遇到一模一样的带娃旅行需求,他大概率呢还是会把这套痛苦的流程重新走一遍,那就非常浪费大模型的 token,也会拖累效率。
那聪明的系统是怎么做的?他会把刚才那一次真正成功的交互轨迹,像一个漏斗一样,把中间那些没用的废话全都过滤掉,最终压缩固化成一个可执行的 skill(技能)。你可以把它理解成一个一键执行的宏指令。
等下次你再遇到类似的带娃旅行需求,Agent 的脑子里就不会去想那些大段大段的对话记录了,而是会直接弹出一个动作:"哦,这个需求我上周刚处理过,我直接用那套带娃云南游的模板就行了。"
对于企业落地来说,这意味着你的 Agent 有了越用越聪明的能力,他能把日常折腾出来的经验变成一套套标准的服务流程。
总结¶
今天其实我们是从最基础的向量数据库踩坑开始,一路拆解了 ChatGPT 那种极其克制的四层架构,然后又往深走聊了构建主动型 Agent 必须具备的流水账本、派生视图和控制策略,最后落地到了时间约束和程序性记忆这两个最容易被踩坑的约束机制上。
其实做到底:想构建一个真正的上线的 Agent Memory,绝对不是简单的买个数据库,然后去拼凑几句 prompt。它是需要我们精心设计一套让历史数据顺利的转换成当前决策的系统工程。
希望今天这些最底层架构的拆解,能给正在做 AI 业务落地的朋友们一点实质性的启发。