AI

大模型工具 Function Call (推荐)

引言


在AI大模型风靡全球的今天,你是否好奇:为什么ChatGPT能告诉你今天的天气?为什么它能帮你查股票、发邮件,甚至操作数据库?这一切的核心秘密,就是Function Calling(函数调用)。

因为大模型的训练数据是静态的,知识截止于某个时间点,即无法感知实时数据(如天气、股价),也无法操作外部系统(如发邮件、查数据库)。

  

什么是 Function Call


1.什么是 Function Call?

简单说:就是让大模型具备“调用外部工具” 的能力!

大模型平时只能靠训练时学到的知识回答问题。一旦你问它:

“现在空气质量怎么样?”?
“我快递到哪了?”
它就懵了,因为这些都是实时、动态信息。

而 Function Calling 能让大模型:意识到“这问题我不会”,喊外部工具帮忙(比如查天气的API、计算器)拿到结果后再组织成答案

举个例子:

你问:“杭州今天天气怎么样?”
大模型会说:“我要调用查天气的函数,参数是:
location=杭州,date=2025/07/23"

外部程序完成查询,把结果传回,然后大模型再告诉你:

“杭州今天 25°C,晴天~”

核心:让大模型从“只会说”变成“能做事”!

Funtion Call 本质:
让大模型根据用户指令,生成结构化参数调用预定义的外部函数(如API、数据库),再将结果转化为自然语言回答。

2.为啥非得有这个能力

因为大模型的知识是“静态”的,训练数据只到某个时间点,之后的变化(股价、新闻、天气)它都不知道。

Function Calling 相当于给它接上“外挂”:

  • 能查实时信息(调用搜索引擎)
  • 能做科学计算(调用计算器)
  • 能执行代码(调用代码解释器)
  • 能访问内部系统(如查库存)
  • 甚至能控制设备( 如关灯、开空调)

没有这能力,大模型就是个“纸上谈兵的学霸”, 有了它,才能变成“能干活的打工人”

所以,Function Calling 也成为实现 Al Agent 的核心技术之一。

3.容易误解的地方

很多同学可能会以为大模型自己能“跑代码”“调用函数”?其实不然!

重点来了:大模型只负责“决定是否调用函数、调用哪个函数、传哪些参数”。

真正执行函数调用的是某个外部程序,比如可能是你写的大模型应用、某个脚本或 API 服务等。所以,Function Calling 本质上是一种提示词工程:你要在提示词里告诉大模型“嘿,你可以用这些函数:XXX”,它才知道有哪些选项,并生成格式正确的调用请求。

4.模型本身能力也很关键

当然,提示词设计再精妙,前提还是大模型本身要“具备函数调用能力”。

当下,函数调用已成为现代大模型的“标配技能”。

主流大模型(如 Llama、Qwen、GPT)在训练阶段就加入了专门的数据,让大模型学会:

  • 看懂函数定义
  • 能正确判断是否调用
  • 能准确选出调用哪个函数
  • 能合理决定如何传参
  • 结构化地生成调用请求,方便程序解析

不同大模型在训练方式和训练数据格式上差别很大!

在使用 Function Calling 时,需要注意:

  • 提示词结构设计:函数清单应该按什么格式写,如何拼接到提示词中
  • 生成结果解析:如何从大模型输出中提取函数调用信息(如函数名、参数等)

这两点因模型而异,必须根据具体模型进行适配!

5.Function Calling和MCP的区别

它们完全不是一回事,可别搞混哈

简单来说:

  • Function Calling:让“大模型”会思考:要不要调用函数(工具)、调用哪个、怎么传参。
  • MCP:让“大模型和工具”能沟通顺畅:处理如何注
    册、发现、调用外部工具等问题。

两者需要配合使用,才能实现稳定的、可扩展的工具调用闭环!

 

经典例子


fuction call 功能可以识别用户意图,告诉我们要调用哪个接口(或工具)来响应用于的意图,并自动解析获取需要的入参。这样就能通过接口(或外部工具)的方式获取响应用户意图需要的信息或操作,让机器人给用户输出的内容更加贴合用户意图。

以一个经典场景为例:用户问“北京今天多少度?”

1.意图识别

大模型分析问题,发现需要实时天气数据,决定调用预定义的get_weather函数

2.生成参数

