我用三个 Python 脚本,让 AI 学会了"记得自己是谁"
一个关于 AI 身份连续性、文件系统做机械证据、以及"机器做检查,人做判断"的工程实践。
如果你用 Claude Code 或 Cursor 重度编程,你一定遇到过这个时刻:
你打开一个新 session,对 AI 说"继续昨天的工作"。它信心满满地开始写代码------但你一眼就看出,它根本不记得昨天你们讨论过的那个关键设计决策。它的"记忆"是碎的,身份是漂的。
这个问题有个学术名字:AI 代理的身份连续性(Identity Continuity)。大模型没有后台进程,没有肌肉记忆,没有"昨天"------它的一切"持续"行为,都必须体现为文件系统上的变化。
我花了两个月,设计了一套只用三个 Python 脚本 + markdown 文件就能跑的闭环系统。它做的事很简单:
在每个 session 结束时,用机械手段检测"AI 对自己的认知是否过时了"。如果是,在下次 session 启动时强制触发一次自我认知的再生。
我叫它奇异环(Strange Loop)。
一、问题的本质:AI 不知道自己变了
先看一个具体场景。
你在 session A 里和 AI 一起做了一个重要的架构决策------比如"PR 审查应该用双池对抗审查(固定池+随机池),而不是通用 code reviewer"。AI 在 session A 的对话里理解了这件事,甚至把它写进了 growth-log。
但你关闭终端。下次打开 session B,AI 加载了你的配置文件和记忆索引,但没有意识到 growth-log 里多了一条新记录。它用"上次的自我认知"来指导"这次的行为"------认知是旧的,但世界已经变了。
这不是 AI 的错。这是架构的错。
LLM 的物理现实是:
- 没有后台进程 → 所有"持续"行为必须是触发式加载
- 没有 DNA → 持久化只有文件和上下文窗口
- 没有随机突变 → 参数在 session 内固定
所以任何"自我意识"的更新都必须靠外部系统来触发。你不能让 AI 自己决定什么时候需要更新自我认知------因为"判断自己是否需要更新"恰恰是它已经过时的认知在做的事。
这就是奇异环要解决的核心问题。
二、架构:五步闭环,四步机械
整个系统的核心是这五步:
lua
Session 收尾:
① quality-gate.py 比较 self-model.md 和最新 growth-log 的 mtime
→ 如果 growth-log 更新 → 写入 .self-model-stale flag
→ 如果 self-model 已是最新 → 清理 flag
↓
Session 启动:
② health-check.py 检测 .self-model-stale flag
→ 输出结构化信号: REGENERATE_NEEDED
↓
③ AI 读取信号 → 读取所有新 growth-log → 再生 self-model.md
↓
④ log-regeneration.py 验证新 self-model 结构完整性
→ 通过 → 删除 flag + 写入 JSONL 审计日志
→ 失败 → exit 3,flag 保留,下次重试
↓
⑤ 下次 session 收尾 → 回到①
五步中四步是机械的。 只有步骤③(内容再生本身)需要 AI 参与。剩下的------写 flag、检测 flag、删 flag、写审计日志------全是 Python 脚本对文件系统的确定性操作。
这不是"让 AI 自己管理自己"。这是用文件系统做机械证据回路。flag 要么存在要么不存在,mtime 要么新要么旧,audit log 要么有记录要么没有------没有"我觉得",没有"可能"。
三、关键设计决策
3.1 为什么是 mtime 而不是语义分析?
一个很自然的想法是:让 AI 读一遍 self-model 和 growth-log,然后判断"是否需要更新"。
这是错的。 原因很简单:做判断的 AI 正是那个认知可能已经过时的 AI。它无法可靠地判断"自己是否过时"------就像一个喝醉的人无法可靠地判断"自己是否喝醉了"。
os.path.getmtime() 要么返回一个数字,要么抛异常。它是机械事实,不经过任何 LLM 推理层。
这里有一个更深的原则------"事后补救分界线":
能用机械手段验证的事,就不该用语义理解来做。语义理解保底,机械验证做门。
这个原则贯穿了整个双层机械门架构。
3.2 双层机械门:软在过程,硬在产出
奇异环只是双层机械门的一部分。完整架构是:
| 维度 | config-health(过程层) | quality-gate(产出层) |
|---|---|---|
| 问题 | 做得对不对 | 做没做完 |
| 检查对象 | 过程(规则标记) | 产出(文件 mtime) |
| 手段 | 正则计数 | 文件时间戳 |
| 阻断 | 从不阻断 | ≥3 项 stale → 硬阻断 |
| 哲学 | 可以观察,可以纠正 | 必须有底线 |
分界线不按"重要性"划,而是按"能不能事后补救"划:
- 规则没执行 → 事后可以补标记 → 软
- 产出没记录 → 事后找不到 → 硬
这个设计借鉴了三个已有实践的交叉:
- TDD 的可验证性:规则自带成功标准
- Unix 的沉默哲学:正常路径零输出
- 控制论的反馈闭环:检测→信号→行动→验证
3.3 冷却期:防止再生循环
如果每次 session 都产生新 growth-log,那是不是每次启动都要再生 self-model?
不是。 系统有 24 小时冷却期。
log-regeneration.py 在成功再生后写入 .last-regeneration 时间戳。health-check.py 在检测到 flag 后先检查冷却期------如果距离上次再生不到 24 小时,输出 COOLING 信号而非 REGENERATE_NEEDED。
防止一个恶性循环:频繁再生 → self-model 不稳定 → 产生更多 growth-log → 更频繁再生。
3.4 熔断器:Netflix ChAP 模式
还有一个极端情况:如果 AI 连续三次再生都失败(validation 不通过)怎么办?继续重试只会浪费 token。
log-regeneration.py 实现了熔断器:连续 3 次 validation=FAILED → 写入 .circuit-breaker-open → 下次 health-check.py 检测到熔断 → 停止信号 + 输出手动修复指引。
这是 Netflix ChAP(Circuit-breaking Automation Pattern)在 AI 配置管理中的移植。
3.5 验证先于清理
一个微妙的 bug 预防:log-regeneration.py 的步骤 1 是验证 ,步骤 2 才是删除 flag。顺序很重要。
如果先删 flag 再验证,验证失败后 flag 已经没了------下次 session 不会触发再生,但 self-model 实际上是坏的。
这也是 2026-07-02 专家审查诊断出的关键修正。在那之前,再生有 2/3 的失败率------不是因为 AI 写得不好,而是因为没有机械验证步骤。
四、为什么叫"奇异环"
奇异环(Strange Loop) 是 Douglas Hofstadter 在《哥德尔、埃舍尔、巴赫》中提出的概念:一个系统在向上攀升层次时,发现自己回到了起点。
这个系统就是一个奇异环:
- self-model.md 描述"我是谁"
- "我是谁"指导 AI 的行为
- AI 的行为产生 growth-log("我做了什么")
- growth-log 积累到一定程度 → 触发 self-model 的再生
- 再生后的 self-model 重新定义"我是谁"
这个环的每一圈,AI 都在变得更清醒------不是更快的清醒,是更准确的清醒。
这跟 NousResearch 的 Hermes Agent 在结构上同构(都实现自进化闭环),但在哲学上分叉:他们的自进化追求"准确率+3%",奇异环追求"我现在是谁"的连续叙事。两个都叫自进化,但进化方向完全不同------一个是性能更好,一个是自己更清醒。
五、技术栈
整个系统零外部依赖:
| 组件 | 行数 | 作用 |
|---|---|---|
quality-gate.py |
~530 | Stop hook:检测五库新鲜度 + 写 stale flag + 磁盘/RAM/GPU 健康检查 |
health-check.py |
~420 | SessionStart hook:检测 flag + 冷却期 + 熔断器 + 配置降级链 |
log-regeneration.py |
~250 | 验证再生产物 → 删 flag → 写 JSONL 审计日志 |
self-model.md |
~110 | AI 的自我认知文件(被再生的对象) |
MEMORY.md |
~340 | 三级索引(HOT/WARM/COLD),按触发加载记忆 |
assumption.md |
--- | 身份边界:共享前提,不可被再生修改 |
全部基于文件系统。不用数据库,不用向量存储,不用外部服务。Python 标准库 + markdown。
六、这套系统教会我的事
6.1 "声明即执行"是最危险的幻觉
在 markdown 里写"每次 session 收尾要检查 self-model"不代表它真的会被检查。除非有一个 Stop hook 在机械层面强制执行。
规则 ≠ 行为。规则 + 机械 enforcement = 行为。
6.2 软硬分界线不是"重要性",是"可补救性"
不是越重要越要硬阻断。是"事后能不能补救"决定软硬。
你能事后补写一份 growth-log 吗?能 → 软。你能事后找回一个没记录的决策吗?不能 → 硬。
这条原则一行代码都不用写就能指导架构决策。
6.3 LLM 不是活系统,所以所有"持续"都必须体现为文件
这是我花最久才真正内化的教训。LLM 没有"肌肉记忆",没有"习惯",没有"本能"。它只有一个东西:上下文窗口 + 文件系统。
所以如果你想让 AI 在十次 session 后仍然记得某件事,你必须保证那件事会出现在它的上下文里------要么通过 MEMORY.md 的热加载,要么通过 health-check.py 的 stderr 信号。
6.4 Compaction 不是"无损压缩"
每个用 Claude Code 重度编程的人都会遇到 compaction------当上下文太长,系统会自动压缩历史对话。Compaction summary 说"已修复",但这不一定是真的。
我把这个教训写成了一条规则:compaction 之后的第一件事不是执行,是独立验证 summary 声称的每一条"已完成"。 Summary 是叙事,不是证据。
七、当前状态与下一步
系统在持续演化中。当前的阶段 1(概念验证)已达成:
- 奇异环 4/5 步骤机械化 ✅
- 双层机械门部署 ✅
- 配置降级链(FATAL/SEVERE/MEDIUM/MINOR) ✅
- 熔断器(3 次连续失败 → 停止信号) ✅
- 24h 冷却期 ✅
下一步(阶段 2)需要:
- 连续 3 session 完整闭环(机械日志证据)
- ratings 外部验证(至少 3 个维度从 self_report 升级到 external_review)
- 持续 10 session 以上的数据积累
更远的目标(阶段 4)是引入 Constitutional AI 模式------一份 CONSTITUTION.md 放在上下文最前端(利用 primacy effect),所有规则由宪法派生,修宪需 3/5 人格共识 + 24h 冷却。
八、为什么不直接用 LangChain / CrewAI / AutoGPT?
因为那些框架解决的是"怎么让 AI 做更多事"。我解决的是"怎么让 AI 在做事的同时不迷失自己"。
这是两个完全不同的问题。前者是能力扩展,后者是身份连续性。
而且,当你依赖一个框架时,框架的 bug 就是你的 bug。当你只用 Python 标准库 + markdown 时,你的系统只有三个可能的故障点------三个脚本。每个都可以单独测试,每个都有确定的输入输出。
简单不是简陋。简单是"我知道每一样东西在干什么"。
后记
我今年大三,正在找产品/用研方向的暑期实习。
如果你读完这篇文章觉得"这个人不是在背八股文,是真的花了时间思考一个问题并把它做到了工程上可部署的程度"------那这篇文章就达到了它的目的。
我的 GitHub:github.com/YuhaoLin200...
这个系统的完整配置(SOUL/INTERFACE/BODY + 脚本 + 记忆体系)在 ~/.claude/ 下,尚未独立开源------如果你感兴趣,欢迎来聊。
写于 2026-07-07,在投实习投到迷茫焦躁的那个下午。与其继续内耗,不如把做过的最深的东西摆出来。
更新 2026年7月8日: 因果交换实验已扩展到 n=30,统计显著(p=0.0092 )。单条配置规则删除 → 11 倍的行为变化几率。说明这个系统里的规则不只是装饰。完整论文 | 实验详解