Function Calling概述
Function Calling(函数调用)是一种让大语言模型能够识别用户意图并调用预定义函数的技术。模型本身不执行函数,而是生成结构化的函数调用请求,由开发者代码实际执行并将结果返回给模型。
基本原理
Function Calling的工作流程:
- 定义可用函数及其参数schema
- 将函数定义和用户消息一起发送给模型
- 模型判断是否需要调用函数,并生成调用参数
- 开发者执行函数并获取结果
- 将函数结果返回给模型,模型生成最终回复
实战:天气查询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、支付转账)直接暴露为函数;对危险操作需要用户确认;对函数参数进行严格校验;记录所有函数调用日志用于审计。