教你快速做一个自己的“ChatGPT”
摘要:在国内使用ChatGPT有些不便,是否可以基于OpenAI开放的API做一个给自己或者同事们使用的聊天机器人,甚至集成到更多的场景….
本文分享自华为云社区《使用 FunctionGraph 快速构建自己的“ChatGPT”》,作者:ChatGPT 、果宝、历川。
一、背景
ChatGPT是一个基于GPT-3模型的聊天机器人,可以与用户进行自然、流畅和有趣的对话。ChatGPT可以理解和使用多种语言,如英语、中文、日语、西班牙语、法语或德语;还可以根据用户的兴趣和需求,提供相关建议和创意内容,如诗歌、故事、代码、歌词等。ChatGPT是一个强大而灵活的工具,可以用于娱乐、学习或工作。
但是在国内使用ChatGPT有些不便,是否可以基于OpenAI开放的API做一个给自己或者同事们使用的聊天机器人,甚至集成到更多的场景…. 效果如下:
二、方案选型
说干就干,我们先从做一个自己的机器人开始,首先我们从OpenAI获取用于鉴权的秘钥。
然后写一个请求OpenAI接口的代码,并写一个web服务接口开放出去,再搭配一个交互用的前端即可。看起来是1小时的工作量,但是如何部署这个服务呢? 购买一个云服务器再安装环境或者配置容器也太麻烦了,于是我问了ChatGPT:
可以看到, 使用FunctionGraph只需要聚焦完成请求OpenAI接口的功能函数,不需要购买和配置资源,甚至不需要写Web接口的代码。 于是一个简单的方案如下:
其中,
- 对象存储服务OBS:用于托管前端页面
- FunctionGraph : 用于响应前端请求,运行代码向OpenAI发送问题
- API网关: 对外开放调用函数的API
注:“函数” 是指客户部署在FunctionGraph上的代码,它可以是一个或多个文件组成的程序,甚至编译好的二进制文件。 如Python 脚本文件,Java的jar 包。
三、开发并部署聊天应用
3.1 创建FunctionGraph函数处理用户提问的请求
首先创建并开发FunctionGraph函数,打开华为云FunctionGraph 产品页面,由于只有一个简单的问题查询接口,这里我们选用事件函数 使用Python 3.9 运行时。
注:事件函数,可以由某类事件触发函数运行,如用户对该函数发送了HTTP请求,关联到该函数的消息队列里产生了新消息,都会自动触发函数运行。
对于事件函数,通常程序入口方法(这里是 handler)会有两个参数:
- event 参数: 包含触发用户函数的事件的相关信息。HTTP请求也是一种事件,event里会包含请求的body header 等;
- context 参数: 调用平台的相关能力,如获取在函数配置里设置的加密环境变量等
图:FunctionGraph 函数源码
上图为本次调用的入口方法handler(),在函数中,我们:
- 从event 里取得请求的参数 prompt
- 调用OpenAI 的接口Python SDK,向OpenAI 发送请求, (示例里我们使用text-davinci-003模型 [1] https://platform.openai.com/docs/model-index-for-researchers#footnote-2)
- handler 方法中我们使用了 context 获取访问OpenAI的key(上图29行) ,获取前需要在函数上配置对应环境变量,如下图所示:
图:函数配置环境变量
注:示例中我们使用了OpenAI的sdk ,也可以将sdk放在函数代码里一起上传,或利用函数的依赖管理能力,通过添加依赖的方式实现:
图:函数配置依赖
在编辑好代码后,只需要点击部署按钮即可完成部署。
3.2 创建APIG触发器来开放接口
通常对于使用函数开发WEB 后端的场景,我们使用API 网关服务,来将函数开放出去供前端访问。为函数在API网关上注册API非常简单,只需要在函数页面上创建APIG触发器:
注意:这里将后端超时时间设定为一个较大的时间,如60s,因为OpenAi的接口响应较慢。在北京4局点中,APIG服务有共享版,支持按需计费,若有较大的流量可以考虑购买APIG独享实例。
图:为GPT函数绑定APIG触发器
APIG触发器上的调用URL,可以直接用于向后端发送请求,该URL 为测试URL,每日仅可访问1000次,可以点击触发器跳转到APIG页面绑定自己的域名。
3.3 托管前端页面到OBS
- 我们准备了一个简单的前端,只需改下前端页面配置的后端地址即可。
- 创建一个OBS 桶,上传前端文件
- 配置OBS 桶静态文件托管,将桶访问权限设置为公共读,并在静态网站托管选项里配置默认首页,将自己的域名指向访问地址。
最后,通过访问配置的域名访问页面,开始体验!
至此,我们其实已经完成了整个简单聊天系统的搭建,案例中我们使用了一个简单的前端页面,开发者也可以考虑集成到如VSCode插件,语音聊天机器人,微信公众号等等。
更进一步,若想使用Serverless技术,开发更为完整,适合生产环境的应用,需要添加鉴权,数据库连接等功能。
四、为后端服务增加接口鉴权
以上我们已经基于FunctionGraph 函数创建了一个简易聊天系统的后端的服务,但是该接口没有任何鉴权,如果开放接口,所有用户都可以访问。
如果需要用户登录后才可以使用,如何做?一个思路是在原有业务代码里增加鉴权,这里我们也可以考虑使用APIG自定义鉴权即APIG组合FunctionGraph 鉴权的形式。 一个新的解决方案,如下。
4.1 创建并配置APIG自定义鉴权函数
使用APIG 自定义鉴权有以下优势:
- 提升开发效率:鉴权与业务解耦,新增逻辑只需关注业务,无需引入鉴权;鉴权代码集中而非分散在多个业务模块,更新鉴权逻辑只需要更新鉴权模块而非所有业务模块;
- 降低成本:对于使用大规格函数进行后端服务的代码,无效请求可以直接由较小规格的鉴权函数拦截,降低大中规格资源服务的运行成本;
- 创建鉴权函数
和普通函数的创建流程一样,只需要注意响应的格式,一个使用JWT 鉴权的简单案例如下。
- 编辑接口,配置自定义鉴权
编辑对应的API,选择自定义鉴权,选择到我们创建的函数:
一个鉴权拒绝的示例如下:
4.2 创建授权函数
基于以上自定义鉴权模式,开发者可以组合自己已有的鉴权逻辑放到自定义鉴权函数中。如果进一步想基于FunctionGraph 创建一个 “登录” 或token授权函数,可以考虑以下方案。
我们首先需要创建一个函数,该函数用于接收用户登录请求,然后去数据库请求,判断用户合法则返回鉴权token。
- 创建授权函数
创建一个普通的事件函数即可,一个简单的示例如下,随后可以为其创建APIG 触发器。
注意,如果需要函数访问VPC里的资源,如本例中的RDS,需要在函数页面配置RDS所在的VPC。
五、“ChatGPT”的升级和“运维”
5.1 日志与监控
使用函数,系统会自动收集用户打印在控制台的日志,用户无需处理日志落盘,收集或直接上报。对于每一条请求日志,FunctionGraph 还会显示请求执行耗时,使用内存及请求状态。
用户可以基于关键词,请求状态进行过滤和检索。
图:函数用户日志页面
同时,平台自动收集函数运行指标,如调用次数,运行时间,错误次数,被拒绝次数,并发数等。
图:函数监控
5.2 版本迭代
在用户更新函数代码时,为保障“ChatGPT”业务稳定运行,可以配置APIG触发器的后端服务指向函数别名:
图:函数别名
图:FunctionGraph别名灰度版本
拥抱Serverless,释放生产力,函数工作流 FunctionGraph
教你快速做一个自己的“ChatGPT”的更多相关文章
- 如何用Mockplus快速做一个手风琴菜单?
手风琴菜单是一种比较常用的菜单形式,利用原型工具来做这种菜单通常要用到中继器.即使是功能强大的Axure,想实现该效果也比较麻烦.但如果你对Mockplus有所了解,你一定知道,利用Mockplus的 ...
- 教你动手做一个 iOS 越狱 app
前言 俗话说得好, 万事开头难. 仅仅是上图一个如此简单地不能再简单的小app, 其实都不算是app, 只是注入了一段代码进系统中, 等到特定的函数方法调用的时候就会被我们hook掉, 执行我们写的代 ...
- 教你如何做一个优雅的Ecmascripter /转
看看这些被同事喷的JS代码风格你写过多少 殷荣桧 JavaScript 今天 现在写代码比以前好多了,代码的格式都有eslint,prettier,babel(写新版语法)这些来保证,然而,技术手段再 ...
- 教你快速撸一个免费HTTPS证书
摘要: 免费 HTTPS 证书,了解一下? HTTPS 已成为业界标准,这篇博客将教你申请Let's Encrypt的免费 HTTPS 证书. 本文的操作是在 Ubuntu 16.04 下进行,使用 ...
- 教你用webgl快速创建一个小世界
收录待用,修改转载已取得腾讯云授权 作者:TAT.vorshen Webgl的魅力在于可以创造一个自己的3D世界,但相比较canvas2D来说,除了物体的移动旋转变换完全依赖矩阵增加了复杂度,就连生成 ...
- 3分钟教你做一个iphone手机浏览器
3分钟教你做一个iphone手机浏览器 第一步:新建一个Single View工程: 第二步:新建好工程,关闭arc. 第三步:拖放一个Text Field 一个UIButton 和一个 UIWebV ...
- 手把手教你利用微软的Bot Framework,LUIS,QnA Maker做一个简单的对话机器人
最近由于要参加微软亚洲研究院的夏令营,需要利用微软的服务搭建一个对话Bot,以便对俱乐部的情况进行介绍,所以现学了几天,搭建了一个简单的对话Bot,期间参考了大量的资料,尤其是下面的这篇博客: htt ...
- R数据分析:跟随top期刊手把手教你做一个临床预测模型
临床预测模型也是大家比较感兴趣的,今天就带着大家看一篇临床预测模型的文章,并且用一个例子给大家过一遍做法. 这篇文章来自护理领域顶级期刊的文章,文章名在下面 Ballesta-Castillejos ...
- 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)
大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...
- 【酷Q插件制作】教大家做一个简单的签到插件
酷Q插件已经有很多了,社区分享一大堆,不过还是自己写才有乐趣,哈哈.不得不吐槽一下,酷Q竟然不更新了,出了个酷Q pro,还收费!!诶.不过这也影响不了咱写插件的心情,今天教大家写一个酷Q签到插件,虽 ...
随机推荐
- 2022-2023年度必备宇宙最全Windows系统软件清单
作为PC端的第一生产力工具,相信对于绝大部分人来说,Windows系统是一款不可替代的产品.既然如此,Pytrick今天就拿出珍藏多年的压箱底宝贝无偿分享给各位,给大家逐一介绍下这些体验一级棒的应用软 ...
- VulnHub靶机渗透实战9-vikings
本次靶机是CTF风格的靶机. 靶场地址:Vikings: 1 ~ VulnHub 网络呢还是桥接模式. Description Back to the Top A CTF machine with ...
- windows GO语言环境配置
目录 GO语言下载 安装goland go目录简介 配置gopath goland里添加goroot和gopath GO语言下载 参考教程:https://www.cnblogs.com/Domini ...
- python注释、变量、数据类型详细
目录 1.python注释 2.PEP8规范 3.变量与常量 1.python中的变量 2.变量名的命名规范 3.常量的基本使用 1.python注释 什么是注释? 注释是对代码的解释说明,写注释是为 ...
- uniapp 微信小程序 根据经纬度解析地址(腾讯地图)
//引入腾旭地图sdk import QQMapWX from '../../common/qqmap-wx-jssdk.js' onLoad(){ this.getMapAddress() }, m ...
- python从公众号文章中获取二维码
在做一个公众号采集的项目中,客户有个要求,想把二维码的url保存到数据库中,如图. 原本以为要各种骚操作各种逆向才能获取得到,没想到竟然很简单. 第一步 观察二维码url的规范 https://mp. ...
- 01.Java面试都问啥?
大家好,我是王有志.好久不见,不过这次没有休假,而是搞了个"大"工程,花了点时间自学Python,然后写了"玩具爬虫",爬某准网的面经数据,为来年的" ...
- Django简介以及基本使用
目录 Django简介以及基本使用 一.django简介 1.web框架的本质是什么 ? 2.python主流web框架有那些 ? 3.web框架的推导过程 二.基本使用 1.运行django注意事项 ...
- vue3学习第一天
第一章 Options API与Composition API 重写双向绑定 vue2 基于Object.defineProperty()实现 vue3 基于Proxy proxy与Object.de ...
- ssm——spring整理
目录 1.概述 2.Spring工厂与IOC 2.1.为什么要有Spring框架 2.2.什么是IOC 2.Spring工厂对实例注入 2.1.使用标签进行注入 2.2.使用注解进行注入 2.2.3. ...