关键:让“工具链”可解释、可回退、可观测。
🎯 文章目标
- 确立单工具与工具链的边界,何时选择哪种
- 设计回退/重试与人工兜底机制
- 打通观测与问题复现
📚 背景/前置
- 工具链:多步骤、多工具、存在依赖与回退(fallback/rollback)
- 单工具:原子化、职责单一、易测试与复用
🔧 核心内容
1) 编排模型
- 串行:按计划顺序执行,失败即回退
- 并行:聚合多个工具结果,提高覆盖与鲁棒性
- 条件:基于规则或模型输出在分支间选择
2) 回退与重试
- 回退:A 失败 → 尝试 B;B 失败 → 走人工兜底
- 重试:指数退避 + 幂等键,按错误类型决定是否重试
- 观测:记录每步“输入/输出/耗时/错误”,支持局部重放
3) 可解释性
- 保留“决策日志”(为何走这条路径)
- 对关键分支输出“可读理由”,便于排障与审计
💡 实战示例:最小编排器
javascript
async function runPlan(plan, call){
for (const step of plan){
try {
const out = await call(step.action, step.input)
if (!out?.ok) throw new Error(out?.error?.message || 'tool failed')
} catch (e){
if (step.fallback){
const out = await call(step.fallback.action, step.fallback.input)
if (!out?.ok) throw new Error(out?.error?.message || 'fallback failed')
} else {
throw e
}
}
}
}
📊 对比/取舍(速查)
- 单工具:简单稳定,适合明确边界的任务
- 工具链:表达力强,适合复杂任务,但需要观测与回退
🧪 踩坑与经验
- 将“不可重试错误”与“可重试错误”分开对待
- 决策理由缺失会导致排障困难;要记录“为什么走这条路径”
- 不要在模型里硬编码凭证/常量,统一通过配置注入
📎 参考与延伸
- ReAct/Toolformer/Plan-and-Execute
- 工作流引擎与有向图编排(Airflow/Temporal/自研)
💭 总结
- 以“编排模型 + 回退/重试 + 决策日志 + 观测回放”构建可治理的工具链