问题

Agent 有几十个工具可用:选错工具、参数填错、该并行的串行执行、一个工具失败全盘崩——工具层是 Agent 可靠性的重灾区。

核心模式

工具调度把工具调用当工作流引擎对待:有向无环图(DAG)描述依赖,独立节点并行执行,失败节点独立容错。

class ToolScheduler:
    def execute(self, plan: DAG) -> Results:
        for level in plan.topological_levels():  # 按依赖分层
            # 同层无依赖,并行执行
            results = await parallel([
                self.run_with_retry(node) for node in level
            ])
            self.check(results)  # 关键节点失败 → 中止或降级

三个子问题各有对策:

  • 选择:工具描述是给模型的"招聘广告",写清"何时用、何时不用";工具超过 20 个时先检索再注入(工具版 RAG)
  • 参数:强 schema 校验 + 参数修正层(模型把 page 填成 pageNo 时自动纠正),校验失败要返回可理解的错误让模型改
  • 容错:网络类错误指数退避重试;参数类错误不重试直接回给模型反思;关键工具配降级替补

实战要点

  • 返回结果必须截断:工具吐回 5 万 token 的 JSON 是上下文杀手,约定"列表类工具默认分页"
  • 幂等性分级:只读工具随便重试,写操作必须有幂等键或前置确认
  • 调度轨迹落日志:哪个工具、什么参数、耗时多少、成功与否——Agent 系统运维全靠它