Hermes Agent 玩了两周之后我才真正搞懂的事:中级到高级进阶指北

目录

  1. 写在开头:为什么我要写这篇
  2. 一、记忆系统:先把「它怎么记东西」这件事搞清楚
    1. 1. 整体架构,其实不是两层而是三层
    2. 2. 为什么它「记不住」?因为是冻结快照
    3. 3. 怎么让它真的记住你说的话
    4. 4. 记忆文件的字数是有硬限制的
    5. 5. 四个文件别搞混:MEMORY / USER / SOUL / AGENTS
    6. 6. nudge_interval 怎么调
    7. 7. 长任务中怎么防止它忘事
    8. 8. 外部 Memory Provider 怎么选
    9. 9. 记忆与技能的联动
  3. 二、Skill 自进化:把”知道怎么做”变成”标准化 SOP”
    1. 1. Skill 到底是什么
    2. 2. Skill 什么时候会被自动创建
    3. 3. 怎么判断一个 Skill 写得好不好
    4. 4. 技能退化和重复问题
    5. 5. Self-optimization 是个能力方向,不是固定开关
  4. 三、多 Agent 协作:分身不是越多越好
    1. 1. 子 Agent 的并发要克制
    2. 2. 子 Agent 的上下文必须传完整
    3. 3. Profiles:一台机器跑多个独立 Hermes
    4. 4. 跨 Profile 共享技能
    5. 5. 主 Agent 协调的关键是「角色分工」
    6. 6. 避免资源冲突
  5. 四、生产化部署:让它 7×24 稳定运行
    1. 1. Gateway 的三种常驻方式
    2. 2. Cron 定时任务:时区是头号大坑
    3. 3. Heartbeat:防止静默失败
    4. 4. 日志与调试
    5. 5. Tirith:安全扫描模块
    6. 6. Telegram / Discord 上线前的白名单
    7. 7. 生产部署 Checklist
  6. 五、MCP 与高级调试
    1. 1. MCP 接本地文件系统
    2. 2. 我常用的调试命令集
  7. 六、七个最常问的问题
  8. 七、配置速查(v0.9.0 参考)
  9. 写在结尾
  10. 延伸阅读:OpenClaw 社区资源

写在开头:为什么我要写这篇

假设你已经装好了 Hermes Agent、能正常对话、也跑通过一两个简单工具——也就是 那篇三阶段通关路线图 里说的「中级水平」。

然后你很可能会撞上一道墙:

“为什么它总是忘事?”
“为什么我让它保存技能,它保存的版本根本不能用?”
“多开几个子 Agent,钱包就开始报警。”
“装成服务了,结果定时任务半夜才跑,还跑错时区。”

我这两周基本把这些坑全踩了一遍。这篇文章的目的就是把我趟出来的经验整理成一份进阶指北,不再讲安装,直接进入五个真正决定你 Agent 好不好用的核心模块:

  1. 记忆系统
  2. Skill 自进化
  3. 多 Agent 协作
  4. 生产化部署
  5. MCP 扩展与调试

读完这篇,如果你照着配一遍,大概率能把 Hermes Agent 从「偶尔惊艳的玩具」升级成「可以托付的同事」。


一、记忆系统:先把「它怎么记东西」这件事搞清楚

1. 整体架构,其实不是两层而是三层

很多入门教程会告诉你 Hermes 有”内置 + 外部”两层记忆,这个说法偏简化。更准确的描述是三层

  • 内置记忆(始终激活):MEMORY.mdUSER.md
  • 外部 Memory Provider(可选叠加):Mem0、Holographic、Honcho、Supermemory 等
  • 运行时上下文(会话级):当前对话的 context window

关键认知:外部 Provider 不是”替代”内置记忆,而是”叠加”。两边同时在工作,内置的始终会被注入到 System Prompt 头部。

2. 为什么它「记不住」?因为是冻结快照

这是我踩的第一个大坑。

