自我进化闭环:从后台审视到强化学习(系列终篇)
导读:一个 agent 不仅能执行任务,还能在后台悄悄审视自己的对话、沉淀技能、把轨迹压缩成训练数据、最终训练出下一代自己。这不是科幻,而是 Hermes 架构的最后一环。本文拆解 s20-s27 共 8 章:用 → 记 → 抽象 → 训练 → 更好地用,完整闭环一次讲透。
先问一个问题:你的 agent 会"长大"吗?
你写过一个能用的 agent。它能调工具、能查资料、能按流程完成任务。
但三个月后,它还是老样子。同样的错误犯三遍,同样的坑踩三次,你手动改 prompt 改到怀疑人生。
LangChain 和 AutoGen 能帮你搭流程,但不会帮你进化。这是 Hermes 从头到尾坚持的一件事。
前 11 篇,我们完成了从环境搭建到工具调用的全部基础。今天收官,聊最后一个问题:agent 如何改写自己?
闭环总览:五个节点,一个循环
先看全景。Hermes 的自我进化不是某个单一功能,而是一条完整的流水线:
用 → 记 → 抽象 → 训练 → 更好地用
- 用:agent 正常干活,产生对话轨迹
- 记:后台审视对话,把值得记的写进 MEMORY.md 或 USER.md
- 抽象:把可复用的做法提炼成 skill 文件
- 训练:把整段轨迹压缩成训练数据,喂给 RL 管线
- 更好地用:新一代模型部署,下次对话自动生效
前三个节点发生在运行时(agent 边干活边学习),后两个节点发生在离线(专门的数据管线)。这就是 s20-s27 的全部内容。
下面逐个拆。
s20:后台审视——agent 的"自我复盘"
最核心的机制叫Background Review(后台审视)。它解决一个问题:agent 怎么知道"这段对话值得记"?
答案是:不用它知道,系统替它盯。
看真实代码,双计数器触发:
self._turns_since_memory=0# 用户消息计数self._iters_since_skill=0# 工具迭代计数self._memory_nudge_interval=10# 触发阈值self._skill_nudge_interval=10每轮结束检查一次。用户消息累计 10 轮,或者工具迭代累计 10 次,就触发_spawn_background_review()。用户手动调 memory/skill 工具时,计数器重置,防止重复审视。
触发后,后台会 fork 一个审查 agent:复制当前 messages 快照、max_iterations=8、nudge_interval=0、daemon 线程、完全静默。它不打扰主对话,干完活就退。
关键是审查 agent 自己不能触发新的审查——nudge_interval=0加独立计数器,双重防护,防止递归爆炸。
两个审视 prompt,防编造
审查 agent 用两个 prompt 审视对话:
- _MEMORY_REVIEW_PROMPT:用户透露了关于自己的事吗?对我行为有期望吗?
- _SKILL_REVIEW_PROMPT:是否用了需要试错才掌握的非平凡方法?可复用吗?
两个 prompt 的收尾都有一句关键的话:
“If nothing is worth saving, just say ‘Nothing to save.’ and stop.”
这句话是防呆设计。没有它,审查 agent 会为了"交差"强行编造记忆——这是所有自进化系统最容易翻车的地方。
s21:技能创作闭环——从手动到自动
有了后台审视,下一步是沉淀。
最笨的实现是什么?人手动改 SKILL.md 文件。没有量化评估,改坏了也不知道,全靠手感。
Hermes 的做法是闭环:后台审视发现可复用做法 → 创建/更新技能文件 → 下次遇到同类任务自动加载。
技能文件长这样:frontmatter(name + description)+ 正文(Steps + 注意事项)。比如 GitHub Actions Python CI 的完整配置流程,第一次试错学会后,沉淀成 skill,下次直接复用。
这就是"抽象"节点:从具体对话中提炼出可复用的方法论。
s22:Hook 系统——不改核心代码的扩展方式
自进化系统有个矛盾:既要改行为,又不能把核心代码改坏。
Hermes 的解法是三类 hooks:
- Gateway hooks:消息生命周期钩子(消息到达、回复发送前等时机触发)
- BOOT.md:启动时执行的自检清单(Startup Checklist)——“检查 API key 存在”"验证环境"等
- Plugin hooks:注册表分发时触发(比如 audit_log 记录每条工具调用)
这套设计的好处是:注入逻辑,不改核心。你想加审计、加日志、加自检,写个 hook 挂上去就行,核心代码一行不动。
s23:Trajectory + RL——对话变成训练数据
运行时学习讲完了,接下来是离线进化。
核心思路一句话:对话轨迹 → 训练数据 → RL 改进模型。
关键组件四个:
- batch_runner:批量跑对话,产出大量轨迹
- trajectory_compressor:压缩轨迹——头尾不压缩,中间摘要(和 s05 的压缩逻辑同理)
- reward 函数:给轨迹打分
- rl_cli:命令行入口,跑 RL 训练
为什么头尾不压缩、中间摘要?因为对话的开头和结尾往往包含最关键的信息(任务目标、最终结论),中间的过程性内容可以摘要化。这和人类记笔记的逻辑一模一样。
从"运行时学习"到"离线进化"
到这里,你已经看到了两种学习:
- 运行时学习(s20-s22):agent 边干活边记,改的是 MEMORY.md 和 skill 文件
- 离线进化(s23):轨迹压缩成数据,训练下一代模型
前者是"换衣服",后者是"换身体"。但两者共享同一个优化循环:打分 → 改写 → 择优。
接下来进入终篇的高潮:s25-s27 的自进化总览。
s25:四层进化目标——风险递进
Hermes 的自进化有四个层次的目标,每一层风险和收益都不同:
| Phase | 对象 | 风险 | 引擎 | 状态 |
|---|---|---|---|---|
| 1 | Skill 文件 | 最低(改坏只影响一个 skill) | DSPy+GEPA | ✅ 已实现 |
| 2 | Tool descriptions | 低 | DSPy+GEPA | 计划中 |
| 3 | System prompt sections | 高(影响所有对话) | DSPy+GEPA | 计划中 |
| 4 | Tool implementation code | 最高 | Darwinian Evolver | 计划中 |
从改一个 skill 到改核心代码,风险逐级递增。Hermes 的策略是从风险最低的开始,跑通闭环后再往上走。
7 步管线:自进化的完整流程
这是 s25 文档的核心图示,也是整个自进化系统的骨架:
1. SELECT TARGET → 2. BUILD EVAL DATASET → 3. EVALUATE BASELINE → 4. CHECK CONSTRAINTS → 5. OPTIMIZE (repeat N) → 6. VALIDATE EVOLVED → 7. DEPLOY步骤 2-4 是度量体系(s26),步骤 5-7 是优化与部署(s27)。每一步都有明确输入输出,不靠运气。
s26:评估体系——没有度量就没有进化
进化没有方向就是随机游走。Hermes 的度量体系三个组件:
LLM-as-judge:适应度函数(FitnessScore)用 LLM 打分。关键设计:rubric 描述而非精确匹配。“好"的定义是"符合 rubric 描述”,不是"输出等于某个字符串"——因为 agent 的任务本质是开放的。
SyntheticDatasetBuilder:合成评估数据集,分 train/val/holdout 三份。防止过拟合到训练数据。
ConstraintValidator:约束门控。版本号、文件大小、测试通过率——不满足约束直接打回,不让劣质进化结果上线。
s27:优化与部署——进化落地
最后一步。优化循环四步走:
收集反馈 → 针对性改写 → 打分 → 择优
注意"针对性"三个字。GEPA 的思路是:先读 trace 理解"为什么"失败,再做针对性变异,而不是盲目随机改。这比纯遗传算法聪明得多——理解原因,再动手。
evolve_skill()完整对接 s25 的 7 步管线。部署流程三步:备份 → 写入 → 下次对话自动生效。永远留后路。
一个重要的架构决策
自进化系统是独立仓库(NousResearch/hermes-agent-self-evolution)。
为什么?因为它是开发时工具,不是运行时功能。它读代码和数据、输出改进文件、通过 git PR 提交——但绝不在用户对话中执行。这条边界划得很清楚:进化是离线的,服务是在线的。
避坑清单:四个最容易翻车的点
- 审视编造:没有 “Nothing to save” 兜底,审查 agent 会强行编造记忆。这是所有自进化系统的头号陷阱。
- 计数器重置:用户手动调 memory/skill 工具后必须重置计数器,否则会重复审视同一段对话。
- 评估标准:用精确匹配做评估是自欺欺人。agent 的任务是开放的,必须用 rubric 描述。
- 约束门控:没有约束验证的进化是放虎归山。版本号、大小、测试通过率,一个都不能少。
系列 12 篇完整回顾
至此,手搓自主 AI Agent:Hermes 架构原理剖析系列全部完结。12 篇完整清单:
| 篇 | 主题 | 对应章节 |
|---|---|---|
| 1 | 生产级 AI Agent 的五层架构 | s00 |
| 2 | 百行 Agent Loop:让模型从"会说话"变成"会干活" | s01 |
| 3 | 自注册工具系统:给 Agent 装上"可插拔的双手" | s02 |
| 4 | SQLite 会话存储与提示词组装 | s03+s04 |
| 5 | 上下文压缩与错误恢复 | s05+s06 |
| 6 | 记忆与技能 | s07+s08 |
| 7 | 安全审批与子 Agent 委派 | s09+s10 |
| 8 | 配置系统优先级链 | s11 |
| 9 | Gateway 与平台适配器 | s12+s13 |
| 10 | 执行环境抽象与定时任务 | s14+s15 |
| 11 | 高级能力扩展:MCP、浏览器、语音视觉 | s16-s19 |
| 12 | 自我进化闭环(本篇) | s20-s27 |
从"能跑起来"到"能干活"到"能记住"到"能调用工具"再到"能进化自己"——你跟着这条路径,手搓了一个完整的自主 AI Agent。
后台审视、技能沉淀、Hook 扩展、轨迹压缩、RL 训练、四层进化、7 步管线、评估体系、约束门控……这些不是孤立的知识点,而是一个闭环。用 → 记 → 抽象 → 训练 → 更好地用,循环往复,agent 才能从"工具"变成"伙伴"。
最后留一个问题给你:如果让你设计第六层进化目标(比改 Tool implementation code 风险更高),你会选什么?欢迎在评论区聊聊你的思路。
参考文献
- Hermes Agent 教学仓库:
agents/s20_background_review.py至agents/s27_optimization_and_deploy.py(本文代码素材,均真实可运行) - Hermes Agent 教学仓库:
docs/zh/s20-background-review.md至docs/zh/s27-optimization-and-deploy.md(后台审视、7 步管线、评估体系详解)
📥源码获取:如需本系列全部源码,请在以下链接克隆:
https://gitcode.com/ganxin7932508/learn-hermes-agent.git