Hermes Agent 自我提升机制详解

Hermes Agent 自我提升机制详解

一、整体思路

大多数 AI Agent 每次对话都从零开始,不记得上次学到了什么,下次遇到同样的问题还要重新摸索。Hermes Agent 的自我提升机制要解决的就是这个问题------让 Agent 像人一样,在实践中积累经验,越用越聪明

整个机制由三个相互配合的部分组成:

arduino 复制代码
┌─────────────────────────────────────────────────────────┐
│                   自我提升三层架构                        │
│                                                         │
│  ① 技能系统   --- 积累"怎么做"的程序性知识                  │
│  ② 记忆系统   --- 积累"了解用户"的陈述性知识                │
│  ③ 后台复盘   --- 驱动以上两者自动更新的执行引擎             │
└─────────────────────────────────────────────────────────┘

二、技能系统:积累"怎么做"

什么是技能

技能是存放在 ~/.hermes/skills/ 下的 Markdown 文件,记录某类任务的具体操作流程、注意事项和命令示例。它的作用类似于"老员工手册"------Agent 遇到相关任务时,先查手册再动手。

一个真实的例子(skills/apple/apple-reminders/SKILL.md):

yaml 复制代码
---
name: apple-reminders
description: Manage Apple Reminders via remindctl CLI (list, add, complete, delete).
platforms: [macos]
prerequisites:
  commands: [remindctl]
---

# Apple Reminders

## When to Use
- User mentions "reminder" or "Reminders app"
- Creating personal to-dos with due dates that sync to iOS

## When NOT to Use
- Scheduling agent alerts → use the cronjob tool instead
- Calendar events → use Apple Calendar

## Quick Reference
remindctl              # Today's reminders
remindctl add "..." --due "tomorrow 9am"
...

类似的,还有 systematic-debuggingtest-driven-developmentdocker-deploy 等内置技能。用户自己遇到的特定问题,Agent 也会自动创建专属技能存下来

技能如何被使用

每轮对话开始前,系统提示中会注入一份技能索引(<available_skills> 列表)。Agent 被要求在回复前先扫描这份索引,一旦发现相关技能,必须skill_view(name) 加载全文,再按技能中的指导执行。

yaml 复制代码
<available_skills>
  software-development:
    - systematic-debugging: 4-phase root cause investigation...
    - test-driven-development: TDD workflow for feature implementation...
  apple:
    - apple-reminders: Manage Apple Reminders via remindctl CLI...
</available_skills>

类比:就像程序员接手新项目时,会先看 README 和 Wiki,而不是直接开始改代码。

技能的增删改

Agent 可以用 skill_manage 工具对技能进行完整的生命周期管理:

操作 触发时机 说明
create 首次完成复杂任务后 写入新技能文件
patch 发现某个步骤有误或遗漏 精确替换指定文本,失败自动回滚
edit 技能需要大幅重写 完整覆盖原文件
write_file 需要附加参考文档 在技能目录下新增文件

举例 :用户第一次部署 Docker 项目,Agent 经过几次试错(忘了加 --no-cache,端口映射写错了),最终成功。这个过程就会被提炼成一个 docker-deploy 技能,记录正确的命令和踩过的坑。下次再部署,直接按技能来,不会再走弯路。

技能的智能过滤

系统提示中展示的技能索引不是全量的,会按当前环境动态裁剪,避免无关技能干扰 Agent:

  • macOS 上不显示 Linux 专属技能
  • 依赖工具没安装的技能自动隐藏
  • 用户手动禁用的技能不展示

三、记忆系统:积累"了解用户"

两个记忆文件

记忆分两类,分别存在两个文件里,每轮对话都注入系统提示

~/.hermes/memories/MEMORY.md --- Agent 的工作笔记

记录与工作环境、工具和项目约定有关的事实:

diff 复制代码
- 项目使用 uv 作为包管理器,不用 pip install
- 测试必须用 scripts/run_tests.sh,不能直接调用 pytest
- 用户的主力开发机是 MacBook,代码跑在远程 Linux 服务器上

~/.hermes/memories/USER.md --- 用户画像

记录用户本身的偏好、工作方式和期望:

diff 复制代码
- 资深 Python 工程师,不需要解释基础语法
- 不喜欢代码里有过多注释,认为好代码自己会说话
- 喜欢简洁的回复,不需要铺垫和过渡句
- 时区 Asia/Shanghai,提到"明天"指的是北京时间

记忆的保存原则

系统提示中明确告诉 Agent 什么值得保存、什么不值得:

markdown 复制代码
✅ 值得保存:
  - 用户反复纠正的行为("别用 pip,用 uv")
  - 用户表达的偏好和期望
  - 稳定的环境事实和工具行为

