chatgpt4如何调用插件 OpenAI 函数调用(1) – ChatGPT Plugin 是如何实现的?

AI资讯1年前 (2023)发布 fengdao
26 0

背景

最近 发布了一些模型及 API 的更新,主要有以下内容:

Chat 接口中新增对 (函数调用)的支持;gpt-3.5 发布的新的支持 16k 上下文的模型 gpt-3.5-turbo-16k ,直接变成了原来的 4 倍;发布了新的支持函数调用的模型 gpt-3.5-turbo-0613 和 gpt-4-0613 ;

其中对开发者而言,最兴奋的就是 的功能了,这个基本就是 底层实现的基础了,有了这个能力我们也可以打造自己的“插件商城”了。下面我们就一起看一下 的具体功能。

概述GPT 本身的局限

的 GPT 本身具有很强的智能,但也有知识陈旧以及缺少“手脚”问题。比如,gpt-4 模型的训练数据都是 2021 年 9 月之前的数据,所以他并不知道 2023 年苹果发布了 系统;另外,现在的 并不能执行一些动作,比如帮忙发送邮件,现在能做的仅仅是编写邮件。

具体表现为:

LLM 的知识是基于模型训练时使用的数据及知识,对于后续的新的事实其并不知道;LLM 类似于“缸中之脑”,其有很高的智能但是缺少一些行动的能力;目前的解决方案

上述问题社区中也有一些解决方案,如 之类的工具。除此之外, 官方也推出了 的功能,允许开发者可以给 LLM 提供一些能力来解决上述问题,甚至是增强其能力提供了更多模态的信息输出。

上述的解决方案中也都有各自的问题:

简单讲 功能其实就是在 Chat 接口(下文统一称 Chat 接口)中新增了一个 的可选入参,该参数是一个列表可以支持传入多个函数的声明,在声明中告诉 GPT 有这些函数可以被调用,他可以借助这些函数完成自己不能完成的的一些事情,或者说把自己的任务完成的更加出色。

从这角度来理解 和 中的 并没有本质区别。前者是面对开发者的基础能力,后者是面对用户的基础交互体验。

的出现基本上可以很好的解决之前遗留的一些问题:

插件调用失败怎么办_插件调用activity异常_chatgpt4如何调用插件

突破编程语言的限制,目前发布的功能是云端接口,只要可以进行网络请求的语言都可以实现此功能;提升函数调用的稳定性,官方出品稳定性有保证,但并不是没有稳定性的问题还是要添加对应容错逻辑;提示 API 易用性,垂直领域的 LLM 应用开发少不了 API 调用,这部分的使用越简单其上层的 LLM 应用月繁荣;

下面我们就来详细看一下 到底是什么,怎么用,以及一些常见的使用案例。

Chat

是 Chat 接口中一个参数,想要了解 我们需要先了解一下 Chat 接口的一些基本概念。

接口简介

Chat 接口 聊天应用中使用的接口,区别于之前的 接口,它将用户和 GPT 的对话以列表的形式进行进行管理,并不是将所有的对话的统一拼接在一个字符串中。除此之外,Chat 接口还明确了 role 的概念,系统的上下文信息通过 来表示。

目前接口仅支持 gpt-3.5 和 gpt-4 的系列模型。其形式大致如下:

import openai
openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
    ]
)

表示的是对话列表,包含对话的角色以及对应的内容,此次的更新中新增了 这个角色,目前共有以下内容:

:表示系统上下文信息,确定当前对话的基本格调,一般接口只包含一条该内容;user:用户的提问的问题;:GPT 返回的回答内容;:函数执行的结果,需要将此信息传递给 GPT,以便 GPT 更加次内容做出进一步的回答; 基本定义

这次的 功能并不是新接口,而是在 Chat 接口上扩展而来的。在请求接口以及接口返回上都有调整。主要内容如下:

接口请求:新增 参数和平级,role 中新增 枚举标识是函数执行的结果;接口返回: 的 中新增 字段,包含函数执行必须的参数信息,与文本内容 平级,但基本不会同时出现;

Curl 请求形式大致如下(下文会详细讲解字段含义):

chatgpt4如何调用插件_插件调用activity异常_插件调用失败怎么办

curl https://api.openai.com/v1/chat/completions -u :$OPENAI_API_KEY -H 'Content-Type: application/json' -d '{
  "model": "gpt-3.5-turbo-0613",
  "messages": [
    {"role": "user", "content": "What is the weather like in Boston?"}
  ],
  "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"]
      }
    }
  ]
}'

返回的 JONS 形式大致如下(下文会详细讲解字段含义):

{
  "id": "chatcmpl-123",
  ...
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": null,
      "function_call": {
        "name": "get_current_weather",
        "arguments": "{ "location": "Boston, MA"}"
      }
    },
    "finish_reason": "function_call"
  }]
}

调用流程

整个功能的调用顺序大致如下:

声明函数并请求 API:定义当前函数的名称,描述,以及对应的参数信息,并执行 的 Chat 接口;执行本地函数:接受接口返回,并解析对应的函数参数信息,根据对应的参数信息调用本地函数;上报执行结果:将本地函数执行的结果上报给 Chat 接口进行汇总、总结;

详细的时序图如下:

下面就以用户询问当前的天气的场景来详细讲解下 是如何运行的。

基本使用第 1 步:声明函数并请求 API

其中 是一个列表包含多个函数对象,每个对象中包含:

name:函数的名字,但函数被命中时接口会返回此处定义的名称;:函数的描述, 会根据此描述根据场景决定是否需要调用此函数,所以这里一定要描述清楚;:函数参数,当前定义的函数需要哪些传参,这些参数的类型以及可空性都需要在这里声明;

首先我们先定义一个获取当前天气的函数声明,并且这个函数需要两个参数:

:位置信息,即想要查询那个地方的天气信息,类型是一个字符串,非空;unit:天气的单位,类型是一个字符串,是两个枚举摄氏度与华氏度,可空;

© 版权声明

相关文章

暂无评论

暂无评论...