用户记忆与知识库
大脑天生健忘:窗口一合上,这段经历就不存在了。记忆系统让 Agent“记得住”,知识库让它“查得到”——这是两种不同的能力,也常被混为一谈。
先划清两条线的边界:
- 记忆(Memory):Agent 与这个用户/这个任务的亲历经历——你的偏好、上次对话的决定、项目的来龙去脉。它是私有且不断生长的。
- 知识库(Knowledge Base):外部世界的既有知识——产品文档、法规条文、技术手册。它通常是公共的、相对静态的。
两者的技术栈有重叠(都涉及存储和检索),但目标不同:记忆回答“关于你,我知道什么”,知识库回答“关于世界,有什么可查”。
记忆:从窗口外找回经历
记忆的层次
借用 Letta(前身 MemGPT)的分析框架,Agent 记忆可分三层:
| 层次 | 内容 | 类比 |
|---|---|---|
| 窗口内记忆(in-context) | 当前对话、系统提示 | 工作记忆 |
| 情景记忆(episodic) | 发生过的具体事件:上次的对话、曾经的失败尝试 | 日记 |
| 语义记忆(semantic) | 从经历中提炼的稳定事实:用户偏好、项目约定 | 人物画像 |
| 程序记忆(procedural) | 学到的做法:某个任务的最佳提示词、工作流程 | 经验技巧 |
记忆的生命周期:写入、检索、遗忘
一个可用的记忆系统要回答三个问题:
- 记什么、何时写。不是所有对话都值得记。实践中常用一个轻量模型在会话中或会话结束时做“提炼”:把值得保留的信息写成结构化条目(“用户偏好简洁的回答风格”),而不是存原始对话。
- 何时取、怎么取。每次新会话开始或对话进行中,用当前话题去检索相关记忆注入上下文。向量相似度检索是主流,配合元数据过滤(用户 ID、项目、时间)更准。
- 何时忘、如何更新。记忆会过时(“用户在用 Vue”半年后可能变成“用户在用 React”)。好的记忆系统支持更新与冲突消解——新记忆覆盖旧记忆而不是无限堆积,否则陈旧记忆会主动污染行为。
开源生态里,Letta(MemGPT)提供了完整的记忆架构(核心思想:让模型自己管理分页的记忆,类似操作系统的虚拟内存),mem0 则专注记忆的提炼-检索-更新管道,两者都可作为自建记忆系统的参照。
记忆的最小可行实现
不必一开始就上向量数据库。很多 Coding Agent 的记忆就是一两个 Markdown 文件(如记录用户偏好的 MEMORY.md):会话结束提炼几条写进去,新会话开头读进来。文件即记忆,简单、可审查、可手工编辑——先跑通循环,再考虑升级存储。
知识库:RAG 的基本盘
知识库的目标是让 Agent 能回答“训练数据里没有、窗口里也装不下”的问题。标准方案是 RAG(Retrieval-Augmented Generation,检索增强生成),管道分四步:
text
离线索引:文档 → 切块(chunking)→ 向量化(embedding)→ 存入向量库
在线检索:用户问题 → 向量化 → 相似度检索 → (重排序)→ 取 Top-K 片段
生成: 片段注入上下文 → 模型基于片段作答每一步都有影响成败的细节:
- 切块:块太大则检索不精、挤占窗口;块太小则上下文断裂。按语义边界(章节、段落)切,保留标题层级作为元数据。
- 检索质量决定上限。向量相似度只是起点,实践里常配合关键词检索(混合检索)与重排序模型(reranker)。检索不到相关内容,后面的模型再强也没用。
- 引用与归因:让答案标注来源片段,既是反幻觉的护栏,也是用户信任的基础。
与上下文工程的边界
记忆和 RAG 最终都以“往上下文里注入信息”收尾,那它们和 Context Engineering 是什么关系?可以这样定位:
- Context Engineering 回答怎么管理窗口:压缩、隔离、缓存,是机制层。
- 记忆与知识库回答管理什么内容:亲历经历与外部知识,是内容层。记忆系统的“检索注入”,正是 Context Engineering 中“检索注入”策略在两类数据上的具体化。
本章小结
- 记忆 = 亲历经历(私有、生长),知识库 = 外部知识(公共、静态),两条线分开设计。
- 记忆系统的三问:记什么、何时取、何时忘;最小可行实现可以只是一个 Markdown 文件。
- RAG 管道:索引 → 检索 → 生成;检索质量决定上限,切块与重排序是主要抓手。
- 记忆与知识库是内容层,上下文工程是机制层,最终都在窗口里汇合。