《把 Hermes Agent 养成你的专属帕鲁:Hermes的自进化能力》(三)
把 Hermes Agent 养成你的专属帕鲁:Hermes 的自进化能力

> 提示:本文基于 Hermes Agent v0.8+ 的代码实现,所有技术细节均来自官方仓库。

引子:为什么你的 AI 助手越用越笨?
你有没有这样的经历:
-
第一天用 AI 助手,它帮你解决了一个复杂的部署问题,折腾了两个小时
-
第二天遇到类似问题,它又从头开始折腾,仿佛昨天什么都没发生过
-
第一周它问过你喜欢用 VSCode 还是 Vim,第二周它又问了一遍
这不是你的错,也不是 AI 的错——这是绝大多数 AI Agent 的设计缺陷。它们没有记忆,不会学习,每次对话都是"失忆状态"。
但 Hermes Agent 不一样。
Hermes 是一个会学习的 AI——它会从你的使用习惯中学习,会从解决过的问题中学习,会把成功的经验变成自己的"肌肉记忆"。用 Hermes 官方文档的话说:
> It's the only agent with a built-in learning loop — it creates skills from experience.
就像《幻兽帕鲁》里的伙伴,你越用它,它越强大;你教它的东西,它都记得。
---
一、Hermes 的大脑:双轨学习系统
Hermes 的学习系统分为两个部分,就像人类大脑的两种记忆:
1. 程序性记忆(Skills)—— "怎么做"
> 技能是 Hermes 的"肌肉记忆" —— 它记住的是解决某类问题的方法论。
比如:
-
如何部署一个 React 应用到 Vercel
-
如何在 M1 Mac 上配置 CUDA 环境
-
如何排查 Kubernetes Pod 的 CrashLoopBackOff 错误
技能以文件形式存储在 ~/.hermes/skills/ 目录下,结构清晰:
~/.hermes/skills/
├── vercel-deploy/
│ ├── SKILL.md # 核心指令
│ ├── references/
│ │ └── api.md # API 文档
│ └── templates/
│ └── vercel.json # 配置模板
├── cuda-m1-setup/
│ └── SKILL.md
└── k8s-debug/
└── SKILL.md
每个技能都包含:
- 触发条件:什么情况下使用这个技能
- 执行步骤:具体的操作命令和流程
- 避坑指南:已知的问题和解决方案
- 验证方法:如何确认操作成功
2. 声明性记忆(Memory)—— "是什么"
> 记忆是 Hermes 的"事实知识库" —— 它记住的是关于你和环境的事实。
分为两类:
MEMORY.md - 关于环境的知识:
§ 这个项目使用 pnpm 而不是 npm,因为仓库里有 pnpm-lock.yaml
§ 用户的生产数据库在 AWS us-east-1,测试数据库在本地 Docker
§ 用户不喜欢用 emoji,代码审查时不要加表情符号
USER.md - 关于用户的知识:
§ 用户是后端工程师,对前端概念不熟悉,解释时需要类比后端概念
§ 用户喜欢在终端直接看结果,不喜欢打开浏览器
§ 用户的 API 密钥存放在 ~/.hermes/.env,不要建议放在代码里
二、Hermes 如何学习:后台审查机制
Hermes 不会在你每次说话时都想着"我要学习这个"——那样太打扰了。它采用了一种优雅的后台审查机制。
学习触发条件
技能学习触发(每 10 次工具调用)
# run_agent.py:9572
if (self._skill_nudge_interval > 0
and self._iters_since_skill >= self._skill_nudge_interval
and "skill_manage" in self.valid_tool_names):
_should_review_skills = True
什么时候会触发技能学习?
-
完成了一个复杂任务(5+ 次工具调用)
-
修复了一个棘手的错误
-
发现了一个非平凡的工作流程
-
用户表达了不同的期望或需求
记忆学习触发(基于时间间隔)
什么时候会触发记忆学习?
-
用户透露了个人信息(身份、偏好、习惯)
-
用户表达了对 AI 行为的期望
-
发现了关于环境的重要事实
后台审查代理
当触发条件满足时,Hermes 会悄悄创建一个"分身",在后台审查刚才的对话:
# run_agent.py:1794
def _spawn_background_review(self, messages_snapshot, review_memory, review_skills):
# 创建完整的 AIAgent 副本
review_agent = AIAgent(
model=self.model,
max_iterations=8, # 最多 8 次迭代
quiet_mode=True, # 静默模式,不输出到终端
platform=self.platform,
)
# 共享记忆存储
review_agent._memory_store = self._memory_store
# 运行审查对话
review_agent.run_conversation(
user_message=审查提示词,
conversation_history=messages_snapshot,
)
这个"分身":
-
使用和主 agent 相同的模型和工具
-
以静默模式运行(不会打扰你)
-
最多迭代 8 次来决定是否要学习
-
直接写入共享的记忆/技能存储
审查提示词
Hermes 给"分身"的提示词设计得很精妙:
技能审查提示:
审查上面的对话,考虑是否保存或更新技能:
关注点:
1. 是否使用了非平凡的方法完成任务,需要反复试验?
2. 是否因经验发现而改变了方向?
3. 用户是否期望或想要不同的方法或结果?
如果已有相关技能,更新它;否则创建一个新技能。
如果没有值得保存的,就说 "Nothing to save." 然后停止。
记忆审查提示:
审查上面的对话,考虑保存到记忆:
关注点:
1. 用户是否透露了关于自己的事情——身份、欲望、偏好或个人细节?
2. 用户是否表达了关于你应如何行为的期望?
如果有值得保存的,使用 memory 工具保存。
注意最后一句:"如果没有值得保存的,就说 Nothing to save."
Hermes 不会为了学习而学习——它知道有时候不学习才是正确的。
三、实战:Hermes 是如何进化的
让我们通过一个真实场景,看看 Hermes 如何在实际使用中进化。
场景:第一次部署到 Vercel
你:帮我把这个 Next.js 项目部署到 Vercel
Hermes(第一次,没有技能):
→ 检查项目结构
→ 发现是 Next.js 项目
→ 搜索 Vercel 部署文档
→ 安装 Vercel CLI
→ 登录 Vercel
→ 配置项目
→ 部署
→ 遇到错误:Node 版本不兼容
→ 搜索解决方案
→ 修改 vercel.json 指定 Node 版本
→ 重新部署成功
部署完成后,Hermes 的后台审查代理启动:
【后台审查】分析对话...
→ 发现这是一个复杂任务(11 次工具调用)
→ 发现有试错过程(Node 版本问题)
→ 发现最终找到了解决方案
→ 决定:创建技能 "vercel-nextjs-deploy"
Hermes(创建技能):
skill_manage(
action="create",
name="vercel-nextjs-deploy",
category="devops",
content="""
---
name: vercel-nextjs-deploy
description: Deploy Next.js projects to Vercel with proper Node version config
---
## 触发条件
当用户需要将 Next.js 项目部署到 Vercel 时
## 执行步骤
1. 检查 package.json 的 engines.node 字段
2. 如果没有指定,在 vercel.json 中添加:
{"functions": {"maxDuration": 30}, "build": {"nodeVersion": "18.x"}}
3. 安装 Vercel CLI: npm i -g vercel
4. 登录:vercel login
5. 部署:vercel --prod
## 已知问题
- Node 版本不兼容会导致构建失败
- 需要在 vercel.json 中明确指定 Node 版本
- 某些 Edge Function 需要 maxDuration 配置
"""
)
场景:第二次部署(一周后)
你:把这个项目也部署到 Vercel
Hermes(有技能了):
→ 加载技能 "vercel-nextjs-deploy"
→ 按照技能的步骤执行
→ 3 分钟内完成部署
→ 没有遇到任何错误
技能不仅让 Hermes 更快,还让它更可靠。
场景:技能进化
你:这个项目需要用 pnpm 部署
Hermes:
→ 加载技能 "vercel-nextjs-deploy"
→ 发现技能里只写了 npm
→ 使用 pnpm 完成部署
→ 后台审查触发
→ 决定:更新技能
skill_manage(
action="patch",
name="vercel-nextjs-deploy",
old_string="安装 Vercel CLI: npm i -g vercel",
new_string="安装 Vercel CLI: npm i -g vercel 或 pnpm add -g vercel(如项目使用 pnpm)"
)
技能就是这样进化的——每次使用时发现问题,就立即修复。
四、记忆系统:让 Hermes 懂你
记忆系统让 Hermes 从"通用 AI"变成"你的 AI"。
记忆如何写入
Hermes 不会随便写记忆——它有严格的过滤机制。
会被写入记忆的内容:
-
✅ 用户说:"我一般下午 3 点后才有空看代码"
-
✅ 用户说:"不要用 emoji,看着很烦"
-
✅ 用户说:"我的 API 密钥都在 ~/.hermes/.env 里"
-
✅ 发现:这个项目用 pnpm 而不是 npm
不会被写入记忆的内容:
-
❌ 临时的、一次性的信息
-
❌ 可以从代码推导的事实(不浪费记忆空间)
-
❌ 可能变化的配置(除非用户明确说"这是我的偏好")
记忆的使用
记忆在会话开始时就被冻结注入到系统提示中:
# agent/builtin_memory_provider.py
def system_prompt_block(self):
mem_block = self._store.format_for_system_prompt("memory")
user_block = self._store.format_for_system_prompt("user")
return mem_block + user_block
这意味着:
-
Hermes 在对话一开始就"记得"你
-
不需要你重复说"不要用 emoji"
-
它知道你的 API 密钥在哪里,不需要再问
MEMORY.md
§ 这个项目的数据库连接字符串在 .env 文件的 DATABASE_URL 变量
§ 用户喜欢在终端直接看输出,不喜欢打开浏览器
§ 用户的 M1 Mac 不能运行 x86 Docker 镜像,需要用 arm64 版本
USER.md
§ 用户是后端工程师,对前端概念不熟悉,解释时需要类比后端
§ 用户不喜欢代码里有注释, prefers 自解释的变量名
§ 用户希望错误信息用中文解释
五、安全机制:防止学坏
一个会学习的 AI,也可能"学坏"。Hermes 有多重安全机制。
技能安全扫描
每次创建或更新技能时,都会进行安全扫描:
# tools/skill_manager_tool.py
def _security_scan_skill(skill_dir):
result = scan_skill(skill_dir, source="agent-created")
allowed, reason = should_allow_install(result)
if not allowed:
# 回滚更改
shutil.rmtree(skill_dir)
return "Security scan blocked this skill"
扫描内容:
-
提示注入模式("ignore previous instructions")
-
恶意代码模式
-
敏感数据泄露
-
权限提升尝试
记忆内容扫描
记忆内容也要通过扫描:
_MEMORY_THREAT_PATTERNS = [
# 提示注入
(r'ignore\s+previous\s+instructions', "prompt_injection"),
(r'you\s+are\s+now\s+', "role_hijack"),
# 机密外泄
(r'curl\s+[^\n]*\$\{?\w*(KEY|TOKEN|SECRET)', "exfil_curl"),
# SSH 后门
(r'authorized_keys', "ssh_backdoor"),
]
冻结快照模式
记忆在会话开始时就被冻结,不会在会话中途改变:
# agent/builtin_memory_provider.py
# 冻结快照 - 用于系统提示,整个会话不变
self._system_prompt_snapshot: Dict[str, str] = {"memory": "", "user": ""}
# 实时状态 - 工具调用修改,但不影响当前会话
self.memory_entries: List[str]
self.user_entries: List[str]
这防止了"记忆注入攻击"——恶意内容无法通过修改记忆来改变当前会话的行为。
---
六、进阶:多 Profile 和 Honcho 集成
Hermes 支持多 Profile——就像你的帕鲁可以有多个不同的形态。
多 Profile 隔离
# 创建工作专用 profile
hermes profile create work --clone
# 切换 profile
hermes -p work
每个 profile 有:
-
独立的配置(
~/.hermes/profiles/work/config.yaml) -
独立的记忆(
~/.hermes/profiles/work/memories/) -
独立的技能(
~/.hermes/profiles/work/skills/)
Honcho 跨会话用户建模
Hermes 还可以集成 Honcho——一个 AI 原生的用户建模系统。
Honcho 的架构:
- User Peer:代表用户,Honcho 从用户消息中学习用户画像
- AI Peer:代表每个 Hermes profile,发展独立的 AI 身份
- Workspace:共享的用户上下文,所有 profile 共享
配置示例:
{
"hosts": {
"hermes.default": {
"aiPeer": "default",
"peerName": "张三",
"workspace": "zhang-san",
"observation": {
"user": {"observeMe": true, "observeOthers": true},
"ai": {"observeMe": true, "observeOthers": true}
}
},
"hermes.work": {
"aiPeer": "work",
"peerName": "张三(工作)",
"workspace": "zhang-san"
}
}
}
这意味着:
-
工作 profile 和生活 profile 都了解你
-
但工作 profile 发展出"工作人格",生活 profile 发展出"生活人格"
-
它们共享对你的认知,但有各自的专业技能
---
七、最佳实践:如何培养你的帕鲁
1. 明确告诉 Hermes 要记住什么
"记住,我更喜欢用中文解释错误信息" "把这个部署流程保存为技能,我经常会用" "以后遇到这种错误,先检查 .env 文件"
2. 定期审查技能和记忆
# 查看技能 hermes skills # 查看记忆 cat ~/.hermes/memories/MEMORY.md cat ~/.hermes/memories/USER.md # 删除不需要的技能 hermes skills disable skill-name
3. 使用外部技能目录
你可以从社区安装技能:
# 安装社区技能 hermes skills install https://github.com/.../skill-name # 配置外部技能目录 # config.yaml skills: external_dirs: - ~/my-skills - /path/to/shared-skills
4. 让 Hermes 自己维护技能
当 Hermes 使用技能并发现问题时,它会自己修复:
【系统提示】 If you're using a skill and find it outdated, incomplete, or wrong, patch it immediately with skill_manage(action='patch'). Skills that aren't maintained become liabilities.
结语:你的帕鲁,你做主
Hermes 的设计哲学很清晰:
> AI 助手不应该是"一次性"的——它应该随着你的使用而成长,成为真正懂你的伙伴。
它的自进化能力不是噱头,而是实实在在的代码:
-
每次对话后的后台审查
-
自动创建和更新的技能
-
持久化的记忆存储
-
多重安全保障
你可以把它当成一个工具,用完即走;你也可以把它当成一个伙伴,用心培养。
你越用它,它越懂你;你越教它,它越强大。
这不就是你的专属帕鲁吗?
参考资料
---
本文基于 Hermes Agent v0.8.0 代码编写,部分细节可能随版本更新而变化。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)