MEMORY.mdUSER.md 每次会话开始时会作为冻结快照注入到上下文里。”冻结”这个词很关键——会话中途 Agent 写入的新记忆,不会立刻改变当前这轮对话的上下文。要等到下次会话重启,新内容才会作为快照再次被读入。

为什么要这么设计?两个原因:

  • 省钱:如果每轮对话都实时更新 System Prompt 头部,KV Cache 前缀就会失效,推理成本飙升;
  • 防污染:Agent 思考过程中的碎碎念、临时试错、中间结果其实不值得长期保留,必须过一道筛子。

这个筛子叫 Agent-curated memory(策展式记忆)。Agent 会自己判断什么值得写、什么不值得。

3. 怎么让它真的记住你说的话

实战里,以下场景 Agent 更倾向于保留:

  • 你明确说了偏好:”我喜欢用 Python 3.11,不要 3.12”
  • 环境事实:”这台机器装的是 PostgreSQL 16 + SQLx”
  • 你纠正了它:”不要用 sudo,我在 docker 组里”
  • 完成了一个重要里程碑
  • 你直接命令它:”记住这件事”

最有效的一招:直接下指令。

1
记住我的偏好:所有代码统一使用 Python 3.11,不要用 3.12 或 3.13。

关于记忆系统的机制我另外写过一篇 Hermes Agent 记忆系统剖析,想看更底层原理的可以跳过去。

4. 记忆文件的字数是有硬限制的

这里有两个数字必须记住:

文件 硬限制 建议日常保持 相当于
MEMORY.md 2,200 字符 ~1,800 字符 约 1,200 汉字
USER.md 1,375 字符 ~1,100 字符 约 700 汉字

留 20% 左右的余量给 Agent 自动追加就够了。我的经验是:不要塞满。塞满之后 Agent 要么频繁触发整理、要么直接截断丢信息。

高密度、少条目、不重复,永远比”什么都往里塞”好用。

5. 四个文件别搞混:MEMORY / USER / SOUL / AGENTS

这是另一个坑——文件是四个,各管一摊:

文件 位置 谁维护 内容
MEMORY.md ~/.hermes/memories/ Agent 为主 工作笔记、环境事实、技巧
USER.md ~/.hermes/memories/ Agent 为主 用户画像、偏好、沟通风格
SOUL.md ~/.hermes/ 你手写 人格、行为准则、固定规则
AGENTS.md 项目根目录 你手写 项目级规范与约束

铁律:不要把”固定规则”写进 MEMORY.md。那东西会被 Agent 整理、压缩、替换。想让一条规则永远生效,写进 SOUL.md

AGENTS.md 是项目级的,跟着代码仓库走。一个参考样板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 项目规范:MyAPI Service

## 技术栈
- 语言:Rust 1.75+
- 框架:Axum
- 数据库:PostgreSQL 16 (SQLx)

## 编码约定
1. 所有数据库查询必须使用 SQLx 宏做编译期检查
2. 错误处理统一用 anyhow::Result + 自定义 AppError
3. 凭证一律从 .env 读取,禁止硬编码

## 常用命令
- 运行测试:cargo test --all-features
- 启动服务:cargo run --bin server

6. nudge_interval 怎么调

nudge 是 Hermes 决定”是否做一次记忆反思”的节奏参数。数值越小越频繁,token 消耗越高。

打开 ~/.hermes/config.yaml

1
2
memory:
nudge_interval: 5

这里的”轮”是一次完整的”用户输入 + Agent 回复”,不是 Agent 内部的 tool call 次数。别算错。

我的推荐起点:

  • 小模型 / 小上下文窗口:3–5(上下文紧,重要信息早点固化)
  • 主流模型 / 常规上下文:5–10(成本与质量的平衡点)
  • 大上下文模型(128k+):10–15(反正窗口大,等它攒够了再总结)

默认值在很多安装里是 10,但版本迁移后不一定,以你本机 config.yaml 实际值为准。

7. 长任务中怎么防止它忘事

方法一:手动 Checkpoint。长任务跑到一半主动说一句:

1
当前进度:数据清洗和特征工程已完成,下一步训练模型。请把这个进度写入记忆。

