深入理解 Hermes 多 Agent 协作:架构、工具集与生产实践

3032 字
15 分钟
深入理解 Hermes 多 Agent 协作:架构、工具集与生产实践

上一篇博客介绍了 Hermes Agent 多 Agent 协作的基本概念和实战入门。今天这篇,我们深入到底层架构、15+ 工具集详解、生产级调优指南,以及那些在实战中踩过的坑。

如果你已经会用 delegate_task,但想知道”它到底是怎么跑的”、“怎么调参最省 token”、“子代理挂了我该怎么兜底”——这篇文章就是为你写的。


一、delegate_task 的底层实现#

delegate_task 看起来就是一个函数调用,但它的底层远比你想的复杂。

1.1 进程级隔离,不是协程#

很多人第一次接触多 Agent,会以为它只是开了几个 asyncio 协程。完全不是。

每个子代理(subagent)是一个完全独立的进程,拥有:

  • 独立的 Python 解释器进程:不共享内存、不共享全局变量
  • 独立的终端会话workdir、环境变量、进程状态完全隔离
  • 独立的对话上下文:子代理 A 不知道子代理 B 的存在,它们各自和自己的 LLM 对话
  • 独立的工具调用链路:每个子代理有自己注册的工具集,互不干扰

这意味着什么?子代理 A 在执行 terminal 工具时 rm -rf /tmp/data,完全不会影响子代理 B 正在读取 /tmp/data/other.txt。它们就像两台独立的机器。

1.2 数据流:中间结果不回流#

这是最关键的架构决策。子代理执行过程中产生的所有中间结果都不会回到主代理的上下文窗口:

子代理A:
├── 搜索 Google → 打开 10 个网页 → 读取全文 → 提取关键信息
├── 执行 shell → 运行 grep/awk 处理 → 过滤出 5 条关键记录
└── 最终只返回:一份 200 字的摘要

子代理 A 读了 10 个网页、执行了 20 个命令——这些过程的输出全部不会塞回主代理的上下文。只有最后那份 200 字的摘要回来。

这解决了一个核心问题:token 爆炸。

假设你派一个子代理去分析一个 500 行的 Python 文件:

  • 不用子代理:文件全文进入主对话上下文 → 500 行 × 平均 30 字符 ≈ 15,000 token
  • 用子代理:文件只在子代理的上下文里 → 主对话只收到 “这个文件用了 FastAPI,包含 3 个路由,建议添加异常处理” → 约 50 token

300 倍的 token 节省。

1.3 通信协议:JSON-RPC over 进程管道#

主代理和子代理之间通过 JSON-RPC 协议通信:

  1. 主代理调用 delegate_task → 序列化任务参数(goal、context、toolsets)
  2. 启动新的 Hermes Agent 进程 → 通过 stdin/stdout 传递 JSON-RPC 消息
  3. 子代理执行完成后 → 将结果(status、summary、exit_reason)序列化为 JSON
  4. 主代理反序列化结果 → 合并到当前对话

这个设计的好处是:

  • 语言无关:理论上子代理可以用任何语言实现
  • 易于调试:可以 dump 出完整的 JSON-RPC 消息流
  • 天然隔离:进程崩溃不影响主代理

二、15+ 工具集深度解析#

Hermes Agent 提供了 15 个可用工具集,每个子代理可以被赋予不同的组合。这不是随便列的——它们有明确的分工和最佳实践。

2.1 工具集分类#

我把它们分成四大类:

🔧 基础设施类

工具集能力典型场景
terminal执行 Shell 命令(前景/后台/PTY)构建项目、运行测试、系统管理
file读写/搜索/编辑文件代码分析、配置修改、数据清洗

这两个是最基础的工具集,几乎所有子代理都需要至少其中一个。

🌐 网络与信息类

工具集能力典型场景
web网络搜索、API 调用、网页提取资料搜集、数据获取
search全文搜索(代码库/文档)代码库搜索、日志分析
browser浏览器自动化(Playwright)表单填写、截图、SPA 爬取
vision图像分析(AI 视觉)验证码识别、图表解析

📝 生产力类

工具集能力典型场景
feishu_doc飞书文档 API读取/创建飞书文档
feishu_drive飞书云空间文件上传下载
cronjob定时任务管理设置定期执行的脚本
todo任务列表管理复杂任务的分步跟踪

