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 代码编写,部分细节可能随版本更新而变化。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