背景
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_used、use_count、success_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 自己学会做事?

