探究ChatGPT,学习开发一款插件,成为前锋者,一同成长。加入「阿杰与AI」大众号,关注AI发展趋势,等待AI时机出现。

  • 1.怎么拜访插件?
  • 2.开发ChatGPT插件-介绍
  • 3.开发ChatGPT插件-入门
  • 4.开发ChatGPT插件-认证
  • 5.开发ChatGPT插件-示例插件
  • 6.开发ChatGPT插件-审阅
  • 7.开发ChatGPT插件-线上插件及常见问题

创立一个插件需求3个过程:

  1. 构建一个API
  2. 运用OpenAPI的yaml或JSON格局对API进行文档化
  3. 创立一个JSON清单文件,用于界说插件的相关元数据

接下来的内容将重点介绍经过界说OpenAPI标准和清单文件来创立一个待办事项列表插件。

插件清单

每个插件都需求一个名为ai-plugin.json的文件,并且该文件需求保管在API的域名下。例如,一个名为example.com的公司会将插件的JSON文件经过example.com域名进行拜访,因为这是他们API保管的方位。当您经过ChatGPT UI装置插件时,后台会在/.well-known/ai-plugin.json方位查找文件。在您的域名上,必须有一个名为/.well-known的文件夹,以便ChatGPT能够连接到您的插件。假如找不到文件,插件将无法装置。关于本地开发,您能够运用HTTP,但假如指向长途服务器,则必须运用HTTPS。

所需的ai-plugin.json文件的最小界说如下所示:

{
    "schema_version": "v1",
    "name_for_human": "TODO Plugin",
    "name_for_model": "todo",
    "description_for_human": "Plugin for managing a TODO list. You can add, remove and view your TODOs.",
    "description_for_model": "Plugin for managing a TODO list. You can add, remove and view your TODOs.",
    "auth": {
        "type": "none"
    },
    "api": {
        "type": "openapi",
        "url": "http://localhost:3333/openapi.yaml",
        "is_user_authenticated": false
    },
    "logo_url": "http://localhost:3333/logo.png",
    "contact_email": "support@example.com",
    "legal_info_url": "http://www.example.com/legal"
}

假如您想检查插件文件的一切或许选项,能够参考下面的界说。在命名插件时,请遵从OpenAI的品牌攻略,不符合这些攻略的插件将无法获得插件商店的批准。

字段 类型 描绘/选项 必需的
schema_version String 架构版别
name_for_model String 命名模型将用于定位插件(不允许有空格,只能有字母和数字)。最多 50 个字符
name_for_human String 人类可读的称号,例如完好的公司称号。最多 20 个字符
description_for_model String 更适合模型的描绘,例如令牌上下文长度注意事项或用于改进插件提示的关键字运用。最多 8,000 个字符
description_for_human String 插件的人类可读描绘。最多 100 个字符
auth ManifestAuth 身份验证模式
api Object API标准
logo_url String 用于获取徽标的 URL。主张尺度:512 x 512。支撑通明背景。
contact_email String 用于安全/审阅、支撑和停用的电子邮件联系人
legal_info_url String 重定向 URL 供用户检查插件信息
HttpAuthorizationType HttpAuthorizationType “bearer” or “basic”
ManifestAuthType ManifestAuthType 授权类型”none”, “user_http”, “service_http”, or “oauth”
interface BaseManifestAuth BaseManifestAuth 类型: ManifestAuthType; 阐明: string;
ManifestNoAuth ManifestNoAuth 无需身份验证: BaseManifestAuth & { type: ‘none’, }
ManifestAuth ManifestAuth ManifestNoAuth, ManifestServiceHttpAuth, ManifestUserHttpAuth, ManifestOAuthAuth

以下是运用不同身份验证办法的示例:

# App-level API keys
type ManifestServiceHttpAuth  = BaseManifestAuth & {
  type: 'service_http';
  authorization_type: HttpAuthorizationType;
  verification_tokens: {
    [service: string]?: string;
  };
}
# User-level HTTP authentication
type ManifestUserHttpAuth  = BaseManifestAuth & {
  type: 'user_http';
  authorization_type: HttpAuthorizationType;
}
type ManifestOAuthAuth  = BaseManifestAuth & {
  type: 'oauth';
  # OAuth URL where a user is directed to for the OAuth authentication flow to begin.
  client_url: string;
  # OAuth scopes required to accomplish operations on the user's behalf.
  scope: string;
  # Endpoint used to exchange OAuth code with access token.
  authorization_url: string;
  # When exchanging OAuth code with access token, the expected header 'content-type'. For example: 'content-type: application/json'
  authorization_content_type: string;
  # When registering the OAuth client ID and secrets, the plugin service will surface a unique token.
  verification_tokens: {
    [service: string]?: string;
  };
}

