工具调用最容易出问题的地方,往往不是模型“不会调用”,而是接口没有把边界说清楚:这个工具什么时候该用、参数允许填什么、成功结果长什么样、失败后还能不能继续。接口描述越含糊,智能体越可能选错工具、传错参数,或者把一个空结果误判成调用成功。
一个工具最好只承担一类明确职责。查询数据、修改数据、发送通知、生成文件这些动作,虽然都可以被智能体调用,但它们的权限、参数和失败后果并不相同。如果把多个动作塞进一个“万能工具”,模型就需要自行猜测什么时候使用哪个分支,后续也很难判断一次调用究竟做了什么。
设计工具时,可以先用一句话回答三个问题:它解决什么问题?它会读取还是改变外部数据?调用成功后,智能体下一步应该做什么?
例如,“查询订单状态”和“取消订单”不应只是同一个接口里的两个参数值。前者通常是读取操作,后者可能产生不可逆影响,应该在工具描述、权限控制和确认流程上明确区分。工具名称也应尽量直接表达动作和对象,避免使用“处理请求”“执行任务”这类范围过大的名称。
工具之间还要减少能力重叠。两个工具都能查询相似内容时,应明确它们的适用条件、数据范围和优先级,否则模型可能根据名称相似度随机选择。必要时,可以在描述中写出“不适用场景”,帮助模型避开错误调用。
参数描述不能只写“传入相关信息”。智能体需要知道参数是否必填、允许使用什么类型、取值范围是什么,以及缺少参数时应该如何处理。
可以按下面的顺序检查每个参数:
尤其要区分“没有提供”和“明确为空”。没有提供可能意味着模型需要追问用户;明确为空则可能代表用户有意取消筛选。如果接口把两者混在一起,智能体就很难选择下一步动作。
参数约束还要覆盖业务规则,而不只是数据类型。一个看起来合法的日期、编号或金额,未必符合业务要求。接口层应尽量在工具真正执行前完成校验,避免错误请求进入后续系统。类型化契约或 JSON Schema 之类的约束方式,都可以用于表达这类规则,但关键不在于采用哪种格式,而在于约束必须能被执行和验证。
模型可以根据上下文生成参数,但不应独自承担所有校验工作。工具层至少需要再次检查必填字段、数据类型、权限范围和相互依赖关系。
如果参数不完整,返回“缺少某字段”通常比返回“调用失败”更有用。前者能让智能体补充信息或向用户提问,后者只能让它重新猜测。对于无法自动修正的输入,则应明确告诉调用方停止重试,避免同一个错误请求被反复执行。
工具返回结果时,不能只考虑最终展示给用户的文字。智能体还需要根据结果判断后续动作,开发者也需要凭记录定位问题。因此,返回值应区分业务结果、状态信息和错误信息。
一个可复用的结果结构,至少可以包含以下几类内容:
这些字段不必全部暴露给最终用户。面向模型的提示可以帮助它规划下一步,面向日志的标识则用于排查同一次调用。两者混在一段自然语言里,容易导致模型误读,也不利于后续统计。
“没有数据”和“工具执行失败”必须分开表达。返回空数组可能意味着查询成功但没有匹配项,也可能意味着服务异常后没有返回有效内容。如果两种情况都使用空结果,智能体可能直接告诉用户“没有数据”,掩盖了真正的故障。结构化错误至少能让模型知道这是一次失败,并决定是重试、换方案还是停止。
返回结果还需要经过基本验证。即使工具返回了结构化数据,也要检查字段是否齐全、类型是否符合预期、业务状态是否合理。不能因为接口返回了内容,就默认内容一定可以直接交给用户。
失败处理的核心不是“遇到错误就重试”,而是判断这个错误有没有可能通过再次调用得到改善。
临时超时、短暂不可用或限流,通常可能在稍后恢复。此时可以采用有限次数的重试,并逐步拉开重试间隔,避免故障期间继续增加系统负载。重试次数和停止条件应由工具或工作流统一控制,而不是让模型无限循环。
如果一次调用已经产生了外部副作用,例如提交订单、发送通知或修改记录,重试前还要确认是否可能重复执行。查询类操作和写入类操作不能采用完全相同的重试策略。
参数格式错误、权限不足、资源不存在以及业务条件不满足,通常不是等待一段时间就能解决的问题。继续发送同样的请求,只会浪费调用次数,并让问题变得更难追踪。
这类错误应直接返回可理解的原因,并给出下一步方向:让用户补充信息、调整参数、申请权限,或者结束当前流程。错误信息不宜只写内部异常堆栈,也不宜笼统地写成“系统错误”。
当主工具暂时不可用时,智能体可以根据预先设计的规则选择备用工具、进入降级模式,或转交人工处理。备用路径必须有明确边界,不能为了“继续完成任务”而调用用途相近但权限或数据范围不同的工具。
如果没有可靠的替代方案,直接停止通常比编造结果更安全。对于连续失败,还应设置自动截止条件,防止一个工具的故障扩散为整条工作流的重复调用。
工具调用不应只记录最终回答,还要保留足以复盘的过程信息。至少需要能够对应上:使用了哪个工具、传入了哪些参数、工具返回了什么状态、失败属于哪一类、智能体采取了什么后续动作。
记录参数时要注意隐私和安全。敏感内容不应原样写入普通日志,可以进行脱敏或只保存必要摘要。记录的目标是帮助定位接口问题,而不是复制所有用户数据。
后续验证可以围绕四个问题展开:
这些记录还可以帮助发现更隐蔽的问题。例如工具表面上的成功率很高,但大量返回结果都缺少关键字段,说明问题可能出在结果校验,而不是调用是否成功。
在接入工具前,可以逐项确认:
一套好的工具接口,不是把所有可能情况都塞进描述里,而是让智能体在关键分岔点上少做猜测。用途边界负责减少误调用,参数约束负责拦截无效请求,结构化结果负责支撑判断,分类错误和截止条件则负责防止失败扩大。先把这四层设计清楚,再接入更复杂的工作流,后续验证和维护都会轻松许多。
Δ
Ctrl+D