在 AI 应用开发中,通用大模型往往存在一个核心痛点:它们只能输出文本,无法对接真实的业务能力。模型的知识是静态的,且存在滞后性,无法查询实时天气、无法操作数据库、也无法自动化执行任务。

而 Function Calling(函数调用/工具调用) 正是为了解决这个问题诞生的核心技术。简单来说,它让大模型从只会“说话”的聊天机器人,进化成了真正能“干活”的智能助手。

 什么是 Function Calling?

Function Calling 是大语言模型(LLM)提供的一种结构化“工具调用”能力。它允许开发者预先定义一批自定义函数(工具),并描述函数的功能与参数格式。

当用户提出需求时,大模型能够自主判断是否需要调用函数、调用哪个函数以及需要传递什么参数,最终结合函数返回的结果生成最终回答。

普通对话与 Function Calling 的核心区别:

  • 普通对话:用户提问 → 模型生成文本回答(无外部交互,能力完全依赖模型本身)。
  • Function Calling:用户提问 → 模型判断需调用工具 → 结构化输出调用参数 → 本地代码执行函数 → 结果回传给模型 → 模型整理最终答案。
Function Calling 的五步核心工作流

完整的 Function Calling 调用链路分为以下 5 个标准步骤,掌握这个流程就掌握了核心原理:

  1. 定义工具函数:开发者编写本地业务函数(如天气查询、数值计算、接口请求),实现具体的业务能力。
  2. 函数结构化描述:用 JSON 格式描述函数名称、功能说明、入参类型、是否必填等,让模型能“看懂”工具的用途。
  3. 模型智能决策:用户发送提问后,模型自动分析需求。如果需要工具,它会输出一个结构化的函数调用指令(固定 JSON 格式,而非自由文本)。
  4. 本地执行函数:程序解析模型返回的调用指令,匹配对应的本地函数,传入参数并执行,获取工具返回的真实结果。
  5. 结果回流生成最终答案:将工具执行的结果追加到对话上下文中,再次传入大模型,由模型整理结果并生成自然语言回答,完成闭环。
实战演练:从零实现 Function Calling

下面通过一个经典的“天气查询 + 数值求和”案例,带你快速上手。这里以调用兼容 OpenAI 接口规范的模型(如通义千问)为例:

环境准备
在开始之前,请确保安装好相关依赖:
pip install openai python-dotenv

完整可运行代码

python

1import json
2import os
3from openai import OpenAI
4from dotenv import load_dotenv
5
6# 加载环境变量(建议将 API Key 放在 .env 文件中)
7load_dotenv()
8
9# 初始化客户端(这里以通义千问的兼容接口为例)
10client = OpenAI(
11    api_key=os.getenv("OPENAI_API_KEY"),
12    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" 
13)
14
15# ====================== 1. 定义本地工具函数 ======================
16def get_weather(city: str, date: str = "今天") -> str:
17    """查询指定城市、指定日期的天气"""
18    # 模拟接口返回,实际项目可对接真实天气 API
19    return f"【{city}{date}天气】晴,气温18-26℃,微风,适宜出行"
20
21def sum_numbers(a: float, b: float) -> str:
22    """计算两个数字的和"""
23    return f"计算结果:{a} + {b} = {a + b}"
24
25# ====================== 2. 函数的结构化描述 (JSON Schema) ======================
26tools = [
27    {
28        "type": "function",
29        "function": {
30            "name": "get_weather",
31            "description": "查询指定城市在特定日期的天气情况",
32            "parameters": {
33                "type": "object",
34                "properties": {
35                    "city": {"type": "string", "description": "城市名称,如:北京"},
36                    "date": {"type": "string", "description": "查询日期,如:今天、明天"}
37                },
38                "required": ["city"]
39            }
40        }
41    },
42    {
43        "type": "function",
44        "function": {
45            "name": "sum_numbers",
46            "description": "计算两个数字相加的和",
47            "parameters": {
48                "type": "object",
49                "properties": {
50                    "a": {"type": "number", "description": "第一个数字"},
51                    "b": {"type": "number", "description": "第二个数字"}
52                },
53                "required": ["a", "b"]
54            }
55        }
56    }
57]
58
59# ====================== 3. 发起对话,让模型进行智能决策 ======================
60messages = [{"role": "user", "content": "帮我查一下上海明天的天气,另外算一下 158 加 242 等于多少?"}]
61
62response = client.chat.completions.create(
63    model="qwen-plus",
64    messages=messages,
65    tools=tools,
66    tool_choice="auto" # 让模型自主决定是否调用工具
67)
68
69response_message = response.choices[0].message
70tool_calls = response_message.tool_calls
71
72# ====================== 4. 本地解析并执行函数 ======================
73# 将模型的回复加入对话历史
74messages.append(response_message)
75
76# 定义一个函数名到实际函数的映射字典
77available_functions = {
78    "get_weather": get_weather,
79    "sum_numbers": sum_numbers
80}
81
82# 如果模型决定调用工具,则遍历并执行
83if tool_calls:
84    for tool_call in tool_calls:
85        function_name = tool_call.function.name
86        function_to_call = available_functions[function_name]
87        # 解析模型提取出的参数
88        function_args = json.loads(tool_call.function.arguments)
89        # 执行本地函数
90        function_response = function_to_call(**function_args)
91        
92        # ====================== 5. 将结果回流给模型 ======================
93        messages.append({
94            "tool_call_id": tool_call.id,
95            "role": "tool",
96            "name": function_name,
97            "content": function_response,
98        })
99
100    # 带着工具的执行结果,再次请求模型生成最终的自然语言回答
101    second_response = client.chat.completions.create(
102        model="qwen-plus",
103        messages=messages
104    )
105    print("🤖 模型最终回复:")
106    print(second_response.choices[0].message.content)

运行结果预期
当你运行这段代码时,模型会首先识别出用户的问题需要两个工具(查天气和计算器),提取出参数 city="上海"date="明天"a=158b=242。本地代码执行后,将真实结果回传给模型,最终你会看到类似这样的自然语言回答:
“上海明天的天气是晴天,气温在18-26℃之间,微风,非常适宜出行。另外,158加242的计算结果是400。”

 Function Calling 的核心价值

通过上述实例可以看出,Function Calling 彻底打破了纯文本交互的边界:

  • 突破知识限制:解决了模型知识滞后、无实时数据的问题(如实时新闻、股价查询)。
  • 扩展能力边界:让模型拥有了计算、接口请求、数据库操作等代码能力。
  • 实现自动化闭环:无需人工干预,模型自主决策、调用工具、汇总结果,是当前 AI Agent(智能体)和自动化工作流的基石。

掌握了 Function Calling,你就掌握了让大模型真正赋能业务场景、落地企业级 AI 应用的核心钥匙。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