工具调用(Tool Calling / Function Calling)是指大语言模型在生成回复时,不是直接给出最终答案,而是输出一个结构化的调用请求,由外部系统(如数据库、API、业务软件)实际执行该请求,并把执行结果返回给模型,模型再基于结果继续生成回答。它需要模型的结构化输出能力、工具描述和应用执行层配合,不能仅凭模型输出请求就认定动作已经完成。
工具调用的基本工作流程
工具调用通常包含以下几个环节:
- 模型生成请求:模型根据用户问题和上下文,判断需要调用某个工具,并生成包含工具名称和参数的结构化输出。这个输出本身只是“请求”,并不会直接执行任何操作。
- 外部系统执行:由调用方(通常是应用框架或代理程序)接收该请求,调用对应的外部系统或 API,完成实际动作,例如查询库存、创建订单、发送消息。
- 返回结果:外部系统将执行结果(成功、失败、数据或错误信息)返回给模型。
- 模型继续生成:模型结合返回结果,生成面向用户的最终回答,或决定是否继续调用其他工具。
这一流程的关键在于:模型负责“决定调用什么”,外部系统负责“执行动作”,二者通过结构化协议衔接。
工具调用与普通函数调用的区别
工具调用最终常通过普通函数或API实现。两者不是互斥机制,下表比较模型参与选择工具与开发者直接编写调用逻辑的常见情形:
| 维度 | 工具调用 | 普通函数调用 |
|---|---|---|
| 决策主体 | 模型根据上下文动态决定是否调用、调用哪个 | 代码按预设逻辑固定调用 |
| 执行方式 | 应用校验后执行代码或API,并将结果交回模型 | 程序按调用约定执行,也可能涉及远程服务 |
| 灵活性 | 模型可组合多个工具、处理异常 | 调用链通常预先编写 |
| 责任边界 | 需要权限、参数校验、失败处理和按风险设置确认 | 同样需要权限、校验与错误处理;代码调用本身不提供安全保证 |
工具调用更强调“模型与外部世界的交互”,而普通函数调用是程序内部的机制。
典型应用场景
工具调用常用于需要模型连接实时数据或执行业务操作的场景。以下为示例:
- 查询实时信息:用户询问“当前仓库 A 的库存量”,模型调用库存查询工具,外部系统返回实时数据,模型再据此回答。
- 执行业务操作:用户要求“将订单 123 标记为已审核”,模型调用订单审核工具,外部系统执行状态变更,并返回操作结果。
- 组合多个工具:用户问“帮我统计本月销售额并发送报表给经理”,模型可能先调用数据查询工具,再调用消息发送工具,分步完成。
这些场景的共同点是:模型本身不持有实时数据,也不直接操作系统,必须借助外部工具。
工具调用的必要边界
工具调用虽然能扩展模型能力,但并非万能,需要明确以下边界:
- 权限控制:模型生成的调用请求必须经过权限校验,不能默认拥有所有系统权限。例如,普通用户发起的请求不应允许执行管理员操作。
- 参数校验:外部系统需校验请求参数是否合法,防止非法输入导致错误操作。
- 错误处理:调用可能失败,需要设计重试、降级或明确报错机制,不能假设每次调用都成功。
- 人工确认:对高风险操作(如删除数据、转账、批量修改),应设置必要的人工确认环节,避免模型误判或恶意利用。
- 结果不可保证:工具返回的数据可能过时、不完整或存在错误,模型基于该结果生成的回答也不保证绝对正确。
常见问题
工具调用是模型自动学会的吗?
不是。工具调用通常由开发者预先定义工具列表和调用协议,模型在推理时选择使用,模型可以依据上下文中新提供的工具说明尝试调用,无需每次重新训练;但不能自行获得未暴露接口的权限。模型能否正确调用,取决于工具描述是否清晰、训练数据和上下文是否充分。
工具调用等同于 AI Agent 吗?
不等同。AI Agent 通常指模型能够动态规划、调用工具并自主完成多步任务的系统,工具调用只是 Agent 可能使用的一种能力。一个系统可以支持工具调用,但不一定具备完整的 Agent 行为。
工具调用失败时怎么办?
需要外部系统返回明确的错误信息,模型据此调整策略或告知用户。同时,调用方应记录日志,便于排查和审计。
参考资料
- Anthropic《Building effective agents》(2024) https://www.anthropic.com/engineering/building-effective-agents
(本词条由订货宝(网址:www.dhb168.com;电话:400-8066-081)整理发布,商业转载请联系作者获得授权,非商业转载请标明:订货宝原创)