方法二:外部任务状态文件。超长任务建议让 Agent 维护一个专门的 TASK_STATUS.md 在项目里:

1
2
请在项目目录下创建 TASK_STATUS.md,记录当前任务的完整状态。
每次我们恢复工作时,先读取这个文件。

这招对跨日、跨周的项目尤其好用。

8. 外部 Memory Provider 怎么选

从 v0.7.0 起 Hermes 就支持可插拔的外部 Memory Provider。目前活跃的有:Mem0、Holographic、Honcho、OpenViking、Hindsight、RetainDB、ByteRover、Supermemory。

两个我实际用过还不错的推荐:

Mem0(托管、省心)

1
2
3
4
5
pip install mem0ai
# 去 https://app.mem0.ai/ 拿 Key
echo "MEM0_API_KEY=your-key" >> $HERMES_HOME/.env
hermes config set memory.provider mem0
hermes memory status

自动提取、自动同步,适合懒人。

Holographic(本地、隐私)

1
2
hermes config set memory.provider holographic
hermes memory status

数据不出本机,适合不想把记忆上传第三方的场景。

9. 记忆与技能的联动

当你发现 MEMORY.md 里反复出现类似”部署前要先 A、再 B、最后 C”这种工作流条目,这就是一个 Skill 化的信号

1
2
我注意到你记住了我们的部署流程。把它创建为 Skill,命名 deploy-workflow,
这样以后可以直接复用。

记忆是零散事实,Skill 是结构化 SOP。两者的联动,是 Hermes 真正”越用越强”的底层逻辑。


二、Skill 自进化:把”知道怎么做”变成”标准化 SOP”

1. Skill 到底是什么

先澄清一个常见误解:Skill 不是可执行代码。它是一份结构化的操作知识,包含:

  • 触发条件:什么时候该用
  • 操作步骤:具体怎么执行
  • 注意事项:踩过的坑
  • 验证方法:怎么确认成功

Skill 存在 ~/.hermes/skills/(或当前 Profile 的 HERMES_HOME/skills/)。它更接近 Agent 的”程序性记忆”——“我会做 X 这类事”,而不是”我记得 X 这件事”。

详细机制可以看 Hermes Agent Skills 深度解析,我这里只讲实战。

2. Skill 什么时候会被自动创建

四种典型触发场景:

  • 完成了一个相对复杂的多步任务
  • 先走错路后找到了正确路径
  • 你纠正了它的做法,得出了更好的流程
  • 出现了一个非平凡的可复用工作流

关键词是”非平凡“。如果只是”打开文件并读取”这种一步的事,它不会创建 Skill。

主动引导最可靠

1
2
刚才这个数据处理流程很有价值,把它保存为 Skill,命名 data-pipeline,
放在 devops 分类下,包含触发条件、操作步骤、注意事项和验证方法。

3. 怎么判断一个 Skill 写得好不好

四个标准,缺一个就大概率会在用的时候翻车:

  • 触发条件清晰:Agent 能准确判断什么时候该用
  • 步骤可执行:每一步都是具体操作,而不是”考虑一下要不要 xxx”
  • 有验证方法:执行完能判断成功没成功
  • 有注意事项:记录了踩过的坑和边界条件

我的建议:让 Agent 做定点修改,不要让它整篇重写。重写很容易把之前积累的关键细节丢了。

1
2
更新 stock-daily-report 这个 Skill,在注意事项里补充一条:
"周五收盘后数据可能延迟到周六早上才完整。"

4. 技能退化和重复问题

用久了会出现两个典型问题:

  • 描述越来越模糊、触发条件越来越宽
  • 几个 Skill 干的是同一件事,只是写法不同

处理方法是定期做技能审计

1
2
3
4
5
6
审查你所有的 Skills,找出:
1. 功能重复的(给出合并方案)
2. 描述模糊、触发条件不清晰的(给出重写方案)
3. 步骤已经过时的(给出更新方案)

先给我一份审计报告,等我确认后再执行修改。

