Hermes Agent 自我改进闭环:从经验学习到技能自动生成的工程实现 原创
Hermes Agent 自我改进闭环:从经验学习到技能自动生成的工程实现
AI Agent 的能力边界由什么决定?多数人认为是模型参数、工具数量或提示词技巧。但一个更深刻的答案正在浮现:Agent 能否从自己的经历中学习。传统 Agent 每次对话都是”出厂状态”——同样的错误重复犯,同样的死路反复走,即便用户已经纠正过一次。而具备自我改进能力的 Agent,会把每一次任务都变成一次”升级”:从经验中提炼技能、压缩上下文、建模用户、加固安全。这就是 Hermes Agent(Nous Research)的核心主张,也是本文要拆解的工程实现。
一、为什么”自我改进”是 Agent 的分水岭
我们把两类 Agent 放在一起对比:
| 维度 | 传统 Agent | 自我改进 Agent(Hermes) |
|---|---|---|
| 任务完成后 | 上下文丢弃,一切归零 | 提炼技能,沉淀记忆 |
| 犯错后 | 下次可能再犯 | 记录教训,写入技能陷阱清单 |
| 用户纠正 | 仅本次生效 | 转化为可复用约束 |
| 上下文使用 | 线性增长,窗口爆满 | 结构化压缩,渐进披露 |
| 对用户的了解 | 零或碎片化 | 双用户建模,长期积累 |
| 安全 | 被动依赖提示词 | 主动扫描注入,隔离会话 |
分水岭不在于”能否用工具”,而在于“能否变得更好”。传统 Agent 是状态机,自我改进 Agent 是学习系统。这背后是一整套工程机制,下面按”经验采集 → 技能生成 → 上下文优化 → 安全保障”的闭环逐层拆解。
二、经验采集层:什么值得学习
自我改进的第一步是判断什么值得学。并非所有交互都有学习价值——每天执行几百次简单读取,如果每次都生成技能,只会制造噪音。Hermes 采用信号触发机制,仅在满足以下条件时启动学习流程:
- 任务完成信号:一次复杂任务成功收尾,尤其是需要 5 次以上工具调用的长链路任务,说明其中蕴含了非平凡的执行顺序。
- 错误恢复路径:遇到死路后通过某种方式找到可行路径。这条”死路 → 绕行 → 成功”的轨迹,比成功本身更有价值,因为它记录了不可行的分支。
- 用户纠正:用户明确说”不对,应该这样做”,这是最直接的教师信号,必须沉淀。
- 非平凡工作流:发现了某个工具组合或操作顺序,无法从文档直接推断。
关键设计是选择性学习。采集层用启发式规则过滤”日常噪音”与”高价值经验”,避免技能库被低质量条目污染。这是一个信息筛选问题,不是存储问题——学错东西比不学更糟。
三、自主技能生成:从经验到可复用程序
经验采集到的是原始轨迹,而技能生成把它转化为可复用程序。Hermes 在触发条件下自动完成”轨迹 → 技能”的抽象:把具体的文件路径、任务参数替换为变量,保留稳定的操作序列。
生成的技能必须通过质量清单的校验,不是”记录了一段操作”就叫技能:
技能质量清单(Hermes 校验标准)
1. 步骤程序 —— 有明确的、可执行的步骤顺序
2. 陷阱 —— 记录已知的错误分支与规避方式
3. 验证 —— 有可检查的完成标准,能证明技能生效
4. 体积 —— 单技能 500 行以内,超标则拆分
5. 去重 —— 与新技能高度重复的旧技能被合并或废弃
6. 版本 —— 同一工作流可演进,保留变更历史
这里有一个重要的取舍:技能是”最短能复现结果的程序”,而非详尽的参考手册。超过 500 行的技能说明抽象粒度有问题——它可能混入了多个任务,或把本该按需加载的细节写进了主流程。技能生成与后续的渐进式披露紧密配合,把长内容拆到引用文件里,保持技能主体的精炼。
四、渐进式披露与 Token 效率
技能会越来越多,但上下文窗口是有限的。如果每个技能都全量加载,Agent 很快就会被”知识”撑爆。Hermes 的解法是三级渐进式披露(Progressive Disclosure):
| 级别 | 内容 | 规模 | 加载时机 |
|---|---|---|---|
| Level 0 | 元数据:名称、描述、触发词 | ~100 words | 始终可见 |
| Level 1 | 主程序:步骤、陷阱、验证 | <5000 words | 指令命中触发时加载 |
| Level 2 | 细节:示例、长参考(references/) | 按需 | 只有执行到需要时才加载 |
这套机制的本质是把 Token 预算花在刀刃上。Level 0 让 Agent 仅凭一行描述就能”知道存在什么”,而不必为每个技能付出完整加载成本;只有真正命中触发条件,才逐级投入。它把”知识库大小”与”上下文占用”解耦——技能库可以无限增长,而每次对话的上下文仍被控制住。这与人类专家相似:大脑不常驻所有手册,而是知道”去哪查”。
五、结构化上下文压缩
即便有渐进式披露,单次长对话仍可能逼近上下文窗口上限。Hermes 在对话达到窗口容量 50% 时触发结构化压缩,而不是等到溢出。压缩不是简单截断,而是保留决策的关键骨架:
压缩保留策略(Context 达到 50% 时触发)
✓ 目标(Goal) —— 本次任务要达成什么
✓ 进度(Progress) —— 已做到哪一步
✓ 决策(Decisions) —— 关键取舍及其理由
✓ 文件(Files) —— 涉及的文件与路径
✓ 下一步(Next) —— 剩余步骤计划
✗ 中间推理细节 —— 可丢弃的冗长过程
压缩算法还有三个严格的工程约束:
- 保留首条交互 + 最后 20 条消息:首条定义了任务原意,最后 20 条保留了最近的执行上下文,两者是恢复的关键锚点。
- 不拆分 tool_call/tool_result 对:工具调用与结果必须成对保留。拆开它们会让 Agent 看到结果却不知道哪个调用产生的,逻辑断裂。
- 压缩前刷盘(Flush):把当前内存状态持久化到磁盘再做压缩,防止压缩过程中意外中断导致数据丢失。
这条”50% 触发”的设计很聪明:它留出了一半的窗口余量用于压缩后的后续操作,避免压缩本身占用完剩余空间。
六、双用户建模
自我改进的对象不只是任务,还有对用户的了解。Hermes 的关键洞见是把”Agent 的知识”与”用户的画像”分离存储,避免互相污染:
| 存储区 | Agent 知识 | 用户画像 |
|---|---|---|
| 内容 | 环境事实、工具特性、教训、已完成工作 | 姓名、偏好、沟通风格、技能水平 |
| 来源 | 任务执行中自我观察 | 用户主动表达与行为推断 |
| 更新时机 | 任务完成后、发现新事实时 | 用户提供新信息或偏好变化时 |
| 用途 | 指导任务执行 | 个性化交互方式 |
为什么必须分离?因为两者的更新频率和可信度不同。工具特性是相对稳定的事实;而用户偏好可能随场景变化。如果混在一起,一次”这次用简洁回答”的临时偏好,可能被当作长期事实污染任务执行知识。分离还带来一个隐私边界:用户画像属于”关于人的数据”,需要更谨慎的存储与访问控制。
七、安全优先的记忆体系
记忆与上下文是 Agent 最强大的能力,也是最大的攻击面。Hermes 把安全内建到记忆机制本身,而非依赖事后提醒:
- 注入检测:扫描所有进入上下文的文件内容,查找提示注入模式(prompt injection)——防止恶意文档通过”忽略之前的指令”之类的文本劫持 Agent。
- 会话隔离:MEMORY.md 这类长期记忆仅在主会话(Main Session)加载,在群组/共享会话中绝不加载。这避免了在多人可见的场景下泄露私人信息。
- 敏感信息过滤:明确的规则——敏感信息不入记忆。API 密钥、密码、个人隐私等不会被写入持久化记忆,从源头杜绝外泄路径。
这三点构成一个”安全记忆”的完整思路:入口扫描(防注入)、出口隔离(防泄露)、存储过滤(防沉淀)。自我改进系统因为要持久化更多信息,安全要求反而更高——每一次学习都必须问:这段经验值得冒泄露风险吗?
八、闭环架构:从经验采集到技能应用的完整链路
把以上机制串起来,就是 Hermes 的自我改进闭环。它不是一个单次流程,而是可持续运转的循环:
┌────────────────────────────────────────────────────────────┐
│ Hermes 自我改进闭环 │
│ │
│ 用户任务 ──► 1. 执行(多工具调用) │
│ │ │
│ ▼ │
│ 2. 经验采集 ◄── 完成/死路/纠正/复杂工作流 ◄── 信号触发 │
│ │ │
│ ▼ │
│ 3. 技能生成 ── 质量清单 + 去重 + 版本化 │
│ │ │
│ ▼ │
│ 4. 渐进式披露 ── Level0(常驻) / L1(触发) / L2(按需) │
│ │ │
│ ▼ │
│ 5. 上下文优化 ── 50%触发压缩 + 刷盘 + 保留骨架 │
│ │ │
│ ▼ │
│ 6. 安全保障 ── 注入扫描 / 会话隔离 / 敏感过滤 │
│ │ │
│ └────► 回到 1,技能越用越强 ──► 螺旋上升 │
│ │
│ 贯穿全程:双用户建模(Agent知识 + 用户画像 分离存储) │
└────────────────────────────────────────────────────────────┘
注意这是一个螺旋而非平面循环:每一轮执行都会调用上一轮沉淀的技能,而本轮的新经验又反过来丰富技能库。这正是”自我改进”的字面含义——系统在使用中持续升级自身。
九、对比分析:Hermes 模式 vs 传统 Agent 框架的”学习”能力
| 能力 | 传统 Agent 框架 | Hermes 模式 |
|---|---|---|
| 技能沉淀 | 依赖人工编写或外部 RAG | 任务后自主生成,自动校验质量 |
| 上下文管理 | 窗口满则报错或硬截断 | 50% 触发结构化压缩,保留骨架 |
| 知识加载 | 全量注入或粗粒度检索 | 三级渐进披露,按触发分层加载 |
| 用户理解 | 会话内短期上下文 | 双画像分离存储,跨会话积累 |
| 错误学习 | 每次重新踩坑 | 死路分支写入技能陷阱清单 |
| 安全记忆 | 提示词层面的临时约束 | 注入扫描 + 会话隔离 + 敏感过滤机制化 |
| 扩展性 | 技能增多导致上下文膨胀 | 技能库无限增长,上下文占用可控 |
传统框架的”学习”多半是外挂的——把知识放在向量库里,执行时检索。Hermes 的学习是内生的——它学习的是自己执行任务的元能力(怎么用工具、怎么避开坑、怎么组织上下文),而非单纯的”事实知识”。这一区别决定了长期使用后的表现分化。
十、工程实践:如何在 OpenClaw 中应用这些模式
这些模式并非 Hermes 专属,其工程思想完全可以迁移到 OpenClaw 等 Agent 平台。以下是具体落地点:
1. 技能自动沉淀
OpenClaw 中,复杂任务完成后(5+ 工具调用、找到可行路径、用户纠正),把可复用的操作序列保存为技能文件。用质量清单把关:必须有步骤、陷阱、验证,500 行以内,超限拆分到 references/。
# 技能文件结构示例(OpenClaw)
SKILL.md # Level 0 元数据 + Level 1 主程序
├─ name/description/触发词
├─ 步骤步骤步骤
├─ ## 陷阱(记录已知死路)
└─ ## 验证(完成标准)
references/ # Level 2 细节(长参考、示例)
2. 渐进式披露的落地
把技能拆成”元数据 + 主程序 + 引用文件”三级。每次会话只注入 Level 0(~100 词),指令命中才读取 Level 1,执行到需要处才读 Level 2。让技能库增长而不撑爆上下文。
3. 上下文压缩脚本
为长任务设置压缩触发器。达到窗口 50% 时,压缩当前上下文,保留:目标、进度、决策、文件、下一步,外加首条交互与最近 20 条消息。压缩前先将状态写入工作区文件(刷盘),且绝不拆散工具调用与结果的配对。
4. 双记忆分区
在 OpenClaw 中用两个独立文件/目录:MEMORY.md 存 Agent 知识(环境事实、工具特性、教训、已完成工作),用户画像单独存放(姓名、偏好、沟通风格、技能水平)。两者分离,避免偏好污染任务知识,也便于单独管控隐私。
5. 安全记忆配置
长期记忆(如 MEMORY.md)仅主会话加载,群组/共享会话禁用。进入上下文的外部文件先扫描注入模式。设置硬性规则:密钥、密码、个人隐私绝不写入持久化记忆。
结语
自我改进的分水岭,不是”Agent 会不会用工具”,而是”Agent 会不会用经验”。Hermes 给出了一套完整、可工程化、可迁移的答案:以选择性经验采集为入口,以质量校验的技能生成为核心,以渐进披露 + 结构化压缩为上下文保障,以双用户建模为个性化基础,以安全优先的记忆体系为底线。这套闭环让 Agent 从”每次从零开始”进化为”越用越强”。对任何正在构建 Agent 系统的开发者来说,这些模式都值得在第一时间内置——因为学习能力,才是 Agent 真正的护城河。
附录:Hermes 自我改进模式速查表
| 问题场景 | 对应模式 | 实现要点 |
|---|---|---|
| 任务完成后经验丢失 | 自主技能生成 | 5+ 工具调用、死路、纠正时触发;质量清单校验 |
| 同一个错反复犯 | 技能陷阱清单 | 记录死路分支与规避方式,写入技能 |
| 技能太多撑爆上下文 | 渐进式披露 | Level0 常驻 / L1 触发 / L2 按需 |
| 长对话逼近窗口上限 | 结构化上下文压缩 | 50% 触发;保目标/进度/决策/文件/下一步 + 首条 + 最后 20 条 |
| 工具调用上下文断裂 | 配对保护 | 不拆分 tool_call/tool_result 对,压缩前刷盘 |
| 不了解用户偏好 | 双用户建模 | Agent 知识 / 用户画像分离存储,独立更新 |
| 记忆被提示注入劫持 | 注入检测 | 扫描所有进入上下文的文件内容 |
| 群组中泄露私人记忆 | 会话隔离 | MEMORY.md 仅主会话加载,共享会话禁用 |
| 敏感数据入记忆 | 敏感信息过滤 | 密钥/密码/隐私硬性不落盘 |
| 技能重复或混乱 | 去重与版本 | 高度重复合并,保留变更历史 |