在上述说到的清单文件中,某些字段的长度是有约束的,并且或许会发生改变。OpenAI还对API呼应体施加了最大长度约束为100,000个字符,这也或许会随时刻而改变。

一般而言,最佳实践是尽或许地简洁描绘和呼应,因为模型的上下文窗口是有限的。

OpenAPI界说

下一步是构建OpenAPI标准来记录API。ChatGPT模型除了在OpenAPI标准和清单文件中界说的内容之外,关于您的API简直一窍不通。这意味着假如您的API十分庞大,您无需将一切功用都露出给模型,能够挑选特定的端点。例如,假如您有一个交际媒体API,您或许期望模型经过GET恳求拜访站点上的内容,但防止模型能够对用户的帖子进行评论,以减少废物信息的时机。

OpenAPI标准是位于您的API之上的封装器。一个根本的OpenAPI标准如下所示:

openapi: 3.0.1
info:
  title: TODO Plugin
  description: A plugin that allows the user to create and manage a TODO list using ChatGPT.
  version: 'v1'
servers:
  - url: http://localhost:3333
paths:
  /todos:
    get:
      operationId: getTodos
      summary: Get the list of todos
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/getTodosResponse'
components:
  schemas:
    getTodosResponse:
      type: object
      properties:
        todos:
          type: array
          items:
            type: string
          description: The list of todos.

OpenAI首要界说标准版别、标题、描绘和版别号。当在ChatGPT中运转查询时,它将检查在info部分中界说的描绘,以确认插件是否与用户查询相关。您能够在编写描绘部分详细了解提示的相关内容。

请记住,在您的OpenAPI标准中存在以下约束,这些约束或许会发生改变:

API标准中每个API端点的描绘/摘要字段的最大长度为200个字符 API标准中每个API参数描绘字段的最大长度为200个字符 因为OpenAI在本地运转此示例,OpenAI期望将服务器设置为指向您的本地主机URL。其余的OpenAPI标准遵从传统的OpenAPI格局,您能够经过各种在线资源了解有关OpenAPI格局的更多信息。还有许多工具能够根据您的基础API代码主动生成OpenAPI标准。

运转插件

一旦您为API创立了API、清单文件和OpenAPI标准,您现在能够经过ChatGPT UI连接插件了。插件或许在两个不同的方位运转,要么是在开发环境的本地,要么是在长途服务器上。

假如您有正在运转的本地API版别,您能够将插件界面指向您的本地主机服务器。要将插件与ChatGPT连接起来,请导航到插件商店,挑选”开发您自己的插件”。输入您的本地主机和端口号(例如localhost:3333)。请注意,目前仅支撑本地开发的auth类型为none。

  • 假如插件正在长途服务器上运转,您首要需求挑选”开发您自己的插件”进行设置,然后挑选”装置未经验证的插件”以进行自己的装置。您只需将插件清单文件增加到yourdomain.com/.well-known/路径中,并开始测验您的API。但是,关于清单文件的后续更改,您需求将新更改布置到您的公共站点,这或许需求很长时刻。在这种状况下,OpenAI主张设置一个本地服务器作为您的API的署理。这样,您能够快速对OpenAPI标准和清单文件进行原型规划更改。
  • 设置一个本地署理以署理您的公共API

  • 以下是一个示例Python代码,展现了怎么设置一个简略的署理来署理您的公共API。
  •   import requests
      import os
      import yaml
      from flask import Flask, jsonify, Response, request, send_from_directory
      from flask_cors import CORS
      app = Flask(__name__)
      PORT = 3333
      # Note: Setting CORS to allow chat.openapi.com is required for ChatGPT to access your plugin
      CORS(app, origins=[f"http://localhost:{PORT}", "https://chat.openai.com"])
      api_url = 'https://example.com'
      @app.route('/.well-known/ai-plugin.json')
      def serve_manifest():
          return send_from_directory(os.path.dirname(__file__), 'ai-plugin.json')
      @app.route('/openapi.yaml')
      def serve_openapi_yaml():
          with open(os.path.join(os.path.dirname(__file__), 'openapi.yaml'), 'r') as f:
              yaml_data = f.read()
          yaml_data = yaml.load(yaml_data, Loader=yaml.FullLoader)
          return jsonify(yaml_data)
      @app.route('/openapi.json')
      def serve_openapi_json():
          return send_from_directory(os.path.dirname(__file__), 'openapi.json')
      @app.route('/<path:path>', methods=['GET', 'POST'])
      def wrapper(path):
          headers = {
          'Content-Type': 'application/json',
          }
          url = f'{api_url}/{path}'
          print(f'Forwarding call: {request.method} {path} -> {url}')
          if request.method == 'GET':
              response = requests.get(url, headers=headers, params=request.args)
          elif request.method == 'POST':
              print(request.headers)
              response = requests.post(url, headers=headers, params=request.args, json=request.json)
          else:
              raise NotImplementedError(f'Method {request.method} not implemented in wrapper for {path=}')
          return response.content
      if __name__ == '__main__':
          app.run(port=PORT)
    

