Function Calling概述

Function Calling(函数调用)是一种让大语言模型能够识别用户意图并调用预定义函数的技术。模型本身不执行函数,而是生成结构化的函数调用请求,由开发者代码实际执行并将结果返回给模型。

基本原理

Function Calling的工作流程:

  1. 定义可用函数及其参数schema
  2. 将函数定义和用户消息一起发送给模型
  3. 模型判断是否需要调用函数,并生成调用参数
  4. 开发者执行函数并获取结果
  5. 将函数结果返回给模型,模型生成最终回复

实战:天气查询Agent

import json
import requests
from openai import OpenAI

client = OpenAI()

# 定义函数
def get_weather(city: str, date: str = "today"):
    """查询天气"""
    api_key = "your-api-key"
    url = f"https://api.weather.com/v1/forecast"
    response = requests.get(url, params={
        "city": city, "date": date, "key": api_key
    })
    return response.json()

# 定义函数schema
functions = [{
    "name": "get_weather",
    "description": "查询指定城市和日期的天气信息",
    "parameters": {
        "type": "object",
        "properties": {
            "city": {
                "type": "string",
                "description": "城市名称,如'北京'、'上海'"
            },
            "date": {
                "type": "string",
                "description": "日期,格式YYYY-MM-DD,默认today"
            }
        },
        "required": ["city"]
    }
}]

# 对话流程
messages = [{"role": "user", "content": "明天北京天气怎么样?"}]

response = client.chat.completions.create(
    model="deepseek-chat",
    messages=messages,
    functions=functions,
    function_call="auto"
)

msg = response.choices[0].message

if msg.function_call:
    # 模型决定调用函数
    func_name = msg.function_call.name
    func_args = json.loads(msg.function_call.arguments)

    # 执行实际函数
    available_functions = {"get_weather": get_weather}
    func_result = available_functions[func_name](**func_args)

    # 将结果返回给模型
    messages.append(msg)
    messages.append({
        "role": "function",
        "name": func_name,
        "content": json.dumps(func_result)
    })

    final_response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages
    )
    print(final_response.choices[0].message.content)

多函数协调调用

在实际应用中,Agent通常需要调用多个函数。可以定义多个函数schema,让模型自主选择调用哪个或哪些函数。例如,一个客服Agent可能需要同时调用「查询订单」、「查询物流」、「查询退款政策」等函数。

最佳实践

  • 函数描述要详细:清晰的描述帮助模型准确判断何时调用
  • 参数校验:在函数内部验证参数,防止模型传入异常值
  • 错误处理:函数执行失败时返回明确的错误信息
  • 结果精简:返回给模型的结果应精简,只包含必要信息
  • 超时控制:为函数调用设置超时时间,防止长时间阻塞

安全注意事项

Function Calling让AI获得了执行代码的能力,必须注意安全:不要将敏感操作(如数据库DELETE、支付转账)直接暴露为函数;对危险操作需要用户确认;对函数参数进行严格校验;记录所有函数调用日志用于审计。