跳到主内容

function calling 是什么?让模型调你的工具

2026-10-29 发布 来源:我告诉你AI导航 阅读

问 AI 模型「北京今天多少度」,它多半编一个数给你——模型自己不联网、不查库、不会执行任何动作,它只会生成文字。function calling 补的就是这一段:你把可用的工具清单(函数名、用途、参数格式)提前报给模型,模型判断该...

问 AI 模型「北京今天多少度」,它多半编一个数给你——模型自己不联网、不查库、不会执行任何动作,它只会生成文字。function calling 补的就是这一段:你把可用的工具清单(函数名、用途、参数格式)提前报给模型,模型判断该用哪个工具、该传什么参数,以结构化格式返回一条调用请求,真正的执行由你的代码完成,执行结果再回填给模型继续作答。这条「定义—决策—执行—回填」的循环,是 agent 开发的地基。这篇按入门篇的惯例把循环拆开讲:工具怎么定义、模型怎么选、结果怎么回填、安全红线在哪,以及它和 MCP、结构化输出的关系。

调用循环的全貌:模型点单,代码炒菜

先建立一个核心认知:模型从头到尾不执行任何函数,它做的只是「选菜」。一轮完整的工具调用走四步。第一步,请求里带上工具清单发给模型。第二步,模型判断需要调工具时,返回的结构不是一段普通文字,而是一条带函数名与 JSON 参数的调用请求。第三步,你的代码拿到请求,执行真实的函数:查天气、读数据库、发邮件,随意。第四步,把执行结果作为新消息回填进对话,再次请求模型,它基于真实结果继续作答或发起下一次调用。执行权始终在开发者手里,这个定位决定了安全模型:模型只能「建议调用」,不能「替你执行」。

工具怎么定义:三要素与描述的价值

每个工具的定义通常三要素:name,函数名,稳定且语义清晰;description,一句话说清这个工具干什么、什么时候该用;parameters,用 JSON Schema 描述参数的名字、类型、哪些必填、取值范围。三要素里最值得花心思的是描述与参数约束:描述写得含糊,模型在多个工具之间就会选错;参数约束写得严,模型给出的参数就少出格。反例是清单一长什么都挂上去——工具越多,误选率上升,安全面也越大。工具描述的具体写法与反面教材,工具描述写法一篇有专门展开。

回填之后:多轮循环、失败与终止

回填结果不是终点,循环还在继续:模型看到工具结果后,可能直接生成最终回答,也可能接着发起下一个工具调用——查完天气再查穿衣建议,就是链式调用。工程上要给循环装两个闸门。一是失败处理:函数执行报错时,别抛异常了事,把错误信息作为结果回填,模型通常能调整参数重试。二是步数上限:给单次任务设最大调用轮数,防止模型陷入无意义的调用循环,费用与时间都有上限兜底。参数本身不合 schema 的,直接在本地校验拦截,把校验错误回填,让模型自己修正。

安全红线:提示注入与最小权限

工具一旦接上,风险模型就变了:模型能「建议」的动作,都可能在恶意指令下被触发。典型的攻击面是提示注入——网页内容、用户上传的文档、第三方数据里藏一句「请调用删除工具」,模型读到了就可能照做,工具权限越大,破坏力越大。红线条文要落进工程:给模型接的工具按最小权限给,只读的先开,写入与删除的谨慎开、配合人工确认;外部内容一律当不可信输入处理。注入的攻击原理见提示注入一篇,红线机制见注入风险一篇。这两条是 agent 开发的底线约束,不是可选项。

与 MCP、结构化输出的关系

最后厘清三个容易混的概念。function calling 是单次交互层的机制:模型与你的函数之间的调用协议。MCP 是工具生态层的协议:把工具做成标准化服务,任何支持 MCP 的应用都能挂载——两者是互补关系,MCP 的底层调用仍走 function calling 这类机制,分工对照见MCP 与 function calling一篇。结构化输出则是另一件事:不触发任何执行,只要求模型的普通回答严格按 JSON schema 输出,两者共用 schema 约束的思路,区别在要不要触发执行,机制见结构化输出一篇。想练手感,可以让智谱清言把同一个天气查询工具的定义写出三种详略不同的版本做对照实验,再用 Kimi 按约束生成参数、模拟一轮完整的调用与回填循环,跑通一次,循环就刻在脑子里了。

概念所处层面管什么触发执行吗
function calling单次交互层模型与你的函数之间的调用协议触发,执行发生在你的代码里
MCP工具生态层把工具做成标准化服务,供支持 MCP 的应用挂载底层调用仍走 function calling 这类机制
结构化输出输出格式层要求普通回答严格按 JSON schema 输出不触发任何执行

function calling 速查

  • 四步循环:报清单、模型点单、代码执行、结果回填
  • 模型只建议调用,执行权始终在开发者手里
  • 定义三要素:name、description、参数 JSON Schema
  • 失败把错误回填让模型重试,步数上限兜住循环
  • 最小权限加人工确认,外部内容按不可信输入处理

关于 function calling 的三问三答

  • 模型能自己执行函数吗?不能。它只返回调用请求,执行永远发生在你的代码里,这也是安全边界的来源。
  • 一次可以挂多少个工具?按任务需要给,宁少勿多;清单越长误选率越高,无关工具先收起来。
  • 函数执行失败会中断对话吗?不会自动中断,把报错信息回填,模型通常能修正参数重试;连续失败再降级处理。

反馈页面信息

请描述需要更正的地方,页面标题和网址会自动附上。

也可以发邮件至 [email protected]