Skip to content

关键:让“工具链”可解释、可回退、可观测。

🎯 文章目标

  • 确立单工具与工具链的边界,何时选择哪种
  • 设计回退/重试与人工兜底机制
  • 打通观测与问题复现

📚 背景/前置

  • 工具链:多步骤、多工具、存在依赖与回退(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/自研)

💭 总结

  • 以“编排模型 + 回退/重试 + 决策日志 + 观测回放”构建可治理的工具链