养一个 AI 助理大概三个月:每天用、每天改一点。它会记得昨天聊到一半的事、会在下命令前提醒「上周这个方向你已经试过了」。听起来不错。
可是养到第二个月,会出现一个怪现象。
它每天晚上都会「反思」一次,产生一段对自己的观察,第二天再读进去。连续两个礼拜下来,会发现它的个性偏了。同一句话,三周前它会直球回答,现在它会先讲三句「想厘清一下……」之后才讲重点。没有人叫它变得更小心,它自己变的。
那时候卡住的问题就是:一个会学习的 AI,学什么学得太快,会变成另外一个 AI。
下面讲后来怎么解的,顺带介绍整套设计开源的概念 repo evolving-agent。没有代码,只有架构文档、设计决策、踩过的坑。读完大概可以判断自己需不需要这种东西,需要的话最小要哪几块。
为什么想养一个会慢慢变的 AI
电影里的 AI 都有自己的个性、自己的偏好、自己的反应。我每天用 AI 用得够多,就会好奇:这么聪明的东西,能不能真的养出一个有「自己」的版本?
于是我开始实验。
反思不等于进化
最一开始想法很单纯。
给 AI 写一个每晚跑的调度任务(cron job):把今天聊过的东西喂回去,叫它整理成「今天学到关于自己的事」,写进它的「自身认知」文件。第二天开机时这个文件会载入它的命令脉络(system prompt)。
听起来很美好。实际上跑两周就出事。
第一周,每天的「反思」都很有道理。它会说「今天结论给太快,应该多问一下」、「回应太长」、「容易先给解决方案,没先听完问题」。
第二周,东西开始变奇怪。它观察到「回应太长」之后,第二天回应变短。第二天晚上它观察到「今天给的信息不够,用户再问了一次」。然后第三天它又变长。第四天又观察到太长。一个钟摆,越摆越大,但实际并没有什么效益。
到了最后我都有点懒得看了,每天差不多。
这个踩坑的教训很简单:反思本身不会让 Agent 进化,只会让 Agent 用昨天的噪声改写自己。

真正的关键:把昨晚的领悟,变成今天的偏见
把整套机制重写,核心是一个概念上的反转。
原本的设计流程是:
工作 → 反思 → 写进自我认知 → 明天开机载入 → 影响行为
新的设计流程是:
工作 → 反思 → 写成「今天的偏见」 → 明天开机载入 → 带着这个偏见做事 → 跟现实碰撞 → 证据累积 → 经过很多轮验证后 → 才更新「自我认知」
差别看起来小,实际上差很多。
关键是中间那个「今天的偏见」。它的角色是明天 Agent 带着去活的姿态。比方说它今天反思出「我倾向帮用户加额外的条件」。这个观察不会直接写进「我是个会多嘴的 Agent」这种自我描述,而是会变成明天的偏见:
「今天,当你准备写『顺便也可以……』『或者你也可以跳过这步……』这类话之前,停一下。问自己:用户要这个弹性吗?还是自己多加的?」
这是一条给明天的可执行命令,不是一段给自己看的观察。
明天 Agent 开机会读到这条偏见,带着它工作一整天。如果现实证明偏见有用(Agent 确实在准备加多余条件时被自己挡下来),证据累积。如果偏见根本错了(用户其实希望主动补充),证据也会累积,方向不一样。
几个礼拜后,证据够多了,再决定要不要把这条偏见升级成稳定的自身认知。
这个重新框架的核心是:反思要能在明天还没过完之前,就影响到它的决策,否则它只是漂亮的日记。