模型输出结构化JSON参数,精准匹配函数要求:

var = {
"name": "get_weather",
"arguments": {
"Location":"北京"
"unit": "celsius"
}

3.执行函数
开发者代码解析参数,并调用命中的天气API,返回数据:

result = {
"Location":“北京",
"temperature": 25,
"cond

4.生成回答

模型将API返回的数据和用户提问整合为自然语言回复:

“北京今日晴,气温25°C,适宜外出。”

  

原理和实现


大模型通过接口对外提供Function Call功能,接口如何调用,不同模型厂商有些差别,具体可以查阅模型厂商的文档。具有的大致的共性如下:
使用Function Call功能时,你需要先定义一些function。然后,在发送给模型的信息中描述这些function(需要指定函数名,函数用途的描述,参数名,参数描述),并传给LLM。注意是发送函数描述,不是定义函数本身的代码。当用户输入问题时,大模型理解用户的意图,通过文本分析是否需要调用某一个function,当需要调用但缺少参数值时,会与用户沟通获取更多的信息,以从用户语义中提取出函数参数。然后,LLM返回一个json,json包括需要调用的function名,需要输入到function的参数名,以及参数值。
下一步,开发者使用接收到的函数参数调用对应函数就可以了。如果需要,还可以将函数执行的结果返回给模型,以进行更多的操作。
总而言之,function cal|帮我们做了两件事情:

  • 1.判断是否要调用某个预定义的函数。
  • 2.如果要调用,从用户输入的文本里提取出函数所需要的函数值

流程示意图

目前,很多模型会自动检测,判断什么时候进行Function Calling

 

 

大模型通过 JSON 调用工具函数的过程


大模型通过 JSON 调用工具函数的过程,本质是模型与外部工具之间的 “标准化对话”,具体细节可拆解为以下步骤:

1. 模型生成符合格式的 JSON 指令

当大模型判断需要调用工具时,会根据提前学习的函数描述(如函数名、参数要求),生成一段严格遵循预设格式的 JSON。

  • 格式约定:通常需要包含function_name(函数名)、parameters(参数键值对)等核心字段,有时会加上id(用于多轮调用时匹配结果)。

示例:

{
  "function_name": "get_weather",
  "parameters": {
    "city": "上海",
    "date": "2024-05-20"
  }
}
  • 模型的 “自律性:训练时会通过大量样本(如 “用户问天气→生成天气函数 JSON”)让模型学会 “什么时候输出这样的 JSON”“参数是否完整”,避免格式错误(如少括号、参数缺失)。

2. 外部程序 “捕获” 并解析 JSON

大模型不会直接执行 JSON,而是由外部系统(如开发者搭建的后端服务)负责处理:

  • 提取指令:外部程序监听模型的输出,当检测到符合格式的 JSON(通常用特殊标记包裹,如<function_call>{...}</function_call>),就会提取这段内容。
  • 校验合法性:检查 JSON 格式是否正确、函数名是否存在、参数是否符合要求(如 “city” 是否为字符串、“date” 是否符合日期格式)。若有错误,可能返回给模型要求修正(比如 “缺少参数 date,请补充”)。

3. 调用工具并获取结果

外部程序解析 JSON 后,执行实际的工具调用:

  • 映射到具体工具:根据function_name找到对应的工具(如 API 接口、本地函数),并将parameters中的参数传入。

例如,若function_nameget_weather,外部程序可能用 curl 调用天气 API:

curl -X POST https://api.weather.com/get \
  -d '{"city":"上海", "date":"2024-05-20"}'
  • 获取返回结果:工具执行后,返回结构化数据(如 JSON 格式的天气信息:{"temperature": "25℃", "condition": "sunny"})。

4. 将结果反馈给模型,完成闭环

外部程序把工具返回的结果整理成自然语言或结构化数据,“喂” 回给大模型,作为下一轮生成的上下文:

  • 模型结合用户原始问题和工具结果,生成最终回答(如 “上海 2024 年 5 月 20 日天气晴朗,气温 25℃”)。
  • 若结果不完整(如天气 API 未返回风力信息),模型可能再次生成 JSON 调用工具补充查询。

核心关键点

  • 大模型的角色是 “生成指令”,不涉及实际调用;外部系统是 “执行者”,负责解析、调用和反馈。
  • JSON 的作用是 “标准化接口”,让模型和工具之间的信息传递清晰、无歧义,就像两人用同一种语言对话。
  • 整个过程的顺畅性,依赖模型对格式的严格遵循(训练保障)和外部程序的高效解析(工程实现)。

  

大模型function call是怎么调用工具的、怎么知道工具在哪呢?


大模型的 Function Call 调用工具的过程,简单来说是 “识别需求→生成调用指令→对接工具→获取结果→整理输出” 的流程,而工具的位置则通过预设的 “接口信息” 来确定。

1. 如何调用工具?

  • 识别调用需求:大模型接收用户问题后,判断是否需要调用工具(比如计算、查实时数据、调用 API 等)。例如,用户问 “今天北京的天气如何”,模型会识别出需要调用天气查询工具。
  • 生成规范调用指令:如果需要调用工具,模型会按照预设的格式(通常是 JSON)生成调用指令,包含工具名称、所需参数(如 “城市 = 北京”“日期 = 今天”)。
  • 对接工具执行:大模型将生成的指令发送给对应的工具接口,工具接收后执行操作(比如调用天气 API 获取数据)。
  • 处理返回结果:工具将结果返回给大模型,模型再把结果整理成自然语言回答用户。

2. 怎么知道工具在哪?

工具的位置是通过预设的接口信息提前告知大模型的,包括:

  • 工具的唯一标识(如工具名称、ID);
  • 工具的调用地址(如 API 接口 URL、本地函数路径);
  • 调用所需的参数格式(必填项、数据类型等)。

这些信息会在大模型部署时配置好,就像给模型一张 “工具地图”,让它知道该找谁、怎么联系。当模型需要调用工具时,就会根据这张 “地图” 找到对应的工具并发起请求。

  

大模型 function call 都需要有个 外部程序 “捕获” 大模型结果 、并且调用函数吗?


在大模型的Function Call(函数调用) 流程中,通常需要一个外部程序或中间层来 “捕获” 大模型的输出结果,并执行实际的函数调用。这是因为大模型本身并不直接具备执行外部函数的能力,它的核心作用是根据用户需求和上下文,判断是否需要调用函数、调用哪个函数,以及生成符合格式的函数调用指令(如参数、函数名等)。

具体流程可拆解为以下步骤:

1. 大模型生成函数调用指令

  • 当用户的问题需要调用外部工具(如查询天气、调用 API、操作数据库等)时,大模型会按照预设格式(通常是 JSON)生成函数调用的描述,例如:
{"name": "get_weather", "parameters": {"city": "北京", "date": "2024-05-01"}}

此时,大模型仅输出指令,并不执行函数。

2.外部程序捕获并解析指令

  • 外部程序(可以是开发者编写的后端服务、Agent 框架中的协调模块等)会监听大模型的输出,识别出其中的函数调用指令,并解析出函数名、参数等关键信息。

3.外部程序执行函数调用

  • 外部程序根据解析结果,调用对应的实际函数(可能是本地函数、第三方 API、数据库操作等),并获取函数的返回结果。

4.将结果反馈给大模型

  • 外部程序将函数的返回结果整理后,再传递回大模型,大模型基于此结果继续处理(如生成自然语言回答、决定是否需要进一步调用函数等)。

为什么需要外部程序?

  • 大模型的局限性:大模型本质是语言模型,没有直接访问外部系统、执行代码或调用 API 的能力,无法直接与外部环境交互。
  • 安全性与可控性:通过外部程序中转,可以对函数调用进行权限校验、参数过滤、日志记录等,避免大模型直接操作外部系统带来的风险(如误操作、安全漏洞)。
  • 兼容性:外部程序可以适配不同的函数接口、工具类型,将大模型的标准化指令转换为各种外部系统可识别的格式。

例外情况?

某些集成了 Function Call 能力的Agent 框架或平台(如 LangChain、AutoGPT 等)会将 “捕获指令 – 调用函数” 的逻辑封装为内部模块,开发者无需手动编写外部程序,但本质上仍是框架内部的中间层在执行 “捕获 – 调用” 的工作,并非大模型自身直接执行。

综上,外部程序(或中间层)是 Function Call 流程中不可或缺的一环,它负责连接大模型与外部函数,实现 “指令生成 – 执行 – 结果反馈” 的闭环。