Appearance
19. 如何实现工具的并行调用?什么时候该串行?
难度 P0 必背 · 岗位 应用 · 频率 ★★★ · 预计阅读 5 min
本题阅读地图
- 💡 简要回答
- 📝 详细解析
- 🎯 面试总结
👔面试官:如何实现工具的并行调用?什么时候该串行?
🙋♂️我:并行就是同时调多个,串行是一个调完再调下一个。
👔面试官:对,但关键是判断依据:工具之间有没有依赖关系?结果是否相互独立?并行能省时间,但串行更可控。你能讲清楚决策逻辑吗?
🙋♂️我:独立的就并行,有依赖的就串行?
👔面试官:对,但还有:并行的并发数控制、超时处理、部分失败怎么办。而且有些场景可以"准并行":先调一个,拿到部分结果后调其他的。
TL;DR 速记
- 是什么:工具调用是否并行,核心看工具之间有没有数据依赖,以及结果能否独立汇总。
- 决策法:独立任务并行,有前后依赖串行,先拿关键输入再并行分支就是准并行。
- 怎么答:「并行不是简单
gather,还要治理并发数、超时、取消、部分失败和结果汇总;否则省下的延迟会变成下游压力和不稳定。」
图解
图 1:并行、串行、准并行的判断
💡 简要回答
并行 vs 串行决策:
| 场景 | 方式 | 示例 |
|---|---|---|
| 工具独立,无依赖 | 并行 | 同时查天气、查汇率、查新闻 |
| 有依赖关系 | 串行 | 先查订单,再查物流(需要订单号) |
| 部分独立 | 准并行 | 先查用户画像,再并行查推荐商品和优惠券 |
并行治理:
- 并发数限制(避免压垮下游)
- 超时控制(最快返回 vs 等全部)
- 部分失败处理(全部失败 vs 部分成功)
📝 详细解析
并行调用
适用场景:
- 查询天气、汇率、股票(相互独立)
- 多源搜索(百度 + Google + 知乎)
- 并行验证(同时查数据库和缓存)
实现方式:
python
import asyncio
results = await asyncio.gather(
tool1.call(),
tool2.call(),
tool3.call()
)治理要点:
- 并发数限制:最多同时调 N 个
- 超时策略:等最快返回 / 等全部返回 / 超时取消
- 部分失败:一个失败全部失败?还是返回部分结果?
串行调用
适用场景:
- 有依赖关系:先查订单状态,再决定是退款还是发货
- 需要前序结果:先搜索,再对搜索结果做深度分析
实现方式:
python
result1 = await tool1.call()
result2 = await tool2.call(param=result1.id)准并行(混合模式)
先串行获取关键信息,再并行调多个独立工具。
示例:
- 串行:查询用户画像(拿到用户标签)
- 并行:根据标签同时查询推荐商品、匹配优惠券、查历史订单
常见踩坑与反例
踩坑 1:看到多个工具就无脑并行
错误描述:「要查订单和物流,那就两个工具一起调」。
正确做法:先判断依赖。物流查询需要订单号,就必须先查订单,再拿订单号查物流。
踩坑 2:只写并行代码,不控并发
错误描述:一次性把 100 个工具调用全丢给下游 API。
正确做法:用信号量、连接池、队列限制并发,结合下游限流规则设置批量大小和退避策略。
踩坑 3:没有部分失败策略
错误描述:三个独立工具里一个超时,整个 Agent 直接失败。
正确做法:区分必需结果和可选结果。可选工具失败时返回 partial result,并把缺失信息明确告知 LLM 或用户。
踩坑 4:准并行场景被写成纯串行
错误描述:先查用户画像,再一个个查推荐商品、优惠券、历史订单。
正确做法:关键依赖先串行拿到,后续互不依赖的分支并行执行,兼顾正确性和延迟。
面试官可能继续追问
追问 1:判断并行还是串行的核心标准是什么? 答题要点:看数据依赖、执行副作用和结果汇总方式。无依赖且无冲突可并行;后一步需要前一步结果就串行;部分依赖用准并行。
追问 2:并行调用的超时策略怎么设计? 答题要点:按场景选择等全部、等最快、超时取消或返回部分结果;要给每个工具设置单独 timeout,也要有整体 deadline。
追问 3:一个并行工具失败怎么办? 答题要点:先判断是否关键依赖。关键结果失败就重试 / 降级 / 失败退出;非关键结果可标记缺失,让 LLM 基于部分结果生成保守答案。
追问 4:怎么避免并行调用压垮下游? 答题要点:并发限流、批量大小控制、指数退避、熔断和隔离仓;不同工具按下游 SLA 配不同并发上限。
🎯 面试总结
决策逻辑:独立并行,依赖串行,混合用准并行。并行要治理:并发数、超时、部分失败。