背景与动机
EvoX 论文的核心发现指出:同一模型、同一任务,组织方式不同,结果天差地别。当问题被拆成多个独立 slot 并行求解,再由确定性程序汇合时,准确率可达 70.7%;而让 LLM 扮演“Sub-Agent”互相传递结果,准确率跌至 38.5%;传统的单上下文模式只有 26.3%。
数据背后的关键事实:Sub-Agent 模式虽然看起来更接近“智能体协作”,却丢失了 166 个正确答案,答案保留率仅 55.5%。这意味着接近一半的可用信息在传递过程中被改写、压缩或误读。
根本原因:LLM 在传递链路上做“重新理解”
LLM 不是无损信道。当一个 Agent 把结果“总结”给下一个 Agent 时,它实际上在进行新一轮的推理与生成。这一行为会引入三层损耗:
- 语义漂移(Semantic Drift):关键词、约束条件、数值精度在转述中被改写。
- 上下文压缩(Context Loss):为了塞进下一段 prompt,中间结果被迫截断,细节不可逆丢失。
- 幻觉注入(Hallucination Injection):Sub-Agent 会基于自己的理解“补全”缺失信息,产生原本不存在的结论。
因此,优化的首要目标不是让 LLM 更好地“传递”,而是把 LLM 从传递链路中移除。
第一性原理设计
在动手写代码之前,先确立三条不可再约的公理和一条奥卡姆剃刀。
- 公理 A:LLM 是推理 + 生成引擎,不是传递 + 汇总引擎。它的价值在“第一次思考”时最大;让它反复搬运中间结果,只会放大误差。
- 公理 B:上下文窗口稀缺,污染不可逆。每引入一段非必要上下文,都会稀释有效信号;一旦污染,无法通过后续 prompt 完全洗回。
奥卡姆剃刀
切掉 LLM 在传递链路中的位置。能由程序搬运的数据,绝不经过 LLM;能由文件系统承载的状态,绝不塞进 prompt。
三条工程约束
- 原子化 + 稳定 ID:每个 slot 只负责一个最小可交付单元,拥有全局唯一、可重入的 slot_id。
- 执行隔离:slot 之间只通过文件/JSON 交换数据,Worker 进程互不阻塞,失败可独立重试。
- 程序化汇合:最终组装必须是确定性程序(Python Collector),而非让 LLM 再次“读一遍然后写一遍”。
架构设计
整体数据流
Claude Code 只负责“拆解”与生成 task_map.json;Hermes 只负责按依赖调度;每个 Worker 只写自己的 slot 文件;Collector 按顺序拼接并校验;最终验证程序确认完整性。
只看覆盖率数字与依赖图:哪些 slot 已完成、哪些可并行、哪些必须等待。
只管自己被分配的 slot。不读其他 slot 的输出,不写公共状态。
确定性程序,按 task_map 中的顺序读取文件并拼接,不做任何 LLM 中转。
task_map.json schema
{
"project": "pmo-platform-report",
"slots": [
{
"slot_id": "css-base",
"file_path": "parts/css-base.html",
"dependencies": [],
"parallel_group": "wave-1",
"description": "CSS variables + base typography"
},
{
"slot_id": "css-components",
"file_path": "parts/css-components.html",
"dependencies": [],
"parallel_group": "wave-1",
"description": "Component CSS + responsive rules"
},
{
"slot_id": "assembly",
"file_path": "index.html",
"dependencies": ["css-base", "css-components", "..."],
"parallel_group": "wave-5",
"description": "Deterministic full assembly"
}
],
"max_parallel_workers": 3,
"collector": "scripts/assemble.py"
}
与 project-blueprint 的关系
在既有 project-blueprint 工作流中,本架构替换的是阶段三“实现”。原本由单一长上下文 LLM 逐步编码的阶段,被替换为:
- 阶段 3a:拆解 → Claude Code 输出
task_map.json与 slot 清单。 - 阶段 3b:蜂群执行 → Hermes + Worker swarm 并行完成所有 slot。
- 阶段 3c:程序化汇合 → Python Collector 组装、验证、输出最终产物。
swarm-execution Skill
文件位置:~/.hermes/skills/software-development/swarm-execution/SKILL.md
该 skill 把蜂群模式封装成可复用的执行协议。它不关心业务逻辑,只关心“如何把一个大任务切小、并行执行、再安全地拼回来”。
5 步执行流程
- 环境准备:创建
parts/目录,校验目标路径,初始化状态文件。 - 拆解(Decompose):Claude Code 读取完整需求,输出
task_map.json与每个 slot 的规格。 - 确认闸门(Approval Gate):人类确认 slot 清单、依赖与并行分组; skill 只在通过后才启动 Worker。
- Worker 执行:Hermes 按 wave 与 max_parallel_workers 调度 Claude Code Worker,每个 Worker 只写自己的 slot 文件。
- 汇合与验证:Collector 拼接所有 slot,验证大小、标签、结构,输出最终产物。
关键特性
| 特性 | 说明 | 值 / 状态 |
|---|---|---|
| 并行上限 | 同一 wave 内最多同时运行的 Worker 数,防止资源耗尽 | 3 |
| 全链路零 LLM 中转 | slot 之间只通过文件交换,Hermes 只读取状态 JSON | 已保证 |
| slot 级幂等重试 | 每个 slot 独立文件路径,失败可单独重跑而不污染其他 slot | 已保证 |
| 依赖 DAG | wave 按依赖拓扑生成,无环图自动排序 | 已保证 |
| 程序化汇合 | 最终组装由 Python 脚本完成,非 LLM 二次生成 | 已保证 |
实战验证 — PMO 平台报告重构
目标
将一个 61 KB 的单文件 HTML 报告,按功能边界拆成 11 个独立 slot,通过蜂群模式并行重建,最终由 Collector 组装为完整页面。
拆解方案
| Slot ID | 内容 | 文件 | 状态 |
|---|---|---|---|
| css-base | CSS 变量 + 基础排版 | parts/css-base.html | ✅ 1.3 KB |
| css-components | 组件 CSS + 响应式 | parts/css-components.html | ✅ 13.8 KB |
| tab-system | Tab 切换按钮 | parts/tab-system.html | ✅ 0.6 KB |
| sidebar | 两个侧边导航 | parts/sidebar.html | ✅ 1.3 KB |
| hero | 两个 Hero 区域 | parts/hero.html | ✅ 0.8 KB |
| scheme-content | 落地方案 7 章节 | parts/scheme-content.html | ✅ 14.8 KB |
| report-content-a | 调研报告前半 | parts/report-content-a.html | ✅ 10.1 KB |
| report-content-b | 调研报告后半 | parts/report-content-b.html | ✅ 14.0 KB |
| footer | 页脚 + 回顶 | parts/footer.html | ✅ 0.2 KB |
| scripts | 交互 JS | parts/scripts.html | ✅ 3.1 KB |
| assembly | 完整组装 | index.html | ✅ 61.7 KB |
执行时间线
基础设施样式优先,两个 CSS slot 无依赖,可并行启动。
页面骨架与导航结构,彼此独立,可并行。
内容主体拆为三块,降低单 slot 上下文长度,提升生成质量。
页脚与交互脚本,依赖前文 DOM 结构已确定。
assembly slot 由 Collector 触发最终确认,读取全部 parts 并生成 index.html。这是整个链路中唯一合理的 LLM 参与点:把已生成的零件组合成最终产物。
对抗性验证结果
验证不是为了证明“没有 bug”,而是主动寻找“哪里可能丢失信息”。以下 10 项验证覆盖了结构、内容、运行时、安全性四个维度。
| 验证项 | 方法 | 结果 |
|---|---|---|
| 内容完整性 | 对比原始产物与重构产物的 <h2>、<section>、.card、<table> 数量 |
✅ 零丢失 |
| 文件大小 | 对比原始 61465 B 与组装后大小 | ✅ 61687 B |
| Tab 切换 | 浏览器点击 + JS API 调用,检查 active 类与内容显隐 | ✅ 正常 |
| JS 错误 | 浏览器控制台 browser_console 监控 |
✅ 0 错误 |
| CSS 变量 | 检查 :root 中 CSS 自定义属性定义 |
✅ 12 个全部保留 |
| 响应式 | 检查 CSS media queries 断点与移动端布局 | ✅ 767 px / 1025 px |
| LLM 中转检查 | 逐段审查链路:拆解→JSON→Hermes→Worker→Collector→验证 | ✅ assembly 唯一 LLM 环节(合理) |
| 内容丢失检查 | grep 关键词计数:关键术语、章节标题、组件类名 |
✅ 所有术语存在 |
| OOM 风险 | 执行期间 free -h 监控,观察内存峰值 |
✅ 内存充足 |
| 并行安全 | 确认所有 Worker 写入独立文件路径,无共享可变状态 | ✅ 无冲突 |
蜂群模式在真实重构任务中实现了零信息丢失。文件大小、结构、交互行为均与原始产物保持一致。
assembly 是唯一合理的 LLM 环节。它不是“中转”,而是“最终确认”:把已验证的零件组合成可交付产物。
同一 swarm-execution 协议可套用到任何 HTML、文档、代码生成任务,只需替换 task_map.json。