返回知识库

AI 与提示 · 智能体与连接

函数调用Function Calling

function calling 让模型把自然语言请求变成结构化调用意图;模型只选择函数并填写参数,宿主应用仍要校验、授权、执行,再用真实业务结果确认完成。

一句订座请求,怎样变成真正的预订?

先看模型生成的 create_reservation 调用单,再让宿主应用校验并执行。故意保留缺失的联系电话,观察失败怎样同时写进调用单和预订卡;补齐后再重试。

湖畔小馆 · 在线礼宾正在处理请求

帮我订今晚 7 点,湖畔小馆,2 位,尽量靠窗。

礼宾 AI

我会先生成预订调用单;应用校验通过后才会真正提交。

MODEL OUTPUT函数调用单
待校验
create_reservation
restaurant
湖畔小馆
date_time
今天 19:00
party_size
2 位
seating
靠窗优先
contact_phone
缺少必填参数
模型负责:选择函数 + 填参数! schema 要求 contact_phone
LAKESIDE TABLEWAITING
今晚19:002 位 · 靠窗优先
湖畔小馆江畔路 18 号 · 前台留桌 15 分钟
业务对象状态等待校验
宿主应用负责:校验 · 权限 · 执行尚未产生副作用

当前边界调用单已经生成,但 contact_phone 缺失。下一步应先校验,不能把模型输出直接当成已执行。

这三件东西,分别是谁负责?

对话、调用单和预订卡是同一条链上的三个对象,不能把其中任何一个误当成已经执行。

用户请求是自然语言
模型从“今晚 7 点、2 位、靠窗”里识别意图,但自然语言可以缺字段、含歧义,也可能超出权限。
函数调用单是结构化意图
name 说明想调用谁,arguments 承载参数。它仍只是模型输出,不是函数执行结果。
宿主应用守住执行边界
应用按 schema 校验参数,再检查授权与业务规则;不通过就拒绝副作用,补齐后才调用真实函数。
业务对象证明真的执行了
只有订座系统返回 HPA-2086,预订卡才进入“已确认”;一句顺口的 AI 回复不能代替执行凭证。
现代 API 多写作 tool calling
旧代码常见 functions/function_call,新接口通常用 tools/tool_calls;名字与封装会变,但“模型提议、宿主执行”的边界不变。

什么时候用,什么时候别让模型绕一圈

函数调用适合把自然语言接到可信系统;它不是所有回答都需要的中间层。

  • 适合:查库存、订座、创建工单、读取账户等任务,需要从自然语言提取参数,再调用外部系统。
  • 需要更严的边界:付款、删除、大额退款等有副作用操作,除了 schema 校验还要授权、幂等与人工确认。
  • 不必使用:模型凭已有上下文就能直接回答的解释、改写和总结;没有外部动作时,不要强行造函数。
  • 别只认名称:文档标题可能仍叫 function calling,代码却已经是 tools/tool_calls;先看真实请求与响应形状。

怎么用:从声明到可验证结果

最短可信链路是“声明 → 生成 → 校验 → 执行 → 回传”,任何一步都不能用想象补齐。

  1. 声明函数与 schema。写清函数名、用途、参数类型、必填项和不允许的额外字段。
  2. 把用户请求和函数声明交给模型。模型决定是否生成调用,并输出函数名与参数。
  3. 在宿主侧重新校验。检查缺失、类型、枚举、权限、幂等键与业务规则;失败就停止并向用户补信息。
  4. 由宿主调用真实函数。模型不能直接写数据库;应用执行后拿到真实返回值或明确错误。
  5. 把结果回传并展示业务对象。将函数结果给模型继续组织回复,同时在产品里显示确认号、工单或订单状态。

同一笔订座:先校验 vs 直接执行模型参数

只改变一个选择:宿主是否在副作用之前校验调用单。

正例 · 先校验缺手机号时不创建,补齐后重试

调用单保留失败原因,预订卡保持“未创建”;用户确认尾号 6621 后,同一请求重试并拿到 HPA-2086。

反例 · 直接信模型把 arguments 直接写进订座系统

缺联系方式仍创建占位记录,餐厅无法确认、用户也收不到通知;重试还可能重复占桌。

快速自测

模型为“给客户退款 ¥800”生成了 refund_order 调用,但 arguments 里没有订单号。宿主应用下一步应该做什么?

继续查证

术语的技术定义和行为以这些一手或权威资料为准。

下一步学

和本知识点经常一起出现的概念。