1.簡介
ChatGPT 是目前非常熱門的人工智能(AI)自然語言處理應用工具。它能夠通過學習和了解人類的語言來進行對話,可廣泛應用于客服聊天機器人、問答系統、虛拟個人助手等應用。它還被用于模仿人類生成多種格式的文本,包括對話,講故事,新聞文章等。ChatGPT 因其能夠了解自然語言,生成高品質,連貫的文本和有意義的響應而獲得公衆和研究界的贊譽褒獎。接下來我們将示範如何使用 Amazon Lambda 等無伺服器計算産品,以及 Amazon S3 建構一個無伺服器的、低成本的 Web 應用程式作為你的個人 AI 助手。本項目中使用的所有服務都涵蓋在亞馬遜雲科技提供的免費服務套餐中。用到的亞馬遜雲科技服務有:
- Amazon API Gateway
- Amazon Lambda
- Amazon S3
- Amazon DynamoDB
你也可以在 https://www.amazonaws.cn/free/ 檢視免費套餐的詳細資訊。
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 .
Bash
- 本示範應用需要建立 3 個 Amazon Lambda 函數,是以總共需要建立 3 個 . zip 檔案:
- lambda_auth.zip
- lambda_login.zip
- lambda_chat.zip
6.建立 Lambda 函數
6.1 建立一個 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 分鐘。
6.2 建立一個 Lambda 函數,用于 AWS API Gateway 請求鑒權在亞馬遜雲科技 Lambda 控制台中,從頭開始建立一個名為 chat-authorizer 的 Lambda 函數,選擇 Node.js 作為運作時。
在環境變量中配置一個名為“TOKEN_KEY”的環境變量,自定義一個值,該值将作為 JWT 簽名密鑰。
将之前建立的 lambda_auth.zip 檔案上傳到 Lambda 代碼源(與建立 open-chat 步驟相同)。6.3 建立一個 Lambda 函數來處理使用者登入請求在亞馬遜雲科技 Lambda 控制台中,從頭開始建立一個名為 openai-login 的 lambda 函數,選擇 Node.js 作為運作時。
添加 TOKEN_KEY 環境變量(與 chat-authorizer 相同):
此函數将調用 DynamoDB 的 API 來驗證使用者名和密碼,是以我們需要附加 Amazon DynamoDBReadOnlyAccess 政策或為此函數的執行角色建立通路 DynamoDB 的内聯政策。
将之前建立的 lambda_login.zip 檔案上傳到 Lambda 代碼源(與建立 open-chat 步驟相同)。7. 建立 API Gateway7.1 建立一個名為“chatbot”的 HTTP API
7.2 建立兩個 POST 方法的路由:/chat,/login
7.3 對于 /chat 路由,建立 Lambda 授權方,以及內建到 Lambda 函數建立一個 Lambda 授權方,在 Lambda 函數字段中,選擇你之前建立的”chat-authorizer“函數。
建立并附加一個 Lambda 內建,內建目标是之前建立的“openai-chat”函數。
7.4 對于 /login 路由,建立并附加一個 Lambda 內建,內建目标是之前建立的“openai-login”函數
7.5 設定 CORS 配置如下
8. 建立 DynamoDB 表
本示範應用使用 Amazon DynamoDB 存儲使用者名和密碼憑證。為了簡化示範,暫未實作注冊功能和密碼加密存儲功能,你可以直接将使用者和明文密碼添加到 Dynamo 的表中。或者你可以參考代碼包中的 AWS CLI。
- 登入并打開 Amazon DynamoDB 控制台,建立一個表名 chat_user_info,分區鍵名為 username,字元串類型。
将你的使用者名和密碼對添加到表中。添加一個字元串類型的新屬性“password”,用于存放使用者對應的密碼。
9. 部署 S3 托管網站
9.1 建立 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/*" ] } ] } JSON9.2 編譯網站靜态檔案在本地環境中,轉到 client/src/commons 檔案夾,将 apigw.js 的第一行更改為你建立的實際的 API gateway 端點。
- 在 client 目錄下,然後運作這些指令來編譯靜态網站的檔案。
>cd client
>npm install
>npm run build
Bash
“npm run build”指令運作完成後,它将在 client 檔案夾中生成一個名為“build”的檔案夾。該檔案夾包含了要部署到 Amazon S3 網站的所有靜态檔案。
你可以通過 S3 控制台将此檔案夾上傳到存儲桶 AWS 或使用 AWSCLI,如下所示:
>aws s3 sync ./build/ s3://bucket-name/
Bash
- 完成所有步驟後,現在您可以在 PC /Mobile 浏覽器中通路 S3 網站,并使用你預先設定在 DynamoDB 表中的使用者名和密碼來登入進入。Amazon S3 靜态托管網站的通路端點可以在“屬性”頁籤中找到。
文章轉載至:使用 Amazon Lambda 等無伺服器産品建構自己的 ChatGPT 應用 | 亞馬遜AWS官方部落格