AI 智能体的记忆,到底记住了什么
用 AI 干活久了,最烦的往往不是它不够聪明,而是它不记事。
每开一个新会话,都要重新交代一遍:这个项目是什么、客户是谁、文件怎么命名、上次那个坑是怎么踩的。说完一遍,第二天再说一遍。真正把人耗掉的不是它能力不够,是这种重复。
过去一年,主流智能体都在补这一块。补法各有不同,但把 Claude、Codex、ZCode 三家的官方文档翻完,会发现它们的思路正在收敛到同一个形状上。这篇就把它们摊开对比一下,并结合我自己的法律业务讲讲怎么用。
一、"记忆"其实是两样东西
这是理解全部问题的前提:智能体的记忆分两种,一种是你自己写进去的,一种是它自己总结出来的。
Claude Code 的官方文档把这件事讲得最直白:它有两套并行机制,一套叫 CLAUDE.md(同类的还有跨工具通用的 AGENTS.md),一套叫自动记忆。文档里那张对照表只有五行,但把区别说尽了——谁写的:你 / Claude;装什么:指令和规则 / 学习和模式;用在哪:编码标准、工作流、项目架构 / 构建命令、调试经验、它自己发现的偏好。
Codex 是同一套分法,只是名字不同:AGENTS.md 是静态指令层,~/.codex/memories/ 是它生成的记忆层。ZCode 走得更远,它在文档里直接写明记忆"不记什么",其中一条就是:项目指令文件里已经写过的,不重复记——把边界划在了两者之间。
用一句话概括这个分工:指令是硬的,记忆是软的。 指令层是你立的规矩,每次会话开场全量加载;记忆层是它攒的经验,用得上才调出来。
1. 你写的那一层:全局指令与项目指令
这一层还要再分两级,全局的和项目的。以我自己的执业场景为例。
全局 AGENTS.md 放什么?放那些换任何一个项目都不变的规矩。 我自己那份里,大致是这么几类:
- 立场:默认代表委托人一方,所有分析、起草、修订从客户最佳利益出发;发现利益冲突迹象先提示,不得径行起草。
- 红线:法律、行政法规、司法解释、指导案例、企业主体信息一律不得虚构;需要精确引用条文的,去官方数据库取原文,不能凭训练记忆输出;无法核实的标注"【待核验】"。
- 格式:文件命名"命名-ABL-日期-Vn-修改内容";合同条款按"第一条 / 1.1 / 1.1.1"分级且用自动多级编号;正文宋体小四、1.5 倍行距、首行缩进 2 字符;数字用 Times New Roman;一千以上加千位分隔符;签署页单独成页、以分页符与正文分隔。
- 默认值:违约金按日万分之五;争议管辖为客户住所地有管辖权的人民法院。
- 署名:律所名称写"上海市锦天城(深圳)律师事务所",修订人署名"锦天城-李成"。
这些东西的共性是:每次都要遵守,且不因项目而变。 换句话说,凡是你已经在心里重复过三遍以上的要求,就应该写进全局指令,而不是每次开场再敲一遍。
项目 AGENTS.md 放什么?放这个项目独有、但项目内恒定的事实和口径。 比如手上一个北交所项目(此处按脱敏习惯称"某北交所项目"),它的项目指令里应该固定住这些:
- 报告期口径:2023 年 1 月 1 日至 2026 年 6 月 30 日,三年一期;
- 体例来源:律师工作报告与法律意见书均以另一同板块项目为模板;
- 署名例外:本项目以总所名义出具,不用深圳分所名称——注意这一条恰好推翻了全局指令里的署名规则,这正是项目层存在的意义;
- 中介机构:保荐机构为某券商,会计师、评估机构分别为某某;
- 待补清单:经办律师姓名、发行方案要素、募投项目、财务指标、审计报告文号暂留空,凡遇到一律标注待补,不许自动填。
再比如另一个新三板挂牌项目,项目指令里会写:本所担任公司律师;三会文件体例参考另一挂牌项目的董事会文件;会议日期按时间表预定(董事会、监事会某日,临时股东会某日);底稿存放目录与成果交付目录的具体路径。
这里有一条判断标准,我认为比任何技巧都管用——Claude Code 官方文档给的原话是:当 Claude 第二次犯同样的错、当你这个会话又敲了一遍上个会话敲过的纠正,就该把它写进去。 反过来说,一件事你只说过一次、且以后未必再说,别急着写进指令,它只会占上下文。
还有一条同样重要:指令要具体到可以验证。 文档举的例子是"用 2 个空格缩进"好过"把代码格式化好"。放到法律文书上就是——"表格外边框 1.5 磅、内边框 0.5 磅、表头行居中加粗"好过"表格排整齐";"每条修改列明原文、修改后文本、修改理由三栏"好过"做个修改说明"。模糊的指令等于没写。
2. 它写的那一层:自动记忆
这一层不需要你动手。它在干活过程中自己记笔记,下次会话自动带上。Claude Code 的自动记忆存在 ~/.claude/projects/<项目>/memory/,ZCode 存在 ~/.zcode/cli/memories/projects/<project>/memory/,Codex 存在 ~/.codex/memories/——三家都是本地纯 Markdown 文件。
它会记什么?照 ZCode 的分类是四种:用户偏好、你对它工作方式的纠正、项目目标与约束、你给过的外部资料。落到我这边,一年下来它自己攒下的东西大致长这样:
- 技术陷阱:用 python-docx 的
addprevious连续插入多个段落时顺序会反转,插完必须复验;Word 或 WPS 生成的文档里,一句话常被拆进多个 run,整段字符串匹配必然失败,得按 run 处理;批量顺移条款编号必须从大到小替换,否则会级联覆盖;转 PDF 后数换页符是最可靠的页数核验方式。 - 工具选型经验:本机 OCR 优先用 Apple Vision 的封装,实测比另一款常用库快约二十倍且准确率更高,盖章件、倾斜扫描件再用第二种交叉核验;有文本层的 PDF 一律直接提取,不启用 OCR。
- 客户与协作习惯:客户常在微信里发来自己改过的 docx,说"以此为最新版"继续改,所以每次接收文件先确认基线版本;微信接收文件的临时目录在什么路径。
- 踩过的坑:某个仓库做依赖操作前必须先比对配置文件,因为本地工作区曾经覆盖过生产配置导致构建失败。
这些东西的共性和上一层正好相反:它们是经验性的、零散的、随环境变化的,你事前根本想不到要写。 你不会在全局指令里预先写一条"注意 addprevious 会反转"——你只有踩过才知道。这正是自动记忆的价值:它把一次性的教训沉淀成了不用重复付学费的东西。
3. 什么进哪一层,别搞反
实务上最容易出的错,是把该硬的东西放软了。
必须每次遵守的规则,写进指令层,不要指望自动记忆。 Codex 官方的建议就是这句话:凡是必须可靠遵守的要求,放进 AGENTS.md 或提交进版本库的文档,记忆层只当作一个有用的本地召回层。理由在 Claude Code 文档里说得更狠——CLAUDE.md 和自动记忆"都是上下文,不是强制配置",你要真正拦住某个动作,得用 hook。
对我们这行,这句话的分量是:"引用法条必须核验现行有效"这种红线,永远写在全局指令里,绝不能靠它自己记住。 它记住了是运气,没记住是事故。
反过来,易变的、经验性的、只在特定环境下成立的,交给自动记忆,别硬塞进指令。 硬塞的代价是双重的:一是占上下文(Claude Code 明确建议单份指令文件控制在 200 行以内,因为"文件越长,消耗越多上下文,遵守度越低"),二是过时了你未必会去删。
还有一个更隐蔽的坑:自动记忆会把项目特例误当成全局偏好。 比如上面那条"本项目以总所名义署名",如果它记成了一条通用偏好,下个项目的文件落款就会错。三家厂商为此都做了项目隔离——Claude 按 project 分仓并称之为一道安全护栏,ZCode 明说一个工作区学到的东西不会漏到另一个。但隔离只解决"跨项目串味",解决不了"在本项目内把特例上升为通例"。所以定期打开记忆文件读一遍,仍然是省不掉的动作。
二、三家各自怎么做
Claude:分三个层面,各做一套
消费端的记忆功能 2025 年 9 月上线。最值得注意的设计是项目隔离——如果你在用 project,每个 project 有自己独立的记忆,产品发布的规划不会串到客户工作里。官方博客把这句话说得很重:项目边界是一道安全护栏,让敏感对话被限制在容器内。同时上线的还有隐身对话,不进历史,也不写入记忆。2025 年 10 月 23 日扩展到 Pro 和 Max,官方在更新里提到,扩展之前专门做了一轮安全测试,看记忆会不会强化有害模式、会不会导致过度迎合。记忆内容以一份"记忆摘要"集中呈现,在设置里可以直接看、直接改,也支持在不同服务商之间导入导出。
Claude Code 这边更工程化。CLAUDE.md 有四个层级:托管策略、用户、项目、本地,从大范围到具体依次加载,全部拼接进上下文,而不是互相覆盖。放到法律团队上,这四层刚好对应:律所统一部署的合规要求、你个人的执业习惯、项目组共享的项目口径、你自己不进版本库的本地便签。自动记忆则存在 ~/.claude/projects/<项目>/memory/,MEMORY.md 是索引,每次开会话只加载前 200 行或前 25KB,以先到者为准;细节笔记放在单独主题文件里,需要时才现读。/memory 可以查看、编辑,也可以整个关掉。
API 层面是记忆工具(memory_20250818)。它最有意思的一点是跑在客户端:模型只发出"请看一下 /memories 目录""请写这个文件"的请求,实际读写由你自己的程序执行,数据存在你自己的基础设施里。命令一共六个——view、create、str_replace、insert、delete、rename,跟操作文件系统没有区别。文档明确说,这个工具现已在 Messages API 上正式可用,不再需要 beta 标头。
Codex:把记忆做成了一条后台流水线
Codex 的写入不发生在对话过程中,而是在会话启动时于后台异步执行,官方仓库文档写得很细,分两个阶段。
第一阶段针对单个会话记录:筛出与记忆相关的内容,交给模型抽取出一份详细的原始记忆和一份精简摘要,落盘之前先做密钥脱敏,再存进本地状态库。有个细节相当实在——只处理"闲置足够久"的会话,避免去总结一个还在进行中的对话。
第二阶段做全局整合:先拿一把全局锁,保证同一时间只有一个整合任务在动记忆目录;把第一阶段的产物合并到磁盘,再另起一个专门的整合子代理去更新 MEMORY.md 和摘要文件。这个子代理运行时没有网络、没有审批权限、只能本地写,也不允许再往下派子代理。
更值得一提的是,整个记忆目录本身被维护成一个 git 基线目录。每轮整合前先生成一份 git 风格的 diff 写入工作区,把这份 diff 交给整合代理去看——本轮记忆增了什么、改了什么、删了什么,一目了然。如果同步完发现工作区根本没变化,直接标记成功退出,不浪费一次模型调用。
这个设计对做尽调的人应该很亲切:它本质上就是底稿的版本留痕。你不是被动接受一份新记忆,而是能看到这一轮相对上一轮的增删。
至于读取侧,第三方对源码的分析称,开场只完整读取摘要文件,截断到固定 token 预算后注入,其余内容靠关键词检索去找,没有向量库,也没有相似度检索。(此段引自 mem0 的源码分析文章,非 OpenAI 官方表述,仅供参考。)
ZCode:默认不开,四类记忆
智谱 ZCode 的记忆是项目级的,v3.6.4 起提供,默认关闭,需要在"设置—通用"里手动打开。文档提醒了两件事:开关只对新会话生效,进行中的对话保持原状态;开启后会额外调用模型来抽取和召回,token 消耗会涨。
记忆分四类:用户(身份、专长、偏好)、反馈(你对它工作方式的纠正)、项目(目标、约束、进展)、参考(你给过的外部资料)。不记的三类同样明确:代码结构和版本历史(反正随时能重读)、项目指令文件已覆盖的内容、只在当前对话里有意义的一次性细节。
存储是本地纯 Markdown,一条事实一个文件,外加一份每行一条的索引。文档一句话说得干脆:这个功能不往任何地方上传东西。想彻底清空,删掉目录即可。你也可以直接在对话里说"记住某某"或"忘掉某某"。
局限它也写在明处:目前没有应用内的记忆管理页面,要审阅只能问代理或者手动改文件;远程工作区不支持;索引加载有大小上限,记多了会被截断。
三、三家收敛到了同一个形状
第一,都是 Markdown 文件,不是向量数据库。 三家的记忆全都躺在磁盘上,是你能打开、能编辑、能做版本比对的纯文本。这跟前两年"给大模型接一个向量库做长期记忆"的主流做法几乎是反的。
第二,都是索引加按需读取,不是全量灌注。 Claude Code 只加载索引的前 200 行,主题文件启动时不读;ZCode 的索引有大小上限;Anthropic 给这个思路起了个名字,叫"即时(just-in-time)上下文检索"。理由很朴素:上下文窗口很贵,塞满了反而更笨。
第三,都在做隔离。 按项目、按工作区、按机器,各有各的边界。
第四,都把控制权交还给用户。 可看、可改、可删、可关。Anthropic 在 API 文档里甚至反过来提醒开发者:要限制记忆文件能长到多大,要定期删除长期未被访问的记忆,要防目录穿越攻击。
四、记忆是有代价的
代价一是 token。 ZCode 直接写了开启记忆会增加消耗。Claude Code 建议单份指令文件控制在 200 行以内,因为"较长的文件消耗更多上下文并降低遵守度"。记得多不等于表现好。
代价二是冲突。 Claude Code 文档里有句话值得抄下来:如果两条规则互相矛盾,Claude 可能任意选一条。放到我们这行就是——全局指令写"署名用深圳分所",项目指令写"本项目用总所名义",这不是冲突,因为层级明确、越具体越优先;但如果你在同一层里既写了"违约金日万分之五"又在别处写了"逾期利率按 LPR 四倍",那就是真冲突,它会随机挑一条。过时的条目不是没用,是有害。
代价三是它不保证执行。 那是上下文,不是配置。文档甚至解释了原因:指令文件的内容是作为用户消息传进去的,不是系统提示的一部分。
代价四是它会记住你不希望它记住的东西。
五、如果你的工作带保密义务
这一段写给同行。
第一,分清哪些记忆在本地,哪些在服务商那边。 ZCode 明说不上传;Codex 的记忆是本地文件;Anthropic 的 API 记忆工具跑在客户端,存在你自己的基础设施里。但消费端 Claude 的记忆是账号级的,存在服务商侧。这两类的风险等级完全不同,用哪一类取决于材料敏感度和委托合同里的约定。
第二,指令层就要做脱敏。 我自己的做法是:凡是准备沉淀成通用提示词、甚至推送到公开仓库的内容,客户名替换为"【项目公司简称】",保荐机构替换为"【保荐机构(主承销商)】",律所替换为"【发行人律师】",会所替换为"【会计师事务所】";上线前用全文检索确认没有残留。项目层的指令则相反,它必须写实名和实数,所以就不要往任何共享位置放。
第三,用好隔离和隐身。 不同客户放在不同项目里,别共用一份记忆。一次性的敏感讨论走隐身模式,不进历史也不进记忆。
第四,定期审计。 记忆文件全是明文 Markdown,一个季度花十分钟通读一遍,把当事人姓名、具体金额、未公开的交易安排删掉。自动抽取再聪明,也不知道你手上这份材料封面上盖着"仅供内部"。
结语
回到开头那个分法:你写的那一层决定它该怎么做,它写的那一层决定它已经知道什么。前者要硬、要具体、要分层;后者要定期读、定期删。两层都不做的人,永远在重复交代;只做后者的人,迟早在某份出具文件上栽跟头。
记忆功能真正的价值,可能不在于它记得多,而在于你能确切知道它记了什么,并且随时能删掉。三家不约而同放弃了黑箱向量库,选择了最土的明文 Markdown,我猜原因就在这里。一个你读不懂、改不动、删不掉的记忆系统,在专业场景里是负债,不是资产。
资料来源(访问日期:2026 年 8 月 21 日)
- Anthropic,《记忆工具》,Claude Platform Docs:https://platform.claude.com/docs/zh-CN/agents-and-tools/tool-use/memory-tool
- Anthropic,《Claude 如何记住你的项目》,Claude Code Docs:https://code.claude.com/docs/zh-CN/memory
- Anthropic,《Bringing memory to Claude》,2025 年 9 月 11 日发布、2025 年 10 月 23 日更新:https://claude.com/blog/memory
- OpenAI,codex 仓库记忆管线文档:https://github.com/openai/codex/blob/main/codex-rs/memories/README.md
- 智谱,《Memory》,ZCODE Docs:https://zcode.z.ai/en/docs/memory
- mem0,《Codex CLI Memory: How It Works》(第三方源码分析,非官方):https://mem0.ai/blog/how-memory-works-in-codex-cli