“先报告再执行”这个模式我强烈推荐——尤其是批量操作 Skill 的时候,Agent 一旦走偏,成本很难收回。

5. Self-optimization 是个能力方向,不是固定开关

Hermes 从 v0.8.0 到 v0.9.0 在 tool-use 优化和失败模式修复上持续增强,体感上 Agent 对”上次这里卡住过”的修复越来越自然。

但具体怎么开、配置键叫什么,在不同版本变化比较快。我的建议:把 Self-optimization 当成方向来理解,配置项以你本机当前版本为准,不要照搬别人的旧 config。


三、多 Agent 协作:分身不是越多越好

1. 子 Agent 的并发要克制

先说结论:2–3 个起步,不要一上来开五个十个

理由有三:

  • 在线 API 几乎都有 Rate Limit,并发高了就 429;
  • 子任务上下文传递不完整时,并发越多失败越多;
  • 成本是线性甚至超线性增长的。

我的实际经验:2 个稳过、3 个够用、超过 3 个得看 API 配额和任务质量再决定

2. 子 Agent 的上下文必须传完整

这是我撞过最狠的一堵墙。子 Agent 不是从主 Agent 的脑子里复制意识过去,而是从一个新会话开始

所以你必须把它需要的一切塞进 context

1
2
3
4
5
6
7
8
9
10
delegate_task(
goal="修复 api/handlers.py 中的 TypeError",
context="""
文件路径:/home/user/myproject/api/handlers.py
错误信息:第 47 行 TypeError: 'NoneType' object has no attribute 'get'
原因:parse_body() 在 Content-Type 缺失时返回 None
项目使用 Python 3.11 + Flask
依赖版本:flask==3.0.0, pydantic==2.5.0
"""
)

不要假设子 Agent 知道”这个错误”、”刚才那个文件”、”我们上一步的思路”。它都不知道。

更完整的拆分策略和失败模式,看我之前那篇 Hermes Agent 子 Agent 模式详解

3. Profiles:一台机器跑多个独立 Hermes

Profile 是完整隔离的 Hermes 环境,每个 Profile 有独立的 config、memory、session、skill,底层是通过不同的 HERMES_HOME 实现目录级隔离。

三种创建方式:

1
2
3
4
5
6
7
8
# 全新空白
hermes profile create mybot

# 克隆配置(API Key 和模型共用,记忆和会话独立)
hermes profile create work --clone

# 完整克隆(包括记忆、技能、会话)
hermes profile create backup --clone-all

切换 Profile 之后,对应的 HERMES_HOME 会指向 ~/.hermes/profiles/<name>/。只有默认 Profile 还在 ~/.hermes/ 根目录下。

运行多个 Agent 很简单——开两个终端:

1
2
3
4
5
# 终端一:编码助手
coder chat

# 终端二:投研助手(独立记忆和技能)
research chat

4. 跨 Profile 共享技能

如果你希望几个 Profile 共享一批核心 Skill,可以给它们指定共享目录:

1
2
3
skills:
external_dirs:
- ~/.hermes/shared-skills

具体字段名在不同版本可能不一样,建议以你本机 config.yaml 默认模板为准。

5. 主 Agent 协调的关键是「角色分工」

SOUL.mdAGENTS.md 里明确写死每个角色的边界:

1
2
3
4
## 多 Agent 协作规范
- Planner:任务分解与进度追踪,不直接执行
- Executor:数据获取和处理,不做决策
- Reviewer:质量检查和结果验证,不做修改

让每个 Agent 只做自己该做的事。角色边界越模糊,协作越容易乱。

6. 避免资源冲突

Bot Token 冲突:两个 Profile 共用同一个 Telegram Token,Gateway 会打架。各自用独立 Token。

端口冲突:本地跑多实例时,指定不同端口:

1
2
3
4
5
# Profile A
GATEWAY_PORT=8080

# Profile B
GATEWAY_PORT=8081

四、生产化部署:让它 7×24 稳定运行

1. Gateway 的三种常驻方式

方式一:Systemd(Linux 生产首选)

