最新消息:OpenAI又发“超能力”!GPT4 十秒就能做个网站!还能修BUG

在国内使用 ChatGPT 有些不便,是否可以基于 OpenAI 开放的 API 做一个给自己或者同事们使用的聊天机器人,甚至集成到更多的场景….  
本文分享自华为云社区《使用 FunctionGraph 快速构建自己的 “ChatGPT”》https://bbs.huaweicloud.com/forum/thread-0267112517194935037-1-1.html,作者:ChatGPT 、果宝、历川。

  一、背景

ChatGPT 是一个基于 GPT-3 模型的聊天机器人,可以与用户进行自然、流畅和有趣的对话。ChatGPT 可以理解和使用多种语言,如英语、中文、日语、西班牙语、法语或德语;还可以根据用户的兴趣和需求,提供相关建议和创意内容,如诗歌、故事、代码、歌词等。ChatGPT 是一个强大而灵活的工具,可以用于娱乐、学习或工作。
但是在国内使用 ChatGPT 有些不便,是否可以基于 OpenAI 开放的 API 做一个给自己或者同事们使用的聊天机器人,甚至集成到更多的场景…. 效果如下:
    v2-3d302cd107269230bc32b82b106b9da0_720w.jpg

  二、方案选型
说干就干,我们先从做一个自己的机器人开始,首先我们从 OpenAI 获取用于鉴权的秘钥。
    v2-902288e6c99f50ada69385cd59d7e39f_720w.jpg
然后写一个请求 OpenAI 接口的代码,并写一个 web 服务接口开放出去,再搭配一个交互用的前端即可。看起来是 1 小时的工作量,但是如何部署这个服务呢? 购买一个云服务器再安装环境或者配置容器也太麻烦了,于是我问了 ChatGPT:
    v2-04177f2ba1783fb9d4ca82824d514987_720w.jpg
可以看到, 使用 FunctionGraph 只需要聚焦完成请求 OpenAI 接口的功能函数,不需要购买和配置资源,甚至不需要写 Web 接口的代码。 于是一个简单的方案如下:
    v2-e227f3720d815b68e687b73545011b1a_720w.jpg
其中,

  • 对象存储服务 OBS:用于托管前端页面
  • FunctionGraph : 用于响应前端请求,运行代码向 OpenAI 发送问题
  • API 网关: 对外开放调用函数的 API
注:“函数” 是指客户部署在 FunctionGraph 上的代码,它可以是一个或多个文件组成的程序,甚至编译好的二进制文件。 如 Python 脚本文件,Java 的 jar 包。

  三、开发并部署聊天应用
  3.1 创建 FunctionGraph 函数处理用户提问的请求
首先创建并开发 FunctionGraph 函数,打开华为云 FunctionGraph 产品页面,由于只有一个简单的问题查询接口,这里我们选用事件函数 使用 Python 3.9 运行时。
    v2-08abca51d1e5fbc2e817bad9f12ea600_720w.jpg
注:事件函数,可以由某类事件触发函数运行,如用户对该函数发送了 HTTP 请求,关联到该函数的消息队列里产生了新消息,都会自动触发函数运行。
对于事件函数,通常程序入口方法(这里是 handler)会有两个参数:

  • event 参数 包含触发用户函数的事件的相关信息。HTTP 请求也是一种事件,event 里会包含请求的 body header 等;
  • context 参数: 调用平台的相关能力,如获取在函数配置里设置的加密环境变量等
    v2-868cf69380d88d1cb800325afb14a2a3_720w.jpg
图: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 行) ,获取前需要在函数上配置对应环境变量,如下图所示:
    v2-cb26fdd1e0822b155d3f461c8838d99b_720w.jpg
图:函数配置环境变量
注:示例中我们使用了 OpenAI 的 sdk ,也可以将 sdk 放在函数代码里一起上传,或利用函数的依赖管理能力,通过添加依赖的方式实现:
    v2-ff907eb2bf7a4b4809ed998aac7d71c3_720w.jpg
图:函数配置依赖
在编辑好代码后,只需要点击部署按钮即可完成部署。

  3.2 创建 APIG 触发器来开放接口
通常对于使用函数开发 WEB 后端的场景,我们使用 API 网关服务,来将函数开放出去供前端访问。为函数在 API 网关上注册 API 非常简单,只需要在函数页面上创建 APIG 触发器:
    v2-58dc586195a2471e289122a8755156d0_720w.jpg
注意:这里将后端超时时间设定为一个较大的时间,如 60s,因为 OpenAi 的接口响应较慢。在北京 4 局点中,APIG 服务有共享版,支持按需计费,若有较大的流量可以考虑购买 APIG 独享实例。
    v2-ca18eb36c3f47a0deda2bfabcaeffe38_720w.jpg
