# Amazon Bedrock Workshop for FSI (4. Agents)
## 目錄
- [實驗環境準備](https://hackmd.io/@6g-86IJuRWiQ17aprBneGQ/HkjF3MBcge)
- [1. Amazon Bedrock Foundation Model 使用概覽](https://hackmd.io/@6g-86IJuRWiQ17aprBneGQ/B1PFXXHcex)
- [2. Amazon Bedrock Knowledge Bases (Vector Store) for RAG](https://hackmd.io/@6g-86IJuRWiQ17aprBneGQ/ByyeB7r5eg)
- [3. Amazon Bedrock Knowledge Bases (Vector Store) for GraphRag](https://hackmd.io/@6g-86IJuRWiQ17aprBneGQ/HJmVw7S9gl)
- [4. Amazon Bedrock Agents](#4-Amazon-Bedrock-Agents)
- [4-1. 建立 Agent](#4-1-建立-Agent)
- [4-2. 建立動作群組 (API 整合)](#4-2-建立動作群組-API-整合)
- [4-3. 調整 API 程式](#4-3-調整-API-程式)
- [4-4. 整合知識庫](#4-4-整合知識庫)
- [4-5. 測試 Agent](#4-5-測試-Agent)
- [5. Amazon Bedrock Flows](https://hackmd.io/@6g-86IJuRWiQ17aprBneGQ/B1eEw7H5gl)
- [6. Amazon Bedrock Guardrails](https://hackmd.io/@6g-86IJuRWiQ17aprBneGQ/SJ0XvmH5lx)
- [其他相關參考資料](https://hackmd.io/@6g-86IJuRWiQ17aprBneGQ/B1Dw5XBclg)
---
## 4. Amazon Bedrock Agents
### 4-1. 建立 Agent
1. 進入 **Amazon Bedrock** 服務

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

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

- **名稱 (Name):** `cloud-advisor`

- **選取模型 (Select model):** `Claude 3.7 Sonnet v1`
- **代理程式指示 (Agent Prompt):**
```
你是一位金融上雲諮詢助手,提供以下服務:
<服務>
- 解答有關金融上雲法規的問題
- 處理上雲遷移申請
- 查詢上雲遷移申請狀態
</服務>
對於任何其他無關的問題,請回答:「抱歉,我沒有這方面的知識。」
在處理客戶查詢時,請遵循以下規則:
<規則>
- 當用戶的問題過於籠統,引導其提供更明確的問題
- 所有的對答都需要使用台灣中文
</規則>
```
- 其他設定 (Additional settings)
- **使用者輸入 (User input):** `已啟用 (Enabled)`
- 上述完成後,先點擊 **儲存 (Save)** 以建立 Agent
[**[ ⤴️ 回到目錄]**](#目錄)
---
### 4-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`
- **動作群組函數 (Action group function) 3:**

:::spoiler **JSON 格式**
{
"name": "get-current-datetime",
"description": "取得現在日期時間",
"parameters": {},
"requireConfirmation": "DISABLED"
}
:::
- 名稱 (Name): `get-current-datetime`
- 描述 (Description): `取得現在日期時間`
2. 上述完成後請點擊 **建立 (Create)**

[**[ ⤴️ 回到目錄]**](#目錄)
---
### 4-3. 調整 API 程式
1. 前往 **Amazon Lambda** 服務

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

3. 取代程式碼 **dummy_lambda.py**
```python
import logging
from typing import Dict, Any
from http import HTTPStatus
import json
from datetime import datetime, timedelta
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]:
"""
AWS Lambda handler for processing Bedrock agent requests.
Args:
event (Dict[str, Any]): The Lambda event containing action details
context (Any): The Lambda context object
Returns:
Dict[str, Any]: Response containing the action execution results
Raises:
KeyError: If required fields are missing from the event
"""
try:
action_group = event['actionGroup']
function = event['function']
message_version = event.get('messageVersion',1)
parameters = event.get('parameters', [])
print(json.dumps(event))
# Execute your business logic here. For more information,
# refer to: https://docs.aws.amazon.com/bedrock/latest/userguide/agents-lambda.html
response_text = ""
match function:
case "apply-cloud-migration":
response_text = "The function {} was called successfully!".format(function)
case "check-approval-status":
response_text = "Your request is still under process."
case "get-current-datetime":
current_time = datetime.utcnow() + timedelta(hours=8)
response_text = "The current date and time is: " + current_time.strftime("%Y-%m-%d %H:%M:%S")
case _:
pass
response_body = {
"TEXT": {
"body": response_text
}
}
action_response = {
'actionGroup': action_group,
'function': function,
'functionResponse': {
'responseBody': response_body
}
}
response = {
'response': action_response,
'messageVersion': message_version
}
logger.info('Response: %s', response)
return response
except KeyError as e:
logger.error('Missing required field: %s', str(e))
return {
'statusCode': HTTPStatus.BAD_REQUEST,
'body': f'Error: {str(e)}'
}
except Exception as e:
logger.error('Unexpected error: %s', str(e))
return {
'statusCode': HTTPStatus.INTERNAL_SERVER_ERROR,
'body': 'Internal server error'
}
```

4. 完成後點擊左方的 
[**[ ⤴️ 回到目錄]**](#目錄)
---
### 4-4. 整合知識庫
1. 進入 **Amazon Bedrock** 服務

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

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

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

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

[**[ ⤴️ 回到目錄]**](#目錄)
---
### 4-5. 測試 Agent
1. 點擊 **儲存 (Save)** 以保存 Agent 相關設定
2. 點擊 **準備 (Prepare)** 以準備進行 Agent 測試,並嘗試測試以下問題:

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

- `金融業上雲需要注意哪些事項?`

- `我要申請系統上雲`

- `我要查詢系統上雲申請狀態`

- `我要請假`

:::
[**[ ⤴️ 回到目錄]**](#目錄)
---