查现在发生了什么
订单状态、库存数量、账户余额、工单进度都属于外部实时数据,不能只靠模型记忆。
大模型本身擅长理解和组织语言,但它不知道实时订单、不会真正写数据库,也不能天然执行审批流。Tool Calling 的作用,是让模型把“应该调用哪个能力、需要哪些参数”用结构化方式说出来,再由业务系统安全执行。
没有工具调用时,模型只能根据已有上下文回答。接入工具后,模型可以请求外部系统提供实时数据或执行确定性动作,但执行权仍然在应用系统手里。
订单状态、库存数量、账户余额、工单进度都属于外部实时数据,不能只靠模型记忆。
优惠价、税费、汇总报表、风控分数需要规则和数据,不能让模型凭感觉算。
创建工单、发送通知、提交审批、生成发票都不是“回答”,而是要走系统流程。
模型只输出调用意图和参数。系统检查后再执行,避免模型越权操作。
Function Calling 或 Tool Calling 是一种让模型调用外部能力的机制。模型负责理解用户意图并生成结构化调用请求,应用系统负责参数校验、权限判断、真实执行和结果回传,最后模型基于工具结果生成回答。
不同平台命名略有差别。面试时不必纠结术语细节,重点是讲清楚“模型产生结构化调用请求,应用系统执行工具”。
常见表达是把函数名称、描述、参数 schema 提供给模型。模型需要工具时,输出函数名和参数,例如 getOrderStatus(orderId)。
Tool 可以是函数、API、检索器、浏览器、代码执行器、工作流节点,也可以是一个封装好的内部服务。
这点很关键。模型返回的是“我要调用哪个工具以及参数是什么”,真正执行工具的是你的后端、Agent Runtime 或编排服务。
模型会受提示词、上下文和用户输入影响。企业系统不能把数据库写入、付款、发邮件、删除数据这类动作交给模型自由决定。正确做法是让模型提出调用请求,系统按权限、策略和审批规则执行。
工具定义不是随便写个函数名。描述太宽泛,模型会乱用;参数太松,执行器会收到脏数据;返回不稳定,最终回答就难控制。
| 字段 | 作用 |
|---|---|
name |
工具名称,短、稳定、语义明确。 |
description |
告诉模型什么情况下应该使用这个工具。 |
parameters |
参数结构、类型、必填项、枚举值和限制。 |
returns |
返回结构,便于模型基于字段回答。 |
policy |
权限、审批、幂等、限流、敏感信息规则。 |
examples |
调用样例,帮助模型学会正确使用边界。 |
{
"name": "get_order_status",
"description": "查询指定订单的支付、库存、发货和异常状态。只用于用户询问某个订单当前进度或未发货原因。",
"parameters": {
"type": "object",
"required": ["orderId"],
"properties": {
"orderId": {
"type": "string",
"description": "订单号,例如 O-20260612-001"
}
}
},
"returns": {
"orderId": "string",
"status": "paid | pending_stock | shipped | cancelled",
"reason": "string",
"nextAction": "string"
},
"policy": {
"readOnly": true,
"requiresAuth": true,
"maskFields": ["receiverPhone", "receiverAddress"]
}
}
要把 Tool Calling 看成一条链路。任何一步出错,都会影响最终答案,所以工程上要能定位每个环节。
userMessage = "查一下订单 O-20260612 为什么还没发货"
modelResponse = callModel({
messages: [userMessage],
tools: [get_order_status]
})
if modelResponse.hasToolCall:
toolCall = modelResponse.toolCalls[0]
args = validate(toolCall.arguments, get_order_status.schema)
result = executeTool(toolCall.name, args, currentUser)
finalAnswer = callModel({
messages: [userMessage, toolCall, result],
instruction: "只能基于工具返回结果回答,缺失信息要明确说明"
})
return finalAnswer
工具调用有成本、有延迟、有风险。设计 Agent 时,要给模型明确边界,也要在应用层做兜底判断。
我不会只依赖模型自己决定是否调用工具。高风险工具要在应用层加规则,比如白名单、用户角色校验、二次确认、幂等 key、频率限制和审计日志。
不要因为参数是模型生成的,就认为它可信。模型可能漏字段、填错类型、混淆对象,也可能被用户提示诱导。
字符串、数字、数组、枚举、日期范围都要检查。日期不要让模型随便生成模糊值。
订单号格式、用户是否拥有该订单、金额是否超过范围,都属于业务校验。
不要把模型参数拼 SQL。要走安全的服务接口,并结合当前登录用户做权限判断。
很多 Tool Calling 失败,不是调用失败,而是返回结果太随意。模型拿到一大段混乱文本,就容易误读、漏读或编造。
{
"success": true,
"data": {
"orderId": "O-20260612-001",
"status": "pending_stock",
"reason": "SKU-7788 当前缺货",
"estimatedShipDate": "2026-06-14",
"nextAction": "等待补货,或建议用户更换同价位可发货商品"
},
"traceId": "tool-7f3a91",
"source": "order-service"
}
如果工具只返回“缺货,预计 6 月 14 日发货”,最终回答就不能补一句“已经给仓库加急”。除非另一个工具明确返回了加急结果,否则这就是模型编造。
企业场景经常要连续查、判断、再动作。多工具编排的难点不在“能调几个”,而在顺序、依赖、失败回滚和用户确认。
先查订单,再查库存,再判断是否能改地址。每一步都依赖前一步结果。
同时查订单、物流、客服工单,最后合并结果,可以降低等待时间。
退款、取消、发通知前,先给用户看确认页,确认后再真正执行。
一旦工具能写数据、发消息、扣款、改配置,风险就不再是回答错了,而是系统真的被错误操作。
模型不能替用户提升权限。工具执行时必须带当前用户身份和租户信息。
退款、删除、对外发送、批量修改这类动作,必须有确认或审批环节。
网络重试或模型重复调用时,不能重复扣款、重复发券、重复创建工单。
记录用户、会话、工具、参数摘要、结果、耗时和 traceId,便于排查。
beforeExecute(toolCall, currentUser):
assert toolCall.name in enabledToolsFor(currentUser.role)
assert validateSchema(toolCall.arguments)
assert checkTenantScope(currentUser.tenantId, toolCall.arguments)
if toolCall.name in highRiskTools:
return requireUserConfirmation(toolCall)
return executeWithAuditLog(toolCall, currentUser)
上线后不能只看“用户满意不满意”。要拆开看模型是否选对工具、参数是否正确、工具是否成功、最终回答是否忠实于结果。
该调用时有没有调用,不该调用时有没有乱调用,是否选对工具。
必填参数是否完整,类型和业务规则是否通过校验。
API 成功率、超时率、重试率、下游错误率都要单独看。
最终回答是否只基于工具结果,有没有增加工具没有返回的结论。
这个案例适合面试,因为它同时包含实时数据、权限、工具返回、最终解释和后续动作。
工具返回:
{
"status": "pending_stock",
"reason": "SKU-7788 缺货",
"estimatedShipDate": "2026-06-14",
"availableActions": ["wait", "change_item", "create_ticket"]
}
最终回答:
这笔订单已经支付成功,目前没有发货是因为商品 SKU-7788 临时缺货。
系统预计 2026-06-14 补货后发出。
你可以继续等待,也可以选择更换同价位可发货商品。
如果需要人工跟进,我可以在你确认后创建售后工单。
模型没有自己猜未发货原因,而是选择工具查真实订单。系统没有把执行权交给模型,而是先校验权限再查。最终回答没有扩大工具结果,只把缺货、预计发货时间和可选动作解释给用户。
面试官通常不是想听术语,而是看你是否知道怎么把 AI 接到企业系统里,并且能控制风险。
A:它是让模型调用外部能力的一种机制。模型根据用户问题决定是否需要工具,并输出结构化的工具名和参数。真正执行工具的是应用系统,应用系统会做参数校验、权限判断、调用后端服务,再把结果交回模型生成最终回答。
A:因为企业系统里很多问题需要实时数据和确定性动作。比如查订单、查库存、创建工单、计算报价,这些不能靠模型记忆或猜测。Tool Calling 可以让模型负责理解意图,让业务系统负责可靠执行。
A:我会先定义工具适用场景,再写清名称、描述、参数 schema、返回结构、错误码和权限策略。描述要告诉模型什么时候该用,参数要可校验,返回要结构化,高风险工具还要加确认、审批、幂等和审计。
A:主要风险是工具选错、参数填错、权限越界、重复执行、下游失败和最终回答不忠实。解决方式是应用层做校验和风控,把写操作放到确认流程里,并记录完整调用日志,方便复盘。
A:RAG 更偏向查资料,让模型基于知识库回答;Tool Calling 更偏向调用能力,可以查实时系统或执行动作。实际项目里两者经常一起用,比如先用 RAG 查政策,再用工具查订单状态,最后合成回答。
练习的目标不是写代码,而是能把一个工具讲清楚。面试里能讲出这份结构,就已经有工程落地感。
写出 name、description、parameters、returns,并说明如何校验用户权限。
例如退款、删除客户、发送短信、改价格、批量导出,并给出确认策略。
从用户问题、工具选择、参数、执行日志、最终回答五个环节定位错误。