# Amazon Bedrock Workshop for FSI (3. Knowledge Bases for GraphRag)
## 目錄
- [實驗環境準備](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](#3-Amazon-Bedrock-Knowledge-Bases-Vector-Store-for-GraphRag)
- [3-1. 建立 S3 Bucket 以存放用於 RAG 的資料 (若您已經完成 2-1 章節,此處可跳過)](#3-1-建立-S3-Bucket-以存放用於-RAG-的資料-若您已經完成-2-1-章節,此處可跳過)
- [3-2. 啟用模型調用日誌記錄 (Optional) (若您已經完成 2-2 章節,此處可跳過)](#3-2-啟用模型調用日誌記錄-Optional-若您已經完成-2-2-章節,此處可跳過)
- [3-3. 建立 Knowledge Base](#3-3-建立-Knowledge-Base)
- [3-4. 同步資料 (Embedding)](#3-4-同步資料-Embedding)
- [3-5. 測試知識庫](#3-5-測試知識庫)
- [3-6. 至 Amazon Neptune 檢視 Embeddings 處理內容](#3-6-至-Amazon-Neptune-檢視-Embeddings-處理內容)
- [4. Amazon Bedrock Agents](https://hackmd.io/@6g-86IJuRWiQ17aprBneGQ/HJe4D7Bcxl)
- [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)
---
## 3. Amazon Bedrock Knowledge Bases (Vector Store) for GraphRag
### 3-1. 建立 S3 Bucket 以存放用於 RAG 的資料 (若您已經完成 2-1 章節,此處可跳過)
#### [Option 1] 通過 AWS CloudShell (Q for CLI)
:::spoiler **操作步驟**
1. 於 AWS Management Console 上方右鍵點擊圖示  並開啟新分頁以啟用 **AWS CloudShell**

2. 關閉歡迎使用視窗,以進入 AWS CloudShell 操作畫面


3. 輸入 `q` 以使用 Amazon Q Developer CLI。

4. 輸入以下 prompt 以下載資料 (以法規文件為例),將其解壓縮,並放置於 S3 Bucket:
```
建立s3 bucket "genai-rag-documents-[AWS_ACCOUNT_ID]-us-west-2",並且下載及解壓縮https://d1wcvekt3937ya.cloudfront.net/knowledge-base-rag-documents.zip,將其所有解壓縮後的內容檔案全部上傳至該bucket
```


:::
#### [Option 2] 通過 AWS CloudShell (Shell Script)
:::spoiler **操作步驟**
1. 於 AWS Management Console 上方右鍵點擊圖示  並開啟新分頁以啟用 **AWS CloudShell**

2. 關閉歡迎使用視窗,以進入 AWS CloudShell 操作畫面


3. 執行以下指令,以下載資料 (以法規文件為例),將其解壓縮,並放置於 S3 Bucket
```bash!
DEMO_FILE="https://d1wcvekt3937ya.cloudfront.net/knowledge-base-rag-documents.zip"
AWS_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
BUCKET_NAME="s3://genai-rag-documents-$AWS_ACCOUNT-us-west-2"
# Download file
if ! wget $DEMO_FILE -O "knowledge-base-rag-documents.zip"; then
echo "Failed to download file"
exit 1
fi
# Extract files to the specific directory
if ! unzip "knowledge-base-rag-documents.zip"; then
echo "Failed to extract zip file"
exit 1
fi
# Change directory
cd "knowledge-base-rag-documents" || {
echo "Failed to change directory"
exit 1
}
# Create S3 bucket
aws s3 mb $BUCKET_NAME
# Sync files to S3
aws s3 sync . $BUCKET_NAME
# List bucket contents
aws s3 ls $BUCKET_NAME
```

:::
#### [Option 3] 通過 AWS Management Console
:::spoiler **操作步驟**
1. 下載資料 (以法規文件為例),並將其解壓縮:https://d1wcvekt3937ya.cloudfront.net/knowledge-base-rag-documents.zip

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

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

4. 輸入 `genai-rag-documents-[Account_ID]-us-west-2` 作為儲存貯體名稱 (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 尚不支援非英文組成的目錄,請勿使用非英文的目錄。檔名則不在此限 (可使用中文)。**
:::
[**[ ⤴️ 回到目錄]**](#目錄)
---
### 3-2. 啟用模型調用日誌記錄 (Optional) (若您已經完成 2-2 章節,此處可跳過)
#### [Option 1] 通過 AWS CloudShell (Q for CLI)
:::spoiler **操作步驟**
1. 輸入以下 prompt 已啟用模型調用日誌記錄:
```
啟用Amazon Bedrock模型調用日誌記錄(包含文字、影像、內嵌項目、Video),將日誌指定存放至CloudWatch,並設定日誌保留7天。設定過程中需考量資安要求,並遵循最小授權原則。
```

:::
#### [Option 2] 通過 AWS CloudShell (Shell Script)
:::spoiler **操作步驟**
1. 執行以下指令,以啟用 Bedrock Audit Log 能力
```bash!
AWS_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
# 建立 CloudWatch 日誌群組
aws logs create-log-group --log-group-name /aws/bedrock/model-invocation
aws logs put-retention-policy --log-group-name /aws/bedrock/model-invocation --retention-in-days 7
# 建立 IAM Role
ROLE_ARN=$(aws iam create-role --role-name bedrock-model-invocation-audit-log --assume-role-policy-document "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"bedrock.amazonaws.com\"},\"Action\":\"sts:AssumeRole\",\"Condition\":{\"StringEquals\":{\"aws:SourceAccount\":\"$AWS_ACCOUNT\"},\"ArnLike\":{\"aws:SourceArn\":\"arn:aws:bedrock:us-west-2:$AWS_ACCOUNT:*\"}}}]}" --query 'Role.Arn' --output text)
POLICY_ARN=$(aws iam create-policy --policy-name bedrock-model-invocation-audit-log-policy --policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["logs:CreateLogStream","logs:PutLogEvents"],"Resource":"arn:aws:logs:us-west-2:'$AWS_ACCOUNT':log-group:/aws/bedrock/model-invocation:log-stream:*"}]}' --query 'Policy.Arn' --output text)
aws iam attach-role-policy --role-name bedrock-model-invocation-audit-log --policy-arn $POLICY_ARN
# 啟用 Amazon Bedrock 模型調用日誌記錄
sleep 5
aws bedrock put-model-invocation-logging-configuration --logging-config "cloudWatchConfig={logGroupName=\"/aws/bedrock/model-invocation\",roleArn=\"$ROLE_ARN\"},textDataDeliveryEnabled=True,imageDataDeliveryEnabled=True,embeddingDataDeliveryEnabled=True"
```

:::
#### [Option 3] 通過 AWS Management Console
:::spoiler **操作步驟**
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)**
:::
[**[ ⤴️ 回到目錄]**](#目錄)
---
### 3-3. 建立 Knowledge Base
1. 進入 **Amazon Bedrock** 服務

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

3. 在右方主視窗中,點擊 **建立 (Create)** > **知識庫 (使用向量存放區) (Knowledge Base with vector store)**,並完成以下步驟 (未提及的參數設定可保留預設):

- *步驟 (1/4):* 提供知識庫詳細資訊 (Provide knowledge base details)
- **知識庫名稱 (Knowledge base name):** `regulation-document-graphrag-semantic`
- **Data Source:** `Amazon S3`
- **Log deliveries - Application logs:** `可評估啟用以用於 Troubleshooting`
- *步驟 (2/4):* 設定資料來源 (Configure data source)
- **[資料來源 1]**
- **資料來源名稱 (Data source name):** `data-source-regulation-docs-text-other`
- **S3 URI:** `s3://genai-rag-documents-[Account-ID]-us-west-2/text-format/others/`
>[!Tip] 提醒
> 由於教學環境有資源使用限制 (Throttling),若您使用自己的 AWS 環境進行測試,可評估擴大資料範圍
- **剖析策略 (Parsing strategy):** `Amazon Bedrock 預設剖析器`
- **分塊策略 (Chunking strategy):** `語義分塊 (Semantic chunking)`
- **區塊的字符大小上限:** `8192`
- 進階設定
- **Data deletion Policy:** `Delete`
- **[資料來源 2]**
- **資料來源名稱 (Data source name):** `data-source-regulation-docs-text-cloud`
- **S3 source:** `s3://genai-rag-documents-[Account-ID]/text-format/cloud/`
>[!Tip] 提醒
> 由於教學環境有資源使用限制 (Throttling),若您使用自己的 AWS 環境進行測試,可評估擴大資料範圍
- **剖析策略 (Parsing strategy):** `Amazon Bedrock 預設剖析器`
- **分塊策略 (Chunking strategy):** `語義分塊 (Semantic chunking)`
- **區塊的字符大小上限:** `8192`
- 進階設定
- **Data deletion Policy:** `Delete`
- *步驟 (3/4):* 選取內嵌項目模型並設定向量存放區 (Select embeddings model and configure vector store)
- **內嵌項目模型 (Embedding model):** `Titan Text Embeddings v2`
- **向量資料庫 (Vector database):** `快速建立新的向量儲存 - 建議值` > `Amazon Neptune Analytics (GraphRAG)`
- *步驟 (4/4)*: 檢閱並建立 (Review and create)
- 點擊 **建立知識庫 (Create knowledge base)**
>[!Tip] 提醒
>**此處約需 5~10 分鐘等待 Amazon Neptune 部署**
>
[**[ ⤴️ 回到目錄]**](#目錄)
---
### 3-4. 同步資料 (Embedding)
1. 當環境建置完成,前往 **資料來源 (Data source)** 選擇 `data-source-regulation-docs-text-other` 及 `data-source-regulation-docs-text-cloud`,接著點擊 **同步 (Sync)**

>[!Tip] 提醒
>**此處約需 5 ~ 10 分鐘進行資料向量處理**
>
[**[ ⤴️ 回到目錄]**](#目錄)
---
### 3-5. 測試知識庫
1. 資料完成同步後,即可在右方聊天視窗進行知識庫測試 (在 **選取模型 (Select model)** 選擇 `Anthropic > Claude Sonnet 4 v1`):
```
金融機構將應用系統部署上雲時,需要遵循哪些規範要求?
金融機構上雲在選擇受委託機構時需要進行哪些盡職調查?
保險業將應用系統部署上雲時,需要遵循哪些規範要求?
保險業如何監督和管理受委託機構的作業品質?
金融機構跟保險業在上雲的規範中,主要有哪些差異?
我今年 40 歲,我何時才可以申請退休?退休時我應該怎麼做才能夠申請到最多的退休金?
公司進行組織調整時,對於以下幾種員工的權益保障有何不同:懷孕女性員工、正在請職業災害補償的員工、一般正職員工、特別休假即將到期的員工
```
:::spoiler **回應結果示範**
- `金融機構將應用系統部署上雲時,需要遵循哪些規範要求?`

- `金融機構上雲在選擇受委託機構時需要進行哪些盡職調查?`

- `保險業將應用系統部署上雲時,需要遵循哪些規範要求?`

- `保險業如何監督和管理受委託機構的作業品質?`

- `金融機構跟保險業在上雲的規範中,主要有哪些差異?`

- `我今年 40 歲,我何時才可以申請退休?退休時我應該怎麼做才能夠申請到最多的退休金?`

- `公司進行組織調整時,對於以下幾種員工的權益保障有何不同:懷孕女性員工、正在請職業災害補償的員工、一般正職員工、特別休假即將到期的員工`

:::
[**[ ⤴️ 回到目錄]**](#目錄)
---
### 3-6. 至 Amazon Neptune 檢視 Embeddings 處理內容
1. 進入 **Amazon Neptune** 服務

2. 在左方導覽列 (如果沒有出現導覽列,可點擊左上方的漢堡圖示  展開),點擊 **Analytics** > **Graphs**
3. 在右方主視窗中,選擇 Knowledge Base 的 **Neptune Graph**,並點擊 **Modify**

- 勾選 `Enable public connectivity`,完成後點擊 **Next** > **Submit**

4. 在左方導覽列 (如果沒有出現導覽列,可點擊左上方的漢堡圖示  展開),點擊 **Notebooks**

5. 在右方主視窗中,點擊 **Create Notebook**,完成以下設定後點擊 **Create notebook**:

- Neptune Service: `Analytics`
- Graph: `bedrock-knowledge-base`
- Notebook name: `aws-neptune-graphrag`
- IAM role: `AWSNeptuneNotebookRole-graphrag`
- VPC: `default`
6. 等待 **Status** 轉換成 `Ready` (約需 5 分鐘),接著點擊 **Actions** > **Open Graph Explorer**

7. 點擊右上方的,您現在可以檢視及觀察 Embedding 的處理內容

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