一个 Hermes 实例跑 6 个 Bot,每个专注一个领域——股票分析、教育内容、代码评审、文字润色、深度调研、综合协调。这篇记录我怎么从「一个万能 Bot」进化到「一支虚拟团队」,踩了哪些坑,以及为什么 Profile-as-Bot 比你想的更简单。


1. 缘起:一个万能 Bot 的疲惫

我的 Hermes Agent 一开始只有一个 default profile。它要管股票分析、要写教案、要审代码、要润色文章、要做调研——什么都干,什么都不精。

问题逐渐暴露:

  • 上下文膨胀:60+ 个技能全部塞进一个 Bot 的上下文,每次对话 token 消耗巨大
  • 角色混乱:让它分析股票时它想写教案,让它审代码时它想做调研
  • Cron 冲突:所有定时任务共用一个 profile,盘前简报和教案巡检互相干扰
  • 记忆污染:股票分析的对话历史和教育内容的对话历史混在一起

我需要的不是一个万能 Bot,而是一支各司其职的团队

2. 核心架构:Profile = Bot

Hermes 的 Bot Mode 本质上是一个 UI 层——底层原语就是 Profile。每个 Profile 是一个完全隔离的 Agent 实例:

1
2
3
4
5
6
7
8
~/.hermes/profiles/
├── default/ # 主 Bot(综合协调)
├── stock/ # 股票分析专家
├── edu/ # 教育内容专家
├── coder/ # 代码评审专家
├── critic/ # 质量审查专家
├── research/ # 深度调研专家
└── writer/ # 文字润色专家

每个 Profile 独立拥有:

组件 说明 隔离程度
config.yaml 模型、Provider、MCP 配置 完全独立
SOUL.md 角色定义 + 行为准则 完全独立
skills/ 技能集 完全独立(需手动裁剪)
memories/ 持久记忆 完全独立
sessions/ 对话历史 完全独立
.env 凭证 默认共享(clone 时复制)

关键洞察:Bot Mode 不是新增了一个抽象层,而是把已有的 Profile 用更友好的 UI 展示出来。 CLI 里做的事和 Desktop 里完全一样:

1
2
3
4
# CLI 和 Bot Mode 等价操作
hermes -p stock chat -q "分析茅台" # = 在 Bot Mode 点击 stock Bot 聊天
hermes -p edu chat -q "生成教案" # = 在 Bot Mode 点击 edu Bot 聊天
hermes cron list # = 在 Routines 面板看所有 Bot 的定时任务

3. 创建 Bot 的实战步骤

步骤 1:创建 Profile

1
2
# 从 default clone,保留配置和凭证
hermes profile create stock --clone

clone 会复制 config.yaml.envskills/——但不会复制 sessions/memories/。这是对的:新 Bot 应该从空白记忆开始。

步骤 2:编写 SOUL.md(最关键的一步)

SOUL.md 是 Bot 的灵魂。没有它的 Bot 和 default Bot 没区别。以我的 stock Bot 为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Hermes Bot — stock(股票分析专家)

## 核心身份
你是**股票分析专家 Bot**,专注 A 股/港股/美股行情分析。

## 专属技能
- Stock MCP Server(120+ 工具)
- 策略回测与选股扫描
- 组合风险诊断与调仓建议

## 工作原则
1. 数据为王 — 所有分析必须基于真实行情数据
2. 风险优先 — 每次分析必须提示风险
3. 结构化输出 — 使用评分卡、仪表盘格式

## 协作接口
- @edu — 提供行情数据作为教学案例
- @critic — 需要分析报告质量评审时
- @research — 需要行业深度调研时

## Cron 命名规范
所有股票相关任务使用前缀 [bot:stock]

SOUL.md 的核心要素

  1. 核心身份 — 这个 Bot 是谁
  2. 专属技能 — 列出它需要的能力(不多列)
  3. 工作原则 — 它的行为准则
  4. 协作接口 — 它可以 @mention 哪些 Bot
  5. Cron 命名规范 — 定时任务的命名前缀

步骤 3:裁剪技能集(最容易忽略的一步)

clone 会复制 default profile 的全部 60+ 技能。不裁剪 = 上下文爆炸

1
2
3
4
5
6
7
8
9
import os, shutil

# stock Bot 只需要这些技能
keep = {"stock-mcp-optimization", "kanban-orchestrator"}
skills_dir = os.path.expanduser("~/.hermes/profiles/stock/skills")

for item in os.listdir(skills_dir):
if item not in keep and not item.startswith('.'):
shutil.rmtree(os.path.join(skills_dir, item))

我的各 Bot 技能裁剪策略:

Bot 保留技能数 核心技能
stock 3 stock-mcp, kanban, investment-decision
edu 5 batch-content, lesson-formatting, education-*
coder 4 adversarial-solver, discriminator-*, codebase-audit
critic 3 discriminator-article-review, discriminator-reality-checker
research 2 web-research, session-search
writer 2 blog-publisher, feishu-format

步骤 4:配置 MCP(共享的艺术)

MCP Server 配置在 config.yamlmcp_servers 段。clone 时自动继承。这意味着 所有 Bot 共享同一套 MCP 工具

1
2
3
4
5
6
# profiles/stock/config.yaml(继承自 default)
mcp_servers:
stock-server:
command: python3
args: ["-m", "stock_mcp_server"]
toolsets: ["stock"]

共享 MCP 的好处:不需要为每个 Bot 单独配置 MCP Server。
共享 MCP 的风险:stock Bot 能调用教育相关的 MCP 工具(虽然它的 SOUL.md 不会引导它这么做)。

步骤 5:验证

