简单实现一个ChatGPT Plugin

OpenAI对ChatGPT Plus用户开放了Plugin的权限。初步体验下来虽然bug不少,不过效果很不错,是一个较为成熟的feature。个人认为,ChatGPT Plugin的体验要远优于New Bing(bing还要继续努力..)

今天从零开始开发一个ChatGPT Plugin,试水一下plugin的潜力。

ChatGPT Plugin如何工作?

ChatGPT Plugin通过访问外部API来:

  • 获得实时信息:例如当天天气,股价;近期招聘信息等。

  • 进行实时操作:例如预定酒店,餐厅;甚至直接操作Gmail,Google docs等。

具体来讲,ChatGPT需要以下两个文件:

  1. .well-known/ai-plugin.json:类似于Chrome Extension开发中的manifest.json。该文件记录plugin的一些metadata。这些信息将用来在插件商店展示该插件,并用来告诉ChatGPT这个插件是干啥的。

  2. openapi.yaml:是一个标准化文档,向ChatGPT解释了API所提供的functions。并说明了如何调用function和function 的responses的具体格式等。

接下来我们开发一个ChatGPT Plugin,实现查询未来几个月即将举办的AI会议,管理会议投稿deadline,收藏会议并制定To-do list等功能。

.well-known/ai-plugin.json

我们首先在这个文件中声明Plugin的基础信息,包括名字,版本号,介绍(有给人类看的介绍,也有给GPT看的描述),logo,联系方式等等。这里不涉及任何具体功能的实现。

 
{    "schema_version": "v1",    "name_for_human": "AI Conferences",    "name_for_model": "AIConf",    "description_for_human": "Plugin to get information about upcoming AI conferences.",    "description_for_model": "Plugin to get information about upcoming AI conferences.",    "auth": {      "type": "none"    },    "api": {      "type": "openapi",      "url": "http://localhost:5023/openapi.yaml",      "is_user_authenticated": false    },    "logo_url": "http://localhost:5023/logo.png",    "contact_email": "yuchengli@example.com",    "legal_info_url": "http://example.com/AIConf"  }

如果Plugin需要进行身份验证(比如预定酒店等plugin),可以在auth 这里使用OAuth,不过这里我们不需要身份验证。

在本地实现我们的server

这里我们用Flask跑一个本地的server来实现plugin的具体功能。

 
from flask import Flask, send_from_directoryfrom flask_cors import CORS
app = Flask(__name__)CORS(app, origins='https://chat.openai.com/')
@app.get("/logo.png")def logo():    return send_from_directory(app.root_path, "logo.png")
@app.get("/.well-known/ai-plugin.json")def plugin_manifest():    with open(".well-known/ai-plugin.json") as f:        return f.read()
@app.get("/openapi.yaml")def openapi():    with open("openapi.yaml") as f:        return f.read()
# 从Github搞来最近的AI会议数据def update_db():    confs_yaml_file = requests.get('https://raw.githubusercontent.com/paperswithcode/ai-deadlines/gh-pages/_data/conferences.yml').text    confs = yaml_load(confs_yaml_file, Loader=Loader)
    global up_coming_conferences    up_coming_conferences = []    for conf in confs:        if 'abstract_deadline' in conf:            deadline = conf['abstract_deadline']        elif 'deadline' in conf:            deadline = conf['deadline']        try:            deadline = datetime.strptime(deadline, "%Y-%m-%d %H:%M:%S")        except:            deadline = datetime.strptime(deadline, "%Y-%m-%d %H:%M")        if deadline > datetime.now():            up_coming_conferences.append(conf)
# 当GPT访问http://localhost:5023/all时,返回list of conference。每个conference包含了title,year,link,place,sub,deadline等信息。@app.get("/all")def all():    update_db()    results = []    # we only need title, year, link, place, sub, and deadline    for conf in up_coming_conferences:        result = {}        result['title'] = conf['title']        result['year'] = conf['year']        result['link'] = conf['link']        result['place'] = conf['place']        result['sub'] = conf['sub']        result['deadline'] = conf['deadline']        results.append(result)    responses = json.dumps(results)    return responses
if __name__ == '__main__':    app.run(debug=True, host='0.0.0.0', port=5023)

我们在def update_db()搞来最近的会议数据。

在@app.get("/all")里确定了Api的endpoint。访问该endpoint,也即http://localhost:5023/all ,将返回一个list的conference信息。

