LZLZL/AI 工具链/本地 · 上手
免费中 · 实践 一阶 本地上下文

项目记忆:
写成什么样才真的生效

2026-08-21 · 少而硬 > 多而软;以及绝对不该写进去的东西

agent 每开一个新会话都是失忆的。项目记忆文件就是你留给它的那张便条。 但便条写长了等于没写——约束的力度和数量成反比。 这一篇讲怎么写才真的生效,以及一条最常见的泄漏路径。

本文写什么该写什么、不该写什么、怎么验证生效。 本文不写我们自己的记忆文件内容。

它是什么:放进每次对话开头的那段话

不同工具叫法不同(CLAUDE.mdAGENTS.md……), 机制是一样的:把这个文件的内容塞进每次会话的开头

知道机制就能推出两条结论,后面全部由此而来:

因为所以
它占的是上下文预算写得越长,留给真正干活的空间越少,而且每一条的相对权重都被摊薄
它是文本,不是执行的规则模型是「读到并倾向遵守」,不是「被强制」。真要拦住的事,得靠权限配置
最反直觉的一条:写得越多,遵守得越差

50 条规则和 5 条规则,遵守率不是一回事。50 条里每一条都只是背景噪声中的一行; 5 条里每一条都显眼。

所以正确的动作不是「想到什么加什么」,而是定期删。 一条规则如果三个月没救过你一次,它就是在稀释别的规则。

该写什么:只写「猜不到」的

判据一句话:它能从代码里看出来的,就别写。

不写
构建「测试要用 make test,不是包管理器默认那条」项目用什么语言(它自己看得见)
约定「这个目录下的文件是生成的,别手改」缩进几个空格(配置文件里有)
边界「别碰 migrations/,那要人工审」泛泛的「请写高质量代码」
陷阱「本地跑要先起某个依赖服务,否则报错很误导」能从 README 读到的
口味「回答用中文」「先说结论」

一个好用的自检:每一条前面都能补上「不然它会……」。补不出来的,删掉。

⚠ 绝对不该写进去的

密钥、token、密码、内网地址——一个都不能有

这是最常见的泄漏路径,而且泄漏方式有三层,很多人只想到第一层:

① 这个文件通常要进 git(团队共享才有意义)→ 进了 git 就进了历史,删掉也还在;
② 它每次会话都被读进上下文 → 等于每一次请求都把它发出去一遍;
③ 团队里任何人 clone 都拿到,包括以后离职的人

正确做法:文件里只写「去哪里取」——「密钥在环境变量 SOME_KEY 里」。 写位置,不写值。

⚠ 别把不受信任的内容原样贴进去

这个文件的内容会被当成上下文读入。如果你把外部来源的文本(issue 正文、爬来的网页、 第三方 README)整段粘进去,里面万一夹着「请执行……」这样的句子, 就成了一条你亲手放进来的指令

要引用外部内容,自己转述一遍,别原样搬运。

怎么验证它真的生效

写完别假设它在起作用,花一分钟验一下:

验什么怎么验
读到了吗新开一个会话,直接问它「这个项目有哪些约定」,看它复述得对不对
照做了吗让它做一件会触碰某条规则的小事,看它有没有绕开
哪一份生效项目层和用户层可能都有;拿不准就直接问它读到了哪些
写完再删一遍

第一版一定写多了。跑一周,把「从来没被触发过」的条目删掉。 项目记忆是要修剪的,不是要积累的。

机制 项目记忆文件的内容被放进每次会话的起始上下文;因此占用上下文预算, 且条目越多单条权重越低。这是这类文件的通用行为,各家命名不同(CLAUDE.mdAGENTS.md 等)。
约束力 它是提示层而非执行层。真要拦住的操作必须靠权限配置 (见Claude Code 那篇deny),不能指望写在记忆文件里。
本文没给的 「多长算长」没有硬阈值——取决于模型上下文与你的项目。 本文只给方向(少而硬),不编一个具体的行数上限
本文不提供的 我们自己的记忆文件内容与项目约定。

相关接着读什么

一阶 · 本地
Claude Code:从零到第一次改代码
三阶 · 常驻
MCP 与工具面:给 agent 装手,以及别装什么
二阶 · 接入层
token 成本账:钱到底烧在哪
二阶 · 接入层
账号是怎么没的,以及被封前该备份什么
本文是教育与工程记录,不是任何第三方产品的推荐或测评。命令、配置键、价格与条款均以各家官方文档为准, 本文标注考证日期,随时可能变更 —— 照抄前请自己核一遍。 自建与自托管的安全责任在部署者本人:密钥、账号与数据的后果由你承担。