官方地址: https://platform.openai.com/docs/guides/function-calling
OpenAI的Function Calling是一种与外部代码或服务交互的机制,它允许模型在生成响应时调用预定义的函数,使其能够实时访问外部数据和API接口,提升模型的应用价值,增强交互性和灵活性。
OpenAI Function Calling 在以下领域展现出广泛的应用前景:
1. 实时数据获取与增强生成(RAG)
-
天气/股票查询:通过调用外部API获取实时天气、金融数据,解决大模型训练数据时效性限制。
-
订单/物流追踪:电商场景中直接查询用户订单状态并生成动态回复。
2. 智能客服与自动化交互
-
多步骤任务处理:在电商客服中连续执行“订单查询→物流跟踪→退款处理”等操作。
-
个性化服务:结合用户历史数据生成定制化回复(如账户余额查询)。
3. 企业自动化与工作流管理
-
表单提交与系统集成:自动填写OA系统表单或更新CRM数据。
-
项目管理:调用API获取项目进度并生成报告,推送至协作平台。
4. 物联网与智能设备控制
-
智能家居:通过函数调用控制灯光、温湿度等设备状态。
-
工业自动化:与生产线API交互,实时调整设备参数。
5. 复杂计算与数据分析
-
数学辅导:执行方程求解、统计计算并解释步骤。
-
数据管道构建:从非结构化文本中提取结构化数据(如发票信息)。
6. 多模态与跨平台整合
-
地理位置服务:调用地图API提供导航或周边推荐。
-
云原生应用:通过Serverless API快速集成大模型能力,降低开发门槛。
技术优势支撑
-
结构化输出:通过
strict: true
确保参数符合JSON Schema,提升调用准确性。 -
并行调用:单次对话支持多个函数调用(如同时查询多个城市天气)。
代码示例:
from openai import OpenAI
import json
from dotenv import load_dotenv
load_dotenv()
# 初始化客户端(需提前设置OPENAI_API_KEY环境变量)
client = OpenAI()
def calculate_sum(numbers):
"""
计算一组数字的总和
:param numbers: 数字列表,例如 [8, 6]
:return: 求和结果
"""
return sum(numbers)
def get_completion(messages):
"""
调用OpenAI接口并处理函数调用
:param messages: 对话历史记录
:return: 模型响应消息
"""
response = client.chat.completions.create(
model="gpt-3.5-turbo", # 使用支持函数调用的最新模型
messages=messages,
temperature=0, # 确保输出确定性
tools=[{
"type": "function",
"function": {
"name": "calculate_sum",
"description": "计算一组数字的总和",
"parameters": {
"type": "object",
"properties": {
"numbers": {
"type": "array",
"items": {"type": "number"},
"description": "需要计算的数字列表"
}
},
"required": ["numbers"]
}
}
}],
tool_choice="auto" # 自动判断是否调用函数
)
return response.choices[0].message
# 初始化对话(包含系统指令和用户问题)
messages = [
{"role": "system", "content": "你是一个数学计算助手,能够执行数值计算"},
{"role": "user", "content": "我有8个桃子,弟弟有6个,我们一共有几个桃子?"}
]
# 第一轮调用:获取函数调用指令
first_response = get_completion(messages)
messages.append(first_response)
print("=====GPT原始回复=====start")
print(first_response)
print("=====GPT原始回复=====end")
if first_response.tool_calls:
# 解析函数调用参数
tool_call = first_response.tool_calls[0]
args = json.loads(tool_call.function.arguments)
# 执行本地函数并获取结果
calculation_result = calculate_sum(args["numbers"])
# 将函数执行结果加入对话历史
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"name": "calculate_sum",
"content": str(calculation_result)
})
# 第二轮调用:生成最终自然语言回复
final_response = get_completion(messages)
print(final_response.content)
else:
print(first_response.content)
输出:
=====GPT原始回复=====start
ChatCompletionMessage(content=None, refusal=None, role='assistant', audio=None, function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_H3TEe6iqSL09uza00ak7ZkwG', function=Function(arguments='{"numbers":[8,6]}', name='calculate_sum'), type='function')])
=====GPT原始回复=====end
你们一共有14个桃子。