五、OpenAi之函数调用(Function Calling)(一)

利用大语言模型进行函数调用:API集成与安全实践

在这里插入图片描述

1.函数调用(Function Calling)

学习如何使大语言模型连接到外部工具

1.1介绍

在API调用中,您可以描述函数规范,让模型智能地选择输出包含参数的JSON对象,过程中你以调用一个或多个函数。聊天补全API自身不能调用函数;而是,让模型生成JSON,使用它调用函数代码

最新的模型(gpt-3.5-turbo-0125和gpt-4-turbo-preview)已通过训练,可以检测何时应该调用函数(取决于输入),并使用模型对符合函数签名的JSON进行响应。拥有这项能力的同时也伴随着风险。我们强烈建议在采取可能影响世界范围内的用户行为之前建立用户确认流程(例如:发邮件、发布网络、购物等待)

1.2常用案例

函数调用可以使你更可靠的从模型获得结构化的数据。可以这样:

  • 创建一些助理,通过调用外部的APIs来回答一些问题(例如:像ChatGPT的插件)
    • 例如:可以定义函数:send_email(to:string, body:string)或get_current_weather(location:string, unit:‘celsius’|‘fahrenheit’)
  • 转换自然语言到API调用
    • 例如:转换“我的最主要的客户都有谁?” get_customers(min_revenue: int, created_before: string, limit: int) 并调用你系 统内部的API
  • 从文本中提取结构化的数据
    • 例如:定义一个函数调用:extract_data(name: string, birthday: string) 或 sql_query(query: string)

等等还有很多…

函数调用的基本步骤如下:

  1. 调用模型时,将“用户查询”和“多个函数”定义在“函数参数”中
  2. 模型可以选择调用一个或多个函数;这样,内容将是遵循自定义模式的字符串化JSON对象(注意:模型可能会产生幻觉参数)
  3. 在你的代码中将string解析成JSON对象,用之前提供的参数(如果存在)调用函数
  4. 追加函数的返回作为一个新的消息再次调用模型,然后让模型归纳结果并返回给用户

1.3支持模型

目前,不是所有模型的版本都是用函数调用数据训练的。支持函数调用的模型有:

  • gpt-4, gpt-4-turbo-preview
  • gpt-4-0125-preview
  • gpt-4-1106-preview
  • gpt-4-0613
  • gpt-3.5-turbo
  • gpt-3.5-turbo-0125
  • gpt-3.5-turbo-1106
  • gpt-3.5-turbo-0613

另外, 以下模型支持并行的函数调用:

  • gpt-4-turbo-preview
  • gpt-4-0125-preview
  • gpt-4-1106-preview
  • gpt-3.5-turbo-0125
  • gpt-3.5-turbo-1106

2.并行函数调用

并行函数调用就是模型一起执行多个函数调用的能力,允许这些函数的效果和结果的调用被并行的解析。如果函数调用要花很长的时间,并行调用就显得非常有用。例如,模型可能要调用函数同时返回三个不同地点的天气,在tool_calls数组中,要包含三个函数调用,并作为一个消息结果返回,每个调用含有一个ID.为响应这些函数调用,增加三个消息至会话中,每个消息包含一个函数调用的结果,从tool_calls引用id,并用tool_call_id表示。

在下面例子中,我们仅定义一个函数get_current_weather。模型调用了函数多次,并将调用函数的返回结果再次发送给模型,由模型决定下一步的返回消息。它会返回一个面向用户的消息,告诉用户一些地区的温度。根据查询结果,可能会在调用一次函数。

如果你想强制模型调用一个指定的函数,你可以设置tool_choice参数,指定具体的函数名。你也可以强制模型生成面向用户的消息,设置参数:tool_choice: none。请注意:参数默认设置为:tool_choice: auto ,含义是由模型决定是否调用函数,调用哪一个函数。

2.1多个函数调用案例

# @Time : 2024/2/15 11:22
# @Author : NaiveFrank
# @Version : 1.0
# @Project : python_tutorial
from openai import OpenAI
import json

# 加载 .env 文件到环境变量
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())

# 初始化 OpenAI 服务。会自动从环境变量加载 OPENAI_API_KEY 和 OPENAI_BASE_URL
client = OpenAI()


# 例子模拟函数调用的硬编码,返回相同数据格式的天气
# 在实际生产中,可以是后台API或第三方的API fahrenheit-华氏温度
def get_current_weather(location, unit="fahrenheit"):
    """返回指定地区的实时天气"""
    if "北京" in location
### OpenAI Function Calling 功能概述 Function CallingOpenAI 提供的项功能,允许开发者定义组函数并让模型生成符合这些函数规范的参数。这机制的核心在于通过 `functions` 参数向 Chat Completions API 提供 JSON Schema 描述的函数列表[^4]。 当启用该功能时,模型会分析输入内容,并决定是否需要调用某个特定函数来完成任务。如果确实需要,则返回个包含所需参数的对象;否则继续正常对话流程[^3]。 #### 配置与实现步骤说明 以下是关于如何配置以及使用此特性的具体指南: 1. **准备阶段** 开发者需先创建好目标应用程序所需的各个业务逻辑对应的 JavaScript 或 TypeScript 函数原型描述文件(JSON Schemas),并将它们上传至指定位置或者集成到自己的服务端代码里作为工具集的部分[^2]。 2. **请求构建** 构建发送给 GPT 的 HTTP 请求体时,在常规的消息数组之外还需额外加入个新的字段——即上述提到过的 “tools” 数组形式表示的支持操作集合。 下面给出了段 Python 示例代码展示整个过程: ```python import os from typing import Any, Dict import requests def call_openai_function(api_key: str, messages: list[Dict[str, Any]], functions: list[dict]) -> dict: url = "https://api.openai.com/v1/chat/completions" headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {api_key}' } data = { "model": "gpt-3.5-turbo", "messages": messages, "functions": functions, "function_call": {"name": "get_current_weather"} } response = requests.post(url=url, json=data, headers=headers) if response.status_code != 200: raise Exception(f"Request failed with status code {response.status_code}: {response.text}") return response.json() ``` 在此基础上还可以进步扩展其他自定义行为比如错误处理等等[^1]。 #### 输出解释 旦成功触发了某项预设动作之后,服务器端将会收到段结构化的数据包,其中包含了所选方法名称及其关联的具体数值信息等内容待我们去解析利用即可。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值