编写描绘

当用户提出或许会发送到插件的潜在恳求时,模型会浏览OpenAPI标准中各个端点的描绘,以及清单文件中的description_for_model。与提示其他语言模型相似,您需求测验多个提示和描绘,以找出最有效的办法。

OpenAPI标准自身是一个很好的当地,能够向模型供给关于API的各种详细信息-哪些功用可用,带有什么参数等等。除了为每个字段运用富有表现力和信息丰厚的称号之外,标准还能够包括每个特点的“描绘”字段。这些描绘能够用于供给函数的自然语言描绘,或者查询字段期望的信息,例如。模型将能够看到这些描绘,并指导其运用API。假如某个字段仅限于特定值,您还能够供给一个带有描绘性类别称号的“枚举”。

description_for_model特点使您能够自由地指示模型怎么一般运用您的插件。总的来说,ChatGPT背面的语言模型十分擅长了解自然语言并遵从指示。因而,这是一个很好的当地,能够供给关于插件的一般阐明以及模型怎么正确运用它的指示。请运用自然语言,最好用简洁但具有描绘性和客观的语调。您能够检查一些示例,以了解其应该是什么样子。OpenAI主张以“Plugin for …”开头,并列出您的API供给的一切功用。

最佳实践

以下是在编撰description_for_model、OpenAPI标准中的描绘以及规划API呼应时应遵从的一些最佳实践:

1.您的描绘不该企图控制ChatGPT的心情、个性或确切回复。ChatGPT被规划为对插件编写适当的回复。

不良示例:

When the user asks to see their todo list, always respond with "I was able to find your todo list! You have [x] todos: [list the todos here]. I can add more todos if you'd like!"
当用户要求检查待办事项列表时,始终回复:“我能够找到您的待办事项列表!您有[x]个待办事项:[在此列出待办事项]。假如您想要增加更多待办事项,我能够帮您!”

杰出示例:

[no instructions needed for this]
[此处不需求阐明]

2.您的描绘不该在用户没有要求运用特定类别的服务插件时,鼓舞ChatGPT运用插件。

不良示例:

Whenever the user mentions any type of task or plan, ask if they would like to use the TODOs plugin to add something to their todo list.
不管用户是否说到任何类型的使命或计划,都问他们是否想要运用TODO插件将某些内容增加到待办事项列表中。

杰出示例:

The TODO list can add, remove and view the user's TODOs.
TODO列表能够增加、删去和检查用户的待办事项。

3.您的描绘不该规则ChatGPT运用插件的详细触发器。ChatGPT被规划为在适当时主动运用您的插件。

不良示例:

When the user mentions a task, respond with "Would you like me to add this to your TODO list? Say 'yes' to continue."
当用户说到一个使命时,回复:“您是否期望我将其增加到您的待办事项列表中?请答复'是'以持续。”

杰出示例:

[no instructions needed for this]
[此处不需求阐明]

4.插件API的呼应应回来原始数据,而不是自然语言呼应,除非有必要。ChatGPT将运用回来的数据供给自己的自然语言呼应。

不良示例:

I was able to find your todo list! You have 2 todos: get groceries and walk the dog. I can add more todos if you'd like!
我能够找到您的待办事项列表!您有2个待办事项:购买杂货和遛狗。假如您想要增加更多待办事项,我能够帮您!

杰出示例:

{ "todos": [ "get groceries", "walk the dog" ] }
{ "todos": [ "购买杂货", "遛狗" ] }

调试

默认状况下,聊天界面不会显示插件调用和其他未呈现给用户的信息。为了更全面地了解模型与插件的交互状况,您能够在与插件进行交互后,点击插件称号后边的向下箭头,检查恳求和呼应。

模型调用插件一般包括模型发送到插件的相似JSON的参数的音讯,随后是插件的呼应,最后是模型使用插件回来的信息的音讯。

假如您正在开发一个本地插件,您还能够经过进入“设置”并切换“打开插件开发工具”来打开开发者控制台。从那里,您能够检查更详细的日志,并运用“改写插件”重新获取插件和OpenAPI标准。

期望经过大众号「阿杰与AI」,能够协助你了解AI产品,并能够解决一些日子和工作中问题。

我将共享有关AI的常识和实用主张,期望能够为你带来有价值的认知,一同探究发现AI的时机。