大数跨境

深入源码:Hermes Agent 如何实现 "Self-Improving"

深入源码:Hermes Agent 如何实现 "Self-Improving" 阿里云开发者
2026-04-22
7

背景

OpenRouter 排行榜上,Hermes Agent 增速达 +204%,位列 Top Coding Agents 第一、Top Productivity 第二。上线不足半年,GitHub Star 数已突破 10.6 万。开发者用数据投票:选择的不是“又一个 OpenClaw”,而是一种架构范式的升级——从被动执行,转向自主进化。

Hermes 与 OpenClaw 的核心差异在于学习机制:OpenClaw 的 Skill 依赖人工编写 Markdown 文件,能力边界由开发者预设;Hermes 则在任务完成后,自动将踩坑经验提炼为可复用的 Skill,实现“越用越强”。这不是功能叠加,而是设计哲学的根本分野——一个靠人喂养,一个自我生长。

本文深入 Hermes 源码,解析其 Self-Improving(自我进化)闭环的实现逻辑,并介绍 RDSHermes 如何将该能力普惠至非开发人员。

项目仓库:
github.com/NousResearch/hermes-agent

总览:三个子系统,一个闭环

多数 Agent 在会话结束后即“失忆”。Hermes 构建了由 Memory、Skill 和 Nudge Engine 组成的学习闭环,实现持续进化。

类比理解:Memory 是助理随身携带的小本子,记录“老板喜欢美式”等事实;Skill 是积累的操作手册,如“部署 K8s 第 2 步必须先推镜像”;Nudge Engine 则是定时提醒的闹钟,驱动助理定期复盘、沉淀经验。

Memory:越用越懂你

两个文件,承载全部认知

Memory 系统设计极简:仅用两个纯文本文件,以 § 分隔条目:

~/.hermes/memories/
├── MEMORY.md    # 环境事实、项目约定、工具特性
└── USER.md      # 用户偏好、沟通风格、工作习惯

容量严格受限:MEMORY.md 不超过 2200 字符,USER.md 不超过 1375 字符。有限空间倒逼 Agent 精炼信息、淘汰冗余,避免 OpenClaw 中因无限制追加导致的数万行巨型文件与检索低效问题。

实现上,MemoryStore 维护两组状态:实时可写条目列表 + 会话启动时冻结的快照:

# tools/memory_tool.py:116-122
class MemoryStore:
    def __init__(self, memory_char_limit=2200, user_char_limit=1375):
        self.memory_entries: List[str] = [ ]
        self.user_entries: List[str] = [ ]
        self.memory_char_limit = memory_char_limit
        self.user_char_limit = user_char_limit
        self._system_prompt_snapshot: Dict[str, str] = {"memory": "", "user": ""}

超限时,add 操作失败并返回全部现有条目,引导模型主动判断哪些内容过时需删除或合并——这一过程本身就是一次“自我反思”。

冻结快照机制

每次会话启动时,Memory 加载后立即生成快照并注入系统提示词:

# tools/memory_tool.py:124-140
def load_from_disk(self):
    mem_dir = get_memory_dir()
    self.memory_entries = self._read_file(mem_dir / "MEMORY.md")
    self.user_entries = self._read_file(mem_dir / "USER.md")
    # 会话开始时冻结快照,之后不再变动
    self._system_prompt_snapshot = {
        "memory": self._render_block("memory", self.memory_entries),
        "user": self._render_block("user", self.user_entries),
    }

快照机制保障系统提示词会话内稳定,支持前缀缓存(Prefix Cache),显著降低 API 成本;新写入内容仅更新磁盘,于下次会话生效。

提示词引导:明确记忆边界

系统提示词中的 MEMORY_GUIDANCE 明确规范记忆原则:

