简介
ChatGPT 是目前非常热门的人工智能(AI)自然语言处理应用工具。它能够通过学习和理解人类的语言来进行对话,可广泛应用于客服聊天机器人、问答系统、虚拟个人助手等应用。它还被用于模仿人类生成多种格式的文本,包括对话,讲故事,新闻文章等。
ChatGPT 因其能够理解自然语言,生成高质量,连贯的文本和有意义的响应而获得公众和研究界的赞誉褒奖。接下来我们将演示如何使用 Amazon Lambda 等无服务器计算产品,以及 Amazon S3 构建一个无服务器的、低成本的 Web 应用程序作为你的个人 AI 助手。
1.创建账户
- 免费使用 100 余种云产品或服务, 长达 12 个月,任选亚马逊云科技海外区域节点。
2.整体架构
- 使用 Amazon S3 存储桶托管前端客户端的 Html、JS、CSS 文件。
- 使用 Amazon API Gateway 将前端请求从客户端路由到后端服务。
- 后端服务部署在 Amazon Lambda 之上,其中包括 API 鉴权功能,用户登录的功能,处理来自客户端的聊天会话的请求并调用 OpenAI SDK 以从 OpenAI 服务器获取响应文本返回给客户端。
- 创建一个 Amazon DynamoDB 表来存储登陆用户名和密码,用于用户登录的基本授权。

3.先决条件
- 首先你需要自行创建一个 OpenAI 帐户,或者使用已有 OpenAI 账户,并在后台生成一个 API 密钥。后面在使用 OpenAI 的 API 时需要传入这个密钥。

- 亚马逊云科技的帐户。如果你的帐户可以享受亚马逊云科技提供的免费套餐,那么在免费套餐配额范围内的费用将为 0。
4.设置本地环境
- 安装 Nodejs(如果已经安装了,请跳过此步)
本次演示应用的前后端采用 Nodejs 开发,因此需要在本地环境中安装 Nodejs,用于编译静态网页文件和 Amazon Lambda 函数的依赖包。
5.获取源代码并构建包
- 从 github 下载代码包到本地。
>git clone https://github.com/aws-samples/aws-serverless-openai-chatbot-demo.git
- 该项目文件夹结构为:

server 文件夹包含后端 lambda 函数的代码。client 文件夹包含前端网页的代码。
- 分别转到 server 文件夹下的各个 lambda 函数文件夹,安装依赖项并打包制作 . zip 文件,以上传到 Amazon Lambda。例如,要制作 zip,则使用以下命令:
>cd server/lambda_login
>npm install
>zip -r lambda_login.zip .
- 本演示应用需要创建 3 个 Amazon Lambda 函数,所以总共需要创建 3 个 . zip 文件:
- lambda_auth.zip
- lambda_login.zip
- lambda_chat.zip
6.创建 Lambda 函数
- 在亚马逊云科技 Lambda 控制台中,从头开始创建一个名为 openai-chat 的函数,选择 Node.js 作为运行时。(备注:如果您使用带有 M1/M2 芯片的 Mac 在本地构建 NodeJS 依赖项,请记住选择“arm64”作为架构选项。)

- 将上一步创建的 lambda_chat.zip 上传到 Lambda 代码源。

- 在环境变量中,创建”OPENAI_API_KEY“的键,并将自己的 OpenAI API KEY 配置成值。

- OpenAI 的接口的响应时间往往会超过 3 秒,因此要请将这个 lambda 函数的超时设置更改为更大的值,如 1 分钟。

- 在亚马逊云科技 Lambda 控制台中,从头开始创建一个名为 chat-authorizer 的 Lambda 函数,选择 Node.js 作为运行时。

- 在环境变量中配置一个名为“TOKEN_KEY”的环境变量,自定义一个值,该值将作为 JWT 签名密钥。

- 将之前创建的 lambda_auth.zip 文件上传到 Lambda 代码源(与创建 open-chat 步骤相同)。
- 在亚马逊云科技 Lambda 控制台中,从头开始创建一个名为 openai-login 的 lambda 函数,选择 Node.js 作为运行时。

- 添加 TOKEN_KEY 环境变量(与 chat-authorizer 相同):

- 此函数将调用 DynamoDB 的 API 来验证用户名和密码,因此我们需要附加 Amazon DynamoDBReadOnlyAccess 策略或为此函数的执行角色创建访问 DynamoDB 的内联策略。

- 将之前创建的 lambda_login.zip 文件上传到 Lambda 代码源(与创建 open-chat 步骤相同)。
7. 创建 API Gateway


- 创建一个 Lambda 授权方,在 Lambda 函数字段中,选择你之前创建的”chat-authorizer“函数。

- 创建并附加一个 Lambda 集成,集成目标是之前创建的“openai-chat”函数。



8. 创建 DynamoDB 表
- 登录并打开 Amazon DynamoDB 控制台,创建一个表名 chat_user_info,分区键名为 username,字符串类型。

- 将你的用户名和密码对添加到表中。添加一个字符串类型的新属性“password”,用于存放用户对应的密码。

9. 部署 S3 托管网站
详情可参考:https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html
将存储桶配置为静态网站时,必须启用静态网站托管、配置索引文档并设置权限。
- 在 Amazon S3 控制台上创建一个名为 Bucket-name(请替换成自己的存储桶名称)的 S3 存储桶。
- 在“属性”选项卡中启用此存储桶的静态网站托管功能。在索引文档中,输入索引文档的文件名 index.html。

- 默认情况下,S3 存储桶会阻止公共访问。你需要在“权限”选项卡中更改设置。

- 并将以下策略(请修改 bucket-name 为实际存储桶名称)添加到存储桶策略以允许能从 internet 访问。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws-cn:s3:::Bucket-Name/*"
]
}
]
}
- 在本地环境中,转到 client/src/commons 文件夹,将 apigw.js 的第一行更改为你创建的实际的 API gateway 端点。

- 在 client 目录下,然后运行这些命令来编译静态网站的文件。
>cd client
>npm install
>npm run build

>aws s3 sync ./build/ s3://bucket-name/
- 完成所有步骤后,现在您可以在 PC /Mobile 浏览器中访问 S3 网站,并使用你预先设置在 DynamoDB 表中的用户名和密码来登录进入。Amazon S3 静态托管网站的访问端点可以在“属性”选项卡中找到。

