函数调用(Function Calling)

函数调用让模型用结构化的函数名和参数表达要执行的操作。应用收到调用后负责校验、执行,并把结果返回给模型。

返回概念图谱 →

理解与应用

函数调用是一种模型与程序协作的接口方式。应用先告诉模型有哪些函数、每个函数做什么以及需要哪些参数;模型根据用户请求输出函数名和参数。这个输出代表一次调用请求,函数此时未必已经执行。真正访问数据库或调用服务的是应用中的代码。

例如用户问“SKU-7 在二号仓还有多少件?”应用提供 lookup_stock 函数,参数是 sku 和 warehouse_id。模型把自然语言转成这两个字段后,运行程序检查参数、确认访问权限,查询库存,再把“可售 4 件”的结果交回模型。模型随后才能用自然语言回答。若省略执行和回传,前面那份看起来很完整的调用记录仍然没有提供任何库存事实。

结构化参数便于程序使用,也便于发现错误。函数要求一个字符串 SKU,模型却给了数字,运行程序就可以在访问库存系统前拒绝。严格的 schema 或结构化输出能力有助于减少格式问题,但“SKU-7 是否存在”“用户能否查这个仓库”属于业务与权限检查,无法由参数格式保证。

一次响应可能提出多个调用,结果需要和各自的调用标识关联,避免把一号仓的结果当成二号仓。流式输出时,参数也可能分多次到达,应用应在完整接收后再解析和执行。若任务只是把一封来信分类成 JSON,不需要访问外部能力,直接使用结构化输出即可;函数调用主要解决的是模型如何向应用请求行动。

关系速览
函数调用(Function Calling)应用于 →工具(Tools)

结构化调用描述为工具执行提供参数接口;应用仍负责校验和实际执行。

BFCL 函数调用评测应用于 →函数调用(Function Calling)

函数调用任务可以借助 BFCL 的评测方法检查参数、选择和调用行为。

看一次交互:从库存问题到工具结果,再到回答

这是调用生命周期的字段示意,不是某家 API 的完整请求格式。call_17 将结果与请求关联;只有在库存查询真正返回后,模型才获得“4 件”这条事实。

以下为教学示意,未连接真实业务系统。

交互示意

用户:SKU-7 在二号仓还有多少件?

模型提出调用:
  调用标识:call_17
  函数:lookup_stock
  参数:{"sku":"SKU-7","warehouse_id":"WH-2"}

应用执行:
  参数校验通过,当前账户有权访问 WH-2。
  查询库存服务。

应用回传给模型:
  对应调用:call_17
  结果:{"available_quantity":4,"warehouse_id":"WH-2"}

示意结果

示意回答:二号仓当前有 4 件 SKU-7 可售。

常见误区

  • 看到模型输出了函数名和参数,就向用户宣称操作成功,跳过了最关键的执行结果。
  • 把返回值只按完成顺序拼接,不按调用标识关联,可能在并行调用时张冠李戴。

前置与延伸

建议先读

相关概念

参考与版本

Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。

  • OpenAI:Function calling ↗

    已核对官方动态文档的调用闭环及 strict schema 约束;不依赖模型名、默认参数或未锁定 SDK 版本。 · 核验:2026-10-10