# agent/prompt_builder.py:144-162
MEMORY_GUIDANCE = (
    "You have persistent memory across sessions. Save durable facts using the memory "
    "tool: user preferences, environment details, tool quirks, and stable conventions.\n"
    "Prioritize what reduces future user steering — the most valuable memory is one "
    "that prevents the user from having to correct or remind you again.\n"
    "Write memories as declarative facts, not instructions to yourself. "
    "'User prefers concise responses' ✓ — 'Always respond concisely' ✗. "
    "'Project uses pytest with xdist' ✓ — 'Run tests with pytest -n 4' ✗."
)

强调“声明式事实”而非“命令式指令”,确保 Memory 具备上下文覆盖弹性;同时明确划界:“若发现新方法,应存为 Skill”——清晰区分 Memory(知道什么)与 Skill(会做什么)的职责。

Skill:把做过的事变成会做的事

Skill 长什么样

每个 Skill 是一个目录,核心为 SKILL.md 文件:

~/.hermes/skills/
├── devops/
│   └── flask-k8s-deploy/
│       ├── SKILL.md         # 主指令
│       ├── references/      # 参考文档
│       └── templates/       # 模板文件
└── software-development/
    └── fix-pytest-fixtures/
        └── SKILL.md

典型 SKILL.md 包含名称、描述、适用场景、步骤、常见陷阱(Pitfalls)等结构化字段。其中 Pitfalls 并非预置,而是 Agent 踩坑后动态追加——构成 Skill 层面的自我进化。

什么时候创建 Skill

创建由 skill_manage 工具 Schema 自动触发,门槛明确:

# tools/skill_manager_tool.py:681-701
SKILL_MANAGE_SCHEMA = {
    "name": "skill_manage",
    "description": (
        "Manage skills (create, update, delete). Skills are your procedural "
        "memory — reusable approaches for recurring task types.\n\n"
        "Create when: complex task succeeded (5+ calls), errors overcome, "
        "user-corrected approach worked, non-trivial workflow discovered, "
        "or user asks you to remember a procedure.\n"
        "Update when: instructions stale/wrong, OS-specific failures, "
        "missing steps or pitfalls found during use. "
        "If you used a skill and hit issues not covered by it, "
        "patch it immediately with skill_manage(action='patch') "
        "— don't wait to be asked.\n\n"
        "After difficult/iterative tasks, offer to save as a skill. "
        "Skip for simple one-offs."
    ),
}

强调“5 次以上调用”“用户纠正后验证有效”“非平凡流程”等条件,确保 Skill 具备复用价值。相较 OpenClaw 手写 Skill 的高成本与社区 Skill 的环境不适配,Hermes 的 Skill 是真实工作流中自然沉淀的经验资产,每一次踩坑都在加固领域护城河。

系统提示词中“Skills that aren't maintained become liabilities”一句,更赋予 Agent 主动维护的责任感。

Skill 的自我修补

当执行已有 Skill 时遭遇新问题,Agent 将在任务完成后精准修补,而非全量重写:

# tools/skill_manager_tool.py:397-485
def _patch_skill(name, old_string, new_string, file_path=None, replace_all=False):
    """Targeted find-and-replace within a skill file."""
    from tools.fuzzy_match import fuzzy_find_and_replace
    new_content, match_count, _strategy, match_error = fuzzy_find_and_replace(
        content, old_string, new_string, replace_all
    )
    if match_error:
        return {"success": False, "error": match_error, "file_preview": content[:500]}
    # ...校验逻辑省略
    original_content = content
    _atomic_write_text(target, new_content)
    # 修改后重新安全扫描
    scan_error = _security_scan_skill(skill_dir)
    if scan_error:
        _atomic_write_text(target, original_content)  # 不通过则回滚
        return {"success": False, "error": scan_error}

采用模糊匹配容忍格式差异;修改后强制安全扫描,失败即自动回滚。Agent 在踩坑当场补全 Pitfalls,后续使用者可直接绕过同类错误。

Skill 的渐进式加载