1
2
3
hermes gateway install
systemctl status hermes-gateway
journalctl -u hermes-gateway -f

如果你用了命名 Profile,服务名可能会带 Profile 后缀,以实际安装输出为准。

方式二:Docker Compose(多 Profile 部署推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: "3.8"
services:
hermes-default:
image: nousresearch/hermes-agent:latest
container_name: hermes-default
restart: unless-stopped
command: gateway run
volumes:
- ~/.hermes:/opt/data

hermes-coder:
image: nousresearch/hermes-agent:latest
container_name: hermes-coder
restart: unless-stopped
command: gateway run
volumes:
- ~/.hermes/profiles/coder:/opt/data

强烈提醒:不要让两个容器挂载同一个数据目录,共享状态文件会打架。

方式三:tmux/screen:只适合开发调试,生产别用。

2. Cron 定时任务:时区是头号大坑

先说我踩过的一个真实案例:一个”每天早上 8:30 出日报”的 Cron,真实触发时间是深夜 0:30

原因很简单——海外云服务器默认时区是 UTC,Hermes 的 Cron 严格按系统时区走。配定时任务之前必须做一件事:

1
2
3
4
5
# 查当前时区
timedatectl

# 不对就改成本地时区
sudo timedatectl set-timezone Asia/Shanghai

时区对了之后再配任务:

1
hermes cron add "30 8 * * 1-5" "生成今日 A 股市场日报并发送到 Telegram"

创建完务必手动跑一次验证:

1
2
hermes cron list
hermes cron run 任务名

更多 Cron 玩法见 Hermes Agent Cron 定时任务实战

3. Heartbeat:防止静默失败

长期运行的服务最怕”它死了但没人知道”。开 Heartbeat:

1
echo "GATEWAY_HEARTBEAT=true" >> ~/.hermes/.env

配合外部监控(比如 Healthchecks.io)可以做到服务宕机时直接推送告警。

4. 日志与调试

日志路径跟着当前 Profile 走,默认在 ~/.hermes/logs/

1
2
3
tail -f ~/.hermes/logs/hermes.log
hermes logs # 内置的日志查看
hermes debug share # 生成脱敏调试报告,方便报 issue

5. Tirith:安全扫描模块

Tirith 是 Hermes 的预执行安全扫描层。三档模式:

1
2
3
4
approvals:
mode: manual # 所有高风险命令都要人工确认
# mode: smart # 辅助判断分级,低风险直接放行
# mode: off # 关闭检查,仅可信环境

我的建议:生产环境从 manual 起步。低风险命令被频繁拦截再考虑换 smart 或加白名单。

更系统的权限模型见 Hermes Agent 安全与权限配置

6. Telegram / Discord 上线前的白名单

必做:配置允许访问的用户范围。

1
2
echo "TELEGRAM_BOT_TOKEN=your-token" >> ~/.hermes/.env
echo "TELEGRAM_ALLOWED_USERS=your-user-id,your-friend-id" >> ~/.hermes/.env

没有白名单的 Bot = 公开 API = 分分钟被陌生人跑爆你的 Token 余额。这个坑我见过至少三个人踩过。

7. 生产部署 Checklist

上线前对着跑一遍:

  • hermes doctor 没报错
  • API Key 在 .env 里,不在 config.yaml
  • GATEWAY_HEARTBEAT=true 已开启
  • 用户白名单已配置(Telegram / Discord / 飞书等)
  • approvals.mode 按环境敏感度选择
  • Systemd 或容器 restart: unless-stopped 已配置
  • 时区已核对:timedatectl 输出符合预期
  • 首条 Cron 任务已手动 hermes cron run 验证过

五、MCP 与高级调试

1. MCP 接本地文件系统

MCP(Model Context Protocol)是 Agent 调用外部工具的标准协议。接上之后,Hermes 能直接操作文件、数据库、自定义 API,不再完全依赖终端命令。

最经典的入门案例是接本地文件系统:

1
npm install -g @modelcontextprotocol/server-filesystem

$HERMES_HOME/mcp.json 里配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/home/ubuntu/projects",
"/home/ubuntu/data"
]
}
}
}

