用 ChatGPT 十分钟内 构建自己的 Serverless (用ChatGPT需要挂梯子吗)

用 ChatGPT 十分钟内 构建自己的 Serverless (用ChatGPT需要挂梯子吗)

点击查看 Serverless 系列文章:

Serverless 时代的微服务开发指南:华为云提出七大实践新标准

华为云发布冷启动加速解决方案:助力 Serverless 计算速度提升 90%+

Serverless Streaming:毫秒级流式大文件处理探秘

背景

ChatGPT 是一个基于 GPT-3 模型的聊天机器人,可以与用户进行自然、流畅和有趣的对话。它可以理解和使用多种语言,如英语、中文、日语、西班牙语、法语或德语;还可以根据用户的兴趣和需求,提供相关建议和创意内容,如诗歌、故事、代码、歌词等。ChatGPT 是一个强大而灵活的工具,可以用于娱乐、学习或工作。

我们是否可以基于 OpenAI 开放的 API 做一个给自己或者同事们使用的聊天机器人,甚至集成到更多场景中。简易效果如下图所示:

方案选型

说干就干,我们先从做一个自己的机器人开始,首先我们从 OpenAI 获取用于鉴权的秘钥。

然后写一个请求 OpenAI 接口的代码,并写一个 web 服务接口开放出去,再搭配一个交互用的前端即可。看起来是 1 小时的工作量,但是如何部署这个服务呢?购买一个云服务器 再安装环境或者配置容器也太麻烦了,于是我向 ChatGPT 请教:

可以看到, 使用 FunctionGraph 只需要聚焦完成请求 OpenAI 接口的功能函数,不需要购买和配置资源,甚至不需要写 Web 接口的代码。一个简单的方案如下:

其中,

注:FunctionGraph 是华为云 Serverless 产品[1];“函数” 是指客户部署在 FunctionGraph 上的代码,它可以是一个或多个代码文件组成的程序,编译好的二进制文件等;如 Python 脚本文件,Java 的 jar 包。

开发并部署聊天应用

3.1 创建 FunctionGraph 函数处理用户提问的请求

首先创建并开发 FunctionGraph 函数,打开华为云 FunctionGraph 产品页面,由于只有一个简单的问题查询接口,这里我们选用 事件函数 使用 Python 3.9 运行时。

注:事件函数,可以由某类事件触发函数运行,如用户对该函数发送了 HTTP 请求,关联到该函数的消息队列里产生了新消息,都会自动触发函数运行。

对于事件函数,通常程序入口方法(这里是 handler)会有两个参数:

上图为本次调用的入口方法 handler(),在函数中,我们:

1. 从 event 里取得请求的参数 prompt

2. 调用 OpenAI 的 Python SDK,向 OpenAI 发送请求调用 OpenAI 开放的模型[2]

3. Handler 方法中我们使用了 context 获取访问 OpenAI 的 key ,获取前需要在函数上配置对应环境变量,如下图所示:

注:示例中我们使用了 OpenAI 的 sdk ,也可以将 sdk 放在函数代码里一起上传,或利用平台的依赖管理能力,通过添加依赖的方式实现:

在编辑好代码后,只需要点击部署按钮即可完成部署。

3.2 创建 APIG 触发器来开放接口

通常对于使用函数开发 WEB 后端的场景,我们使用 API 网关服务,来将函数开放出去供前端访问。为函数在 API 网关上注册 API 非常简单,只需要在函数页面上创建 APIG 触发器:

注意:这里将后端超时时间设定为一个较大的时间,如 60s,因为 OpenAI 的接口响应较慢。

APIG 触发器上的调用 URL,可以直接用于向后端发送请求,该 URL 为测试 URL,每日仅可访问 1000 次,可以点击触发器跳转到 APIG 页面绑定自己的域名。

3.3 托管前端页面到 OBS

最后,通过访问配置的域名访问页面,开始体验!

至此,我们已经完成了整个简单聊天系统的搭建 ,案例中我们使用了一个简单的前端页面,开发者也可以考虑集成到如 VSCode 插件,语音聊天机器人,微信公众号,等等。

为后端服务增加接口鉴权

以上我们已经基于 FunctionGraph 函数创建了一个简易聊天系统的后端的服务,但是该接口没有任何鉴权,如果开放接口,所有用户都可以访问。

如果需要用户登录后才可以使用,如何做?一个思路是在原有业务代码里增加鉴权,这里我们也可以考虑使用 APIG 自定义鉴权即 APIG 组合 FunctionGraph 鉴权的形式。一个新的解决方案,如下。

4.1 创建并配置 APIG 自定义鉴权函数

使用 APIG 结合函数进行自定义鉴权有以下优势:

1. 提升开发效率:鉴权与业务解耦,新增逻辑只需关注业务,无需引入鉴权;鉴权代码集中而非分散在多个业务模块,更新鉴权逻辑只需要更新鉴权模块而非所有业务模块;

2. 降低成本:对于使用大规格函数进行后端服务的代码,无效请求可以直接由较小规格的鉴权函数拦截,降低大中规格资源服务的运行成本;

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

4.2 创建授权函数

基于以上自定义鉴权模式,开发者可以组合自己已有的鉴权逻辑放到自定义鉴权函数中。如果进一步再想实现“登录”功能可以创建一个函数来接收请求查询数据库,如:

创建一个普通的事件函数即可,一个简单的示例如下,随后可以为其创建 APIG 触发器。

“ChatGPT”的升级和观测

5.1 日志与监控

Serverless 计算 平台会自动收集用户打印在控制台的日志,用户无需处理日志落盘,收集或直接上报。用户可以基于关键词,请求状态进行过滤和检索。

同时,平台自动收集函数运行指标,如调用次数、运行时间、错误次数、被拒绝次数,并发数等。

5.2 版本迭代

在用户更新函数代码时,为保障机器人业务稳定运行,可以配置 APIG 触发器的后端服务指向函数别名,更新完代码后创建新版本,将别名指向该版本即可:

[1] 华为云 Severless FunctionGraphOpenAI 开放的各模型今日好文推荐

阿里过去一年裁员达19000人;字节跳动布局中国版 ChatGPT;马斯克称下周将开源推特算法代码 | Q资讯

技术裁员正在助长新的创业潮:本来犹豫要不要创业,没想到公司替我做了决定

入行 14 年,我还是觉得编程很难:给大项目写代码没意思还危险

马斯克猛烈抨击 ChatGPT引轰动:“这不是我想要的”

声明:本文来自用户分享和网络收集,仅供学习与参考,测试请备份。