为避免 OpenClaw “重型背包”模式导致的 Token 浪费与注意力稀释,Hermes 采用“动态图书馆”策略:默认仅加载轻量索引(Skill 名称+一句话描述),按需调用 skill_view 加载完整内容。

Available skills:
 devops:
   - flask-k8s-deploy: Deploy a Flask app to Kubernetes with health checks
   - nginx-reverse-proxy: Configure Nginx reverse proxy with SSL
 software-development:
   - fix-pytest-fixtures: Debug and fix pytest fixture scope issues

开源版 Skill 需用户从零积累;RDSHermes 的 Skill Hub 则预装数据库专业技能(智能巡检、慢 SQL 诊断、索引优化等),解决冷启动问题,实现“上线即具备领域能力”与“越用越强”的双轨演进。

Nudge Engine:谁来提醒 Agent “该学习了”

Memory 和 Skill 均为存储系统,写入需主动触发。Nudge Engine 即是该触发器,通过双计数器驱动静默复盘。

两个计数器,两种粒度

# run_agent.py:1328-1331 — Memory 计数器
self._memory_nudge_interval = 10   # 每 10 个用户回合触发一次
self._turns_since_memory = 0

# run_agent.py:1428-1431 — Skill 计数器(默认 10)
self._skill_nudge_interval = int(skills_config.get("creation_nudge_interval", 10))
self._iters_since_skill = 0

Memory 按用户回合计(信息来自输入),Skill 按工具迭代计(经验源于执行)。达阈值即触发审查,若 Agent 已主动调用相关工具则自动重置。

后台 fork Agent:不打扰用户的静默审查

Nudge 触发后,不在主对话中打断用户,而是在后台 fork 独立 Agent 实例,基于主会话快照执行审查:

# run_agent.py:2665-2711
def _spawn_background_review(self, messages_snapshot, review_memory=False, review_skills=False):
    def _run_review():
        with open(os.devnull, "w") as _devnull, \
             contextlib.redirect_stdout(_devnull), \
             contextlib.redirect_stderr(_devnull):
            review_agent = AIAgent(
                model=self.model,
                max_iterations=8,
                quiet_mode=True,
            )
            review_agent._memory_store = self._memory_store
            review_agent._memory_enabled = self._memory_enabled
            review_agent._user_profile_enabled = self._user_profile_enabled
            # 禁用 review agent 自身的 nudge,防递归
            review_agent._memory_nudge_interval = 0
            review_agent._skill_nudge_interval = 0
            review_agent.run_conversation(
                user_message=prompt,
                conversation_history=messages_snapshot,
            )
    thread = threading.Thread(target=_run_review, daemon=True)
    thread.start()

关键设计:输出重定向至 /dev/null,用户无感知;最多 8 次工具调用,防 API 过度消耗;禁用自身 Nudge,防无限递归;共享 Memory,写入即时生效。“干活”与“反思”完全解耦。

Review Agent 依据专用提示词决策:Memory Review 聚焦用户偏好,Skill Review 关注解题过程。所有 prompt 均以“If nothing is worth saving, just say 'Nothing to save.' and stop.”收尾,杜绝无效填充。审查在用户收到响应后异步启动,全程零干扰。

完整案例:从“不会”到“精通”的三次会话

以 K8s 部署 Flask 应用为例,串联三系统协同:

第 1 次会话:冷启动

用户:“帮我把 Flask 应用部署到 K8s 集群”

用户: 帮我把这个 Flask 应用部署到 K8s 集群

Memory 与 Skills 均为空,Agent 依赖基座知识摸索,经 12 次工具调用,踩出两大典型错误:ImagePullBackOff(未推镜像)、CrashLoopBackOff(livenessProbe 路径错误)。12 次迭代触发 Skill Review,自动生成 flask-k8s-deploy Skill,包含完整步骤与 Pitfalls,用户全程无感知。

第 2 次会话:Skill 复用 + 自我修补

