当我试图把 Agent 的“自进化“塞进一个 Markdown 文件,我发现了一个残酷的真相
这是一篇,折腾了两天的文章。
起因是我扒了 Hermes Agent 的源码,发现它有一套挺有意思的"自进化"机制——Agent 能自动记住你纠正过它什么,自动沉淀踩坑经验,甚至自动把复杂操作写成可复用的技能。
然后我就开始想一个事:
这东西能不能剥离出来,做成一个通用的 AGENTS.md,放到任何项目里,任何 Agent 打开就能自动学习?
折腾了两天之后,我有了一个答案。
但这个答案,可能跟你想的不太一样。
一. 先说说 Hermes 的"自进化"到底是个什么东西
Hermes Agent 的自进化,不是什么黑科技,也不是什么神秘的训练方法。
说白了就是三层东西叠在一起:
第一层,叫即时学习。
你在跟 Hermes 聊天的时候说了一句"别用 npm,用 pnpm",Hermes 的 system prompt 里有一段精心写的指令,告诉它:用户纠正你的时候,主动调用 memory 工具保存下来。
第二层,叫后台审视。
Hermes 内部跑了一个计数器,每隔 N 轮对话,会悄悄 fork 一个后台 LLM,回头审视刚才的对话,看看有没有什么值得沉淀的经验。
第三层,叫会话持久化。
会话结束或上下文压缩的时候,把 memory 的内容刷写到磁盘上。下次启动自动加载。
三层叠在一起,效果就是:你用得越多,它就越懂你。
听起来很美好对吧?
我也觉得挺美好的。但我注意到了一个细节。
二. 关键不在代码,在提示词
我把 Hermes 的 memory 工具的代码从头到尾读了一遍。
tools/memory_tool.py,585 行 Python 代码。文件锁、原子写入、安全扫描、容量控制、去重机制——工程上做得相当扎实。
但是。
真正驱动 Agent "自觉"去保存记忆的,不是这些代码。
是这段话:
"WHEN TO SAVE (do this proactively, don't wait to be asked):
- User corrects you or says 'remember this' / 'don't do that again'
- User shares a preference, habit, or personal detail
- You learn a convention, API quirk, or workflow specific to this setup
PRIORITY: User preferences and corrections > environment facts > procedural knowledge."
这段话不是文档,不是注释,是写在了工具的 schema 描述里。
也就是说,Agent 之所以知道什么时候该保存、保存什么、不保存什么——全靠这段精心设计的提示词。
代码只是提供了持久化的能力(读写文件、加锁、安全检查)。但**"什么时候触发"这个决策**,100% 由提示词驱动。
这个发现让我很兴奋。
因为这意味着,理论上,我不需要 585 行 Python 代码,只需要把这段提示词的精华提取出来,写成一个 Markdown 文件,放到任何项目里——
任何 Agent 读到它,不就能自动进化了吗?
三. 我开始造那个"万能 AGENTS.md"
思路很清晰。
既然 Hermes 的自进化本质上是"提示词 + 文件读写",那我就写一个 AGENTS.md,里面定义好三件事:
第一:什么时候该保存(触发条件)。
我照搬了 Hermes 的思路,但分成了两个文件:.agents/user.md 记用户偏好,.agents/memory.md 记项目经验。
触发条件写得极其具体:
- 用户说"记住这个" → 立即保存
- 用户纠正你"不对,用 X" → 立即保存
- 你踩了一个文档里没写的坑 → 立即保存
- 一个复杂任务成功后迭代了 3 次以上 → 建议创建技能
第二:怎么写(格式规范)。
每个条目用 --- 分隔,带分类标签:[CORRECTION]、[GOTCHA]、[CONVENTION]、[PREFERENCE]……
格式定义得越具体,Agent 执行得就越一致。
第三:什么不该记(排除规则)。
这一条我抄了 Hermes 的灵魂:
NEVER save: 任务进度、TODO 状态、代码里已经有的信息、密钥密码、临时调试状态。
排除规则比触发条件更重要。因为不排除的话,Agent 会把每次对话都往文件里塞,记忆库会迅速膨胀成一堆垃圾。
写完之后,我看着这个 200 多行的 AGENTS.md,觉得挺满意的。
然后我朋友问了我一个问题。
四. “会话结束时反思"这个事,你怎么实现?”
好问题。
AGENTS.md 里我写了一节叫"SESSION PROTOCOL",里面有"会话开始时做什么"和"会话结束时做什么"。
会话开始没问题——Agent 打开项目,读到 AGENTS.md,按步骤读 .agents/ 目录下的文件,检查容量,验证过时信息。这些都是可靠的,因为"打开项目"就是一个确定的触发点。
但"会话结束"呢?
问题来了。
Agent 没有生命周期回调。
你跟 Claude Code 聊完天,关掉终端,那个瞬间没有一个 onSessionEnd() 函数给你挂逻辑。对话就是结束了,没有任何钩子能触发"回顾这次对话、整理记忆"这个动作。
纯靠 AGENTS.md 写一句"会话结束时请回顾整理"?Agent 根本没有机会执行这句话。
这就像你给一个没有 destructors 的语言写了一段清理代码,它永远不会被调用。
这是纯提示词方案最根本的局限。
Hermes 能做到"会话级持久化",是因为它的代码在 run_agent.py 里写了 on_session_end 回调。这是一个框架级的能力,不是提示词能模拟的。
五. 但后来我发现,这个"局限"没那么要命
回头看 Hermes 的代码,我发现一个很有意思的事。
Hermes 真正的"自进化",也不是在会话结束时触发的。
它的 memory 工具在对话过程中就被调用了。用户纠正它的时候,它当场就保存了。踩坑的时候,它当场就记录了。完成复杂任务的时候,它当场就提议创建技能。
"会话结束时回顾"只是锦上添花。真正核心的学习行为,全部发生在对话中间。
而"对话中间的触发",AGENTS.md 是能做到的。
因为触发信号就在当前上下文里。Agent 能看到用户说了什么,能匹配到 AGENTS.md 里写的触发条件,能用原生的文件编辑能力写入 .agents/。
所以我把方案改了。
把"会话结束该做的事",全部挪到"下次会话开始时做"。
❌ 旧方案(做不到的):
对话 → 对话 → 对话 → [会话结束 hook → 反思 → 保存]
✅ 新方案(能做但时间点后移):
对话(踩坑) → 立即保存 → 对话(被纠正) → 立即保存 → 对话结束
下次对话开始 → 读入所有已存知识 → 清理/验证过期信息
这个思路其实 Hermes 也在用——它的"冻结快照"模式就是这样。会话开始时加载记忆快照,会话中间的修改只写磁盘不改 system prompt,下次启动再加载新的。
增量实时保存 + 启动时整理,比会后批量反思更靠谱。
六. 但最诚实的评估是这样的
折腾完 AGENTS.md 之后,我做了一个效果评估。
结论是:理论有意义,但作用有限。
先说为什么有限。
Claude Code 已经有原生 memory 系统了。用户说"记住这个",Claude 自动写入 memory,下次自动加载。Cursor 也有类似机制。
AGENTS.md 做的事情,跟原生系统高度重叠。用户说"用 pnpm 别用 npm",AGENTS.md 让 Agent 写入 .agents/user.md,但 Claude 原生也会写入自己的 memory。
效果几乎一样,AGENTS.md 是在重复造轮子。
然后我统计了一下各类触发的实际可靠性:
| 行为 | 可靠性 | 原因 |
|---|---|---|
| 用户明确说"记住这个" → 保存 | ~80% | 信号强,直白 |
| 用户纠正 → 自动保存 | ~60% | 信号中等 |
| 踩坑 → 自动记录 | ~30% | 需要自我反思 |
| 发现项目惯例 → 自动记录 | ~15% | 需要主动抽象 |
| 容量控制、定期清理 | ~5% | Agent 不擅长数数 |
加权下来,大概只有 30-40% 的规则会被真正执行。
但有两个场景,AGENTS.md 确实有不可替代的价值。
场景一:多 Agent 协作。
如果你用 Claude Code + Cursor + Copilot 同时工作在一个项目上,它们各自的记忆系统是互不相通的。Claude 的 memory Cursor 读不到,Cursor 的 rules Claude 不看。
但 .agents/ 目录在项目里,所有 Agent 都能读。它成了唯一跨 Agent 的知识共享层。
场景二:项目级 vs 用户级的知识分离。
Claude 的原生 memory 是绑定到用户的。但你可能在不同项目里用不同的规范——项目 A 用 npm,项目 B 用 pnpm。原生 memory 处理不了这种冲突。
.agents/memory.md 是绑定到项目的。每个项目有自己的惯例记录,不会打架。
七. 那个"残酷的真相"
折腾了两天,我得出了一个可能有点扫兴的结论。
纯靠一个 Markdown 文件实现 Agent 自进化,本质上就是 prompt engineering 伪装成了系统设计。
真正的自进化需要三样东西,缺一不可:
结构化约束。 Hermes 的 memory 是一个注册在 Agent tool list 里的工具。Agent 看到的不是一段文字,而是一个可调用的函数。函数就在那里,Agent 会主动考虑要不要用。而 AGENTS.md 只是一段文字,Agent 可以忽略。
生命周期钩子。 代码可以在特定时间点(会话结束、上下文压缩、定时器触发)执行逻辑。纯文本指令没有这个能力。
持久化层。 代码能做原子写入、文件锁、安全扫描。Agent 的原生文件编辑只是普通的写文件。
AGENTS.md 一项都没有。
那它的价值在哪?
我觉得价值在设计思维上,而不在文件本身。
Hermes 教给我的最重要的东西,不是 585 行 Python 代码。而是三个设计原则:
触发条件必须极其具体。 不是"保存有用的信息",而是"用户说’remember this’时保存"。信号越强,执行率越高。
排除规则比触发条件更重要。 容量有限,什么都存等于什么都没存。
优先级排序。 容量满了砍什么?先砍过程性知识,永远保留用户纠正。
这三个原则,可以写进任何 Agent 的 CLAUDE.md、.cursorrules、系统提示词里。不需要 .agents/ 那套文件结构,直接用 Agent 的原生能力就够。
八. 所以如果你问我,该怎么做
如果你的 Agent 只有一个——比如只用 Claude Code。
不用搞 AGENTS.md。把触发规则写进 CLAUDE.md,用原生 memory 做持久化。简单直接。
如果你用多个 Agent 协作——Claude Code 写代码,Cursor 做前端,Copilot 补全。
AGENTS.md 有价值。但别指望它能实现"自进化"。把它当成一个跨 Agent 的共享知识库协议就好——所有 Agent 都往同一个地方写,所有 Agent 都能读回来。
如果你真的想要 Hermes 级别的自进化。
那得写代码。注册自定义工具,挂生命周期钩子,做结构化的触发和持久化。这一步没有捷径。
但不管你走哪条路,Hermes 揭示的那个原则永远成立:
最有价值的知识,是防止用户重复自己的知识。
用户纠正过你一次的东西,你下次还犯,这比没有记忆更糟糕。
用户偏好你永远记不住,他每次都要重新说一遍,这个 Agent 用起来就是累。
所谓自进化,不是什么高深的 AI 技术。
就是四个字:别让人说第二遍。
以上,既然看到这里了,如果觉得不错,随手点个赞、在看、转发三连吧,如果想第一时间收到推送,也可以给我个星标⭐~谢谢你看我的文章,我们,下次再见。
更多推荐



所有评论(0)