其他需要注意的是:

  1. 我们需要CORS来允许http://chat.openai.com访问我们的server。

  2. @app.get("/logo.png") :render 一个logo文件。

  3. @app.get("/.well-known/ai-plugin.json"):render manifest文件。

  4. @app.get("/openapi.yaml"):render api说明文件。

这里我们为我们的插件精心挑选一个清心寡欲的logo,像极了写论文时的我:

openapi.yaml

该文件是标准的OpenAPI格式的文档,目的是告诉GPT我们的Plugin提供了哪些function,该如何调用这些function,和function的输出形式是什么。

分开来讲:首先是插件基本信息的插件的url地址。

openapi: 3.0.1info:  title: AI Conferences  description: Plugin to get information about upcoming AI conferences.  version: 'v1'servers:  - url: http://localhost:5023

Endpoint:/all ,也即访问http://localhost:5023/all 的方法和结果。我们这里,我们告诉GPT使用get与服务器交流。summary则告诉GPT这个function是干啥的用的。

paths:  /all:    get:      operationId: getAllUpcomingConf      summary: Get information about all the upcoming conferences      responses:        "200":          description: OK          content:            application/json:              schema:                $ref: '#/components/schemas/getAllUpcomingConfResponses'

Response格式:这里告诉GPT该怎么解读返回的结果。

components:  schemas:    getAllUpcomingConfResponses:      type: array      items:        type: object        properties:          link:            type: string            description: The link to the conference website.          place:            type: string            description: The place where the conference will be held.          sub:            type: string            description: The subfield of AI that the conference is about.          deadline:            type: string            description: The deadline for submitting papers.

放在一起有:

openapi: 3.0.1info:  title: AI Conferences  description: Plugin to get information about upcoming AI conferences.  version: 'v1'servers:  - url: http://localhost:5023paths:  /all:    get:      operationId: getAllUpcomingConf      summary: Get information about all the upcoming conferences      responses:        "200":          description: OK          content:            application/json:              schema:                $ref: '#/components/schemas/getAllUpcomingConfResponses'components:  schemas:    getAllUpcomingConfResponses:      type: array      items:        type: object        properties:          link:            type: string            description: The link to the conference website.          place:            type: string            description: The place where the conference will be held.          sub:            type: string            description: The subfield of AI that the conference is about.          deadline:            type: string            description: The deadline for submitting papers.

在ChatGPT页面注册Plugin

搞定上面的之后,需要去ChatGPT的商店注册我们的插件。

打开plugin store.

点develop your own plugin.

输入我们的server地址

这里点install,安装我们清新寡欲的plugin

安装好了在这里选定,开始对话!

使用体验

首先,我们问一下最近都有哪些会议可以投稿:

Amazing!看起来挺靠谱,点一下最上方的展开按钮,我们可以看到我们服务器返回给GPT的真实内容:

可以看到ChatGPT就是把得到的内容翻译成了自然语言。

添加新功能

OK,我们再实现一个新功能,让ChatGPT可以为我们收藏目标会议,以便今后打算。

starred_conferences = []@app.get("/star/<conf_name>")def star(conf_name):    update_db()    for conf in up_coming_conferences:        if conf['title'] == conf_name:            starred_conferences.append(conf)            return "OK"    return "Not Found"

如代码所示,我们添加了一个新的function,让GPT可以通过GET请求,收藏一个特定的会议。

根据这个功能更新openapi.yaml(具体改动略,详见文末的Github repo) 。

Done!光收藏还不行,收藏完了我们总是要查看我们收藏了什么。所以我们需要实现查看已收藏会议的方法。添加新的endpoint /starred用于查询已收藏内容

@app.get("/starred")def starred():    results = []    for conf in starred_conferences:        result = {}        result['title'] = conf['title']        result['year'] = conf['year']        result['link'] = conf['link']        result['place'] = conf['place']        result['sub'] = conf['sub']        result['deadline'] = conf['deadline']        results.append(result)    responses = json.dumps(results)    return responses

同时更新openapi.yaml (具体改动略,详见文末的Github repo)。

测试一下新功能:

这里我们成功收藏了EMNLP会议,并随后查询了所收藏会议的一些信息。

OpenAI是怎么教会GPT使用Plugin的?

很好奇OpenAI是怎么调教GPT来让它使用plugin的。根据OpenAI关于Plugin的文档,基本可以确定是将manifest文件和openapi.yaml直接给GPT过目。不过不能确定这里是不是用了某些很神奇的prompt。

简单问一下GPT,看会不会漏出什么马脚。

并没有漏出什么马脚,所以我们暂时无法得知OpenAI具体用什么指令来指导GPT了。

参考

完整的实现参见github repo:

