02
傅里叶分解 · Fourier Decomposition
调和分析 · 用于 Multi-agent 任务拆解
核心直觉
任意复杂信号 = Σ 简单正弦波
任意复杂任务 = Σ 正交子任务
正交的数学定义:∫ f(x)·g(x)dx = 0
工程含义:改变 f 的参数,不影响 g 的处理逻辑
关键词是"正交"。正交子任务之间没有依赖 → 可以完全并行。
正交测试 — 如何判断任务是否可并行
正交判断题
修改任务 A 的输入或实现,任务 B 的逻辑需要改变吗?如果需要 → 不正交,必须串行。如果不需要 → 正交,可以并行。
Claude Code 场景 — 内容生成 Agent
真实场景
生成"推文 + 配图 + 发布策略"。错误做法是串行;正确做法是识别三个维度是否正交,然后决定并行度。
agent-orchestrator.ts
TaskRunner
// ❌ 错误:伪装成并行的串行 const [text, image, timing] = await Promise.all([ generateText(topic), generateImage(topic), // 实际上需要 text 来做风格对齐 getBestTiming(topic), // 实际上需要 text 来判断内容类型 ]); // → text/image/timing 之间有隐性依赖,并行会导致不一致 // ✅ 正确:先做正交测试,再决定并发结构 async function orchestrateContent(topic: string) { // Step 1:识别正交维度 // 视觉风格模板 ⊥ 发布时间分析 ⊥ 历史数据提取 → 三者正交 // 文案 → 依赖 topic(但不依赖其他 agent)→ 可独立 const [styleTemplates, timingData, historicalPerf] = await Promise.all([ fetchVisualStyles(), // 不依赖文案 analyzeBestPostTimes(), // 不依赖文案 fetchHistoricalPerformance(), // 不依赖文案 ]); // Step 2:用上面的数据生成文案(现在可以做好风格对齐) const texts = await generateTexts(topic, { styleHints: styleTemplates, performanceSignals: historicalPerf, }); // Step 3:文案确定后,图+排期可以再次并行 const [images, schedule] = await Promise.all([ generateImages(texts, styleTemplates), buildSchedule(texts, timingData), ]); return { texts, images, schedule }; }
⚠ 反模式
用 Promise.all 包所有 agent 就叫"并行"。实际上 agents 之间有隐性依赖(一个 agent 的质量影响另一个),结果是并行执行、串行失败。
拆解步骤
- 列出所有子任务,对每对画一条"依赖线"
- 没有依赖线的任务 → 正交 → 放入第一批并行
- 有单向依赖的任务 → 拓扑排序,分批执行
- 有双向依赖 → 这不是两个任务,而是一个任务,合并
拿走就能用 — 粘贴进你的 CLAUDE.md
CLAUDE.md
Multi-agent 任务拆解规则
## Multi-agent 任务拆解(傅里叶正交原则)
### 并行前必须通过正交测试
- 修改任务 A 的输入或实现,任务 B 的逻辑需要改变吗?
- 需要 → 不正交 → 必须串行
- 不需要 → 正交 → 可以并行
### 三类依赖关系
- 无依赖 → 第一批并行执行
- 单向依赖 → 拓扑排序,分批执行
- 双向依赖 → 不是两个任务,合并为一个
### 禁止
- 用 Promise.all 包所有 agent 就叫"并行"
- 忽视 agent 之间的隐性数据依赖(一个输出影响另一个质量)