OpenAI API进阶-Function Calling实现插件!

Function Calling介绍

Function Calling是什么

OpenAI Chat API官方文档:Chat API Function Calling官方介绍:Function Calling alt

开发者现在可以向 gpt-4-0613 和 gpt-3.5-turbo-0613 描述函数,并让模型智能地选择输出一个包含调用这些函数参数的 JSON 对象。这是一种更可靠地将 GPT 的功能与外部工具和 API 相连接的新方法。 这些模型经过了微调,既可以检测到何时需要调用函数(根据用户的输入),又可以回复符合函数签名的 JSON。函数调用使开发者能够更可靠地从模型中获得结构化数据。例如,开发者可以:

  • 利用外部工具调用的聊天机器人(如 ChatGPT 插件)来回答问题 将查询如“Email Anya看看她下周五是否想喝咖啡”转换为像 send_email(to: string, body: string) 这样的函数调用,或者将“波士顿的天气如何?”转换为 get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')。
  • 将自然语言转换为 API 调用或数据库查询 将“这个月我的前十位客户是谁?”转换为内部 API 调用,如 get_customers_by_revenue(start_date: string, end_date: string, limit: int),或者将“Acme 公司上个月下了多少订单?”转换为使用 sql_query(query: string) 的 SQL 查询。
  • 从文本中提取结构化数据 定义一个名为 extract_people_data(people: [{name: string, birthday: string, location: string}]) 的函数,以提取在维基百科文章中提到的所有人物。 这些用例通过我们的 /v1/chat/completions 端点中的新 API 参数 functions 和 function_call 得以实现,开发者可以通过 JSON Schema 描述函数,并可选择要求模型调用特定函数。

一句户解释就是:我们可以把自己的函数集成到GPT里了

Function Calling解决什么问题

Function Calling本质上就是插件! 插件功能相当于给OpenAI增加了一个武器库,开发者可以随意给它安装武器提升它的能力。

数据实时性问题

alt 问他langchain是什么?由于训练集是截止2021年的,他会回答不知道。但是有了Function Callling,我们就可以写一个函数集成谷歌/百度搜索API,给GPT加上联网能力,这样就借助搜索引擎的能力支持了数据的动态更新。

跟已有系统集成问题

alt 问他今天天气如何?由于ChatGPT数据集是离线的,无法满足获取实时天气的需求。但是有了Function Calling,我们可以编写一个函数来调用天气获取的API,从而获取实时天气信息,然后再与大模型的对话能力进行自然语言交互。

Function Calling如何使用

使用介绍

与普通chat对话的区别是增加了两个额外参数

  • functions: 声明自定义函数库
  • funcion_call: 控制大模型什么时机使用通Function Calling功能 alt 普通代码:
completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages
)

Function calling:

completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages,
   
    # 增加额外两个参数
    functions=functions,
    function_call="auto",  # auto is default, but we'll be explicit
)

实时天气查询实践

整体要经过两次的OpenAI Chat接口调用。

调用流程

1.定义函数 定义本地函数get_current_weather实现从API拉取,这里直接写一个简单对参数输出进行模拟。 然后按照OpenAI的文档要求格式定义get_current_weather的接口函数的json参数。 2.第一次调用接口 返回大模型分析出的函数名称参数。 结果如下:

{
  "id": "chatcmpl-8EIYxuSvhxmvYRE2UZI19fodbhXGv",
  "object": "chat.completion",
  "created": 1698418639,
  "model": "gpt-3.5-turbo-0613",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": null,
        "function_call": {
          "name": "get_current_weather",
          "arguments": "{\n  \"location\": \"Boston, MA\",\n  \"unit\": \"celsius\"\n}"
        }
      },
      "finish_reason": "function_call"
    }
  ],
  "usage": {
    "prompt_tokens": 86,
    "completion_tokens": 26,
    "total_tokens": 112
  }
}

3.调用本地函数 获取返回值,进行本地python方法调用 4.第二次调用接口 将第一次接口的返回值message与本地函数调用的接口拼装起来,然后再次调用接口。 结果如下:

{
  "role": "assistant",
  "content": "The weather in Boston today is 20 degrees Celsius."
}

代码实现

完整代码链接:Fuction Calling 示例

# function_calling.py
import openai
import json

openai.api_key = 'sk-NYsoG3VBKDiTuvdtC969F95aFc4f45379aD3854a93602327'
openai.api_base = "https://key.wenwen-ai.com/v1"

# 1. 定义函数
# 1.1 定义模拟获取天气的本地函数
def get_current_weather(location, unit):
    # Call the weather API
    return f"It's 20 {unit} in {location}"


# 1.2 定义函数字典方便调用
function_dict = {
    "get_current_weather": get_current_weather,
}

# 1.3 定义chat接口需要的函数
functions = [
    {
        "name": "get_current_weather",
        "description": "Get the current weather in a given location",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city and state, e.g. San Francisco, CA",
                },
                "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
            },
            "required": ["location"],
        },
    }
]

# 2. 第一次调用chat接口,返回的是函数调用的提示
messages = [
    {"role": "user", "content": "What's the weather like in Boston today with celsius?"}]
completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages,
    functions=functions,
    function_call="auto",  # auto is default, but we'll be explicit
)
print(completion)

# 3. 从结果接口的结果中获取函数调用的参数 进行本地函数调用
# 3.1 获取函数调用的参数
response_message = completion.choices[0].message
function_name = response_message["function_call"]["name"]
function_args = json.loads(response_message["function_call"]["arguments"])
# 3.2 调用本地函数
function_response = function_dict.get(function_name)(**function_args)
# 3.3 将本地函数的结果作为chat接口的输入
messages.append(response_message)
messages.append({
    "role": "function",
    "name": function_name,
    "content": function_response,
})

# 4. 第二次调用chat接口,返回的是chat的最终结果
completion_final = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages,
)

print(completion_final.choices[0].message)

上面的代码中的key是我自己维护的,免费给大家使用,代码可以直接运行!

python3.9 function_calling.py

本文由 mdnice 多平台发布

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值