💡阅读指南

上一节我们用 /goal 模式重写了 UP 主监控器的提示词。但如果你在当前环境里直接执行这个 /goal 版本,会发现一个问题:Agent 已经执行过逐步骤版本,沉淀了技能和记忆,/goal 模式的"自主探索"优势体现不出来。这一节我们聊怎么用 Hermes 的多 Profile 机制创建一个干净环境。

10.1 为什么需要干净环境

在 default profile 里,你已经执行过了 6.8 的逐步骤版本。Agent 知道 B 站的字幕怎么拿、关注列表要翻页、日报格式是什么。现在你让它执行 /goal 版本,它不会从零开始探索,而是直接复用之前的经验。

这样看不出 /goal 模式和逐步骤模式的差异。/goal 模式的价值在于让 Agent 自主规划、探索最优路径,但如果它已经知道答案了,这个优势就被掩盖了。

我们需要一个干净的环境:没有之前的技能沉淀,没有相关的记忆,让 Agent 从头开始面对这个任务。

10.2 Hermes 的 Profile 机制

Hermes 的 Profile 是完全独立的 Agent 实例。每个 Profile 在硬盘上是一套独立的目录,包含配置、技能、记忆、会话、Gateway 等所有东西。两个 Profile 从不共享状态——唯一共享的是 Hermes 程序本身。

这就像在一台新电脑上重装了 Hermes,所有东西都是全新的。删除整个文件夹,Agent 就消失了。导出这个文件夹,可以在另一台机器上重建完全相同的 Agent。

创建和切换

你可以让当前的 Hermes 帮你创建新 Profile:

code
帮我创建一个新的 Profile,名字叫 goal-test,
用于测试 /goal 模式。

Hermes 会自动执行 hermes profile create goal-test,建好完整的目录结构。然后让它帮你配大模型:

code
帮我给 goal-test 配置大模型,用和我当前一样的配置。

创建完成后,在终端里用 -p 参数切换:

Bash
hermes -p goal-test
💡切换 Profile 的三种方式
  • 临时切换hermes -p goal-test "你的提示词",只执行这一次
  • 进入交互模式:先 hermes -p goal-test,然后持续对话
  • 设置默认hermes profile use goal-test,后续命令默认走 goal-test

查看当前 Profile

切换了几次之后,你可能会忘记当前在哪个 profile 里。用 hermes profile list 命令查看:

Bash
hermes profile list

当前激活的那个前面有个 * 号: alt text

想看某个 profile 的详细信息(模型、Gateway 状态、技能数量等),用 hermes profile show

Bash
hermes profile show goal-test

10.3 实测:从创建到运行

我们实际走一遍。

第一步:让 Hermes 帮你创建 Profile

打开你当前的 Hermes(default profile),对它说:

code
帮我创建一个新的 Profile,名字叫 goal-test,
用于测试 /goal 模式。

Hermes 会在终端里执行:

Bash
hermes profile create goal-test

输出大概是:

code
✓ Created profile: goal-test
  Path: ~/.hermes/profiles/goal-test
  Config: ~/.hermes/profiles/goal-test/config.yaml

然后它会把完整的目录结构建好,包括 config.yaml、.env、SOUL.md、skills/、memories/ 等等,所有文件都是默认模板。

第二步:配置大模型

新 Profile 是干净的,连大模型都没配。继续让 Hermes 帮你配:

code
帮我给 goal-test 配置大模型,用和我当前一样的配置。

Hermes 会读取你当前的 config.yaml,找到大模型相关的部分(model、api_key 等),复制到 goal-test 的 config.yaml 里。

完成后它会告诉你:"已配置完成,goal-test 现在可以使用 [模型名] 了。"

第三步:切换过去

打开一个新的终端窗口(或者在当前窗口退出 Hermes),运行:

Bash
hermes -p goal-test

进入交互模式。

这个时候,你发第一句话,就能感受到"干净环境"是什么意思。

比如你说:

