OpenAI Function Calling 实践

官方地址: 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个桃子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值