❌ 不要保存:
  - 任务进度和当前 TODO(临时的,用 session_search 召回)
  - 某次具体的操作步骤(这是技能的职责)

类比:就像一个新同事刚入职时,你告诉他"我们用 Jira 不用 Trello","代码 review 要在合并前完成"。他记下来,以后不需要你再重复说。

记忆的冻结快照机制

每次会话开始时,MEMORY.mdUSER.md 的内容被快照冻结 ,注入系统提示后不再更新(即使 Agent 在这次会话中新增了记忆条目)。这样做是为了保持系统提示稳定,让 Anthropic 等提供商的 Prompt Cache 能有效命中,降低 token 成本。新增的记忆条目在下次会话才会生效。

历史会话搜索(session_search)

当用户提到"上次我说的那个问题"、"你之前帮我写的那段脚本"时,Agent 不会靠猜,而是用 session_search 工具在 SQLite FTS5 索引里全文检索历史对话,再用 LLM 摘要出相关内容。

这让历史对话本身也成为了记忆的一部分,无需人工整理。


四、后台复盘:驱动自动学习的引擎

技能和记忆不是靠用户手动维护的,驱动它们自动积累的是后台复盘机制

触发逻辑

系统维护两个计数器,满足条件时触发复盘:

arduino 复制代码
记忆复盘:每 10 次用户对话轮次触发一次
              (memory.nudge_interval,默认 10,可在 config.yaml 配置)

技能复盘:每 10 次工具调用迭代触发一次
              (skills.creation_nudge_interval,默认 10,可在 config.yaml 配置)

"工具调用迭代"指的是 Agent 调用工具的次数,纯聊天不计入------这样只有真正做了复杂任务时才会触发技能复盘。

两个触发条件独立运作,可以同时满足(合并为一次复盘)。

执行方式:Fork 一个完整子 Agent

复盘不是简单地执行一个规则,而是Fork 出一个完整的子 Agent,让它读完整个对话历史,自己判断有没有值得保存的内容:

bash 复制代码
主 Agent 完成本轮回复
       │
       ▼ 满足触发条件?
       │
       ▼ 是 → 启动守护线程(不阻塞用户继续对话)
              │
              ▼ Fork 子 Agent
                - 相同模型(保持判断一致性)
                - 共享记忆存储(写入立即对主 Agent 可见)
                - 最多 8 轮(防止失控)
                - 禁止再次触发复盘(防止无限递归)
              │
              ▼ 把完整对话历史 + 复盘提示词传给子 Agent
              │
              ▼ 子 Agent 自主判断并执行:
                - 有值得记录的用户信息 → memory.save()
                - 有可复用的操作流程   → skill_manage(create/patch)
                - 什么都不值得保存     → 说 "Nothing to save." 结束
              │
              ▼ 主 Agent 展示摘要:
                "💾 Skill 'docker-deploy' created · Memory updated"

复盘提示词示例(记忆复盘)

vbnet 复制代码
Review the conversation above and consider saving to memory if appropriate.

Focus on:
1. Has the user revealed things about themselves --- their persona, desires,
   preferences, or personal details worth remembering?
2. Has the user expressed expectations about how you should behave,
   their work style, or ways they want you to operate?

If something stands out, save it. If nothing is worth saving, just say
'Nothing to save.' and stop.

设计亮点:用 AI 来判断"什么值得学习",而不是写死规则。这让积累的内容更自然、更准确。

系统提示中的持续行为强化

除了周期性复盘,系统提示中还有两段常驻引导,让 Agent 在每次任务结束时主动考虑学习:

css 复制代码
# 技能引导(每轮注入)
After completing a complex task (5+ tool calls), fixing a tricky error,
or discovering a non-trivial workflow, save the approach as a skill so
you can reuse it next time. When using a skill and finding it outdated,
patch it immediately --- don't wait to be asked.

# 记忆引导(每轮注入)
The most valuable memory is one that prevents the user from having to
correct or remind you again. User preferences and recurring corrections
matter more than procedural task details.

五、外部记忆扩展(Honcho 等插件)

内置记忆系统(MEMORY.md / USER.md)之外,Hermes 还支持接入外部记忆提供商,通过插件机制加载。同时只允许一个外部提供商,避免冲突。

目前支持的外部记忆插件:

插件 特点
Honcho 辩证式用户建模(dialectic Q&A),语义搜索,跨会话 peer cards
Mem0 向量化记忆存储,语义相似度检索
Holographic 本地嵌入向量,支持离线语义搜索
RetainDB 结构化记忆数据库
SuperMemory 云端记忆服务
Hindsight 基于对话事后分析的记忆提取

以 Honcho 为例,它不只是记录用户说了什么,还会通过多轮对话逐步推断用户的深层偏好和认知模式,建立一个持续演化的用户心智模型。