code
你好,介绍一下你自己。

它会回复一段自我介绍,但不会提到任何关于 B 站、UP 主监控器的内容。因为它没有之前的会话历史,没有相关的技能,也没有记忆。

如果你去问 default profile 的 Hermes:"你还记得上次做的 B 站 UP 主监控器吗?",它会滔滔不绝地讲细节。但 goal-test 的 Hermes 会说:"我没有这个记录。"

这就是完全隔离的效果。

第四步:执行 /goal 版本

在 goal-test 里,把 6.10 写好的 /goal 版本提示词喂给它:

code
/goal 检查我 B 站"特别关注"分组(https://space.bilibili.com/xxxxxxx/relation/follow?tagid=-10)里所有 UP 主的最新动态。
找出过去 24 小时内的每个新视频,为每个视频生成约 100 字的内容摘要。

约束:
- 字幕提取必须通过 CDP 浏览器完成(裸 HTTP 请求拿不到字幕数据,
  因为 B 站的字幕接口要求登录态)
- 优先用字幕内容生成摘要;字幕获取失败时,最多尝试 3 种不同的获取方式,
  都失败后再降级用视频标题和简介
- 关注列表可能分页,必须翻页获取完整列表(B 站每页只显示 20 人)

整理成日报,格式包含:UP 主名称、视频标题、视频链接、内容摘要、摘要来源。

完成标准:
- 所有特别关注的 UP 主都已检查(无遗漏)
- 每个新视频都有对应的摘要条目
- 日报已通过微信发送

异常处理:
- 某 UP 主主页加载失败:记录失败,不阻塞其他 UP 主的检查
- 分组内无新视频:日报中说明"过去 24 小时无更新"

这次你会看到完全不同的执行过程。

goal-test 的 Hermes 不知道 B 站的字幕接口长什么样,不知道要调哪个 API,不知道关注列表分页怎么处理。它必须从零开始探索:先尝试理解任务,规划步骤,然后一步步执行。

Hermes 会不断地尝试、分析、继续,直到完成任务,或者中断。这个过程中最显著的特点是Hermes 不会打扰你,它会自己分析决策。除非是一些必须你给出的信息,才会停下来询问你。你能看到它的思考过程、试错路径、最终的解决方案。这正是 /goal 模式的价值:让 Agent 自主规划,而不是按你的步骤机械执行。

整个过程会比 逐步骤慢,因为 Agent 在探索;而你之所以觉得逐步骤的版本更快,只是因为你用自己的时间提前研究了技术方案,给了 Agent 步骤。

对比两个 Profile 的执行

执行完之后,你可以回到 default profile,问它同一个任务,但用逐步骤版本的提示词。你会发现:

  • default profile 执行逐步骤版本:执行很快,因为 Agent 知道怎么做,按步骤走。但如果你改了一个 API,它可能不会自动适应。
  • goal-test 执行 /goal 版本:执行慢一点,因为 Agent 在探索。但如果你告诉它"字幕接口变了",它会自动调整策略,因为它理解的是目标而不是步骤。

这就是为什么我们需要干净环境:只有在一个全新的 Profile 里,你才能真正看到 /goal 模式让 Agent 从零开始规划的效果。

10.4 实测

结果:

alt text

这里顺便提一下,最开始我在 goal-test 环境里测试的是 mini-max-3 。它输出了贼多的思考过程,然后执行了 4 分钟,还没进入到特别关注里,不知道要监控哪几个 UP 主: alt text 真的给我一种”一顿操作猛如虎,一看结果原地杵“的感觉。有时候模型与模型的差距还是挺大的。 而 DeepSeek-V4-Pro 很快就定位到目标: alt text

10.5 附:Profile、Gateway、Channel、Session 的关系

这四个概念是我们用得最多的机制,它们之间是什么关系,需要我们理清楚。

特别是当你新建了一个 profile,发现之前配置的飞书或微信不见了,会疑惑:channel 不是全局的吗?怎么新的 profile 里没有?

Profile 是最顶层的隔离单元。 一个 profile 就是一个完整的 Hermes 实例,有自己的配置、记忆、技能、会话。你可以把它理解成一台独立的电脑——装了 Hermes,配好了环境,存好了数据。

Gateway 是每个 profile 的「收发室」。 它是一个常驻后台的进程,负责接收外部平台的消息、转发给 Hermes 处理、再把回复发回去。每个 profile 可以有自己的 gateway 进程(gateway.pid),也可以不启动。Gateway 没有配好,消息就进不来、出不去。

Channel 是 gateway 对接的外部平台。 每个 profile 的 gateway 可以配置多个 channel(微信、飞书、Telegram 等),但这些配置不是全局共享的。default profile 接了飞书,goal-test 不会自动继承这个配置。如果你想让 goal-test 也能通过飞书收发消息,需要在 goal-test 里重新执行一遍 hermes -p goal-test gateway setup,给它单独配一个 channel。

这里有个实际问题:同一个平台的 Bot Token 通常只能被一个 gateway 使用。比如你只有一个微信的 Bot,那同一时间只能有一个 profile 的 gateway 在运行这个 Bot。

如果 default profile 的 gateway 正在运行,你再启动 goal-test 的 gateway 去连接同一个 Bot,平台会把旧连接踢掉。这是平台侧的限制,不是 Hermes 的问题。

如果你真的需要多个 profile 同时连接同一个平台,需要为每个 profile 创建独立的 Bot(比如在飞书里,就可以创建多个 bot,每个 bot 有独立的 token)。

Session 是 profile 内部的对话记录。 你在某个 profile 里和 Hermes 聊天,产生的对话历史就是 session。Session 存储在 profile 的 sessions/ 目录里,不同 profile 的 session 完全隔离。goal-test 里的对话记录,default profile 看不到;反过来也一样。

用一张图来看它们的关系:

code
Profile: goal-test
├── config.yaml          ← 模型配置、API Key
├── .env                 ← Bot Token(如果有)
├── SOUL.md              ← 个性设定
├── skills/              ← 技能目录
├── memories/            ← 记忆系统
├── sessions/            ← 这个 profile 的所有对话记录
│   ├── session_001.db
│   ├── session_002.db
│   └── ...
├── gateway.pid          ← Gateway 进程(收发室)
├── channel: 飞书        ← Gateway 对接的外部平台
├── channel: 微信        ← 可以有多个
└── ...

Profile: default
├── config.yaml
├── .env
├── SOUL.md
├── skills/
├── memories/
├── sessions/            ← default profile 的对话记录,和 goal-test 完全隔离
│   ├── session_001.db
│   └── ...
├── gateway.pid          ← default 的 Gateway 进程
├── channel: 飞书        ← 独立配置,不共享
└── ...

所以当你新建一个 profile 时,它就像一台刚装好系统的电脑——什么都配好了,但还没有启动收发室(gateway),也没有接外部平台(channel),更没有打过电话(session)。你需要手动给它配 channel,启动 gateway,然后开始对话,才会产生 session。

或者你也可以指挥你的 Hermes 来帮你配置这些。

这也是为什么我们说多 profile 是"完全隔离"的。它们共享的只是 Hermes 这个程序本身,数据、配置、gateway、channel、session 全部分开。

10.6 ■ 学点英语

中文 English 音标 说明
配置隔离 Profile Isolation /ˈproʊfaɪl ˌaɪsəˈleɪʃən/ 用不同 profile 分开保存配置和运行状态
干净环境 Clean Environment /kliːn ɪnˈvaɪrənmənt/ 没有历史配置干扰、适合测试复现的环境
配置继承 Configuration Inheritance /kənˌfɪɡjəˈreɪʃən ɪnˈherɪtəns/ 新环境继承旧环境配置的机制
测试复现 Test Reproduction /test ˌriːprəˈdʌkʃən/ 在相同条件下重新得到同样结果的能力