1. 为什么单模型总在关键任务上翻车:MoA 要解决的场景问题
如果你用 Hermes Agent 跑过稍微复杂一点的任务,大概都遇到过这种尴尬:同一个模型,写文案时文采飞扬,让它顺手改个并发 bug 就开始胡编 API;逻辑推理时头头是道,一落到具体业务规则又抓不住重点。这不是模型不行,而是单个模型的能力分布本来就不均匀——它在某些维度上强,在另一些维度上就是有盲区。
我最近在折腾 Hermes Agent 的 MoA(Mixture of Agents)机制时,发现它给出的解法挺聪明:不让一个模型硬扛所有判断,而是先让几个模型从不同角度给出分析意见,再由一个决策模型统一汇总、拍板、执行。你可以把它理解成一个"多模型顾问团"——顾问们只出主意不动手,真正干活的是那个拍板的人。
这篇文章面向想复现这套机制的开发者,重点讲清楚三件事:MoA 在 Hermes 里的角色分工、provider 该怎么接、以及怎么跑一次"多模型讨论到单模型决策"的完整验证。文中所有配置都以 Hermes Agent 的config.yaml和 CLI 命令为准,你可以直接照着改。
在动手之前,先把 MoA 和普通 multi-agent 的区别说清楚,不然很容易配错方向。普通多 Agent 是几个"人"分头干活,各自有上下文、工具和执行路径;MoA 始终是一个 Hermes 会话、一个主模型在跟你对话,只是这个主模型在回答前先听了几个模型的意见。所以 MoA 提升的是"单次回答质量",不是替代多 Agent 的分工协作。放到公司场景里类比:多 Agent 是成立几个项目小组,MoA 是开一次专家评审会,Aggregator 就是最后形成结论、拍板执行的那个人。
理解了这层定位,后面的 provider 配置和模型角色分配才不会跑偏。
2. TaoToken 作为 MoA provider 的前置准备:Base URL、Key 与模型清单
MoA 的 reference models 和 aggregator 都需要通过 provider 去调用具体模型。Hermes 支持多种 provider,这里我用 TaoToken 作为统一接入层来演示,原因是它把多个模型收敛到一套 OpenAI 兼容接口上,配 reference models 时不用为每个模型单独维护一套鉴权逻辑。
前置准备分三步,都不复杂。
第一步,拿到 API Key。访问 https://taotoken.net/api-keys 创建密钥,复制出来先存好,后面config.yaml里要用。注意 Key 只在创建时完整显示一次,丢了就重新建一个。
第二步,确认 Base URL。TaoToken 的接口地址是https://taotoken.net/api,这个地址在 Hermes 里作为 provider 的base_url使用。它兼容 OpenAI 的/v1/chat/completions协议,所以 Hermes 里凡是走 OpenAI 兼容 provider 的地方都能直接填。
第三步,确定你要用哪些模型。MoA 的模型角色分配是核心,建议按"视角互补"来选,而不是按"哪个最强"来堆。比如:
| 角色 | 建议模型类型 | 作用 |
|---|---|---|
| Reference 1 | 逻辑/代码强的模型 | 从技术可行性角度给意见 |
| Reference 2 | 业务/表达强的模型 | 从可读性、业务贴合度给意见 |
| Reference 3(可选) | 风险/边界敏感的模型 | 挑毛病、指出潜在坑 |
| Aggregator | 综合能力均衡的模型 | 汇总意见、输出最终回复、发起工具调用 |
这里有个关键点:Aggregator 才是真正写 assistant response 和发出 tool calls 的模型。reference models 不直接调用工具,也不直接回复用户,它们只产出分析意见。这个分工是 MoA 能保持 Hermes 原有 agent loop 稳定的前提——如果每个模型都能直接调工具,执行链路会乱成一团。
如果你还没决定用哪些模型,可以先到 https://taotoken.net/models 看下当前可用的模型清单,再回来配。模型 ID 要填准确,比如deepseek/deepseek-v4-pro这种带前缀的写法,填错了会在请求阶段直接报模型不存在。
准备好 Key、Base URL 和模型清单,就可以进入配置环节了。
3. 可复制的 MoA provider 配置:config.yaml 与 preset 结构
这一节是全文最需要你动手的部分。Hermes 的 MoA 配置主要落在config.yaml里,核心是moa这一段。下面给出一份可以直接改的配置片段,路径和字段名都按 Hermes 的约定来。
# ~/.hermes/config.yaml providers: taotoken: type: openai-compatible base_url: https://taotoken.net/api api_key: ${TAOTOKEN_API_KEY} moa: default_preset: default presets: default: reference_models: - provider: taotoken model: deepseek/deepseek-v4-pro - provider: taotoken model: anthropic/claude-opus-4.8 aggregator: provider: taotoken model: anthropic/claude-opus-4.8 reference_max_tokens: 1024 max_tokens: 4096 enabled: true review: reference_models: - provider: taotoken model: deepseek/deepseek-v4-pro - provider: taotoken model: openai/gpt-5.5 aggregator: provider: taotoken model: anthropic/claude-opus-4.8 reference_max_tokens: 768 max_tokens: 4096 enabled: true几个字段的含义需要说清楚,不然改起来容易懵:
providers.taotoken是 provider 定义,type用openai-compatible,base_url填https://taotoken.net/api,api_key建议用环境变量引用而不是硬编码,避免 Key 泄露到版本库里。
moa.default_preset指定默认用哪个 preset,这里指向default。
presets下面每个 preset 包含reference_models和aggregator两部分。reference_models是列表,每个元素有provider和model两个字段;aggregator是单个对象,同样有provider和model。
reference_max_tokens控制顾问模型的输出长度。这个值很关键——reference models 只给意见,不需要长篇大论,设小一点(比如 768 到 1024)能明显减少每轮等待时间。max_tokens是 aggregator 的输出上限,可以给大一些。
配好之后,用 CLI 验证一下 preset 是否被正确识别:
hermes moa list正常会列出default和review两个 preset。如果想交互式改,可以用:
hermes moa configure review要删掉某个 preset:
hermes moa delete review这里有个容易踩的坑:api_key用${TAOTOKEN_API_KEY}引用时,要确保这个环境变量在 Hermes 启动的 shell 里已经 export 了。如果 Hermes 是通过 systemd 或桌面图标启动的,环境变量可能读不到,这时候要么在启动脚本里显式 export,要么临时把 Key 直接写进配置(不推荐长期这么做)。
配置写完后,先别急着跑复杂任务,用下一节的验证请求确认链路通了再上强度。
4. 验证一次多模型讨论到单模型决策:从 /moa 到工具调用
配置就绪后,最直接的验证方式是用/moa一次性快捷命令。它临时用默认 preset 跑这一轮,跑完恢复原来的模型,不会永久切换当前会话的模型。
/moa design and implement a migration plan for this flaky test cluster这条命令触发后,Hermes 内部会走一遍完整的 MoA 流程:reference models 先并行给出分析意见,aggregator 读取这些意见,然后作为最终执行模型输出回复或发起工具调用。如果后续工具返回结果,下一轮还会重复这个过程。
如果你想验证"多模型讨论"确实发生了,可以在配置里把 reference models 设成两个风格差异明显的模型,然后给一个需要多角度判断的任务,比如:
/moa 分析这段代码的并发安全问题,并给出修复方案观察 aggregator 的输出,通常会体现出对多个视角的整合——比如既提到了技术层面的锁竞争,也提到了业务层面的幂等性要求。如果输出看起来和单模型没区别,可能是 reference models 没生效,检查hermes moa list是否正常、enabled是否为true。
另一种用法是把 MoA preset 当作当前会话的模型长期使用:
/model default --provider moa或者:
/model review --provider moa这时 MoA 就作为当前会话的模型持续工作,后续每轮对话都会走多模型讨论加单模型决策的流程。Hermes 的 CLI、gateway、TUI、Dashboard、Desktop GUI 都能选择 MoA preset,因为 MoA 本质上就是 Hermes 模型系统里的一个 provider。
验证成功的标志有三个:一是/moa命令不报错,二是 aggregator 的输出明显整合了多个视角,三是工具调用正常发起且结果被正确回填到下一轮。三个都满足,说明 provider 接入和模型角色分配都对了。
如果只满足前两个但工具调用没触发,问题多半出在 aggregator 的模型选择上——有些模型对 function calling 的支持不完整,换一个工具调用能力强的模型再试。
5. 常见报错排查:401、local proxy failed 与 reading choices 报错
MoA 配置过程中最容易撞上的几类报错,这里逐个拆解。
401 Unauthorized。这个基本是 Key 的问题。先确认TAOTOKEN_API_KEY环境变量在当前 shell 里能echo出来,再确认config.yaml里引用的是同一个变量名。如果 Key 本身没问题,检查base_url是不是写成了https://taotoken.net/api/带尾斜杠——有些 OpenAI 兼容客户端对尾斜杠敏感,去掉再试。还有一种情况是 Key 被复制时带了空格或换行,重新从 https://taotoken.net/api-keys 复制一次。
local proxy failed。这个报错通常出现在 provider 的base_url指向了一个本地代理地址,但代理没起来。如果你在config.yaml里把base_url写成了http://127.0.0.1:xxxx之类的地址,改成https://taotoken.net/api即可。Hermes 本身不需要额外的本地代理层,直连就行。
reading choices 报错。典型表现是请求发出去了,但解析响应时在choices字段上报错。这多半是模型 ID 填错了,导致服务端返回了一个非标准结构的错误响应。检查reference_models和aggregator里的model字段,确认模型 ID 和 https://taotoken.net/models 上列出的完全一致。带前缀的模型(如deepseek/deepseek-v4-pro)前缀不能省。
OAuth 相关报错。如果你用的是需要 OAuth 的 provider(比如某些 Codex 类接入),报错信息里会出现 OAuth 字样。这类 provider 的鉴权不走 API Key,而是走 OAuth 流程,配置方式和普通 OpenAI 兼容 provider 不同。如果你只是想快速验证 MoA,建议先用 API Key 类的 provider 跑通,再回头处理 OAuth。
MoA preset 不生效。/moa命令跑了但没看到多模型讨论的痕迹。先hermes moa list确认 preset 存在,再检查default_preset指向的名字和实际 preset 名是否一致。还有一种可能是enabled被设成了false,改成true即可。
排查时有个通用技巧:把reference_max_tokens临时调大,让 reference models 输出更完整的意见,这样更容易在 aggregator 的输出里看到多视角整合的痕迹。确认链路通了之后再调回去。
6. 把 MoA 用顺手:模型角色分配与长期编码场景的接入建议
跑通验证之后,真正决定 MoA 好不好用的是模型角色分配。我的经验是别贪多,reference models 两到三个就够,再多边际收益递减,等待时间却线性增长。
分配原则可以这样定:一个模型负责"能不能做",从技术和可行性角度给意见;一个模型负责"该不该做",从业务和风险角度给意见;如果任务涉及大量代码,再加一个专门看代码质量的。aggregator 选综合能力均衡、工具调用稳定的模型,因为它要同时干三件事——读意见、写回复、发工具调用。
如果你打算把 MoA 用在长期编码或 Agent 类任务上,可以考虑用 Coding Plan 这类按周期计费的方式接入,比按次调用更适合高频场景。具体可以到 https://taotoken.net/coding-plan 看下当前的方案说明。
对于 Claude Code 这类需要 Anthropic 协议兼容的接入场景,TaoToken 也提供了对应的接入方式,配置时注意 provider 的type要选对,Base URL 和 Key 的填法和上面一致。接入文档在 https://taotoken.net/doc 有完整说明,遇到协议层面的问题可以先查那里。
最后说一个实测下来比较实用的技巧:给不同的任务类型配不同的 preset。比如default用于日常问答,review用于代码审查,fast用于快速草稿。这样切换时不用改配置,直接/model review --provider moa就行。preset 多了之后记得定期清理不用的,hermes moa delete删掉,免得hermes moa list输出太长看花眼。
MoA 的价值不在于堆模型数量,而在于把"多视角分析"和"单点决策执行"这两件事解耦。reference models 负责拓宽判断的覆盖面,aggregator 负责收敛成可执行的结论。配置对了,它在复杂任务上的稳定性提升是能感知到的。