---
# System prepended metadata

title: 使用 Amazon Bedrock 來打造 Chatbot

---

# 使用 Amazon Bedrock 來打造 Chatbot

* 此頁面短網址：https://tinyurl.com/z3mr3a5t
* AWS 實驗環境網址：https://catalog.us-east-1.prod.workshops.aws/join?access-code=b69f-0a1505-d9
* 敬請填寫回饋表：https://pulse.aws/survey/HU90ZSLB

## 使用 Knowledge Bases for Amazon Bedrock 快速構建知識庫

### 零、登入實驗環境
使用區域：US West (Oregon) us-west-2

* 填寫電子郵件，以獲取登入實驗環境的 OTP 驗證碼

![1.11.1](https://hackmd.io/_uploads/SJjr1bf-1g.png)

![1.11.2](https://hackmd.io/_uploads/rkwIk-GWyx.png)

* 在電子郵件中獲取驗證碼通知郵件並填寫到網頁中

![1.11.3](https://hackmd.io/_uploads/H1XvJWGWye.png)

* 勾選確認後加入 Event

![1.11.4](https://hackmd.io/_uploads/rynD1bzW1x.png)

![1.11.5](https://hackmd.io/_uploads/rkgguJ-MWke.png)

* 成功加入後，點選 Open AWS Console，即可進入 AWS 控制台。注意右上角選擇區域為 US West (Oregon) us-west-2  
![1.11.6](https://hackmd.io/_uploads/r1O_1WGWke.png)

### 一、開通模型權限

* 在最上端搜尋框輸入 `Bedrock`，點選後將進入到 Amazon Bedrock 的 UI 控制台。

點選 Get started：  
![s4](https://hackmd.io/_uploads/HJ-q1ZfWJe.png)

* 在這裡我們可以看到 Amazon Bedrock 支援多個基礎模型 (foundation models),其中包括 Amazon Titan、Claude、Jurassic、Command、Mistral、Stable Diffusion 以及 Llama 2。  
![s5](https://hackmd.io/_uploads/r1vc1WM-ke.png)

* 確認右上角區域，若已是 Oregon，這一步跳過。若不是，請在右上角選擇 Oregon，選擇 us-west-2：  
![s6](https://hackmd.io/_uploads/ByC5kWf-Jx.png)

* 左側的導覽列中點選 Model access，如下圖所示：  
![s7](https://hackmd.io/_uploads/HJQoJ-fbJl.png)

* 若已有相應模型權限，模型後面會顯示 Access granted，可跳過這一步。否則，點選 Enable specific models:  
![model_access](https://hackmd.io/_uploads/rJ5bO7MZ1e.png)

* 選擇 Anthropic 及 Amazon，點選 Save changes  
![model_access_select](https://hackmd.io/_uploads/rJMLumfZJx.png)

* 會有 Access request for 2 models failed 是正常的，可以忽略
![model_access_error](https://hackmd.io/_uploads/BkShu7Mb1g.png)

* 送出後會顯示正在申請中，需稍待 3~5 分鐘，要確認狀態可以重新整理頁面  
![2](https://hackmd.io/_uploads/SJpnkbfbyx.png)

* 重新整理頁面後有看到 Access granted 就代表設定成功，可以開始進行後續的章節  
![3](https://hackmd.io/_uploads/BJmpyWzZye.png)

### 二、上傳文件到 S3 bucket

1. 下載要查詢的文件，我們以勞動基準法為例，點選以下網址後，點選右上角下載，選擇 pdf 檔
https://law.moj.gov.tw/LawClass/LawAll.aspx?PCode=N0030001

![law](https://hackmd.io/_uploads/B17aGbM-ye.png)

2. 通過 https://console.aws.amazon.com/s3/ 打開 Amazon S3 控制台，然後點擊 建立儲存貯體(Create bucket) 按鈕。
3. 給定儲存貯體名稱，例如：*kbbucketxxxx* ， *xxxx* 請改為隨機的4位數字，點擊最下面的 建立儲存貯體(Create bucket) 按鈕。如果已存在，請修改名稱，繼續建立
4. 點擊建立好的儲存貯體，點擊建立資料夾，建立一個資料夾，點擊上傳(Upload)按鈕，點擊新增檔案(Add File)按鈕，上傳前面步驟已下載的文件或您自己的文件，上傳成功後進入對應資料夾中，點擊 複製 S3 URI 按鈕。您也可以直接上傳資料夾(Add Folder)，成功後複製文件夾的 S3 URI。

### 三、建立知識庫
1. 通過 https://console.aws.amazon.com/bedrock/ 打開 Amazon Bedrock 控制台，然後從左側導航窗格中選擇知識庫。
2. 在知識庫部分，選擇建立知識庫。
3. 在提供知識庫詳細資訊頁面上，預設設定保持不變：  
    * 在知識庫詳細訊息部分，為您的知識庫提供名稱和描述。  
    * 在 IAM 權限部分，您可以讓 Amazon Bedrock 建立服務角色  
    * 選擇下一步。  
4. 在設置資料來源頁面上，提供要添加到知識庫中的資料來源的訊息：  
    * 提供資料來源的名稱保持不變，Amazon S3 對象的 URI 需要從第一步中複製過來。  
    * 為您的資料源選擇分塊策略 (Chunking strategy)。不做選擇，預設分塊即可

建立完資料來源後，就無法更改分塊策略。

選擇下一步。    		

5.	在嵌入模型部分，選擇嵌入模型(Titan Embeddings v2)以將知識庫從資料轉換為嵌入內容。目前支援以下模型。  
    * Amazon Titan Embeddings v2
    * Amazon Titan Embeddings G1 - Text v1.2
    * Cohere Embed English v3
    * Cohere Embed Multilingual v3
6.	在向量資料庫部分，預設選擇，不需要操作。 
    * 快速建立新的向量資料庫 — Amazon Bedrock 會建立一個 Amazon OpenSearch Serverless 向量搜索集合，自動配置嵌入資料來源的設置，並為您管理該集合。
7.	選擇下一步。
8.	在查看並建立頁面上，查看知識庫的配置和詳細訊息。在需要修改的任何部分中選擇編輯。如果您感到滿意，請選擇建立知識庫。
9.	此時，知識庫建立過程開始，來源的狀態變為進行中。建立知識庫所用的時間取決於您提供的資料量。建立完知識庫後，將出現綠色成功橫幅，知識庫的狀態變為就緒。
10.	等待建立成功後，即可選擇資料來源，點擊同步(sync)按鈕。

### 四、查詢知識庫
等待同步成功後，即可在右側點擊 選擇模型(select model)，選擇 **Claude 3 Sonnet**    
![kb_selectmodel](https://hackmd.io/_uploads/ryQPeZzWJe.png)

然後輸入要查詢的問題,等待輸出。  
```text
請問退休的條件是什麼
```
輸出如下圖:  
![kb_query](https://hackmd.io/_uploads/HyMy7GMWkg.png)

可以看到 Claude 有成功根據勞動基準法提供退休的條件。

**這樣您就建立成功了一個知識庫，可以開始探索更多進階功能，新增文件、刪除文件、上傳同名文件後進行同步、切換不同的大型語言模型、只使用搜尋功能、建立新的知識庫等。**

詳細資料請查看 [Knowledge Bases for Amazon Bedrock 文件](https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base.html)


## 使用基礎設施即代碼 (Infrastructure as Code, IaC) 來打造聊天機器人

### 簡介 🔥

[Bedrock Claude Chat](https://github.com/aws-samples/bedrock-claude-chat) 是一個開源專案，旨在展示如何使用 Amazon Bedrock 和 Anthropic Claude 模型建立 AI Chatbot 聊天應用服務。此次 Workshop 將練習部署此開源專案，作為企業內部私有的 AI Chatbot 服務。


### 架構簡述

[Bedrock Claude Chat](https://github.com/aws-samples/bedrock-claude-chat) 的架構是建立在 AWS 託管服務之上，無需管理基礎設施，並直接呼叫 Amazon Bedrock。使得此應用程序是可擴展、可靠，且安全的。

![arch](https://hackmd.io/_uploads/rJPWclGWkl.png)

以下是此應用程序使用到的 AWS 服務:
* 資料儲存和處理
  * Amazon DynamoDB：用於存儲對話歷史的 NoSQL 數據庫
  * Amazon Athena：用於分析 S3 存儲桶的查詢服務
* 後端服務
  * Amazon API Gateway + AWS Lambda：後端 API 端點（使用 AWS Lambda Web Adapter 和 FastAPI）
  * Amazon Bedrock：通過 API 使用基礎模型的託管服務。Anthropic Claude 用於聊天回應，Cohere 用於向量嵌入
  * Amazon EventBridge Pipes：接收來自 DynamoDB 流的事件並啟動 ECS 任務以嵌入外部知識
* 前端和安全性
  * Amazon CloudFront + S3：前端應用程序交付（使用 React 和 Tailwind CSS）
  * AWS WAF：IP 地址限制
  * Amazon Cognito：用戶身份驗證

### 安裝步驟 🚀

可利用 [Super-easy deployment](https://github.com/aws-samples/bedrock-claude-chat#-super-easy-deployment) 方式部署，也可透過 [Deploy using CDK](https://github.com/aws-samples/bedrock-claude-chat#deploy-using-cdk) 方式部署。本次 workshop 將使用 [Super-easy deployment](https://github.com/aws-samples/bedrock-claude-chat#-super-easy-deployment) 方式部署，以下為摘要的步驟。

1. 請在登入 AWS Management Console 後，(右鍵)點擊畫面上方的 ```CloudShell``` 按鈕。(建議使用另開新視窗)

![image](https://hackmd.io/_uploads/S11nDZu11x.png)

2. 點擊後，會建立一個 Shell 環境供執行 AWS CLI 指令、部署程式等。

![image](https://hackmd.io/_uploads/S1lT7ub_yye.png)

3. 在 CloudShell 內，執行以下指令下載並安裝 Bedrock Claude Chat。

```shell!
git clone https://github.com/aws-samples/bedrock-claude-chat.git

cd bedrock-claude-chat

chmod +x bin.sh

./bin.sh --bedrock-region "us-west-2"
```

4. 執行上述指令後 (最後一步驟```./bin.sh```)，會跳出 ```Are you ready to explore the world of v2.x? (y/N):``` 訊息，請輸入 ```y``` 並按下 Enter 即可。

5. Shell 畫面會出現 ```Starting deployment...```，此時約需要等待 30 分鐘完成部署，部署進度可到 ```CloudFormation``` 及 ```CodeBuild``` 內查詢。

:::info
重要：
[Super-easy deployment](https://github.com/aws-samples/bedrock-claude-chat#-super-easy-deployment) 參數可參考 [Optional Parameters](https://github.com/aws-samples/bedrock-claude-chat#optional-parameters)。若使用 CDK 部署，則請參考專案內的 [Others](https://github.com/aws-samples/bedrock-claude-chat#others) 章節內關於註冊網域、網段等設定。
:::

:::warning
注意：
務必關閉自助式註冊 (改採手動在 Cognito 內新增)，或是設定可註冊的 Email 網域，以免被非內部員工註冊使用。
:::

6. 部署完成後會出現以下訊息，請直接在瀏覽器複製貼上 Frontend URL 就可以打開網頁。

:::success
Frontend URL: https://xxxxxxxxx.cloudfront.net
:::


### 使用指引 🛠️

#### 1. 自助式註冊

登入前一個步驟最後產生的 Bedrock Claude Chat 前端網址，第一次登入可透過 Create Account 按鈕進行註冊。請務必輸入目前可以收信的 Email 位址以進行驗證。

![image](https://hackmd.io/_uploads/rJCAgGukke.png)

:::info
若之前的 CloudShell 已經不小心關掉，或忘記之前產生的 Frontend URL。可到 Cloudformation 內找到 BedrockChatStack 內的 Outputs 查詢。
:::


#### 2. 切換語系

左下角 Menu | Languages 可切換語系。


#### 3. 直接交談

點擊 ```新的聊天``` 即可開始交談。


#### 4. 透過 Bot 建立 System Prompt

Use case: 卡路里預測

**Bot 1:**
名稱: 卡路里辨識 v1
指示:
```
你會從使用者上傳的食物照片辨識卡路里，並且提供專業的飲食建議。
```

**Bot 2:**
名稱: 卡路里辨識 v2
指示:
```
你會從使用者上傳的食物照片辨識卡路里，並且提供專業的飲食建議。

以下是食物的卡路里:
無骨牛肉一兩 458
生力麵一包 344
高梁酒100cc 324.8
法國麵包 1 兩 392
熱狗一個 291
白蘭地 100cc 229.6
飯 1 碗 268
雞蛋布丁一塊 280
威士忌 100cc 229.6
培根肉 1 兩 224
漢堡一個 257
牛奶全脂 一杯240cc 170
雞腿一支 182
炸薯條一包 214
可樂 340cc 132
饅頭一個 172
巧克力糖一條 145
蘋果汁 一杯240cc 117
麵條 1 碗 134
水果蛋糕一塊 115
紹興酒 100cc 91.6
豬肉 (全瘦一兩) 82
哈密瓜一兩 102
牛奶脫脂 一杯240cc 88
魚肉一兩 73
葡萄柚一個 88
葡萄酒 100cc 75.2
土司一片 68
香蕉一根 80
豆漿 一杯240cc 73
全麥麵包一個 65
西瓜一片 40
台灣啤酒 100cc 34.3
```

分別使用兩個 Bot，上傳以下照片並輸入```請告訴我卡路里```

![image](https://hackmd.io/_uploads/BJBSTMO11l.png)
備註：此照片於網路上下載，僅供教學使用。

#### 5. 更多 Bot 功能說明

RAG、共用等功能說明。

### Recap

* 透過本次 workshop 可以讓學員了解 LLM / RAG 運作原理，以及如何利用 AWS 服務建構 AI Chatbot，並供企業內部私有使用。
* Production 使用務必設定 Sign-up domain 或改由手動建置帳號。
* 善用 Bot 功能，降低幻覺、提升 LLM 回覆品質。


### Troubleshooting

**錯誤訊息: 聊天框輸入文字後，出現 ```在回答時發生了錯誤。``` 或 ```An error occurred while responding.```。 請檢查 CloudWatch Log ```/aws/lambda/BedrockChatStack-WebSocketHandler``` 內的錯誤訊息。**

**錯誤 1: 呼叫到錯誤 region 的 Amazon Bedrock**
:::danger
[ERROR]	2024-10-12T15:22:23.297Z	89d92734-dcad-4c48-b12d-9569bccc1b5b	Error: An error occurred (AccessDeniedException) when calling the ConverseStream operation: User: arn:aws:sts::076086955972:assumed-role/BedrockChatStack-WebSocketHandlerRole4D6EDDA6-xfOs9tQoJTss/BedrockChatStack-WebSocketHandler7115E6CA-buF4Z502mAjm is not authorized to perform: bedrock:InvokeModelWithResponseStream on resource: arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0 with an explicit deny in a service control policy

:::

方案: Bedrock Claude Chat 預設使用 us-east-1，因此在安裝時需要修改參數改使用 us-west-2 的 Amazon Bedrock。請檢查安裝步驟。

**錯誤 2: 未開啟 Amazon Bedrock Model 權限**
:::danger
Failed to run stream handler: An error occurred (AccessDeniedException) when calling the ConverseStream operation: You don&#39;t have access to the model with the specified model ID.

:::

方案: 請按照前置步驟去啟用 Amazon Bedrock 模型權限。