图:为 GPT 函数绑定 APIG 触发器
APIG 触发器上的调用 URL,可以直接用于向后端发送请求,该 URL 为测试 URL,每日仅可访问 1000 次,可以点击触发器跳转到 APIG 页面绑定自己的域名。

  3.3 托管前端页面到 OBS

  • 我们准备了一个简单的前端,只需改下前端页面配置的后端地址即可。
  • 创建一个 OBS 桶,上传前端文件
    v2-1c81ec5de63ae47072041366fbc55b88_720w.jpg

  • 配置 OBS 桶静态文件托管,将桶访问权限设置为公共读,并在静态网站托管选项里配置默认首页,将自己的域名指向访问地址。
    v2-70740ea5587d834cec77b66d955ad950_720w.jpg
    v2-b8f1e997c51b9f68bbd8bb67594eacfa_720w.jpg
最后,通过访问配置的域名访问页面,开始体验!
    v2-3d302cd107269230bc32b82b106b9da0_720w.jpg
至此,我们其实已经完成了整个简单聊天系统的搭建,案例中我们使用了一个简单的前端页面,开发者也可以考虑集成到如 VSCode 插件,语音聊天机器人,微信公众号等等。
更进一步,若想使用 Serverless 技术,开发更为完整,适合生产环境的应用,需要添加鉴权,数据库连接等功能。

  四、为后端服务增加接口鉴权
以上我们已经基于 FunctionGraph 函数创建了一个简易聊天系统的后端的服务,但是该接口没有任何鉴权,如果开放接口,所有用户都可以访问。
如果需要用户登录后才可以使用,如何做?一个思路是在原有业务代码里增加鉴权,这里我们也可以考虑使用 APIG 自定义鉴权即 APIG 组合 FunctionGraph 鉴权的形式。 一个新的解决方案,如下。
    v2-5420ae748fe5c7b2b98bd79ac0378952_720w.jpg
  4.1 创建并配置 APIG 自定义鉴权函数
使用 APIG 自定义鉴权有以下优势:

  • 提升开发效率:鉴权与业务解耦,新增逻辑只需关注业务,无需引入鉴权;鉴权代码集中而非分散在多个业务模块,更新鉴权逻辑只需要更新鉴权模块而非所有业务模块;
  • 降低成本:对于使用大规格函数进行后端服务的代码,无效请求可以直接由较小规格的鉴权函数拦截,降低大中规格资源服务的运行成本;

  • 创建鉴权函数
和普通函数的创建流程一样,只需要注意响应的格式,一个使用 JWT 鉴权的简单案例如下。
    v2-547bb5ea40da4820083a4d6d3067b25a_720w.jpg

  • 编辑接口,配置自定义鉴权
编辑对应的 API, 选择自定义鉴权,选择到我们创建的函数:
    v2-195d6477b4f1ecad8ec75cae0427d4ac_720w.jpg
一个鉴权拒绝的示例如下:
    v2-18ffa39d4722975bd727e043197d4443_720w.jpg
  4.2 创建授权函数
基于以上自定义鉴权模式,开发者可以组合自己已有的鉴权逻辑放到自定义鉴权函数中。如果进一步想基于 FunctionGraph 创建一个 “登录” 或 token 授权函数,可以考虑以下方案。
我们首先需要创建一个函数,该函数用于接收用户登录请求,然后去数据库请求,判断用户合法则返回鉴权 token。

  • 创建授权函数
创建一个普通的事件函数即可,一个简单的示例如下,随后可以为其创建 APIG 触发器。
    v2-1a18f900966eb740fb428ea5b76635d0_720w.jpg
注意,如果需要函数访问 VPC 里的资源,如本例中的 RDS,需要在函数页面配置 RDS 所在的 VPC。
    v2-fc295dcd6fe70290a6163b88d1fb9099_720w.jpg

  五、“ChatGPT” 的升级和 “运维”
  5.1 日志与监控
使用函数,系统会自动收集用户打印在控制台的日志,用户无需处理日志落盘,收集或直接上报。对于每一条请求日志,FunctionGraph 还会显示请求执行耗时,使用内存及请求状态。
用户可以基于关键词,请求状态进行过滤和检索。
    v2-e10544479c0cfb10852c0bf6af9f6593_720w.jpg
图:函数用户日志页面
同时,平台自动收集函数运行指标,如调用次数,运行时间,错误次数,被拒绝次数,并发数等。
    v2-f11fbe4d2c8b9061ead144b1afc4687f_720w.jpg
图:函数监控
  5.2 版本迭代
在用户更新函数代码时,为保障 “ChatGPT” 业务稳定运行,可以配置 APIG 触发器的后端服务指向函数别名:
    v2-4bceed77cedb3a4ceef9f70f3457d063_720w.jpg
图:函数别名
    v2-722d8e4c76c4e5c42da58802815c9e17_720w.jpg
    v2-7183b437fa3ab33b9763479c860f03d1_720w.jpg
图:FunctionGraph 别名灰度版本