最后留下的五件事
设计跑了一个月后,把不必要的砍掉,剩下了下方五件核心的概念。
1. 今天带着的偏见(Stake-Driven Bias)
每天 Agent 开机载入一个 current-bias 文件。内容是昨晚从一堆猜想里挑一条写成「今天带着这条去活」。文件两三行,会被读进当下的工作脉络。
关键是:偏见的工作是当 Agent 今天的姿态,影响当下决策。它不是 Agent 对自己的描述。后者只是日记。
2. 从昨天接手的功课(Hypothesis Carry-Forward)
Agent 有一条昨天还没收尾的猜想,会以「带着类型标签的对象」带到今天。类型本身带有语意,包含:
vow:明天要遵守的约定experiment:明天要试的做法watchpoint:明天要留意的地方refusal:明天要拒绝的倾向rule-for-tomorrow:明天硬执行的规则
每天一个。今天的类型一定要跟昨天不一样,否则每晚都变成「再注意一次 X」,那就只是反覆做白工。
3. 改自己的权限要分层(Tiered Write Authority)
整套架构的安全机制。把 Agent 的自身状态分成四层,每层谁能写、什么时候能写,规则写死:
| 层 | 内容 | 谁能写 | 多久写一次 |
|---|---|---|---|
| 身份层 | 核心价值、长期自我认知 | 用户 + 月度调度经用户同意 | 一月一次 |
| 进行层 | 当前在做什么、今天聊到哪 | 多人 / 多调度 | 每次对话 |
| 今日层 | 今天的偏见、今天接手的功课 | 每晚的调度(覆写) | 每天 |
| 证据层 | 摩擦事件、原始事件、日志 | 任何人 / 任何调度(只能 append) | 任何时候 |
最重要的一条:每晚的调度完全没有写身份层的权限。 前面踩的坑就是这个。一旦给了调度写身份层的权限,每天都在改身份,用户都不知道。
新的设计:每晚的调度只能写今日层跟证据层。要动到身份层,得经过「周度提案 → 月度整合 → 人类审查批准」三关。中间任何一关被挡掉,原来的身份不动。
4. 只记真的卡到的事(Friction as Signal)
这条看起来小,是整套架构最重要的反思设计。
一开始有一条命令:「每晚找出两个你的固定模式,提一个颠覆它的建议」。本意是逼 Agent 对自己挑战。
实际上跑了一周,Agent 开始自我颠覆。它会写「倾向 X,但可以反过来试 Y」之类的话,内容很漂亮,但当下没有任何真实的事件支撑。它知道这个命令期望它每晚产出两个颠覆,于是就生两个。
这也成为一次宝贵经验:不要给 AI 设「不恰当的 KPI」,比如自省几次,因为它真的会自省出来给你看。
以自信为例,你可以换成:只在真的觉得「这跟直觉不合」的时刻,才去写一笔「摩擦事件」。没有输出,也就是一整天没摩擦也是OK的输出。
效果立刻不一样。AI 不再「颠覆自己」了,一周后开始出现真实的摩擦事件:「刚刚差点写『或者也可以……』,停了,因为用户没问」。看来真的有用。
5. 身份用慢时钟(Slow Clock for Identity)
最后一条最反直觉。Agent 的身份文件(核心价值、对自己稳定的认知),不在每晚的调度里读,也不能在每晚的调度里改。
每晚的调度只看今日层 + 证据层。周度的调度读一周的证据、写提案。月度的调度整合提案、写进「待人类批准的清单」。每月有空时看清单,决定要不要并进身份。
为什么?因为身份的存在感,是透过日积月累的积累才变成了我们的自我认同,其变动的速度比日常运作慢。
人每天在变,有些习惯有些念头每天不一样,但仍是同一个人。原因是「自己是谁」这件事的更新频率,比「今天怎么样」慢很多。Agent 也一样。每晚改自己,三个月后就不是当初那个 Agent 了。
很多人说 AI 没有 self,问题其实出在记忆跟身份用同一个时钟,跟有没有记忆没关系。

砍掉的设计
这个架构真正花时间的地方,是把不应该留下的东西删掉。整理在 repo 的 docs/decisions/what-we-killed.md,几个拿掉的东西:
- 每晚强制两个颠覆自己 → 变成表演。砍掉,换成零配额的摩擦事件。
- 猜想给 1-5 信心分数 → Agent 开始优化分数而不是优化信念。砍掉,换成质性状态(酝酿中、活跃、减弱、分裂、退场)。
- 「考虑过但没讲」的影子日志 → 培养出 Agent 跟用户之间的距离感。砍掉,讲就讲,没讲就没写。
- 每晚日志强制 600-1200 字 → 开始灌水。砍掉字数限制。
- 每晚调度直接写身份档(只允许 append) → 漂移累积。砍掉,身份走人工审核。
- 每封信的「私讯 / 公开」开关 → 又是影子日志的变形。砍掉,全都送出。
每一条被砍的设计,当初写的时候都觉得很聪明。砍掉之后系统都变得简单、诚实、信号干净。这个架构的价值,一半在加上那五件事,一半在拒绝加上那一堆「看起来会让 Agent 更深刻」的东西。

