工具调用并行调度
六个调用一口气吐出来,Harness 怎么排班?依赖分析分波:彼此不看对方输出的并行干,参数引用前序结果的排队干,同文件的两个写强制串行——因为后写会覆盖前写。拧依赖标记看波次重排,再开「忽略写冲突」亲眼看翻车:省下 450 毫秒,代价是改动静默丢失。
纯前端确定性调度:分波 = 依赖拓扑分层(wave = 1 + max(wave(deps))),总耗时 = 各波最慢者之和,写-写同目标按输出顺序排隐式依赖;口径对齐知识库《工具执行机制》单轮并行调度器,零 API、零随机。
模型一轮吐出六个调用:读两个文件、一次搜索、两个写同一个 config.ts、跑一遍测试。五站流水线(注册→懒加载→校验→执行→回填)走到站 4 · 执行间,Harness 依赖分析后排班:彼此不看对方输出的并行干,参数引用前序结果的排队干。 拧下面的依赖标记,看波次怎么重排。
一轮六个调用 · 依赖标记
点亮 = 参数引用前序结果,必须等读Read src/config.ts≈400ms
波 0无依赖 → 第一波并行 · 只读:与所有调用互不看输出,配并行的主力
读Read src/db.ts≈600ms
波 0无依赖 → 第一波并行 · 只读:与读 config.ts 互不依赖,同一波并行
搜WebSearch "LLM 每周动态"≈900ms
波 0无依赖 → 第一波并行 · 联网搜索:输入不依赖任何人,第一波开跑
改Edit src/config.ts≈500ms
波 1写①:改的是读 config.ts 回来的内容——没等齐就开工,改的是旧快照
写Write src/config.ts≈450ms
波 2写②:与 Edit 改同一个文件——并行就是在赌运气,后写覆盖前写
跑Bash npm test≈1200ms
波 1文章示例:测试要等两个文件都读回来才开跑——拿不到输入的活没法开工
调度泳道 · 波内并行,波间串行
3 波 · 总耗时 ≈2550ms总耗时 = Σ 各波最慢者(900 + 1200 + 450 = 2550ms);全串行对照 = Σ 全部调用(4050ms)。 生效依赖:read-a←[无];read-b←[无];search←[无];edit-a←[read-a];write-a←[read-a, edit-a];test←[read-a, read-b]
波数3依赖拓扑分几层
并行总耗时≈2550ms各波最慢者之和
全串行对照≈4050ms六个调用排队跑
并行提速1.59x并行红利给只读
判据只有一个这一轮里彼此不看对方的输出才配并行——参数引用了前序结果,就必须等它回填(波次推后);拿不到输入的活没法开工。
写-写同目标串行两个写并行就是在赌运气:后写覆盖前写。成熟的 Harness 对写操作倾向串行或加锁,把并行红利留给只读操作。
并行不是默认状态忽略写冲突确实更快(省 1500ms),代价是改动静默丢失——并行是提速手段,不是想开就开的开关。