AI 应用工程入门(八):Tool Calling 为什么能让 AI 办事?
用普通人能听懂的方式解释模型如何请求调用工具,以及后端为什么必须负责执行和校验。
RAG 让模型会查资料,Tool Calling 让模型会办事情。模型自己不知道订单状态,也不能凭空修改业务数据,但它可以在需要时请求调用系统提供的工具。
题目 1:什么是 Tool Calling?
标准答案:Tool Calling 是让大模型在需要时调用你提供的函数或工具,而不是只靠自己生成文字。
工程要点:模型负责理解意图和组织回答,工具负责获取真实数据或执行真实动作。比如用户问订单物流,模型可以请求调用 getOrderStatus,后端再真正查询订单系统。
题目 2:为什么需要 Tool Calling?
标准答案:因为大模型不能可靠完成实时查询、数据库读取、业务接口调用、发邮件、创建工单、精确计算和修改用户资料等任务。
工程要点:不要让模型猜数据,要让它调用工具拿数据。凡是涉及真实业务状态的问题,都应该优先考虑工具或数据库,而不是让模型凭语言生成。
题目 3:基本流程是什么?
标准答案:用户提问,模型判断需要哪个工具,生成工具参数,后端执行真实函数,把函数结果返回给模型,模型再生成最终回复。
工程要点:模型不会直接执行函数。它只是告诉后端想调用哪个工具和参数。真正执行、权限校验、参数校验和审计,都必须在服务端完成。
题目 4:工具定义长什么样?
标准答案:工具定义通常包括 name、description 和 parameters。它要告诉模型工具能做什么、参数有哪些、参数格式是什么。
工程要点:工具定义像给模型看的 API 文档。描述越清楚,模型越容易选对工具、填对参数。工具数量也要控制,先从高价值只读工具开始,再逐步加入写操作。
一个订单查询工具的定义可以这样写:
const tools = [
{
name: "getOrderStatus",
description: "根据订单号查询订单当前状态和物流信息。",
parameters: {
type: "object",
properties: {
orderId: {
type: "string",
description: "用户订单号,例如 A1024",
},
},
required: ["orderId"],
},
},
];
模型可能返回这样的工具调用请求:
{
"name": "getOrderStatus",
"arguments": {
"orderId": "A1024"
}
}
真正查询订单系统的动作必须由后端执行。后端还要确认这个用户是否有权查看 A1024,而不是只相信模型填出来的参数。
题目 5:Tool Calling 最大风险是什么?
标准答案:模型可能误解用户意图或生成错误参数,导致执行不该执行的操作。
工程要点:读操作可以相对自动,写操作要谨慎,高风险操作必须用户确认,不可逆操作最好人工审核。模型可以建议调用工具,但最终能不能执行,必须由系统规则决定。
完整示例:工具调用是模型请求,后端执行
Tool Calling 最容易被误解成“让模型调用函数”。更准确的说法是:模型根据上下文提出工具调用请求,后端验证参数和权限,再决定是否真的执行。模型不能绕过后端,也不能直接拿到数据库写权限。
一个工具定义必须像给模型看的 API 文档:名字清楚,描述清楚,参数清楚,什么时候用也清楚。
const tools = [
{
name: "getOrderStatus",
description: "查询当前登录用户名下某个订单的状态和物流信息。只用于订单状态查询。",
parameters: {
type: "object",
properties: {
orderId: { type: "string", description: "订单号,例如 A1024" },
},
required: ["orderId"],
},
},
];
模型可能返回工具调用请求,但这一步还不是执行:
{
"toolName": "getOrderStatus",
"arguments": { "orderId": "A1024" }
}
后端要做三件事:参数校验、权限校验、结果脱敏。比如用户传了 A1024,后端要确认这个订单属于当前用户;查询结果里如果有手机号、地址,也要按业务规则决定是否展示。
async function runToolCall(userId: string, call: ToolCall) {
if (call.toolName !== "getOrderStatus") throw new Error("unknown_tool");
const orderId = String(call.arguments.orderId ?? "");
if (!orderId) throw new Error("missing_order_id");
const order = await orders.findById(orderId);
if (!order || order.userId !== userId) throw new Error("forbidden");
return { status: order.status, tracking: order.trackingSummary };
}
读操作可以自动一些,写操作必须谨慎。删除账号、退款、发消息、改价格这类动作必须有用户确认和审计日志。模型可以建议,但系统规则决定能不能执行。
这一课的完整答案是:Tool Calling 让 AI 能办事,但权限没有交给 AI。模型负责理解意图,后端负责执行、校验、审计和兜底。
这一篇最该带走的结论是:Tool Calling 不是把权限交给模型,而是让模型请求调用能力。权限、校验、执行和审计都属于后端责任。