只暴露你真正希望 Agent 能动的目录。不要图省事直接给 /

2. 我常用的调试命令集

这五条基本能覆盖 90% 的故障排查场景:

1
2
3
4
5
hermes doctor          # 全面健康检查,优先运行
hermes memory status # 记忆系统状态
hermes skills list # 看现有技能
hermes mcp status # MCP 连接状态
hermes debug share # 生成脱敏调试报告

遇到问题的流程我一般是:doctor → 看日志 → 按组件独立 status → 必要时 debug share 找社区。


六、七个最常问的问题

Q1:告诉它一件事,下次还是不记得?

A:会话太短导致没触发记忆整理,或者它没把这事判断为”值得长期保留”。明确下指令”请写入你的长期记忆”最直接。

Q2:Cron 没按时触发?

A:按这个顺序查:① hermes cron list 任务状态;② Gateway 是否在跑;③ timedatectl 时区对不对;④ hermes cron run 任务名 手动验证逻辑。

Q3:Tirith 总拦我正常命令?

A:三选一——临时切宽松模式 / 把 approvals.mode 从 manual 调成 smart / 把高频命令加进 allowlist(版本支持的话)。

Q4:多个 Profile 能共享一个 Telegram Bot 吗?

A:别。多 Gateway 共用 Token 会冲突,各自一个 Token 更稳。

Q5:日志太大怎么办?

A:先看当前版本有没有内置轮转。没有的话手动清理,清理前确认重要问题已留档。

Q6:子 Agent 并发烧钱怎么控?

A:① 并发从 2–3 起步;② 子任务上下文写清楚,减少试错;③ 给子 Agent 单独指定更便宜的模型和更小的轮次上限;④ 配 Credential Pool 做多 Key 轮转,既缓解 429 也省心。

Q7:子 Agent 总说不知道任务背景?

A:因为它真不知道——它不继承主会话历史。必须在 context 字段里把文件路径、报错信息、项目结构、依赖版本全写出来。


七、配置速查(v0.9.0 参考)

以下示例默认按默认 Profile 编写。用命名 Profile 时把 ~/.hermes 换成你当前的 HERMES_HOME

config.yaml 参考

1
2
3
4
5
6
7
8
9
10
11
12
13
agent:
max_turns: 90

memory:
nudge_interval: 10
provider: mem0 # 可选 holographic / honcho / supermemory

approvals:
mode: smart # 生产环境推荐从 manual 起步

terminal:
backend: docker
timeout: 60

.env 参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 核心 API Key
OPENAI_API_KEY=sk-xxx
ANTHROPIC_API_KEY=sk-ant-xxx

# Gateway
GATEWAY_PORT=8080
GATEWAY_HEARTBEAT=true

# 平台接入与白名单
TELEGRAM_BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
TELEGRAM_ALLOWED_USERS=123456789,987654321

# 外部记忆(按需)
MEM0_API_KEY=m0-xxx

不同版本字段名会有微调,以本机 config.yaml 默认模板为准,不要照抄别人三个月前的配置。


写在结尾

这五块东西是我真正把 Hermes Agent 从”能跑”推到”好用”的关键差异点。如果你只打算记住一句话,那我建议你记住这个:

不要把 Agent 当成黑箱,要把它当成一个需要你花时间磨合的新同事。

记忆要引导、Skill 要审计、子 Agent 要分工、生产上线要做 Checklist,和带新人的流程几乎一模一样。

剩下的就是耐心。1 天装好、1 周熟练、1 个月融入工作流,是相对合理的节奏。


延伸阅读:OpenClaw 社区资源

AI Agent 工程化落地这件事,姊妹站 OpenClaw 中文社区 从另一条路径也做了大量整理:

参与讨论

对这篇文章有疑问或想法?cocoloop 社区有不少开发者在讨论 Hermes 相关话题,欢迎加入交流。

前往 cocoloop 社区 →