🔗 工具链编排
简单的 Agent 任务可能只需一次工具调用,但复杂任务往往需要多个工具协同工作。工具链编排解决的是如何将多个工具调用组织成一个高效、可靠、可追踪的执行流程。
🔀 多工具协作模式
🔗 串行(Sequential)
工具按顺序依次执行,后一步依赖前一步的输出。
Tool A → Tool B → Tool C
适用:数据查询后处理、多步工作流
优点:逻辑清晰、依赖明确
缺点:总耗时 = 各步耗时之和
⚡ 并行(Parallel)
多个无依赖关系的工具同时执行。
Tool A ┐
Tool B ┤→ 聚合
Tool C ┘
Tool B ┤→ 聚合
Tool C ┘
适用:多源数据聚合、独立子任务
优点:总耗时 ≈ 最慢的工具
缺点:需处理部分失败场景
🔀 条件分支(Conditional)
根据前置结果动态选择执行路径。
Tool A → 判断 → B 或 C
适用:需要逻辑判断的流程
优点:灵活适应不同输入
缺点:需 LLM 做出正确判断
🗺️ Map-Reduce
将同一操作并行应用到多个数据项,再汇总。
[a,b,c] → Map(A) → Reduce
适用:批量处理、多文件分析
优点:可扩展,适合大量数据
缺点:需要汇总逻辑
📊 模式选择决策矩阵
| 场景特征 | 推荐模式 | 理由 |
|---|---|---|
| 步骤间有严格数据依赖 | 串行 | 确保数据流正确性 |
| 多个独立数据源查询 | 并行 | 减少总延迟,提升吞吐 |
| 需要根据中间结果路由 | 条件分支 | 动态决策,避免无效调用 |
| 批量处理相似任务 | Map-Reduce | 扩展性好,资源利用高效 |
| 复杂混合场景 | DAG(有向无环图) | 组合多种模式,统一调度 |
📋 调用链管理
在多工具协作中,调用链追踪是调试和监控的基础。每次工具调用都应记录完整上下文。
调用链数据结构
{
"trace_id": "trace_abc123",
"span_id": "span_xyz789",
"parent_span_id": null,
"tool_name": "get_weather",
"start_time": "2025-05-26T10:00:00Z",
"end_time": "2025-05-26T10:00:01.2Z",
"duration_ms": 1200,
"input": { "city": "Beijing" },
"output": { "temp": 28, "condition": "晴" },
"status": "success",
"error": null,
"retry_count": 0
}
关键能力
1
Trace ID 贯穿全链路
一次用户请求生成唯一 Trace ID,所有工具调用共享该 ID
2
Span 父子关系
每个工具调用是一个 Span,嵌套调用通过 parent_span_id 关联
3
输入输出记录
记录完整请求/响应(注意敏感信息脱敏),便于问题复现
4
耗时分解
记录每次调用的耗时,定位性能瓶颈
📊 结果聚合
当多个工具并行执行时,需要统一聚合结果并呈现给 LLM。
| 聚合策略 | 描述 | 适用场景 |
|---|---|---|
| 简单合并 | 将所有结果按顺序拼接为文本 | 少量工具(2-5 个),结果不大 |
| 结构化汇总 | 以 JSON/Markdown Table 形式组织 | 同质化数据(如多城市天气) |
| LLM 摘要 | 用一次 LLM 调用对结果进行总结 | 大量文本结果,需提取关键信息 |
| 流式聚合 | 边执行边将完成的结果推送给 LLM | 并行任务,需逐步展示进度 |
⏱️ 超时与熔断
工具调用可能因网络故障、服务崩溃等原因长时间无响应。超时与熔断机制是系统稳定性的保障。
三级防护体系
1
单次超时(Timeout)
每个工具调用设置最大等待时间(默认 30s,可配置)。超时后返回超时错误给 LLM,让其决定是否重试或使用替代方案。
2
熔断器(Circuit Breaker)
当某工具的失败率超过阈值(如 50%),自动熔断该工具。后续请求直接返回错误而不实际调用,避免雪崩。熔断后定时探测(半开状态),恢复后重新接入。
3
全局超时(Global Deadline)
为整个工具链执行设置总时间上限(如 120s)。超时后强制终止所有进行中的调用,返回部分结果或降级响应。防止用户无限等待。
熔断器状态机
CLOSED
正常调用
失败率 > 阈值 →
正常调用
OPEN
直接拒绝
冷却时间到 →
直接拒绝
HALF-OPEN
探测调用
成功 → CLOSED探测调用
失败 → OPEN
💡 工具链设计原则
- 幂等性优先:工具应设计为幂等操作,支持安全重试
- 无依赖并行:尽可能将无数据依赖的工具设计为可并行执行
- 快速失败:不可恢复的错误应立即返回,不要让 LLM 空等超时
- 结果可观测:每次调用都记录结构化日志,支持全链路追踪
- 优雅降级:当某个工具不可用时,应有 Plan B(缓存、默认值、替代工具)
- 限额控制:限制每个请求的最大工具调用次数(建议 5-10 次),防止无限循环