一、理解 Function Calling 的概念

Function Calling(函数调用)是大模型的 “工具使用能力”—— 简单说:

  • 过去大模型只能 “聊天”,遇到需要计算、查实时数据、调用 API 的需求(比如 “查今天北京的天气”“算 123*456”),要么瞎编,要么做不了;
  • 有了 Function Calling,大模型可以主动调用外部函数 / 工具(比如天气 API、计算器函数),拿到结果后再整理成自然语言回答你。

通俗类比:大模型是 “办公室助理”,Function Calling 是 “助理可以打电话 / 查电脑 / 用计算器” 的权限,让助理从 “只能聊天” 变成 “能做事”。

二、理解 Function Calling 的工作原理

核心流程分 4 步,像 “助理接任务→选工具→用工具→汇报结果”:

  1. 用户提问:比如 “北京今天气温多少?”
  2. 大模型判断 “需要调用工具”:大模型分析问题后,发现 “查实时天气” 自己做不了,得调用 “天气查询函数”;
  3. 大模型生成 “函数调用请求”:按函数的要求传参数(比如函数需要 “城市名”,大模型就自动提取 “北京” 作为参数),生成类似 get_weather(city="北京") 的请求;
  4. 执行函数 + 返回结果:外部系统执行 get_weather 函数,拿到 “北京今天气温 - 5℃”,再把结果传给大模型;
  5. 大模型整理回答:把函数返回的结果转成自然语言(比如 “北京今天的气温是 - 5℃,注意保暖哦~”)。

关键:大模型负责 “判断是否调用工具 + 传什么参数”,工具负责 “执行并返回结果”

三、实战使用 OpenAI 提供的 Function Calling 接口(基础请求及优化)

以 OpenAI 的 GPT-3.5/4 为例,用 Python 实现 “查天气” 的 Function Calling:

1. 基础请求步骤

步骤 1:定义函数(告诉大模型 “有什么工具可用”)

先给大模型 “注册” 工具:说明函数名、功能、参数格式(类似 “给助理一份工具清单”)。

# 定义要给大模型用的函数(这里模拟天气查询函数)
def get_weather(city: str) -> str:
    """查询指定城市的实时气温"""
    # 实际场景是调用天气API,这里模拟返回结果
    return f"{city}今天的气温是-5℃"

# 把函数信息告诉大模型(按OpenAI的格式要求)
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "查询指定城市的实时气温",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名称,比如北京"}
                },
                "required": ["city"]  # 必须传的参数
            }
        }
    }
]
步骤 2:调用大模型,触发函数调用
from openai import OpenAI
import json

client = OpenAI(api_key="你的API密钥")

# 用户提问
user_query = "北京今天气温多少?"

# 1. 先让大模型判断是否调用工具
response = client.chat.completions.create(
    model="gpt-3.5-turbo-1106",  # 注意:只有新模型支持Function Calling
    messages=[{"role": "user", "content": user_query}],
    tools=tools,  # 把工具清单传给大模型
    tool_choice="auto"  # 让大模型自动决定是否调用工具
)

# 2. 提取大模型的工具调用请求
response_message = response.choices[0].message
tool_calls = response_message.tool_calls

# 3. 如果大模型决定调用工具,执行函数
if tool_calls:
    # 遍历所有工具调用(可能调用多个函数)
    for tool_call in tool_calls:
        function_name = tool_call.function.name
        function_args = json.loads(tool_call.function.arguments)
        
        # 执行对应的函数
        if function_name == "get_weather":
            weather_result = get_weather(**function_args)  # 传参:city="北京"

    # 4. 把函数结果再传给大模型,让它整理回答
    final_response = client.chat.completions.create(
        model="gpt-3.5-turbo-1106",
        messages=[
            {"role": "user", "content": user_query},
            response_message,  # 大模型之前的工具调用请求
            {
                "role": "tool",
                "tool_call_id": tool_call.id,
                "content": weather_result  # 函数返回的结果
            }
        ]
    )
    print("回答:", final_response.choices[0].message.content)
运行结果
回答:北京今天的气温是-5℃,天气比较寒冷,外出建议做好保暖措施~

2. 优化技巧

  • 指定tool_choice:如果强制大模型调用某个函数,用tool_choice={"type": "function", "function": {"name": "get_weather"}}
  • 优化函数描述:函数的description要清晰(比如 “查询城市的实时气温和天气状况”),避免大模型误解;
  • 处理多工具调用:如果有多个函数(比如get_weather+get_air_quality),大模型会自动选择需要的工具;
  • 参数校验:在执行函数前,校验大模型传的参数(比如city是否为空),避免函数报错。

四、探讨自定义 Function 的可能性

自定义 Function 的核心是 “把任何你能写的代码,都变成大模型的工具”,常见场景:

  1. 调用企业内部 API:比如 “查公司员工的考勤记录”“查订单的物流状态”;
  2. 操作数据库:比如 “查近 7 天的销售数据”(写 SQL 查询函数);
  3. 执行本地脚本:比如 “批量处理 Excel 文件”“生成周报 PPT”;
  4. 调用第三方服务:比如 “订机票”“查股票行情”“翻译文档”。

限制:只要你的函数能接收参数、返回结果,就能给大模型用 —— 相当于给大模型开了 “操作现实世界” 的权限。

五、探讨 Function Calling 在大模型应用场景中带来的 “质变”

Function Calling 让大模型从 “聊天机器人” 升级为 “智能助手”,带来 3 个核心质变:

  1. 解决 “知识过期” 问题:大模型训练数据是固定的,但 Function Calling 可以查实时数据(比如 “查 2025 年最新的 iPhone 价格”);
  2. 解决 “不会计算 / 逻辑” 问题:大模型算复杂数学题容易错,但可以调用计算器函数(比如 “算 12345*67890”);
  3. 解决 “无法操作工具” 问题:大模型可以主动调用 API、数据库、脚本,完成实际任务(比如 “帮我订明天去上海的高铁票”)。

典型场景案例

  • 智能客服:调用 “订单查询 API”+“退款申请 API”,直接帮用户处理售后;
  • 数据分析助手:调用 “SQL 查询函数”+“图表生成函数”,自动生成销售报表;
  • 个人助理:调用 “日历 API”+“天气 API”,提醒用户 “明天北京下雨,记得带伞,且有 9 点的会议”。

最后总结:Function Calling 是大模型从 “能说” 到 “能做” 的关键能力,也是现在 AI 应用(比如 Copilot、智能体)的核心技术之一 —— 掌握它,就能搭建出真正能 “解决实际问题” 的大模型应用。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