# 國泰金控雲世代計畫:Amazon Bedrock Workshop
## Workshop Lab Link
>[!Tip] 提醒
>**建議瀏覽器:Firefox、Chrome**
- workshop link: https://catalog.us-east-1.prod.workshops.aws/join?access-code=691c-02e133-0b
### [Option 1] 使用 AWS 練習環境
:::spoiler **操作步驟**
1. 進入課程提供的 AWS Workshop Studio 網址,並點擊 **「Email one-time password (OTP)」**,以獲得一次性臨時密碼。

2. 輸入**自己的 Email** 以用於接收一次性臨時密碼 ,並點擊 **「傳送密碼」**。

>[!Tip] 提醒
>**活動期間使用相同 Email 進行登入將會使用相同的練習環境**
3. 進入自己的 Email 以取得 **9 碼 Passcode**。

4. 將 9 碼 Passcode 填入,並點擊 **「登入」**。

5. 登入並進行環境使用要求條款後,請勾選 **「I agree with the Terms and Conditions」**,並點擊 **「Join event」**。

==中間省略==

6. 點擊 **「Open AWS console」**,以開啟 AWS Management Console。

>[!Tip] 提醒
>**練習過程中,若 AWS Management Console 逾時登出,可再次點擊此連結以重新登入並更新憑證**
7. 進入 AWS Management Console 後,即完成登入。