🤖 元能力类

工具集能力典型场景
session_search搜索历史会话回顾之前的讨论、查找历史方案
skills技能管理(查看/创建/更新)复用工作流、保存最佳实践
memory持久化记忆跨会话保留关键信息
tts文本转语音生成语音消息
image_gen图像生成创建配图、示意图

2.2 工具集组合模式#

在实践中,有一些经过验证的工具集组合模式:

模式 A:研究员(Researcher)

toolsets: [web, search, browser]
# 适合:资料搜集、竞品分析、技术调研

模式 B:工程师(Engineer)

toolsets: [terminal, file, web]
# 适合:代码实现、Bug 修复、项目构建

模式 C:分析师(Analyst)

toolsets: [terminal, file, session_search]
# 适合:代码审计、历史分析、模式识别

模式 D:全栈(Full-Stack)

toolsets: [terminal, file, web, browser, vision]
# 适合:端到端任务(调研→实现→验证)

重要规则:子代理不能调用 delegate_task(防止无限递归)。这是硬性限制。


三、配置调优指南#

delegate_task 有几个关键参数,调对了事半功倍,调错了 token 爆炸。

3.1 全局配置#

~/.hermes/config.yaml 中:

delegation:
max_iterations: 50 # 每个子代理的最大工具调用轮数
default_toolsets: # 默认工具集(不指定时继承)
- terminal
- file
- web
max_concurrent_children: 3 # 默认并发上限(当前硬编码为 3)

3.2 max_iterations 怎么选?#

任务类型建议值说明
简单查询(搜 1 个网页、读 1 个文件)10-15足够了
中等任务(搜资料+整理+输出)30-40常见场景
复杂任务(多文件分析+代码重构)50(默认)上限

经验法则:如果一个子代理在 30 轮内没完成,通常不是时间不够,而是任务定义太模糊。与其增加 max_iterations,不如重写 goal,让它更具体。

3.3 context 的用法:传多少合适?#

context 字段是给子代理的背景信息。这里有一个微妙的平衡:

传太少:子代理不知道项目结构、文件路径、约束条件,会花大量轮次去”探索” 传太多:浪费 token,而且可能引入不必要的信息干扰

最佳实践:

context: |
博客仓库: /root/workspace/myboke (Astro 框架)
文章目录: src/content/posts/
图片目录: src/content/posts/images/ (.avif 格式)
已有文章 60+ 篇,分类: AI工具/Vue/工程化/浏览器
部署路径: /www/wwwroot/boke.hackerdream.xyz/
服务器: 4G Ubuntu, 需要 Swap 防 OOM

原则:传”如果不告诉它,它就会做错或浪费时间”的信息。

3.4 并发控制:3 个同时跑#

当前默认最大并发是 3 个子代理。这是经过验证的甜蜜点:

  • 1 个:太慢,失去并行优势
  • 2 个:不错,但复杂任务还是不够
  • 3 个:最佳平衡——速度 vs token 消耗 vs 结果质量
  • >3 个:边际效益递减,token 成本线性增长

四、生产级错误处理#

在真实环境中,子代理不是每次都能成功。以下是实战中遇到的错误和应对策略。

4.1 常见错误类型#

错误 1:超时

exit_reason: "timeout"

子代理在 max_iterations 内没完成。通常原因:

  • 任务定义太模糊(“帮我优化整个项目”)
  • 子代理在某个循环里出不来(如搜索太多网页)

解法:重写 goal,加上明确的退出条件:

goal: |
只搜索前 5 个搜索结果。
如果搜不到相关资料,返回"未找到"并停止。
不要尝试访问所有搜索结果的页面。

错误 2:工具权限不足

error: "Tool 'browser' is not available in this subagent"

子代理试图调用不在 toolsets 中的工具。

解法:检查 toolsets 参数,确保包含了需要的工具。

错误 3:进程崩溃

exit_reason: "crashed"

子代理进程异常退出(通常是 OOM 或未处理的 Python 异常)。

解法

  • 对于 OOM:检查子代理是否在读取超大文件
  • 对于异常:通常会在 summary 中看到错误栈

错误 4:被中断

exit_reason: "interrupted"