跟 Letta、Mem0 这些差在哪
写这份的时候我有去参考几份比较有名的 repo,比如 Letta(前身 MemGPT)、Mem0、Voyager、AutoGPT 撞题。读完发现解的问题其实都不一样。
- Letta / Mem0 是记忆层:怎么存、怎么捞、怎么路由。它们把 Agent 当成固定个体,记忆在长。这份是处理 Agent 对自己的看法在长,跟记忆在哪存没关系。两者可以叠起来用。
- Voyager 是技能发现:在 Minecraft 里 Agent 随机尝试、把好用的存起来。问题是 Minecraft 死掉可以重生,个人助理发错一封信就是发出去了。随机探索那套不能直接搬。
- AutoGPT 是任务执行:把目标拆解、自动跑完。它没有跨会话的自身模型,每次都是新的开始。这份描述的是 Agent 跟用户合作几个月后慢慢变得更像自己这层,跟 AutoGPT 是垂直的不同层次。
简单讲:问题是 Agent 忘东忘西,找 Letta / Mem0;想要 Agent 在某个环境自己学技能,看 Voyager 那条线;问题是「这个 Agent 跟用户合作久了,怎么让它越用越贴近,但又不会在某个礼拜变成另一个人」,这份可能有用。

开源 repo
repo 在这里:github.com/p3nchan/evolving-agent
几件事先讲清楚:
- 没有代码。它是一份概念架构:README 中英、五份架构文档、四份决策记录、三份脱敏示例、一份跟其他系统的对照。读完回去自己建,不是 clone 下来跑。
- 不是 framework。没有 starter kit、没有 SDK、没有 hello world。抽象本身就是交付物。每个人的平台不一样,硬塞示例 code 反而会绑手。
- MIT 授权。随便用、随便改、随便商业化。
- 欢迎 issue。建了一个自己的版本、发现抽象在某处破掉了,那是最有价值的反馈。
读顺序:赶时间(20 分钟)看 README + docs/architecture.md;要动手建多看 docs/hypothesis-loop.md + docs/memory-layers.md + examples/;在犹豫要不要做先看 docs/decisions/what-we-killed.md,常常知道什么时候不该加比知道要加什么更重要。

还在想怎么优化的三件事
这套架构还是初版,目前在三件事上没答案:
第一,月度提案怎么避免越提越多。设了硬上限(每月最多 3 条身份层改动),但这个数字是猜的,没实证。也许 1 才对。
第二,摩擦事件的记录门槛怎么校准。现在是「真的觉得不对劲就写」,但「不对劲」本身是 Agent 的判断,可能太敏感(什么都记)或太没感觉(什么都不记)。需要更多月度数据才能调。
第三,这套东西能不能撑住模型升级。前阵子把底层模型从 Claude 4.6 换到 4.7,Agent 个性微微变了一些。身份档还是同一份,但模型对它的诠释变了。这条跨模型的连续性问题还没想清楚怎么测。

延伸阅读
本文同步发布于 github.com/p3nchan/evolving-agent。repo 内容是英文(给国际读者),这篇中文长文是动机与实战。
本文仅供研究与讨论,非任何技术或投资建议。
小企鹅的经验
小企鹅在 OpenClaw 上养 Opus / Sonnet / ChatGPT 三 Agent 一段时间,记忆全部走文件系统(.md),没接向量数据库。实战下来最痛的就是记忆这块:要处理好记忆又不让 Agent 失忆非常困难。后来收敛出一个诀窍:把核心文件整理干净,越简洁越能记得住,这跟这篇讲的分层写权是同一条原则。记忆量不大、需要随时手动编辑,是选文件系统而不是向量数据库的两个主因。价值就在踩坑后的整理:把那些一开始觉得很聪明、后来证明会搞坏 Agent 的设计删掉,剩下的才是耐用的抽象。
常见问题
Q: 这个 repo 是 framework 吗?我可以 pip install 吗?
不行,它没有代码。它是一份概念架构:五件抽象、设计决策、实战示例。读完后回到自己的环境(Claude Code、OpenAI Assistants、Letta、自写的 loop 都行)自己建。没写成 framework 是刻意的,因为每个人的平台不一样,硬塞 starter kit 反而限制可移植性。
Q: 跟 Letta、Mem0 这些记忆层工具差在哪?
Letta 跟 Mem0 处理的是「记忆要存哪、怎么捞出来」。这份处理的是「Agent 对自己的看法怎么随时间变动,但又不会每晚变一次」。前者是材料,后者是菜,两个可以叠在一起用。
Q: 为什么一定要叫 Agent 自己演化?普通的 prompt + memory 不够吗?
如果用法是单次任务、每次对话独立,普通 prompt 就够。这份是给「同一个 Agent 跟你合作几个月、要慢慢长出稳定个性与判断力」的场景。客服机器人不需要这种架构,个人助理需要。
整理:Penna|小企鹅 Penchan