上一节我们用 /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:
帮我创建一个新的 Profile,名字叫 goal-test,
用于测试 /goal 模式。
Hermes 会自动执行 hermes profile create goal-test,建好完整的目录结构。然后让它帮你配大模型:
帮我给 goal-test 配置大模型,用和我当前一样的配置。
创建完成后,在终端里用 -p 参数切换:
hermes -p goal-test
- 临时切换:
hermes -p goal-test "你的提示词",只执行这一次 - 进入交互模式:先
hermes -p goal-test,然后持续对话 - 设置默认:
hermes profile use goal-test,后续命令默认走 goal-test
查看当前 Profile
切换了几次之后,你可能会忘记当前在哪个 profile 里。用 hermes profile list 命令查看:
hermes profile list
当前激活的那个前面有个 * 号:

想看某个 profile 的详细信息(模型、Gateway 状态、技能数量等),用 hermes profile show:
hermes profile show goal-test
10.3 实测:从创建到运行
我们实际走一遍。
第一步:让 Hermes 帮你创建 Profile
打开你当前的 Hermes(default profile),对它说:
帮我创建一个新的 Profile,名字叫 goal-test,
用于测试 /goal 模式。
Hermes 会在终端里执行:
hermes profile create goal-test
输出大概是:
✓ 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 帮你配:
帮我给 goal-test 配置大模型,用和我当前一样的配置。
Hermes 会读取你当前的 config.yaml,找到大模型相关的部分(model、api_key 等),复制到 goal-test 的 config.yaml 里。
完成后它会告诉你:"已配置完成,goal-test 现在可以使用 [模型名] 了。"
第三步:切换过去
打开一个新的终端窗口(或者在当前窗口退出 Hermes),运行:
hermes -p goal-test
进入交互模式。
这个时候,你发第一句话,就能感受到"干净环境"是什么意思。
比如你说:
你好,介绍一下你自己。
它会回复一段自我介绍,但不会提到任何关于 B 站、UP 主监控器的内容。因为它没有之前的会话历史,没有相关的技能,也没有记忆。
如果你去问 default profile 的 Hermes:"你还记得上次做的 B 站 UP 主监控器吗?",它会滔滔不绝地讲细节。但 goal-test 的 Hermes 会说:"我没有这个记录。"
这就是完全隔离的效果。
第四步:执行 /goal 版本
在 goal-test 里,把 6.10 写好的 /goal 版本提示词喂给它:
/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 实测
结果:

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

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 看不到;反过来也一样。
用一张图来看它们的关系:
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/ | 在相同条件下重新得到同样结果的能力 |