:::
### [Option 2] 通過 AWS Management Console Signin Console 登入
:::spoiler **操作步驟**
1. 進入 [AWS Management Console](https://console.aws.amazon.com/),並輸入 **Account ID / Alias** 及 Admin 的 **User Name** 及 **Password** 後,點擊 **「Sign in」** 登入。

2. 進入 AWS Management Console 後,即完成登入。

:::
### [Option 3] 通過 AWS Identity Center 登入 (Optional)
:::spoiler **操作步驟**
1. 進入 AWS Identity Center 登入網址,並輸入 **Username** 及 **Password**,完成後點擊 **「Sign in」**。

2. 登入後,選擇**對應 AWS Account 的 Admin 權限**後,點擊連結以登入。

3. 進入 AWS Management Console 後,即完成登入。

:::
---
## 1. Anthropic Claude foundation model 的 prompt engineering 技巧分享
1. 確認區域為 **奧勒岡 (Oregon)**

2. 點擊 **齒輪** 可以更換為您習慣的語言

3. 進入 **Amazon Bedrock** 服務

4. 點擊 **模型存取權 (Model access)** 來啟用欲存取的 Foundation Models (FM)

5. 您可點擊 **啟用所有模型 (Enable all models)** 來啟用所有的 FMs 存取權限

>[!Tip] 提醒
>**此處選擇 Enable all models 為在 Workshop 中簡化操作目的,在您自己的 AWS 環境時,請按照您的實際需求選擇所需的 FMs**
6. 點擊 **範例 (Examples)** 可測試各種生成式應用情境

7. 選擇 **遊樂場 (Playground)** 可針對 FMs 進行快速的測試

- 模型: Anthropic > Claude 3.5 Sonnet
- 系統提示 (System Prompt): `你是專業的資深程式開發人員,你將協助使用者生成程式碼,並依據專業提供合適的程式碼及修改建議,所有對話都必須使用台灣中文進行對話。`
- User Prompt: `請寫出一支 Python 程式,運作於 Lambda,當中須包含 putObject 及 getObject 的程式及示範呼叫。`
:::spoiler **回應結果示範**

:::
8. Anthropic Claude Prompt Engineering 參考連結
- Anthropic Claude Prompt Engineering: https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview
---
## 2. Amazon Bedrock Knowledge Bases (RAG)
### 2-1. 建立 S3 Bucket 以存放用於 RAG 的資料
1. 下載資料 (以法規文件為例),並將其解壓縮:https://aws.bardlan.com/gp2

2. 進入 **Amazon S3** 服務

3. 點擊 **建立儲存貯體 (Create bucket)**

4. 輸入 `genai-rag-documents-[Account_ID]` 作為儲存貯體名稱 (Bucket name),當中 `[Account_ID]` 請覆蓋成您所使用的 AWS Account ID。完成後請點擊 **建立儲存貯體 (Create bucket)**

>[!Tip] 提醒
>**S3 為物件儲存服務 (Object Storage),Bucket Name 亦可作為 URL,因此需全球唯一命名,不能與任何其他 S3 Bucket Name 重疊,此外 S3 需為全為小寫英文字及連字號組成。**
5. 將下載的檔案及目錄上傳至建立的 S3 Bucket 中。

>[!Tip] 提醒
>**請注意 Amazon Bedrock Knowledge Bases 尚不支援非英文組成的目錄,請勿使用非英文的目錄。檔名則不在此限 (可使用中文)。**
---
### 2-2. 啟用模型調用日誌記錄 (Optional)
1. 進入 **Amazon CloudWatch** 服務

2. 進入 **日誌 (Logs) > 日誌群組 (Log groups)**

3. 點擊 **建立日誌群組 (Create log group)**
- 日誌群組名稱 (Log group name): `/aws/bedrock/model-invocation`
- 保留設定 (Retention setting): `1 週 (7 天) - 1 week (7 days)`
- 完成後點擊 **建立 (Create)**
4. 進入 **Amazon Bedrock** 服務

5. 在左方導覽列 (如果沒有出現導覽列,可點擊右上方的漢堡圖示  展開),點擊 **Bedrock configurations** > **設定 (Settings)**
6. 啟用 `模型調用日誌記錄 (Model Invocation logging)`
- 選取日誌記錄目的地 (Select the logging destinations):`僅限 CloudWatch Logs (Cloudwatch Logs only)`
- 日誌群組名稱 (Log group name):`/aws/bedrock/model-invocation`
- 建立並使用新角色 (Create and use a new role):`bedrock-model-invocation-audit-log`
- 完成後點擊 **儲存設定 (Save settings)**
---
### 2-3. 建立 Knowledge Base
1. 進入 **Amazon Bedrock** 服務

2. 在左方導覽列 (如果沒有出現導覽列,可點擊右上方的漢堡圖示  展開),點擊 **知識庫 (Knowledge bases)** 來快速建立 RAG 應用

3. 在右方主視窗中,點擊 **建立知識庫 (Create knowledge base)**,並完成以下步驟 (未提及的參數設定可保留預設):

- *步驟 (1/4):* 提供知識庫詳細資訊 (Provide knowledge base details)
- 知識庫名稱 (Knowledge base name):`regulation-document-semantic`
- Data Source: `Amazon S3`
- Log deliveries - Application logs: `可評估啟用以利 Troubleshooting`
- *步驟 (2/4):* 設定資料來源 (Configure data source)
- 資料來源名稱 (Data source name):`data-source-fsc`
- S3 URI: `s3://genai-rag-documents-[Account-ID]`
- Chunking and parsing configurations: `Custom`
- Parsing strategy: `Claude 3 Sonnet v1`
- Chunking strategy: `Semantic chunking`
- Max token size for a chunk: `8192`
- 進階設定
- Data deletion Policy: `Delete`
- *步驟 (3/4):* 選取內嵌項目模型並設定向量存放區 (Select embeddings model and configure vector store)
- 內嵌項目模型 (Embedding model): `Titan Text Embeddings v2`
- 向量資料庫 (Vector database): ` 快速建立新的向量儲存 (OpenSearch Serverless - recommend)`
- *步驟 (4/4)*: 檢閱並建立 (Review and create)
- 點擊 **建立知識庫 (Create knowledge base)**
>[!Tip] 提醒
>**此處約需 5~10 分鐘進行 Knowledge Base 環境部署**
---
### 2-4. 同步資料 (Embedding)
1. 當環境建置完成,前往 **資料來源 (Data source)** 選擇 `data-source-fsc` 並點擊 **同步 (Sync)**

>[!Tip] 提醒
>**此處約需 10~15 分鐘進行資料向量處理**
### 2-5. 測試知識庫
1. 資料完成同步後,即可在右方聊天視窗進行知識庫測試 (在 **選取模型 (Select model)** 選擇 `Anthropic > Claude 3.5 Sonnet`):
```
金融業上雲需要注意哪些事項?
保險業上雲需要注意哪些事項?
針對金融資安,主管機關有哪些要求?
```
:::spoiler **回應結果示範**
- `金融業上雲需要注意哪些事項?`

- `保險業上雲需要注意哪些事項?`

>[!Tip] 提醒
> **此處回應若包含金融機構上雲應注意事項相關資料是合理的,因為大語言模型在訓練過程中,「保險業」與「金融機構」的是相近的詞彙**。
> **可通過 Prompt Engineering 來優化,或是結合篩選條件機制來利用標籤控制文件搜尋範圍。**
- `針對金融資安,主管機關有哪些要求?`

:::
2. 點擊以展開組態設定,來進行不同的嘗試:

- 篩選條件:`target = insurance`
- `保險業上雲需要注意哪些事項?`
- Break down queries: `checked`
- `金融業上雲應該注意哪些事項?還有資安有哪些面向需要注意?並請提供這些事項具體在哪些條款 (第幾條第幾項第幾款)?`
:::spoiler **回應結果示範**
- `保險業上雲需要注意哪些事項?`

- `金融業上雲應該注意哪些事項?還有資安有哪些面向需要注意?並請提供這些事項具體在哪些條款 (第幾條第幾項第幾款)?`


:::
---
## 3. Amazon Bedrock Agents
### 3-1. 建立 Agent
1. 進入 **Amazon Bedrock** 服務

2. 點擊 **代理程式 (Agents)** 來快速建立 RAG 與 API 整合應用

3. 點擊 **建立代理程式 (Create Agent)**

- 名稱 (Name): `cloud-advisor`
- 選取模型 (Select model):`Claude 3 Sonnet`
- 代理程式指示 (Agent Prompt): `你是金融上雲的諮詢專家,你將依據問題決定要查詢內部資料還是呼叫 API。除了上雲法規及諮詢問題、遷移申請及查詢申請狀態外,其他無關的問題請回答:「抱歉,我沒有這方面的知識」。所有的對答都需要使用台灣中文。`
- 其他設定 (Additional settings)
- 使用者輸入 (User input):`Enabled`
- 上述完成後,先點擊 **儲存 (Save)** 以建立 Agent
---
### 3-2. 建立動作群組 (API 整合)
1. 前往 **動作群組 (Action groups)** 並點擊 **新增 (Add)**

- 輸入動作群組名稱 (Enter Action group name):`cloud-application`
- 描述 (Description):`處理上雲相關申請作業`
- 動作群組類型 (Action group type): `使用函數詳細資訊進行定義`
- 動作群組調用 (Action group invocation): `快速建立一個新的 Lambda 函數 - 建議值`
- 動作群組函數 (Action group function) 1:

:::spoiler **JSON 格式**
{
"name": "apply-cloud-migration",
"description": "提供上雲遷移申請",
"parameters": [
{
"name": "cloud_provider",
"description": "Cloud Provider",
"required": "True",
"type": "String",
"tableIndex": 0
},
{
"name": "department_name",
"description": "Department Name",
"required": "True",
"type": "String",
"tableIndex": 1
},
{
"name": "services_required",
"description": "Services Required",
"required": "True",
"type": "Array",
"tableIndex": 2
},
{
"name": "workload_name",
"description": "Workload Name",
"required": "True",
"type": "String",
"tableIndex": 3
},
{
"name": "kickoff_date",
"description": "Kickoff Date (YYYYMMDD)",
"required": "True",
"type": "String",
"tableIndex": 4
}
],
"requireConfirmation": "DISABLED"
}
:::
- 名稱 (Name): `apply-cloud-migration`
- 描述 (Description): `提供上雲遷移申請`
- 參數 (Parameters):
- 名稱 (Name): `cloud_provider`
- 描述 (Description): `Cloud Provider`
- 類型 (Type): `String`
- 必要 (Required): `True`
- 名稱 (Name): `department_name`
- 描述 (Description): `Department Name`
- 類型 (Type): `String`
- 必要 (Required): `True`
- 名稱 (Name): `services_required`
- 描述 (Description): `Services Required`
- 類型 (Type): `Array`
- 必要 (Required): `True`
- 名稱 (Name): `workload_name`
- 描述 (Description): `Workload Name`
- 類型 (Type): `String`
- 必要 (Required): `True`
- 名稱 (Name): `kickoff_date`
- 描述 (Description): `Kickoff Date (YYYYMMDD)`
- 類型 (Type): `String`
- 必要 (Required): `True`
- 動作群組函數 (Action group function) 2:

:::spoiler **JSON 格式**
{
"name": "check-approval-status",
"description": "查詢上雲遷移申請的核准狀態",
"parameters": [
{
"name": "department_name",
"description": "Department Name",
"required": "True",
"type": "String",
"tableIndex": 0
},
{
"name": "workload_name",
"description": "Workload Name",
"required": "True",
"type": "String",
"tableIndex": 1
}
],
"requireConfirmation": "DISABLED"
}
:::
- 名稱 (Name): `check-approval-status`
- 描述 (Description): `查詢上雲遷移申請的核准狀態`
- 參數 (Parameters):
- 名稱 (Name): `department_name`
- 描述 (Description): `Department Name`
- 類型 (Type): `String`
- 必要(Required): `True`
- 名稱 (Name): `workload_name`
- 描述 (Description): `Workload Name`
- 類型 (Type): `String`
- 必要(Required): `True`
2. 上述完成後請點擊 **建立 (Create)**

---
### 3-3. 調整 API 程式
1. 前往 **Amazon Lambda** 服務

2. 點擊自動生成的 Lambda function (函數): `函數名稱為 cloud-application 開頭`

3. 取代程式碼 **dummy_lambda.py**
```
import json
def lambda_handler(event, context):
agent = event['agent']
actionGroup = event['actionGroup']
function = event['function']
parameters = event.get('parameters', [])
print(json.dumps(event))
responseText = ""
match function:
case "apply-cloud-migration":
responseText = "The function {} was called successfully!".format(function)
case "check-approval-status":
responseText = "Your request is still under process."
case _:
pass
# Execute your business logic here. For more information, refer to: https://docs.aws.amazon.com/bedrock/latest/userguide/agents-lambda.html
responseBody = {
"TEXT": {
"body": responseText
}
}
action_response = {
'actionGroup': actionGroup,
'function': function,
'functionResponse': {
'responseBody': responseBody
}
}
dummy_function_response = {'response': action_response, 'messageVersion': event['messageVersion']}
print("Response: {}".format(dummy_function_response))
return dummy_function_response
```

4. 完成後點擊左方的 
---
### 3-4. 整合知識庫
1. 進入 **Amazon Bedrock** 服務

2. 點擊 **代理程式 (Agents)** 並進入 `cloud-advisor`

3. 點擊 **在代理程式建置器中編輯**

4. 前往 **知識庫 (Knowledge bases)** 並點擊 **新增 (Add)**

- 選取知識庫 (Select knowledge base):`regulation-document-semantic`
- 代理程式的知識庫指示 (Knowledge base instructions for Agent):`查詢及回應有關金融業上雲的相關法規`
5. 完成後點擊 **Add** 以整合知識庫

---
### 3-5. 測試 Agent
1. 點擊 **儲存 (Save)** 以保存 Agent 相關設定
2. 點擊 **準備 (Prepare)** 以準備進行 Agent 測試,並嘗試測試以下問題:

```
金融業上雲需要注意哪些事項?
我要申請系統上雲
我要查詢系統上雲申請狀態
我要請假
```
:::spoiler **回應結果示範**
- `金融業上雲需要注意哪些事項?`

- 點擊 **顯示追蹤 (Show trace)** 可查看推理細節

- `我要申請系統上雲`


- `我要請假`

:::
---
## 其他相關參考資料:
- Mapping the Mind of a Large Language Model: https://www.anthropic.com/research/mapping-mind-language-model
- [AWS Samples] Bedrock Claude Chat: https://github.com/aws-samples/bedrock-claude-chat
- Workshop: https://hackmd.io/@dennisc/Sk3FCxdJkg
---