用户:“帮我再部署一个 Django 应用到 K8s”

用户: 帮我再部署一个 Django 应用到 K8s

Agent 加载 Skill 后复用流程,调用降至 9 次,已知坑被绕过,但暴露 Django 特有错误(DisallowedHost)。Review Agent 同步完成三项操作:写入用户画像、记住 registry 地址、修补 Skill 新增 ALLOWED_HOSTS 项。

第 3 次会话:零错误,一次搞定

用户:“帮我部署一个新的 FastAPI 微服务”

用户: 帮我部署一个新的 FastAPI 微服务

Agent 已掌握用户身份、registry、集群配置及全部 Pitfalls,仅需 6 次调用,零错误完成部署。

维度

会话 1(冷启动)

会话 2(Skill 复用)

会话 3(全协同)

工具调用

12 次

9 次

6 次

错误数

2

1

0

Memory

触发写入

系统提示词注入

Skill

触发创建

复用 + 自我修补

复用已修补版本

开源 Hermes 中,经验本地存储于 ~/.hermes/;RDSHermes 将 Skill 云端化,实现“一人踩坑,全员受益”的组织级进化。

安全机制:进化也需要约束

Agent 具备自我写入能力,亦带来攻击面。Hermes 设计双重防护:

第一层:Memory 内容扫描
因 Memory 最终注入系统提示词,需严防 prompt injection 等恶意指令:

# tools/memory_tool.py:65-81
_MEMORY_THREAT_PATTERNS = [
    (r'ignore\s+(previous|all|above|prior)\s+instructions', "prompt_injection"),
    (r'do\s+not\s+tell\s+the\s+user', "deception_hide"),
    (r'system\s+prompt\s+override', "sys_prompt_override"),
    (r'curl\s+[^\n]*\$\{?\w*(KEY|TOKEN|SECRET|PASSWORD)', "exfil_curl"),
    ...
]

第二层:Skill 安全扫描
所有 Skill(含自创与 Hub 安装)均需通过统一扫描,不通过则自动回滚:

# tools/skill_manager_tool.py:56-74
def _security_scan_skill(skill_dir):
    result = scan_skill(skill_dir, source="agent-created")
    allowed, reason = should_allow_install(result)
    if allowed is False:
        report = format_scan_report(result)
        return f"Security scan blocked this skill ({reason}):\n{report}"

开源版解决单机安全;RDSHermes 进一步引入加密托管:AK/SK 由网关代理鉴权,密钥不落盘、不暴露给 Agent 或用户,筑牢凭证隔离防线。

设计取舍一览

设计决策

表面效果

背后的考量

Memory 限 2200 chars

迫使 Agent 挑重要的记

低质量 Memory 注入系统提示词 = 每次 API 调用带噪声

声明式事实 vs 操作步骤分离

Memory 存事实,Skill 存步骤

两者更新频率、触发条件、安全风险完全不同

冻结快照模式

系统提示词会话内不变

保护前缀缓存,避免每轮 API 调用重复计费

后台 fork 审查

用户感知不到 review 过程

自省不应占用用户任务的 attention budget

Nudge 计数器可配置

默认 10

太频繁浪费 API 成本,太稀疏错过学习机会

patch 优先于全量重写

局部修复 Skill

保留已验证稳定部分,只改需改之处

安全扫描 + 自动回滚

拒绝恶意写入

Memory/Skill 最终进入系统提示词,是一等安全边界

Skill 自动进化的下一步

“自动创建”与“自我修补”已落地,未来方向包括:

  • 生命周期管理:在 YAML frontmatter 中增加 last_useduse_countsuccess_rate,支撑自动降权、归档与过时检测。

  • 技能组合:识别高频共用 Skill(如 flask-k8s-deploy + nginx-reverse-proxy),自动合成复合工作流(如 full-stack-deploy),迈向“思考”而非仅“记忆”。

  • 创建透明度:Skill 创建由静默转为显性通知,支持用户审核与纠正,提升协作信任。

  • 团队治理:RDSHermes 要求写操作二次确认,确保每一次进化均可追溯、可审计,实现“能自我进化,但每一步都在监管链上”。

