转载:小红书 AI产品赵哥
前言🔖
有朋友面试 AI Agent 开发、AI 产品经理,都被问到了这样一个问题:
你的 Agent 架构里,如何设计记忆机制?
正好最近我一直在做 Agent,发现无论是手搓 Agent 的小伙伴,还是打算面试 AI Agent 开发、产品岗的小伙伴,可能都绕不开今天要聊的话题 ——Agent 记忆机制
大家有没有遇到过这种情况:
- 上午跟 Agent 详细讨论了项目 A 的各种细节,下午再问它,它一脸茫然地问 “项目 A 是什么?”
- 或者你跟它说了喜欢简洁的报告风格,下次它还是给你整出一堆花里胡哨的客套话。
- 昨天刚纠正过的错误,换个问法它又犯了。
是不是挺崩溃的?
面试的时候,如果被问到 Agent 的记忆机制怎么设计,直接回答 “用向量数据库”,这道题大概都很难及格。
因为这里有个根本矛盾:上下文窗口(Context Window)是有限的,但任务和交互周期可能是无限的。就像你的背包容量有限,但旅行没有终点。
所以记忆系统不是简单堆个数据库就完了。它更像大脑的分层记忆体系。今天我们就来拆解一下这种设计思路。大家准备好的话,咱可就发车了!!!
一、第一层:短期记忆🔖
首先,这是记忆系统的第一层,也是最直接的一层 —— 短期记忆,也叫工作记忆(Working Memory)。
🔹【是什么?】
你可以把它想象成你书桌的工作台,或者是电脑的内存(RAM)。
这个台上,放着你当前正在处理的任务所需的一切工具和材料。它非常方便,你一伸手就能拿到,一低头就能看到。但缺点也很明显:台面空间非常有限,而且下班后(任务结束后)不清空就会乱成一团。
在 Agent 中,短期记忆通常就是指被直接放进上下文窗口(Context Window)里的那部分信息。它包含了:
- 最近几轮的对话历史:你和 AI 刚刚聊了什么。
- 当前的工具调用结果:AI 刚刚查询了天气 API,返回的结果 “北京,晴,25 度”。
- 当前的执行计划:AI 正在执行一个分为三步的计划,目前进行到第二步。
- 临时变量和中间思考:AI 为了解决一个复杂问题,自己进行的一些思考链(Chain of Thought)的中间产物。
🔹【核心价值】
短期记忆的核心价值在于即时性和高相关性。它保证了 AI 在执行每一步推理时,都能立刻访问到最关键、最新的信息,从而保持对话的连贯性和任务的流畅性。
🔹【面临的挑战】
但是,问题也随之而来。上下文窗口不是无限的,而且是按 token 计费的,非常昂贵。如果你不加节制地把所有东西都堆在工作台上,很快就会:
- 台面溢出:上下文窗口被塞满,更早的信息被挤掉,导致 AI 突然失忆。
- 成本飙升:每次请求都带着几万甚至几十万的 token,你的钱包在燃烧。
- 效率下降:台面太乱,AI 在做决策时,需要处理的无关信息太多,反而影响了推理的质量和速度。
所以,短期记忆虽然好用,但必须有一个机制来管理它,不能让它无限膨胀。这就引出了我们的第二层。
二、第二层:记忆压缩🔖
当你的工作台越来越乱时,你会怎么做?你会把已经完成的工作材料整理归档,把一些讨论过程写成一份简洁的会议纪要,然后把不重要的草稿纸扔掉,对吧?
💡 记忆压缩,扮演的就是这个整理员和纪要员的角色。
🔹【是什么?】
记忆压缩,也叫上下文压缩(Context Compaction),是一种将冗长的、非结构化的历史信息,通过 AI 自身能力,总结、提炼成一份简短、结构化的摘要的技术。
假设你已经和 Agent 对话了 50 轮,为了修复一个 bug。到了第 51 轮,AI 真的有必要知道第一轮你是怎么跟它打招呼的吗?完全没必要。
记忆压缩要做的是,让 AI 回头看,然后生成一份类似这样的摘要:
{
"task_id": "BUG-FIX-2023-1028",
"user_goal": "修复用户登录时500错误的问题",
"progress_summary": [
"已确认bug可在测试环境稳定复现",
"已定位问题代码位于 auth_service.js 的 getToken 函数",
"初步尝试增加try-catch块,但未解决根本问题"
]
"next_steps": [
"尝试分析数据库连接池在高峰期的表现",
"考虑引入重试机制"
],
"key_decisions": [
"用户明确表示,不希望修改数据库表结构"
]
}
🔹【核心价值】
这份摘要的价值巨大:
- 信息降噪:它过滤掉了大量的口水话、寒暄、错误尝试等噪音,只保留了最有价值的信号。
- 成本控制:用一个几百 token 的结构化摘要,替换掉几万 token 的原始对话历史,极大地节省了上下文成本。
- 状态保持:即使原始对话被移出短期记忆,这份摘要也能让 AI 在后续的对话中,快速回想起任务的核心状态。
Anthropic 公司在开发长任务 Agent 时,就大量使用了这种技术。他们发现,定期地让 AI 自我总结,是维持长期对话连贯性的关键。
🔹【如何实现?】
通常是在对话进行到一定长度(比如每 10 轮或 20 轮),或者在任务的一个阶段性节点完成后,触发一个特殊的 Prompt,让 AI 根据之前的对话历史,生成或更新这样一份摘要。这份摘要可以被保留在短期记忆的顶端,或者存入长期记忆,供后续随时调取。
记忆压缩就像一座桥梁,它连接了短暂易逝的短期记忆和永久保存的长期记忆。
三、第三层:长期记忆🔖
现在,我们来到了记忆系统最核心的也是最能体现 Agent 智慧的部分 —— 长期记忆。如果说短期记忆是工作台,那么长期记忆就是你身后那座档案馆。
【它是什么?】
长期记忆负责存储那些跨会话、跨任务、需要永久或半永久保存的信息。它保证了 Agent 在今天和你聊完后,明天、下周、甚至明年再见到你时,它依然认识你,记得你们之间的故事。
这里存储的内容包罗万象:
- 用户偏好:你喜欢什么样的沟通风格?你的职位是什么?你的主要目标是什么?
- 历史项目记录:你之前用这个 Agent 完成了哪些项目?结果如何?
- 核心业务知识:公司的组织架构、产品的技术文档、行业的黑话术语。
- 重要决策和事实:“在上次会议中,CEO 确认了 Q4 的战略重点是用户增长。”
【如何实现?】
这里就是向量数据库这类技术发挥作用的地方了。常见的实现方式包括:
- 向量数据库 (Vector DB):最主流的方式。通过将文本信息转换成 “语义向量” 来存储,非常适合进行模糊的、基于意义的检索。
- 知识图谱 (Knowledge Graph):更进一步,它不仅存储信息,还存储信息之间的关系,形成一张巨大的知识网络。
- 传统数据库 (SQL/NoSQL):对于那些结构化非常强的信息(比如用户档案),传统数据库依然是很好的选择。
但如果想在面试中或实际设计中更上一层楼,你需要展示对长期记忆更精细的理解。我们可以模仿人脑的记忆分类,把长期记忆也拆解成三类。这个设计思路,会让你的 Agent 更高级。
3.1 三种长期记忆
🔹3.1.1 语义记忆(百科全书)
- 是什么:存储客观事实、通用知识和规则。这些信息与具体的时间、地点、人物无关。
- 类比:百科全书,你知道 “地球是圆的”,“公司的报销上限是 2000 元”,“Python 是一门编程语言”。
- 在 Agent 中:
- 公司的规章制度
- 产品的技术文档
- 行业知识库
- API 接口的使用说明
- 价值:让 Agent 成为一个真正的领域专家,而不是一个只会聊天的空壳。
🔹3.1.2 情景记忆(日记本)
- 是什么:存储具体发生过的、带有时间戳和个人体验的事件。它是关于 “什么时间、什么地点、发生了什么事” 的记忆。
- 类比:日记本,你记得 “上周五下午,我和朋友在海边吃了烧烤”。
- 在 Agent 中:
- “2023 年 10 月 26 日,用户 ‘ 张三 ‘ 提交了年度预算审批,状态:待处理。”
- “上一次对话中,用户对 AI 生成的报告格式提出了不满,认为太啰嗦。”
- “项目 A 在启动时,CEO 曾强调安全是第一优先级。”
- 价值:让 Agent 拥有历史感,能够理解上下文的演变,并根据过去的具体事件来调整当下的行为。这是实现真正个性化和人情味的关键。
🔹3.1.3 程序记忆(操作手册)
- 是什么:存储如何做某件事的流程和技能。这是一种关于 “How-to” 的肌肉记忆。
- 类比:操作手册 / 食谱。你学会了如何骑自行车,如何开车,如何做一道番茄炒蛋。你不需要思考每一步,而是自然而然地完成。
- 在 Agent 中:
- “一个标准的报销流程是:提交申请 → 部门主管审批 → 财务审批 → 打款。”
- “修复一个线上 bug 的最佳实践是:创建 hotfix 分支 → 编写单元测试复现 bug → 修复代码 → 提交 PR → 观察部署。”
- “与新客户沟通的标准 SOP(标准作业程序)。”
- 价值:让 Agent 能够高效、稳定地执行复杂的多步任务,并沉淀和复用最佳实践。
通过这样三位一体的设计,你的长期记忆系统就不再是一个混沌的信息垃圾堆,而是变得结构清晰、功能明确了。
四、记忆管理:如何设计一个健康的记忆系统?🔖
现在你的 Agent 拥有了短期记忆、压缩记忆和长期记忆,是不是够用了?当然不了,一个更大的问题出现了:记忆爆炸!
想象一下,如果你的大脑无法忘记任何事情,你记得你吃过的每一顿饭、看过的每一片云、听过的每一句废话…… 你会被海量的、无关的记忆淹没,最终无法正常思考和生活。
一个健康的记忆系统,管理记忆的能力,远比存储记忆的能力更重要。它必须具备一套完整的 “增删改查” 和 “遗忘” 机制。
🔹1. 写入 (Write):当好守门员
不是所有信息都值得被记入长期记忆。你需要一个守门员来判断:
- 什么时候存?是在对话结束后,还是在用户明确说 “记住这个” 时?
- 存什么?是存用户的偏好,还是一个重要的决策,或是一个成功的解决方案?
- 怎么存?是直接存原文,还是先进行总结和打标签?
💡 最近的研究趋势是,让一个元认知 AI 来扮演这个守门员,它专门负责评估一段信息是否有长期保存的价值。
🔹2. 召回 (Recall):当好图书管理员
当 Agent 需要从长期记忆中获取信息时,如何保证它能在正确的时间,找到正确的信息?
- 相关性 (Relevance):这是最基本的。通过向量检索等方式,找到与当前任务最相关的内容。
- 时效性 (Recency):最近的记忆通常比陈旧的记忆更重要。
- 重要性 (Importance):有些记忆虽然很久远,但极其重要(比如 CEO 的战略指示)。在存储时,可以为记忆打上 “重要性” 权重。
💡 一个好的召回系统,会综合考虑这几个因素,给出一个加权排序,确保最有价值的信息被优先提供给 Agent。
🔹3. 更新 (Update):当好编辑
信息是会过期的。用户的偏好会变,公司的政策会改。
- 当 Agent 发现新的信息与长期记忆中的旧信息冲突时,它应该有能力去更新甚至替换旧的记忆。例如,用户说:“我现在不喜欢简洁的报告了,我喜欢详细的”,Agent 就应该去更新长期记忆里的 “用户偏好” 条目。
🔹4. 遗忘 (Forgetting):当好清洁工
这是最反直觉,但也是最高级的功能。主动遗忘,是一种保护机制。
- 遗忘过期信息:比如一个三个月前的项目临时密码,早就没用了,留着反而有安全风险。
- 遗忘无关噪音:大量的闲聊、情绪化的表达,长期来看价值不大,会污染记忆库。
- 遗忘失败路径:除非是为了吸取教训,否则很多失败的尝试路径可以被遗忘,以保持程序记忆的清晰。
设计一个遗忘算法,比如基于记忆的访问频率、年龄和重要性来决定是否淘汰一条记忆,是顶级 Agent 记忆系统设计的标志。
五、面试怎么回答这类问题?🔖
现在,让我们回到最初的那个面试问题。当你对记忆系统有了如此深刻的理解后,你的回答将是摧枯拉朽:
- “面试官您好,关于 Agent 记忆机制的设计,我认为不能简单地用一个向量数据库来概括。一个健壮的记忆系统,核心是解决上下文窗口有限与任务周期无限的矛盾,因此通常需要采用分层设计。”
- “首先,是短期记忆,也叫工作记忆。它直接存在于上下文中,负责保存当前任务最直接相关的信息,保证推理的即时性,就像电脑的内存。”
- “其次,是记忆压缩机制。当短期记忆过长时,我们需要用 AI 来自动总结和提炼核心信息,形成结构化的摘要,这既能节省成本,又能保持任务状态,是短期和长期记忆之间的桥梁。”
- “最核心的是长期记忆。它负责跨会话的知识沉淀。为了实现更精细的管理,我们可以将其分为三类:语义记忆,像教科书,存储客观知识;情景记忆,像日记,记录具体事件;程序记忆,像操作手册,存储工作流程。这样的设计更接近人脑,能让 Agent 更懂你。”
- “最后,也是最关键的,是配套的记忆管理系统。仅仅有存储是不够的。我们必须设计精巧的写入、召回、更新和遗忘机制。特别是遗忘机制,它能主动清理过期和无关的记忆,避免记忆污染,这对于维持 Agent 长期运行的健康至关重要。”
- “总而言之,我认为真正优秀的 Agent,其核心竞争力已经不只是模型本身的能力,更是其背后那套分层、分类、可管理的记忆系统的设计能力。”