07-Hermes 自学习闭环全拆解:复盘 → 提炼 → 生成 → 应用 → 再复盘
Hermes 自学习闭环全拆解:复盘 → 提炼 → 生成 → 应用 → 再复盘
闭环全景
┌──────────────┐ │ ① 任务执行 │ │ Agent 完成 │ │ 一个任务 │ └──────┬───────┘ │ ▼ ┌──────────────┐ ┌────────────────│ ② 自我复盘 │────────────────┐ │ │ 分析做得 │ │ │ │ 好/坏/原因 │ │ │ └──────┬───────┘ │ │ │ │ │ ▼ │ │ ┌──────────────┐ │ │ │ ③ 提炼经验 │ │ │ │ 提取可复用 │ │ │ │ 的规则/模式 │ │ │ └──────┬───────┘ │ │ │ │ │ ┌────────────┼────────────┐ │ │ ▼ ▼ ▼ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 更新持久 │ │ 生成/更新│ │ 关联已有 │ │ │ │ 记忆 │ │ Skill │ │ 知识 │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ │ └────────────┼────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────┐ │ │ │ ④ 存储到 │ │ │ │ 记忆系统 │ │ │ └──────┬───────┘ │ │ │ │ │ ▼ │ │ ┌──────────────┐ │ └─────────────→│ ⑤ 下次应用 │←────────────────┘ │ 新任务自动 │ │ 加载改进 │ └──────────────┘关键设计:这不是一个线性的"学习然后结束"的过程,而是一个持续循环。⑤产生的新结果又会在②中被复盘,形成螺旋上升。
第一步:任务执行
闭环的起点是任何一个任务。这个任务可以是你直接要求的,也可以是 Hermes 自己触发的。
任务类型: 直接任务:👤 "帮我写一个用户积分查询接口" 定时任务:Hermes 每天早上 9 点自动推送天气和日程 级联任务:上一个任务的后续("刚才那个接口再加个分页") 无论哪种类型,Hermes 都会在任务执行时记录: - 原始需求(你说的话 / 触发条件) - 执行过程(调用了哪些工具、读了哪些文件、搜索了哪些记忆) - 最终输出(代码 / 文档 / 回复) - 你的反馈(明确的纠正 / 沉默认可 / 追问)第二步:自我复盘
这是整个闭环中最关键的一步。任务完成后,Hermes 在后台运行一个内化的复盘 Prompt。
复盘的完整 Prompt 模板
[系统指令 — 只在后台执行,用户不可见] 你刚完成了一个任务。请分析以下内容并输出结构化复牌报告: ## 任务信息 - 原始需求: {user_request} - 执行步骤: {execution_steps} - 最终输出: {final_output} - 用户反馈: {user_feedback} ## 分析维度 ### 1. 做得好的地方(What went well) - 哪些输出完全符合用户预期? - 哪些已有的记忆/Skill 被正确应用了? - 哪些工具调用是高效的? ### 2. 做得不好的地方(What went wrong) - 用户有没有纠正?纠正了什么? - 用户有没有追问?(追问 = 之前没说清楚) - 有没有工具调用失败或返回无关内容? ### 3. 原因分析(Why) - 做得好是因为什么?(已有规则明确?任务简单?记忆精确?) - 做得不好是因为什么?(规则缺失?记忆不准确?上下文不足?) ### 4. 改进方向(What to do differently) - 如果同样的任务再来一次,哪里可以改进? - 能不能提取一条可复用的规则? - 有没有需要更新或删除的已有记忆? ### 5. 可提取的规则(Extractable rules) - 格式:IF [触发条件] THEN [正确做法] - 置信度(0-1):你有多确定这是一条稳定的规则而非一次性的情况 - 关联已有记忆:这条规则和哪些已有记忆相关或冲突复盘的实际产出
以"写用户积分查询接口"为例:
=== 复牌报告 === 1. 做得好的地方: ✅ 代码风格符合已有规则(函数式、列表推导式、Pydantic v2) ✅ API 返回格式正确({code, data, message}) ✅ 数据库操作加了 try/except 2. 做得不好的地方: ⚠️ 积分计算用了 Float(用户在第 3 轮纠正为 Decimal) ⚠️ 没有处理并发扣减的场景(用户追问了"如果同时间扣积分呢") ⚠️ 查询接口没加分页,用户自己加了(说明应该默认加分页) 3. 原因分析: Float 精度问题:已有 memory 中记录了"涉及金额用 Decimal", 但没有关联到"积分"——说明记忆的语义关联不够 并发问题:缺少"金融相关操作要显式处理并发"的规则 分页问题:缺少"列表查询默认加分页"的规则 4. 改进方向: - 扩展 Decimal 规则的关联范围:金额 → 所有数值精确计算 - 新增规则:"涉及扣减/增加的操作要说明并发控制方案" - 新增规则:"列表查询类接口默认加分页参数" 5. 可提取的规则: 规则一(置信度 0.85): IF 涉及数值计算(金额/积分/数量) THEN 使用 Decimal 而非 Float/Float64 关联: [feedback] 金额用 Decimal 规则二(置信度 0.72): IF 接口返回列表 AND 数据量不可控 THEN 默认添加 page/limit 分页参数 关联: 无(新规则) 规则三(置信度 0.65):← 置信度偏低,因为只有一次 IF 涉及增减操作(余额/积分/库存) THEN 显式说明并发控制方案 关联: 无(新规则)第三步:提炼经验
复盘报告出来后,Hermes 要做的事是——把"报告"变成"知识和行动"。
提炼的三种产物
产物一:更新已有持久记忆(强化或修正) 报告说 "Decimal 规则的关联范围不够" → 更新 [feedback] 金额用 Decimal → 扩展 tags: "amount" → "amount,points,quantity,price" → 更新语义向量(以便"积分"查询能搜到这条) → 置信度不变(规则本身就确认过,只是范围扩展了) 产物二:生成新的持久记忆条目(记录新发现) 报告说 "缺少分页规则" → 创建 [feedback] 列表查询默认加分页 → 置信度 0.72(来自复盘评估) → 标记为 emerging(还有待验证的新规则) 产物三:生成或更新 Skill(可执行的规则) 报告说 "可以提取 3 条规则" → 规则一(置信度 0.85):检查是否已有相关 Skill → 没有 → 创建新 Skill → 规则二(置信度 0.72):低于阈值但接近 → 标记 pending,等进一步验证 → 规则三(置信度 0.65):低于阈值 → 仅存入持久记忆,不生成 Skill提炼的过滤条件
不是每条复盘发现都会变成记忆或 Skill。Hermes 有一个过滤层:
过滤条件: ① 置信度 >= min_confidence(0.85)→ 直接生成 Skill ② 置信度 >= 0.70 但 < 0.85 → 存入持久记忆,标记 emerging,等更多验证 ③ 置信度 < 0.70 → 仅记录在复牌日志中,不产生行动 ④ 如果和已有记忆冲突 → 先降低已有记忆的置信度,再决定 ⑤ 每天最多自动生成 max_per_day 个 Skill(默认 5)第四步:存储到记忆系统
提炼完成后,三种产物分别写入:
产物类型 存储位置 下次加载时机 ────────────────────────────────────────────────────────── 更新的持久记忆 SQLite memories 表 下一次检索到关联关键词时 新的持久记忆 SQLite memories 表 下一次检索到关联关键词时 新的 Skill ~/.hermes/skills/auto/ 下一次同类任务加载 Skill 时 更新的 Skill ~/.hermes/skills/auto/ 立即替换旧版本 复盘日志 ~/.hermes/logs/reflection/ 不自动加载(用于审计)复盘日志的保留
# 查看所有复盘记录hermes reflection list# 输出:# 2026-06-04 15:30 task: "用户积分查询接口" 规则提取: 3 条 Skill 更新: 1 个# 2026-06-04 10:15 task: "JWT 刷新逻辑" 规则提取: 1 条 Skill 更新: 0 个# 2026-06-03 18:00 task: "数据库连接池配置" 规则提取: 2 条 Skill 更新: 1 个# 查看某次复盘的详情hermes reflection show20260604-153000# 复盘日志自动保留 30 天(可在 config.yml 的 logging 中配置)第五步:下次应用
闭环的最后一步——也是最让用户"体感强烈"的一步。当你发起一个同类的新任务,Hermes 自动加载了改进:
场景:第二天,你提了一个新需求 👤 > "帮我写一个优惠券模块,包含创建和查询列表接口" Hermes 的自动加载过程: 1. 检索持久记忆: → 命中 [user] code_style(函数式、Pydantic v2) → 命中 [project] api_format({code, data, message}) → 命中 [feedback] DB 操作加 try/except → 命中 [feedback] 数值计算用 Decimal(tags 已扩展到 quantity) → 命中 [feedback] 列表查询默认加分页(emerging,但仍在上下文中注入) 2. 检索 Skill: → 匹配 code-style-functional Skill → 匹配 error-message-zh Skill 3. 生成代码时: ✅ 用了列表推导式而非 for 循环(Skill) ✅ 优惠券金额用 Decimal(从"积分"学到的,扩展到"金额") ✅ 查询列表自动加了 page/limit 参数(从上次复盘学到的) ✅ 错误信息用中文(Skill) 4. 你只说了"写一个优惠券模块"——后面三项优化都是自动的。 你甚至可能没有注意到它们的存在。学习和应用的时间线
学习效率的典型曲线: 第 1-5 个任务(快速增长期): 每个任务都有明显的纠正 → 学习密度最高 平均每个任务产生 2-4 条新规则或 Skill 更新 第 6-20 个任务(稳定增长期): 纠正频率下降 → 常见模式已经被学会 平均每 2-3 个任务产生一条新规则 第 20+ 个任务(微调期): 纠正很少(Agent 已经很懂你) 偶尔出现新规则(新类型的任务 / 你的偏好变了) 大部分复盘报告显示"没有新的可提取规则"在 config.yml 中控制闭环
advanced:evolution:enabled:true# 自学习总开关# 复盘配置reflection:enabled:true# 是否在任务后自动复盘trigger:"after_every_task"# after_every_task | after_correction_only | manualdepth:"standard"# quick | standard | deepmax_reflection_tokens:4000# 复盘报告最大 Token# 提炼配置extraction:min_confidence_for_skill:0.85# 生成 Skill 的置信度阈值min_confidence_for_memory:0.70# 存入持久记忆的阈值max_new_skills_per_day:5# 每日最多生成 Skill 数max_new_memories_per_day:20# 每日最多新增记忆数# 复盘日志reflection_log:enabled:trueretention_days:30path:"~/.hermes/logs/reflection/"depth 参数的选择
quick(快速复盘): → 只分析"有没有被纠正",不分析"为什么" → 耗时 < 5 秒,不调额外 API → 适合:简单任务、批量任务 standard(标准复盘,推荐): → 完整五维分析(好/坏/原因/改进/规则) → 耗时 15-30 秒,调用一次 API → 适合:大部分日常任务 deep(深度复盘): → 额外分析:和过去 10 次复盘的关联、跨任务的模式发现 → 耗时 45-90 秒,调用 1-3 次 API → 适合:架构决策、新的项目初始化、发生了严重错误时加速自学习:你主动做什么
自学习是自动的,但你可以让它更快更准:
技巧一:纠正时附带原因
❌ 只告诉它"不对": 👤 "不对" 🤖 [猜测哪里不对→可能猜错→浪费学习轮次] ✅ 告诉它"为什么不对": 👤 "不对,折扣计算应该用 Decimal,Float 会有精度问题" 🤖 [精确理解问题→置信度直接 0.90+→一次学会] 效果差异:附带原因的纠正,1 次效果 = 不带原因的 3 次技巧二:在关键任务后手动触发深度复盘
# 完成了一个重要任务(如架构设计、数据库选型)后hermes reflection trigger--depthdeep# Hermes 会做额外的跨任务分析:# "这个任务中的决策和上周的[某任务]有相似的取舍逻辑,# 建议将它们合并为一条更通用的架构决策规则..."技巧三:定期回顾自动生成的 Skill
# 每周花 5 分钟hermes skills list--sourceauto--sortrecent# 快速浏览:# → 哪些 Skill 一直在用(置信度高,可以不管)# → 哪些 Skill 置信度低或最近被频繁纠正(需要关注)# → 哪些 Skill 好久没用了(可能需要清理)# 清理低质量 Skillhermes skills cleanup --min-confidence0.5--inactive-days30技巧四:主动纠正记忆和 Skill
当你的偏好发生变化时,不要等 Hermes 自己发现(那需要 3-5 次纠错): 👤 > "我现在改用 Go 了,Python 相关的偏好不用了" 🤖 > 已更新: - 归档 3 条 Python 相关 Skill - 降低 5 条 Python 相关记忆的检索优先级 - 新建 [user] tech_stack: Go 的偏好和 OpenClaw 的对比
OpenClaw 的"改进"循环: 你改了 System Prompt → 重启 Agent → Agent 行为改变 → 是"你主动升级 Agent" Hermes 的自学习闭环: Agent 完成任务 → 自我复盘 → 发现改进点 → 自己改 Skill → 是"Agent 自我升级" 关键差异: OpenClaw 的 Agent 不会因为做了 100 个任务而变得更懂你 Hermes 的 Agent 每做一个任务都在变得更懂你这篇文章的要点
1. 五步闭环: 任务执行 → 自我复盘 → 提炼经验 → 存储到记忆系统 → 下次应用 2. 复盘模板五维分析: 做得好的 / 做得不好的 / 原因分析 / 改进方向 / 可提取的规则 3. 提炼的三种产物: → 更新已有记忆(强化或修正) → 新生新的记忆(记录新发现) → 生成或更新 Skill(可执行规则) 4. 置信度过滤: ≥ 0.85 → 生成 Skill 0.70-0.85 → 存为 emerging 记忆 < 0.70 → 只记录不复盘日志 5. 四个加速学习的技巧: → 纠正时附带原因(1 次顶 3 次) → 关键任务后手动深度复盘 → 每周回顾自动生成的 Skill → 偏好变化时主动告诉 Hermes延伸阅读
- Hermes Self-Evolution 官方文档
- Nous Research: Building Agents That Learn