https://github.com/liyucheng09/aiconf_plugin

OpenAI对plugin的说明:

https://platform.openai.com/docs/plugins/introduction?utm_medium=email&_hsmi=258126318&_hsenc=p2ANqtz-8Xi_Zr1TCX6GUPwJd40qklxEEiSsqvmzN6153ZkAjpO6POh0N_q3F0LBdWi7DEfPQddcbiIslA2WNndFySMM-1Gu3rcQ&utm_content=258126318&utm_source=hs_email

https://platform.openai.com/docs/plugins/review?utm_medium=email&_hsmi=25812631

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15682.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT Plugin发布,这东西到底是干嘛的?里面的逻辑是什么?

前言 chatGPT目前的明显问题是不能够获取新知识&#xff0c;也没有办法和外界交互&#xff0c;而plugin就是来解决这个问题的。 chatgpt-retrieval-plugin 插件的基本信息 这是最新开源的一个plugin&#xff0c;里面有几个核心点 第一个是插件的定义 我不逐句翻译了&#…

chatgpt赋能powershell

最近chatgpt非常火爆&#xff0c;获得超高曝光度的同时&#xff0c;也让大家对ai和ai工具有了新的认识。关于chatgpt&#xff0c;可以参考这篇文章。 今天主要推荐一个可以与powershell集成的ai工具&#xff0c;其后端也是openai的服务&#xff0c;可以有效提高工作效率。 Po…

ChatGPT算法护航,拿不到年薪25W全额退!

最近因ChatGPT爆火&#xff0c;使得很多人非常的焦虑&#xff0c;下面是我看到的一位好朋友心情&#xff01;不知道大家是否也有同样的心情&#xff01;&#xff5e; 感觉很多人在看到ChatGPT时都有这样的担忧&#xff0c;这样的担忧是不是源自于神经网络如果参数量足够大&…

搭个ChatGPT算法模型,离Java程序员有多远?

除了大家都想体验一下这款智能的 ChatGPT AI&#xff0c;也有很多互联网公司开始搭建自己的 ChatGPT&#xff0c;但真的挺担心最后整出来的不是 ChatGPT 而是 ChatPPT。为此我也想研究下 ChatGPT 是怎么做出来的&#xff0c;都说是模型和数据训练&#xff0c;那我能训练吗&…

基于java记账管理系统(论文+PPT+源码)

本 科 毕 业 设 计&#xff08;论文&#xff09; 题 目&#xff1a;记账管理系统 专题题目&#xff1a;记账管理系统 本 科 毕 业 设 计&#xff08;论文&#xff09;任 务 书 题 目&#xff1a; 记账管理系统 专题题目&#xff08;若无专题则不填&#xff09;&#xff1a…

为了搞懂ERP,我连问 ChatGPT 30个问题,通透!

我对ERP有很多的疑问&#xff0c;这次向ChatGPT请教&#xff0c;连问30个问题&#xff0c;瞬间觉得通透了很多&#xff0c;以下是我的问题和ChatGPT的回复&#xff0c;分为概念篇、架构篇和生态篇三部分&#xff0c;希望能带给你新的启示。 一、概念篇 1、ERP是什么&#xff1f…

安卓app源码和设计报告——简易记账本

课 程 设 计&#xff08;实训&#xff09;说 明 书 题目实现简易记账本功能 专 业班 级学生姓名同组学生指导老师 课程设计&#xff08;实训&#xff09;评语 学生姓名 专业 班级 2 题目 实现简易记账本功能 评语&#xff1a; 成绩&#xff1a; 优良中及格不及格出勤20%…

ChatGPT来抢财务饭碗?别慌!对话企业聊聊财务数字化

10大职业将被ChatGPT取代&#xff0c;财务也位居其中&#xff1f;有媒体和机构整理&#xff0c;最有可能被取代的职业有&#xff1a;技术工种、媒体工作者、法律工作者、市场研究分析师、教师、财务、交易员、平面设计师、会计师、客服。你感受到职业危机了吗&#xff1f; 当下…

不止ChatGPT,这些GPT 官方助力的潜力股同样值得拥有

我很惊讶于 OpenAI 创投基金主页面的简陋&#xff0c;或许他们更关注于做事吧。对于 OpenAI 的第一组投资来说&#xff0c;人工智能实验室已使用其 1 亿美元的基金投资了至少 12 家公司&#xff0c;很多公司的产品状态尚处于“Join Waitlist”状态&#xff0c;下面我带你了解一…

Java——Linux使用Docker部署若依前后端分离版【保姆级教程】

