问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

一步步带你认识大模型的 Function Call

创作时间:
作者:
@小白创作中心

一步步带你认识大模型的 Function Call

引用
1
来源
1.
https://www.53ai.com/news/LargeLanguageModel/2025033178916.html

Function Call是大模型(如GPT系列)的一项重要功能更新,它让AI不仅能够生成文本,更能与外部系统交互,执行复杂任务。本文将从Function Call的工作原理、代码实现到其在AI应用中的重要作用,为你全面解析这项技术的核心价值。

大模型(如OpenAI的GPT系列、Claude、Gemini等)中的 Function Call(函数调用)是近年来引入的一项强大功能,它极大地扩展了大语言模型的能力边界,使其不仅能生成文本,还能与外部工具、API、数据库等系统交互,执行更复杂的任务,它更是实现AI Agent的一把钥匙。

这项技术大大增强了大模型的实用性,使其能够执行复杂任务,如查询天气、预订机票、搜索信息等。Function Call弥补了纯文本模型的局限性,让AI可以与外部系统和API交互,提供更精准、实时的服务。它的明显优势包括结构化输出、扩展能力范围、减少幻觉,以及提高复杂任务的处理能力。

什么是Function Call

Function Call 是一种机制,它的出现,使得大模型在对话过程中拥有了调用预定义的函数(或 API)的能力,并且可以基于调用函数的返回结果继续对话,它的原理如下:

  1. 函数定义(Function Schema)
    开发者需要向大模型提供一组函数的定义,包括:
  • 函数名称(name)
  • 函数描述(description)
  • 参数结构(parameters),通常使用 JSON Schema 格式定义参数的类型和含义。
  1. 模型决定调用函数
    当用户输入一个问题时(如:“上海今天天气怎么样?”),大模型判断是否需要调用某个函数。如果需要,会自动生成调用该函数所需的参数。

  2. 外部系统执行函数
    这个请求被发送到真实的后端函数或 API,由开发者实现。例如调用天气 API 获取的天气信息,并返回结果。

  3. 模型继续对话
    大模型接收到函数返回结果后,会将其作为上下文的一部分,继续生成自然语言回复。

代码举例

下面使用 OpenAI 实现 Function Call , 通过一个简单的例子来说明。我们需要查询世界城市的天气情况。假设我们有一个外部函数 get_current_weather,它会调用一个天气 API 并返回结果。

先定义一个函数 get_current_weather,它将调用一个天气 API(例如 OpenWeatherMap API)来获取实时天气数据。接下来,我们将使用 OpenAI 客户端来实现 Function Call。假设我们已经有一个 OpenAI 的 API 密钥,并且启用了 Function Call 功能。

import openai
import requests

# 设置OpenAI的API密钥
openai.api_key = "xxx"

# 定义一个函数,用于获取指定地点的当前天气信息
def get_current_weather(location: str, unit: str = "metric"):
    """
    获取指定地点的当前天气信息。
    参数:
        location (str): 地点名称,例如 "Beijing" 或 "Shanghai"。
        unit (str): 温度单位,"metric" 表示摄氏度,"imperial" 表示华氏度,默认为 "metric"。
    返回:
        dict: 包含温度和天气描述的字典。
    """
    api_key = "xxx"  # 替换为你的OpenWeatherMap API密钥

    # 构造请求的URL
    url = f"http://api.openweathermap.org/data/2.5/weather?q={location}&units={unit}&appid={api_key}"

    try:
        # 发送HTTP GET请求
        response = requests.get(url)
        # 检查响应状态码是否为200(成功)
        if response.status_code == 200:
            data = response.json()
            # 从JSON数据中提取温度和天气描述
            return {
                "temperature": data["main"]["temp"],
                "description": data["weather"][0]["description"]
            }
        else:
            # 如果响应状态码不是200,打印错误信息
            print(f"请求天气API失败,状态码:{response.status_code}")
            return None
    except Exception as e:
        # 捕获异常并打印错误信息
        print(f"解析天气API时发生错误:{e}")
        return None

# 定义函数调用的元数据
functions = [
    {
        "name": "get_current_weather",
        "description": "获取指定城市的当前天气",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "城市名称"
                },
                "unit": {
                    "type": "string",
                    "description": "温度单位(metric 或 imperial)",
                    "default": "metric"
                }
            },
            "required": ["location"]
        }
    }
]

# 用户输入
user_input = "沈阳今天的天气如何?"

# 调用OpenAI的ChatCompletion接口
response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
        {"role": "user", "content": user_input}
    ],
    functions=functions,
    function_call="auto"  # 自动决定是否调用函数
)

# 检查是否触发了函数调用
if response.choices[0].finish_reason == "function_call":
    function_args = response.choices[0].message.function_call.arguments
    function_name = response.choices[0].message.function_call.name
    # 如果触发的函数是get_current_weather
    if function_name == "get_current_weather":
        # 调用get_current_weather函数获取天气信息
        weather_result = get_current_weather(
            location=function_args["location"],
            unit=function_args.get("unit", "metric")
        )
        # 如果获取到天气信息
        if weather_result:
            # 再次调用ChatCompletion接口,将天气信息作为上下文传递
            second_response = openai.ChatCompletion.create(
                model="gpt-4",
                messages=[
                    {"role": "user", "content": user_input},
                    {"role": "assistant", "content": response.choices[0].message.content},
                    {"role": "function", "name": function_name, "arguments": function_args},
                    {"role": "function", "name": function_name, "content": weather_result}
                ]
            )
            # 打印最终的回答
            print(second_response.choices[0].message.content)
        else:
            # 如果天气信息获取失败,提示用户
            print("无法获取天气信息,请检查网络连接或稍后再试。")
else:
    # 如果没有触发函数调用,直接打印模型的回答
    print(response.choices[0].message.content)

Function Call作用总结

Function Call 是大模型通过理解用户意图,自动决定调用哪个函数、构造参数、执行调用、接收结果、继续对话的一整套流程。它的作用体系在以下几点:

  1. 增强能力:模型通过Function Call可以调用外部工具或服务,从而执行自身无法完成的任务,如实时数据检索、文件处理、数据库查询等。
  2. 实时数据访问:大模型通常基于静态数据集训练,不具备实时信息。Function Call允许模型访问最新的数据,提供更准确、更及时的回答。
  3. 提高准确性:在需要精确计算或特定领域知识时,大模型可以通过调用专门的函数来提高回答的准确性。
  4. 个性化服务:Function Call使得大模型能够根据用户的具体需求调用不同的服务,提供个性化的用户体验。
  5. 操作复杂任务:有些任务过于复杂,无法仅靠模型的内置知识解决。Function Call允许模型将这些任务分解为可管理的子任务,并调用相应的函数来解决。
  6. 交互式应用:在构建交互式应用时,如聊天机器人或虚拟助手,Function Call使得模型能够执行更复杂的交互。
  7. 安全性和合规性:通过Function Call,可以在模型外部处理敏感数据,确保数据安全和合规性。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号