RDSHermes:从“开发者工具”到“团队都能用”

开源 Hermes 是面向开发者的引擎,需手写 config.yaml、配置 API Key、排查日志,门槛较高。RDSHermes 将其封装为开箱即用的企业级服务:

开源 Hermes Agent

RDSHermes

开始使用

命令行安装,手写 config.yaml

控制台一键开通,零配置

对话界面

终端 CLI

内置 WebUI,浏览器直连

接入 IM

内置 Gateway,config.yaml 配凭证后启动

控制台填 App ID 即完成

数据库连接

手动配连接串,密码明文写配置

一键接入 RDS 实例,密码自动加密

云凭证管理

AK/SK 写进环境变量或配置文件

加密托管,网关代理鉴权,密钥不落盘

技能管理

Agent 自动创建,磁盘文件

Skill Hub 预装专业技能

简言之:开源 Hermes 是引擎,RDSHermes 是整车。

它在 Hermes Self-Improving 能力基础上,补齐四大能力:

  • 数据库安全纳管:MySQL、PostgreSQL、SQL Server、MariaDB 多引擎一键接入,密码即时加密;支持只读模式,守住生产环境底线。

  • 身份认证托管:AK/SK 加密托管,云 API 调用由网关代理鉴权,密钥不暴露给 Agent 或用户。

  • 内置数据库专业技能:Skill Hub 预装智能巡检、慢 SQL 诊断、索引优化等技能,DBA 一句“帮我巡检 prod-mysql”,Agent 即刻执行真实分析。

  • 全链路监控审计:写操作需确认才执行,会话可追溯,Token 消耗可监控,安全事件自动告警。

效果直观:市场部同事打开 WebUI 一句话查渠道数据;开发者排查线上问题无需等待 DBA;DBA 在飞书群 @ 一下即可完成晨间巡检,耗时从 40 分钟缩短至 2 分钟。“不是所有人都会写 config.yaml,但所有人都会打字。”

RDSHermes 已上线阿里云 RDS AI 应用市场,支持免费试用。若已使用 OpenClaw/RDSClaw,执行 hermes claw migrate 一条命令即可平滑迁移全部配置与记忆数据。

总结

Hermes Agent 的 Self-Improving 本质是 Memory、Skill、Nudge Engine 三者的精密协同:Memory 记住“你是谁”,Skill 记住“怎么做事”,Nudge Engine 确保循环永续运转。用得越久,Agent 响应越快、错误越少。

OpenClaw 在 AI Agent 普及中功不可没,但其依赖人工调教、升级易崩溃、记忆文件持续膨胀的架构,正逐步完成历史使命。

开发者用数据投票——选择 Hermes,并非因其功能更多,而是因为它做了一件 OpenClaw 架构无法实现的事:用得越久,越好用。v0.6.0 起,Profiles 补齐多实例、MCP Server Mode 对接 IDE 生态、迁移工具覆盖 sessions/cron/memory,OpenClaw 用户切换门槛已被系统性拆除;叠加 RDSHermes 对数据库与云资源的安全访问管控,Agent 的能力边界已远超代码编写范畴。

如果你仍在手写 Skill、手动维护 MEMORY.md、每次升级前反复调试——不妨思考:你的时间,该花在给 Agent 做运维,还是让 Agent 自己学会做事?

【声明】内容源于网络
0
0
阿里云开发者
阿里巴巴官方技术号,关于阿里的技术创新均呈现于此。
内容 3761
粉丝 0
阿里云开发者 阿里巴巴官方技术号,关于阿里的技术创新均呈现于此。
总阅读45.7k
粉丝0
内容3.8k