三省 | 多 Agent 并行调研工坊
工坊规矩 「吾日三省吾身」——独立反思三遍胜过一遍想透。OpenRouter 在 DRACO benchmark 上把这事坐实了:Opus×3 + Opus judge 比 Opus 单跑高 +6.7pp,提升的 3/4 来自"综合"环节本身,1/4 才来自模型多样性。意味着 sub-agent 即便都是 Claude 家族也能拿大头收益。但 Judge 阶段如果只投票多数赢,就把最值钱的产物(少数派的"我不知道")扔了。
参考:https://openrouter.ai/blog/announcements/fusion-beats-frontier/
接活:用户给的输入
用户通常给以下任意一种,足够明确就直接开始:
- 一个开放问题:「X 和 Y 哪个更适合 Z」/「X 选型」/「评审 X 方案」
- 一个研究对象:「研究下 X」/「全面看一下 X」
- 一个隐性研究需求:「帮我做 X 决定」(背后是需要先调研)
如果问题太窄("修这个 bug"),停手,告诉用户这不适合 Fusion,用单 Opus 跑更划算。
班规总纲
- 拆角度异质 > 同质。三个都拍"成本"等于没拆。如果实在想不出三个互补角度,也好过单跑——但写综合时明说"角度同质,多样性贡献弱"。
- 同条消息里发 3 个 Agent tool 调用。串行 spawn 就是花三倍时间装样子。
- 每个 sub-agent prompt 自包含。它看不到主对话,要的 context 一并给。
- 每个 sub-agent 都加硬约束:「不要凭记忆瞎编,查不到就说"未找到"」、「输出 ≤ 500 字」、「不要给"看情况"的废话结论」、「必须加载 web-access skill」(如需联网)。
- Judge 阶段保留少数派。某个 sub-agent 老实说"查不到 / 无法验证"——这条不能被另两个 agent 的笃定数字淹没。这是 sub-agent 模式最值钱的产物。
- 综合输出敢下判断。"看情况" / "需要更多信息" 是这个 skill 的最大失败模式。
- 不要把 Judge 偷偷做成 Vote。Judge 的工作是对比、找空白、调和张力,不是数票。
第一步:拆角度(异质 > 同质)
针对用户问题,拆 3 个互补角度。常见模板:
| 任务类型 | 推荐角度 |
|---|---|
| 技术选型 | 任务质量 / 成本 / 实操集成 |
| 架构评审 | 性能 / 可维护性 / 演进风险 |
| 方案对比 | 优势面 / 劣势面 / 落地约束 |
| 调研类 | 一手来源 / 社区实践 / 已知陷阱 |
| 决策类 | 短期收益 / 长期影响 / 退出成本 |
第二步:并行 panel
Agent A (Explore): 角度 1(偏调研)
Agent B (Explore): 角度 2(偏调研)
Agent C (general-purpose): 角度 3(偏实操 / 需要更深的工具理解)
每个 sub-agent prompt 必须包含:
- 明确的研究目标 + 完整背景(self-contained)
- 硬约束:不编、查不到就说不到、≤ 500 字、敢下判断
- 必须加载
web-accessskill(如需一手来源) - 输出结构提示(建议小标题 + bullet)
第三步:Judge 阶段
三 agent 全部回来后,按这个清单交叉评审:
| 维度 | 怎么做 |
|---|---|
| 共识 | 三家都点到的核心结论 → 这是可信的基线 |
| 分歧 / 张力 | 各家结论差异 → 标 ⚠️ 待核实项 |
| 关键缺口 | 谁老实说"查不到 / 无法验证" → 这条不能被淹没 |
| 独特观点 | 某 agent 单独发现的硬事实 / 反直觉点 |
| 潜在错误 | 凭印象写的数据 / 未引用一手来源的判断 |
第四步:综合输出
按这个顺序:
- 一句话敢下判断的结论
- 结构化对照表(决策维度 + 推荐)
- 老实标注待核实项 + 它们对结论的影响
- 可立即落地的下一步
- (可选但建议)元观察:这次得到了什么单跑拿不到的东西
第五步:落 Obsidian 知识卡(默认开)
调研一散就废了。综合输出完成后,主 agent 额外写一张 Obsidian 卡片到用户的 vault,让今天的调研三个月后还能搜得到。
默认 vault 路径:~/Documents/Obsidian/三省研究/(用户可在主对话里改、或软链接到真 vault;不存在会自动建)。
文件名:<YYYY-MM-DD>-<slug>.md(slug 从 topic 取,中文按拼音可选,留 8-12 字)。
卡片模板(严格按这个结构生成,留好 [[wikilink]] 占位让用户在 Obsidian 里手连):
---
type: research
date: {YYYY-MM-DD}
topic: {一句话主题}
tags: [{领域}, {方法}, 三省调研]
sources:
- {一手 URL 1}
- {一手 URL 2}
sub_agents:
- {Agent A 角度}
- {Agent B 角度}
- {Agent C 角度}
---
# {主题}
> 一句话判断:{综合输出的那句话}
## 共识
- {三家都点到的核心结论}
## 分歧 ⚠️
- {差异 + 待核实项}
## 缺口(少数派的"我不知道")
- {谁说了"查不到/无法验证"——这条不能被淹没}
## 独特发现
- {某 agent 单独发现的硬事实 / 反直觉点}
## 下一步
- [ ] {可立即落地的动作 1}
- [ ] {可立即落地的动作 2}
## 元观察
{这次得到了什么单跑拿不到的东西}
## 相关
[[{相关概念 1}]] [[{相关概念 2}]]
硬约束:
- frontmatter 字段必须齐全(type/date/topic/tags/sources/sub_agents)——Obsidian Dataview 靠这些
- sources 只放真的查过的一手 URL,没查过就留空数组
sources: [],不要为了好看编 URL(同班规"少数派的我不知道"原则) [[相关]]占位用方括号,让用户自己在 vault 里连——自动猜的双链质量差,反而污染图谱- 文件已存在就在文件名后加
-v2别覆盖(同 topic 多次研究是常态)
告诉用户卡片在哪:综合输出末尾加一行:
📝 已落 Obsidian 知识卡:
<vault path>/<filename>.md(在 Obsidian 里搜topic或 tag 找到它)
已知陷阱
- ❌ Sub-agent 拿到主对话的隐式上下文 → spawn 时务必给完整自包含 prompt
- ❌ 串行 spawn(三次单独消息)→ 总耗时变三倍,并行收益归零
- ❌ Judge 阶段简单"投票多数赢" → 丢掉少数派的不确定结论
- ❌ 三个 sub-agent 角度同质(都是"成本")→ 多样性贡献为零
- ❌ Sub-agent prompt 用"搜索"动词 → 把它锚定到 WebSearch,对反爬站点失效(参考 web-access skill 的论述)
- ❌ 综合输出"看情况" → 等于没综合
- ❌ 用户明显是"实时迭代"场景却强上 Fusion → 用户在等,1-2 分钟 spawn 时间会让他离开
- ❌ Obsidian 卡片硬编"相关 [[X]]"自动双链 → 自动猜的链接质量差污染图谱,留空让用户手连
- ❌ Obsidian 卡片 sources 凑数填假 URL → 同班规"少数派的我不知道"原则,没查过的就留空数组
实测案例
完整案例见 examples/openrouter-fusion-research.md——会话里现场跑过一次"OpenRouter Fusion API 在 Claude Code 工作流里何时值得用",Agent B 老实说"OpenRouter API 返回 Fusion 价格 -1,无法估算"——这条被保留进最终结论,验证了"少数派的'我不知道'是最贵的信号"。
一句话出师证书
Fusion 不是把同一个问题问三遍,是从三个互补视角各看一眼,然后保留少数派的"我不知道"。如果你的综合输出是"看情况",你没在做 Fusion,你只是浪费了三倍 token。
发现日期:2026-06-16 · 打磨日期:2026-06-17(按鲁班 Skill v1.0 思路)