目录

1. 核心概念

2. Function Calling 的工作流程(四步曲)

3. 具体例子:查询天气

第一步:开发者定义函数

第二步:用户提问 & 模型解析

第三步:代码执行 (Application Layer)

第四步:最终回答

4. 为什么要用 Function Calling?

5. 主流模型支持

6. 参考文献


1. 核心概念

通常情况下,大模型(如 ChatGPT)只能生成文本。当你问它“今天北京天气怎么样?”时,如果它没有联网,它只能说“我不知道,我的数据截止到 2023 年”。

Function Calling 的机制是:
开发者告诉 AI:“我有这些工具(函数/API),如果用户的问题需要用到这些工具,请不要直接胡编乱造,而是告诉我你需要调用哪个工具,以及参数是什么。”

注意: AI 不会直接运行代码。它只是输出一个 JSON 格式的指令,告诉开发者去运行什么代码。


2. Function Calling 的工作流程(四步曲)

图中的应用层实际可以是一个中台,暴露给LLM的输入输出功能介绍应该尽可能清晰。而调用的函数内容可以非常复杂来完成一个复杂的任务。在具体实践中实际上花的主要时间是在应用这一层关于LLM调用了api之后怎么处理输入得到输出的函数功能。

这是一个闭环的过程,通常包含以下 4 个步骤:

  1. 定义工具 (Define):开发者在发送请求给 LLM 时,附带一份“工具说明书”(通常是 JSON Schema 格式),描述有哪些函数可用、每个函数的作用、需要什么参数。

  2. 模型决策 (Decision):LLM 分析用户的 Prompt。如果它认为需要使用工具才能回答,它不会输出普通文本,而是输出一个结构化的函数调用请求(Function Call)。

  3. 执行代码 (Execute)这是关键一步。 你的应用程序(后端代码)接收到 LLM 的请求,在本地或服务器上真正执行这个函数(比如调用天气 API、查询数据库)。

  4. 生成回答 (Response):应用程序将函数的执行结果再次发回给 LLM。LLM 结合用户的原始问题和函数的执行结果,生成最终的自然语言回答。


3. 具体例子:查询天气

假设我们正在开发一个 AI 客服助手,用户问:“波士顿现在的天气怎么样?”

如果没有 Function Calling,模型无法回答。现在我们来看看有了 Function Calling 后的全过程。

第一步:开发者定义函数

我们在调用 LLM 接口时,告诉它我们有一个查天气的函数 get_current_weather。

(伪代码/JSON 结构示意)

// 发送给 AI 的可用工具列表
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "获取指定城市的当前天气",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "城市名称,例如:San Francisco, CA"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"]
                    }
                },
                "required": ["location"]
            }
        }
    }
]
第二步:用户提问 & 模型解析

用户输入:“波士顿天气如何?”

LLM 接收到问题和上面的工具列表。它经过“思考”,认为这个问题适合用 get_current_weather 来解决。于是,LLM 不返回“我不清楚”,而是返回如下数据:

// LLM 的回复 (Function Call)
{
  "content": null,
  "tool_calls": [
    {
      "function": {
        "name": "get_current_weather",
        "arguments": "{\"location\": \"Boston, MA\"}"
      }
    }
  ]
}
第三步:代码执行 (Application Layer)

你的后端程序捕获到 LLM 想要调用函数。
程序读取 name 是 get_current_weather,参数是 Boston, MA。
程序调用第三方的天气 API(例如 OpenWeatherMap)。

API 返回结果: {"temperature": "22", "unit": "celsius", "description": "sunny"}

第四步:最终回答

你的程序将 API 的结果构造成一条新的消息,发回给 LLM。

发送给 LLM 的上下文:

  1. 用户:波士顿天气如何?

  2. 助手:(调用函数 get_current_weather, 参数 Boston)

  3. 系统(Function 结果): {"temperature": "22", "unit": "celsius", "description": "sunny"}

LLM 看到结果后,用自然语言组织最终答案:
“波士顿现在天气晴朗,气温大约是 22 摄氏度。”


4. 为什么要用 Function Calling?

  1. 连接实时数据:让 LLM 能够回答“现在的股价”、“今天的头条新闻”、“我的快递到哪了”等实时问题。

  2. 执行操作:不仅仅是聊天,还能让 AI 真正做事。比如“帮我把这封邮件发给张三”、“帮我在日历上定个明天下午 3 点的会”。

  3. 结构化数据提取:你可以定义一个提取信息的函数(比如 extract_user_info),强迫 LLM 将一段乱糟糟的文本(“我叫小明,住在北京,电话是123”)转化为完美的 JSON 格式。

  4. 减少幻觉:通过依靠确定的 API 返回值,而不是依靠模型“脑补”,可以大大提高回答的准确性。


5. 主流模型支持

需要注意的是,不是所有的模型都支持Function Calling功能,具体需要查看相关模型的文档或SDK。例如文心一言支持:ERNIE-Bot-SDK/docs/guides/function_calling.md at develop · peterlcm/ERNIE-Bot-SDK · GitHub

目前,由于Openai提出的协议功能影响范围太广。新出的模型大多支持该功能。另外,还有一些专门为 Function Calling 微调的小模型用来支持资源有限的设备部署。


6. 参考文献

一文搞懂 Function Calling(函数调用) - 知乎

Google Gemini 3 Pro

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