外部提供商的记忆内容同样注入系统提示,与内置记忆并列展示,互不替代。


六、一次完整的自我提升过程

场景:用户第一次让 Agent 帮忙调试一个 Python 测试失败问题。

bash 复制代码
第 1 轮:用户说"帮我看看为什么测试挂了"
  → Agent 扫描技能索引,发现 systematic-debugging 技能
  → 加载技能,按 4 阶段流程排查:复现 → 隔离 → 根因 → 修复
  → 过程中发现用户项目的测试要用 scripts/run_tests.sh 而非 pytest
  → 测试修复成功,对话结束

  [后台复盘触发(工具调用超过阈值)]
  → Fork 子 Agent 审阅对话
  → 发现:用户项目有特殊的测试运行方式,这是稳定事实
  → memory.save("测试必须用 scripts/run_tests.sh,不能直接调用 pytest")
  → 展示:"💾 Memory updated"

第 2 轮(下次会话):
  → 系统提示已包含该记忆条目
  → Agent 不会再建议用 pytest,直接用正确命令
  → 用户无需重复说明

场景二:连续几次对话后触发记忆复盘。

arduino 复制代码
第 10 轮:用户说"回复短一点,别废话"
  [记忆复盘触发(对话轮次达到阈值)]
  → Fork 子 Agent 审阅近期对话
  → 发现:用户多次表达对简短回复的偏好
  → memory.save("用户希望回复简洁,避免铺垫和总结性废话", target="user")
  → 展示:"💾 User profile updated"

后续所有对话:
  → USER.md 注入系统提示
  → Agent 自动调整回复风格,不再写冗长的开场白

七、关键代码位置

功能 文件 位置
系统提示组装(含技能/记忆注入) agent/prompt_builder.py 全文;_build_system_prompt()run_agent.py:3638
技能/记忆行为引导常量 agent/prompt_builder.py SKILLS_GUIDANCE:164MEMORY_GUIDANCE:144SESSION_SEARCH_GUIDANCE:158
技能索引构建与双层缓存 agent/prompt_builder.py build_skills_system_prompt():583
后台复盘触发逻辑 run_agent.py 记忆触发 :8839,技能触发 :11835,复盘启动 :11854
后台复盘执行(Fork 子 Agent) run_agent.py _spawn_background_review():2458
复盘提示词 run_agent.py _MEMORY_REVIEW_PROMPT:2423_SKILL_REVIEW_PROMPT:2434_COMBINED_REVIEW_PROMPT:2444
技能工具(创建/修补/加载) tools/skill_manager_tool.py skill_manage()
技能查看 tools/skills_tool.py skill_view():804skills_list():647
记忆存储(读写/快照/注入) tools/memory_tool.py MemoryStore:105format_for_system_prompt():359
记忆管理器(多提供商协调) agent/memory_manager.py MemoryManager:83
历史会话搜索 tools/session_search_tool.py session_search():297
外部记忆插件(Honcho 等) plugins/memory/ 各子目录 __init__.py
技能文件解析工具 agent/skill_utils.py 全文
相关推荐
掘金安东尼1 小时前
开源小工具:掘金福利页「补签卡」按次数自动兑换(Chrome 扩展)
前端·开源
charlie1145141911 小时前
基于开源项目的现代C++工程实践——OnceCallback 前置知识(下):C++20/23 高级特性
c++·开源·c++20
文慧的科技江湖2 小时前
零碳园区综合管理平台PRD需求文档 - 慧知开源充电桩平台
spring cloud·微服务·开源·能源·慧知开源光储充管理平台·慧知开源光储充管理系统·零碳园区管理平台
XD7429716362 小时前
科技早报晚报|2026年5月10日:Agent 安全沙箱、可审计编程代理与持久化产品上下文,今晚更值得做的 3 个开源机会
科技·安全·开源·开源项目·ai agent·开发者工具
金玉满堂@bj2 小时前
PostgreSQL:企业级全能开源数据库
数据库·postgresql·开源
djarmy3 小时前
哪些海外国家最可能落地矿鸿/OpenHarmony矿山方案?1. 资源型发展中国家(最优先)
嵌入式硬件·开源
Hical_W15 小时前
Hical 踩坑实录五部曲(二):MSVC / GCC / Clang 三平台 C++20 编译差异
linux·windows·经验分享·嵌入式硬件·macos·开源·c++20
带娃的IT创业者20 小时前
Valve 开源 Steam Controller:当硬件设计遇上开源精神,一场游戏外设的革命才刚刚开始
游戏·开源·开源硬件·cad·知识共享·valve·游戏外设
计算机魔术师21 小时前
【技术趣闻 | AI Agent Skill】为什么 AI 总绕着同一个脑回路转?多语言思维采样:让 Agent 从“给一个答案”变成“给一组方案”
开源