1
2
3
4
5
hermes profile list                    # 列出所有 Bot
hermes -p stock chat -q "回复OK" -Q # 测试 stock Bot 连通性
hermes -p edu chat -q "回复OK" -Q # 测试 edu Bot 连通性
hermes -p stock mcp test stock-server # 测试 MCP 连接
hermes -p stock skills list # 确认技能裁剪结果

4. 跨 Bot 协作

@mention 调度

在 Bot Mode 的群聊中,可以用 @mention 触发跨 Bot 协作:

1
2
3
4
5
6
7
8
用户: @stock 分析一下茅台最近的走势
stock Bot: [分析结果]

用户: @critic 评审一下这份分析报告
critic Bot: [评审意见]

用户: @edu 把这个分析做成教学案例
edu Bot: [教案内容]

CLI 等价操作:

1
hermes -p default chat -q "@stock 分析茅台" -Q

关键发现

  • @mention 在 CLI 中触发跨 Bot 调度(与 Desktop Bot Mode 行为一致)
  • 被调用 Bot 的回复直接返回到发起方的输出
  • MCP 工具在所有 Profile 间共享(同一 config.yaml 继承)

协作矩阵

在每个 Bot 的 SOUL.md 中定义 ## 协作接口,明确可调用的 Bot 和触发场景。这形成了一个隐式的协作图:

1
2
3
4
5
6
7
8
9
10
11
default (综合协调)
├── @stock → 股票分析
├── @edu → 教育内容
├── @coder → 代码评审
├── @critic → 质量审查
├── @research → 深度调研
└── @writer → 文字润色

stock ↔ edu (行情数据作为教学案例)
edu ↔ writer (教案润色)
coder ↔ critic (代码评审 → 质量审查)

5. Cron 命名规范

所有定时任务按 Bot 前缀命名,便于过滤和管理:

1
2
3
4
5
[bot:stock] 盘前简报         # stock Bot 的定时任务
[bot:stock] 持仓监控 # stock Bot 的定时任务
[bot:edu] 每日教案巡检 # edu Bot 的定时任务
[bot:edu] StudyAI 数据监控 # edu Bot 的定时任务
[default] 每日早报 # default Bot 的定时任务

查看某个 Bot 的所有定时任务:

1
hermes cron list | grep "\[bot:stock\]"

6. 踩坑记录

坑 1:clone 不等于隔离

症状:给 stock Bot 的 .env 加了一个新 API Key,结果 edu Bot 也能用。

原因hermes profile create stock --clone 会复制 .env 文件。所有 clone 出来的 Bot 共享同一份凭证池。

修复:如果需要凭证隔离,clone 后手动修改 .env。大多数情况下共享是合理的(避免 credential refresh 互相失效)。

坑 2:不裁剪技能 = 上下文爆炸

症状:stock Bot 的每次对话都消耗 30K+ tokens,响应变慢。

原因:clone 后 60+ 技能全部保留,每个技能的 SKILL.md 都在上下文中。

修复:手动裁剪,只保留与 Bot 使命相关的技能。我的 stock Bot 从 60+ 裁剪到 3 个,token 消耗降到 8K。

坑 3:SOUL.md 不写 = 和 default 没区别

症状:创建了新 Bot 但它的行为和 default Bot 完全一样。

原因:没有编写 SOUL.md,Bot 没有角色定义。

修复:每个 Bot 必须有独立的 SOUL.md。这是 Bot 存在的意义。

坑 4:Cron 命名不规范 = 无法按 Bot 过滤

症状hermes cron list 输出一堆任务,分不清哪个属于哪个 Bot。

原因:定时任务没有按 Bot 前缀命名。

修复:统一使用 [bot:<name>] 前缀。新建 cron 时在 prompt 中明确要求使用前缀。

坑 5:不同模型导致跨 Bot 响应质量不一致

症状:stock Bot 用 mimo-v2.5,edu Bot 用 deepseek-v4-flash,edu 的输出质量明显差。

原因:不同模型的能力差异。

修复:所有 Bot 推荐使用相同模型:

1
2
3
for p in coder critic research writer; do
sed -i 's/deepseek-v4-flash/mimo-v2.5/g' ~/.hermes/profiles/$p/config.yaml
done

坑 6:MCP 配置继承的隐藏依赖

症状:删除了 default profile 的某个 MCP Server,结果所有 Bot 的对应工具都不可用了。

原因:clone 的 profile 继承 default 的 mcp_servers 配置,但 MCP Server 进程是共享的。

修复:修改 MCP 配置前,先确认有多少 Bot 依赖它。在 SOUL.md 中记录每个 Bot 依赖的 MCP Server。

7. 效果对比

指标 之前(单 Bot) 之后(6 Bot)
上下文 token 消耗 30K+/次 5-10K/次
响应延迟 8-12s 3-5s
角色混淆 频繁 几乎为零
Cron 任务冲突 偶发 无(按 Bot 隔离)
记忆污染 无(独立 memories)

8. 总结

核心结论:Hermes 的 Profile-as-Bot 不是什么高深架构,就是把「一个万能 Bot」拆成「多个专家 Bot」。关键动作只有三个:

  1. 写 SOUL.md — 给每个 Bot 明确的身份和边界
  2. 裁剪技能 — 每个 Bot 只保留它需要的技能
  3. 规范命名 — Cron 任务按 [bot:<name>] 前缀命名

做到这三步,你就拥有了一支各司其职的 AI 虚拟团队。

一句话 takeaway:不要让一个 Bot 做所有事——让每个 Bot 只做一件事,做到极致。

相关资源


生成时间:2026-08-22 10:00