目录 一、项目规划与前置工作 1.1、docker所需镜像 1.2、使用工具 1.3、防火墙与安全组的配置 1.4、域名解析、备案、SSL证书的准备&#xff08;可选&#xff09; 二、Docker和镜像安装 2.1、Docker安装 2.1.1、检查环境 2.1.2、搭建gcc环境&#xff08;gcc是编程语言译器&am…

面向数据安全共享的联邦学习研究综述

开放隐私计算 摘 要&#xff1a;跨部门、跨地域、跨系统间的数据共享是充分发挥分布式数据价值的有效途径&#xff0c;但是现阶段日益严峻的数据安全威胁和严格的法律法规对数据共享造成了诸多挑战。联邦学习可以联合多个用户在不传输本地数据的情况下协同训练机器学习模型&a…

好再来点餐APP源码和设计报告

大作业文档 项目名称&#xff1a;好再来点餐专业&#xff1a;班级&#xff1a;学号&#xff1a;姓名&#xff1a; 目 录 一、项目功能介绍3 二、项目运行环境3 1、开发环境3 2、运行环境3 3、是否需要联网3 三、项目配置文件及工程结构3 1、工程配置文件3 2、工程结构…

Java 编写的个人记账网站 完整源码 附带详细的设计报告

今天为大家分享一个java语言编写的个人记账网站&#xff0c;目前系统功能已经很全面&#xff0c;后续会进一步完善。整个系统界面漂亮&#xff0c;有完整得源码&#xff0c;希望大家可以喜欢。喜欢的帮忙点赞和关注。一起编程、一起进步 开发环境 开发语言为Java&#xff0c;开…

Vue2+3入门到实战

作为IT技术相关行业不可或缺的岗位之一&#xff0c;前端开发工程师就业前途广阔&#xff0c;一直是很多同学心中转行的首选行业。但很多人还没开始&#xff0c;便被一系列问题难倒了&#xff0c;比如&#xff1a;前端该如何入门&#xff1f;路线图是怎样的&#xff1f;想要找到…

尝试用 ChatGPT 完整的实现一个 Serverless 后端工程

❝ 本文转自 Xiaowen.Z 的博客&#xff0c;原文&#xff1a;https://xiaowenz.com/blog/2023/04/coding-with-chatgpt-pilot/&#xff0c;版权归原作者所有。欢迎投稿&#xff0c;投稿请添加微信好友&#xff1a;cloud-native-yang 写在前面 因为从过年开始&#xff0c;断断续续…

只因为给我打了0.1分,重新撸了个记账小程序

2019年的时候和朋友出去旅行&#xff0c;因为需要A账单&#xff0c;所以前一天开发了一个记账小程序&#xff0c;时间匆忙&#xff0c;就随便完成基础记账和AA计算功能后就上线&#xff0c;旅行结束后也就没用过了&#xff0c;前几天无意登录&#xff0c;发现被打了1.0分。 叔能…

总体设计(软件项目)

1.引言 1.1编写目的 由前面的需求分析&#xff0c;得出了系统的基本需求&#xff0c;要实现整个系统&#xff0c;需要对用户的需求进行设计&#xff0c;概要设计主要是利用比较抽象的语言对整个系统进行概括&#xff0c;确定对系统的物理配置&#xff0c;确定整个系统的处理流…

ChatGPT是什么,一文读懂ChatGPT

ChatGPT是个啥? 近期很多朋友后台私信GPT如何访问,我在网上找到一个免梯子的GPT,使用起来还是挺顺畅的,有需要的可以尝试使用,传送门,界面也挺清新的 近期,OpenAI 发布了 ChatGPT,是一个可以对话的方式进行交互的模型,因为它的智能化,得到了很多用户的欢迎。ChatG…

ChatGPT实战:如何进行高难度沟通

最近发现了一个很实用的 ChatGPT 在职场中的应用场景——高难度沟通。对于一个没有什么经验的职场人来说&#xff0c;在第一次面对催促项目进度、礼貌地告诉甲方你们给的钱实在太少了、向老板反馈最近加班太多了等等沟通场景&#xff0c;会很手足无措。 有了 ChatGPT 之后&…

chatgpt搭建企业级量身定制

如果要搭建企业级量身定制的ChatGPT系统&#xff0c;可能需要经过以下几个步骤&#xff1a; 需求分析和设计&#xff1a;根据企业的实际需求&#xff0c;确定ChatGPT的功能和性能指标&#xff0c;并进行系统设计和架构规划。 数据收集和预处理&#xff1a;收集与应用场…