解决部分AI笔记过时的问题
起因:它会骗我
我家那台机器上养着一个AI,平时管它叫杂鱼
它不是那种聊完就忘的玩具,它有自己的笔记本:一份写它是谁,一份写我是谁,一份记环境事实,还有一份是「东西都放哪」的索引,另外还有一大堆积攒下来的技能和文档
用久了就开始烂,而且烂得很安详
它骗我有两种骗法
- 索引里写着「细节在某个文档里」,那个文档早改名了,指针指过去是空的,它自己不知道,我也不会天天去点(后面才感觉明显不对QAQ)
- 我说把这段改短点,它回一句「改好了」,我 diff 一下发现顺手丢了三行,丢的那三行还是我特意留的
这两种都不是「忘了记」,是同一个问题:
改文件的那个家伙,不能同时是唯一的见证人
它觉得它成功了,它收到的反馈就是「文件写进去了」,万一“model hit max output tokens”就难受了(写不进去还一直尝试)
土法监制
一开始就是人肉盯
改之前先 cp 一份,改完自己 diff
cp MEMORY.md MEMORY.md.bak跑了两周发现这办法到处都是坑啊
- 同一分钟里改两次,第二次的
cp把第一份备份吃了 - 备份堆在被保护的那个目录里,结果我自己的检查脚本开始把
.bak文件当正经内容统计 - 目录级的备份放在技能树里面,加载器直接报「同名技能,歧义」,那个技能从此按名字调不出来
- 最要命的:备份这事儿是「记得就做」,不是「必须做」,而人(和 AI)都不记得
固定成一条链
后来让它把它写成一条不许跳的链
./scripts/pre-change-backup.sh notes/MEMORY.mdpython3 scripts/post-change-compare.py <备份> notes/MEMORY.mdpython3 scripts/pointers-check.py(对了,<备份> 这种尖括号只能待在代码块里,直接写进正文会被当成 HTML 标签吞掉,转义这个坑我踩过 QAQ)
顺序是:备份、改、比对、检查、快照
其中最有用的不是备份,是比对,因为它是唯一能把「它说改好了」变成「有东西可核对」的一环(备份就是以防万一嘛,不清理就到处都是)
判据我改过两轮,最后定成这个样子:某一行的原文在改后文件里找不到了,同时它身上有特征的东西在整个文件里也没了,才算可疑
特征指的是路径、标识符、数字、连续中文,或者这一行的三词短语一条都没活下来
为什么不写「相似度低于 60% 就报警」这种阈值
- 短行上这个比例恒真,等于没判
- 长行上丢一整段它还能及格,真丢内容的时候它反而不响
阈值看起来专业,实际上是给自己找心安的
四份笔记,按「读的频率」分
它那几份笔记后来我重新分过层,判据不是内容主题,是「多久读一次」
| 层 | 多久读 | 该放什么 |
|---|---|---|
| 身份 | 每轮都读 | 它是谁、语气、丢不起的铁律 |
| 用户 | 每轮都读 | 我是谁、我的偏好、哪些事要问过我再做 |
| 记忆 | 每轮都读 | 环境事实、路径、端口、约定 |
| 索引 | 按需读 | 东西都放哪、还有哪些没做 |
前三份每轮都要塞进上下文,所以它们是预算,索引层不进上下文,靠身份层里一行指路(前两个东西不建议经常改,毕竟如果有比较高的缓存命中还能减少一点肉疼)
顺带定了一条分级:每轮都要用的写前三份,一整类任务才用的写进技能文档,能重算出来的(版本号、计数、命令输出)干脆不记,需要的时候跑一遍
踩过的坑(挑几个
触发锚写成「合适的时候」就等于没有
我一开始写「开工前先看一眼待办」,结果它一句「你好」就把自己判成「还没开工」,永远不看
后来改成状态加时机:「会话开局、第一次回话之前,如果看不到待办内容就读一次」,看的是「内容在不在」,不是它觉得自己开没开工
同一条判据写在两个脚本里,一定会漂
「什么算备份文件」「什么算已归档」,我一开始在两个检查器里各写了一份,两周后其中一份多了个跳过规则,另一份没有,于是同一棵树在两个工具眼里是两个样子
现在这条规则只有一个家,第二个地方 import 第一个,判据改完跑一遍,真实输出必须逐字节不变
检查器要有自己的退出码,但只能算自己该管的
一开始所有检查都退 0,等于把「工具可不可信」又交回给读报告的人,而报告是没人读的
全算进去也不行:有些维度管的是上游文件,作者根本改不动,天天报红,报到我看见红色就麻木,那这个码就废了
现在的规矩是:自有维度计退出码,信息类只打印
文档本身就是被扫的数据
我自己的文档里有一个「示例路径」,写的是 2026/03/notes.md,检查器把它当成真引用,报断链
还有一处更搞笑:技能文档里写着「这个技能故意不带 references/INDEX.md」,那句「提到它」也被当成引用
两次的修法不一样:一次改文档(写成占位符形式),一次改判据(承认裸文件名和部分路径是人写文档的正常形态,去查后缀)
共同点是不许靠「关掉检查」了事,检查一关,它就什么都不保护了
归档和删除必须报得不一样
指针指不到东西时,我原来只有两种结局:能解析,不能解析
结果我发现我不敢往归档目录里搬东西了,因为搬进去和删掉在报告里长得一模一样
现在是三种:能解析、可恢复(在归档里,告诉你去哪找)、真断,前两种分开报,人才敢归档
续写之前先看尾巴
有一次它补日记,凭印象往下写,结果中间空了一整晚的档
现在这条也写进规矩了:要追加东西之前,先读一眼最后一条到哪了,一条命令的事,省的是那种「结果看着挺合理、其实是错的」的错
让另一个模型来骂自己
这套东西我自己查了半个月,觉得没问题了
后来我把它丢给 codex 一轮一轮审,只读不改,前后六轮,一共挑出五十来条,其中几条是真 bug
- 隐藏目录的判据漏了「最后一段」,于是
.tmp/这种临时目录被当成「有内容却没有说明文件」乱报 - 「可恢复」这个分支对按路径写的引用根本触发不了,因为后缀匹配把归档目录也算成「文件还在」,那个分支写了等于没写
- 归档目录如果不起点开头的名字(比如直接叫
archived),整套机制被绕过,两个检查器还互相拆台 - 文档里承诺「备份脚本会强制备份不落在被保护目录里」,脚本其实没做,是句空话
教训很直白:检查器自己也得被检查,而且自己审自己没用,得换个模型、换套上下文来审
后来就开了
审干净之后我把这套东西抽象成了一个参考项目,所有内容都是编的,示例里的 AI 叫 Alice,用户叫 Sam,主机叫 example-host,跟我家这台玩意一点关系都没有
里面就三样东西
- 四份上下文示例文件,加一份说明为什么这么分层、每层该放什么
- 六个脚本:改前备份、改后比对、快照、备份归档、指针检查、索引体检
- 一个自测脚本,58 个用例,每个检查都验两个方向:改措辞必须过、真删内容必须被抓
想拿来用的话,clone 下来跑一行就行
./scripts/selftest.sh它会把这套工具在示例数据上全部走一遍,你不用信文档,直接看它自己跑出来的结果
现在还烂(只是烂得起来了
写完这些没啥子总结的
我一直觉得,日志的价值不在于证明成功,而在于让失败能被发现
笔记也是
2026-09-12,在它又一口咬掉两行之后写的这堆
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时