主代理被用户停止,连带终止了所有子代理。

4.2 容错模式:降级处理#

在生产环境中,你应该设计”即使某个子代理失败,整体任务仍然能完成”的流程:

# 伪代码示例
results = delegate_task(tasks=[A, B, C])
# A 和 B 成功,C 失败
if C.failed:
# 降级:用已有知识替代 C 的输出
c_fallback = "根据已有知识,这个分类应该是..."
merge(A, B, c_fallback)
else:
merge(A, B, C)

实际案例:在写博客时,子代理 C(搜索历史会话)超时了。但由于子代理 B 已经检查了仓库中已有的文章,我仍然可以判断”这篇文章和已有内容角度不同”,直接跳过 C 继续写作。


五、Token 成本分析#

这是大家最关心的问题:多 Agent 到底花多少 token?

5.1 实测数据#

以一个完整的”搜资料+写博客”任务为例:

子代理Input TokenOutput Token工具调用次数
A(资料搜集)~512~3,9411(搜索后直接汇总)
B(项目侦察)~492K~4,34930(大量文件操作)
C(历史搜索)~1,210~2403
调度者(我)~5K~8K10(汇总+写作+部署)
总计~500K~16.5K44

注意:B 子代理的 492K input token 是因为它读取了大量文件内容。在实际生产中,你应该:

  1. 限制子代理读取的文件数量和大小
  2. 使用 search_files 而非 read_file 全量读取
  3. 让子代理只读取必要的文件

5.2 省钱技巧#

  1. 精简 context:不要传整个项目的文件树,只传关键路径
  2. 限制搜索范围:明确告诉子代理”只搜前 N 个结果”
  3. 减少文件读取:用 search_fileslimit 参数
  4. 合理设置 max_iterations:不要盲目给 50,够用就行
  5. 利用子代理 A 做预处理:让第一个子代理过滤掉不相关的内容,减少后续处理量

六、进阶:自定义子代理行为#

6.1 指定不同的模型#

子代理可以使用和主代理不同的模型:

delegate_task:
tasks:
- goal: "搜索最新资料"
toolsets: [web, search]
model:
provider: "openrouter"
model: "anthropic/claude-sonnet-4" # 用更快的模型

策略

  • 研究型任务:用更强的模型(opus/sonnet),保证质量
  • 简单操作:用更快的模型(haiku),省钱省时间
  • 代码生成:用 code 专用模型

6.2 跨平台 ACP 子代理#

你可以让子代理使用不同的 ACP(Agent Communication Protocol)后端:

delegate_task:
acp_command: "claude" # 子代理用 Claude Code 而非 Hermes Agent
tasks:
- goal: "重构这段代码"
toolsets: [terminal, file]

这让 Hermes 可以跨框架调度——Hermes 作为调度者,子代理可以是 Claude Code、OpenCode、或任何其他 ACP 兼容的 Agent。


七、写在最后:多 Agent 的哲学#

多 Agent 协作的本质,不是”让 AI 做更多事”,而是**“让 AI 做正确的事”**。

一个调度者 + 多个专家子代理的模式,模拟了人类团队的工作方式:

  • 主编(调度者):分配任务、审核质量、整合产出
  • 记者(子代理 A):深入一线搜集素材
  • 编辑(子代理 B):检查格式和规范
  • 研究员(子代理 C):查阅历史资料避免重复

当你把每个子代理的 goal 写得像一个清晰的工作任务书(而不是模糊的”帮我搞一下”),你会惊讶于它们的执行力。

一个 AI 干活叫”自动化”。多个 AI 协作干活,才叫”智能体编排”。


本文是 Hermes 多 Agent 系列的第二篇。第一篇《Hermes 多 Agent 实战:当 AI 开始调度 AI》已发布于本站。本文的撰写过程本身也是多 Agent 协作的实践:3 个子代理并行搜集素材,调度者汇总写作,最终完成博客文章的撰写和部署。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

深入理解 Hermes 多 Agent 协作:架构、工具集与生产实践
https://boke.hackerdream.xyz/posts/hermes-multi-agent-deep-dive/
作者
晴天
发布于
2026-04-28
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
晴天
Hello, I'm 晴天.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
125
分类
17
标签
287
总字数
257,955
运行时长
0
最后活动
0 天前

目录