我用 6 个 AI Bot 搭了一个虚拟团队——Hermes 多 Bot 编排实战
一个 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 | ~/.hermes/profiles/ |
每个 Profile 独立拥有:
| 组件 | 说明 | 隔离程度 |
|---|---|---|
config.yaml |
模型、Provider、MCP 配置 | 完全独立 |
SOUL.md |
角色定义 + 行为准则 | 完全独立 |
skills/ |
技能集 | 完全独立(需手动裁剪) |
memories/ |
持久记忆 | 完全独立 |
sessions/ |
对话历史 | 完全独立 |
.env |
凭证 | 默认共享(clone 时复制) |
关键洞察:Bot Mode 不是新增了一个抽象层,而是把已有的 Profile 用更友好的 UI 展示出来。 CLI 里做的事和 Desktop 里完全一样:
1 | # CLI 和 Bot Mode 等价操作 |
3. 创建 Bot 的实战步骤
步骤 1:创建 Profile
1 | # 从 default clone,保留配置和凭证 |
clone 会复制 config.yaml、.env、skills/——但不会复制 sessions/ 和 memories/。这是对的:新 Bot 应该从空白记忆开始。
步骤 2:编写 SOUL.md(最关键的一步)
SOUL.md 是 Bot 的灵魂。没有它的 Bot 和 default Bot 没区别。以我的 stock Bot 为例:
1 | # Hermes Bot — stock(股票分析专家) |
SOUL.md 的核心要素:
- 核心身份 — 这个 Bot 是谁
- 专属技能 — 列出它需要的能力(不多列)
- 工作原则 — 它的行为准则
- 协作接口 — 它可以 @mention 哪些 Bot
- Cron 命名规范 — 定时任务的命名前缀
步骤 3:裁剪技能集(最容易忽略的一步)
clone 会复制 default profile 的全部 60+ 技能。不裁剪 = 上下文爆炸。
1 | import os, shutil |
我的各 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.yaml 的 mcp_servers 段。clone 时自动继承。这意味着 所有 Bot 共享同一套 MCP 工具。
1 | # profiles/stock/config.yaml(继承自 default) |
共享 MCP 的好处:不需要为每个 Bot 单独配置 MCP Server。
共享 MCP 的风险:stock Bot 能调用教育相关的 MCP 工具(虽然它的 SOUL.md 不会引导它这么做)。
步骤 5:验证
1 | hermes profile list # 列出所有 Bot |
4. 跨 Bot 协作
@mention 调度
在 Bot Mode 的群聊中,可以用 @mention 触发跨 Bot 协作:
1 | 用户: @stock 分析一下茅台最近的走势 |
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 | default (综合协调) |
5. Cron 命名规范
所有定时任务按 Bot 前缀命名,便于过滤和管理:
1 | [bot:stock] 盘前简报 # stock 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 | for p in coder critic research writer; do |
坑 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」。关键动作只有三个:
- 写 SOUL.md — 给每个 Bot 明确的身份和边界
- 裁剪技能 — 每个 Bot 只保留它需要的技能
- 规范命名 — Cron 任务按
[bot:<name>]前缀命名
做到这三步,你就拥有了一支各司其职的 AI 虚拟团队。
一句话 takeaway:不要让一个 Bot 做所有事——让每个 Bot 只做一件事,做到极致。
相关资源:
生成时间:2026-08-22 10:00






