# Amazon Bedrock Workshop for FSI (2. Knowledge Bases for RAG)
## 目錄
- [實驗環境準備](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](#2-Amazon-Bedrock-Knowledge-Bases-Vector-Store-for-RAG)
- [2-1. 建立 S3 Bucket 以存放用於 RAG 的資料](#2-1-建立-S3-Bucket-以存放用於-RAG-的資料)
- [2-2. 啟用模型調用日誌記錄 (Optional)](#2-2-啟用模型調用日誌記錄-Optional)
- [2-3. 建立 Knowledge Base](#2-3-建立-Knowledge-Base)
- [2-4. 同步資料 (Embedding)](#2-4-同步資料-Embedding)
- [2-5. 測試知識庫](#2-5-測試知識庫)
- [2-6. 至 Amazon OpenSearch 檢視 Embeddings 處理內容](#2-6-至-Amazon-OpenSearch-檢視-Embeddings-處理內容)
- [3. Amazon Bedrock Knowledge Bases (Vector Store) for GraphRag](https://hackmd.io/@6g-86IJuRWiQ17aprBneGQ/HJmVw7S9gl)
- [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)
---
## 2. Amazon Bedrock Knowledge Bases (Vector Store) for RAG
### 2-1. 建立 S3 Bucket 以存放用於 RAG 的資料
#### [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 尚不支援非英文組成的目錄,請勿使用非英文的目錄。檔名則不在此限 (可使用中文)。**
:::
[**[ ⤴️ 回到目錄]**](#目錄)
---
### 2-2. 啟用模型調用日誌記錄 (Optional)
#### [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)**
:::
[**[ ⤴️ 回到目錄]**](#目錄)
---
### 2-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-rag-semantic`
- **Data Source:** `Amazon S3`
- **Log deliveries - Application logs:** `可評估啟用以用於 Troubleshooting`
- *步驟 (2/4):* 設定資料來源 (Configure data source)
- **[資料來源1]**
- **資料來源名稱 (Data source name):** `data-source-regulation-docs-text`
- **S3 URI:** `s3://genai-rag-documents-[Account-ID]-us-west-2/text-format/`
- **剖析策略 (Parsing strategy):** `Amazon Bedrock 預設剖析器`
- **分塊策略 (Chunking strategy):** `固定大小分塊 (Fixed-size chunking)`
- **權杖上限 (Max tokens):** `4096`
- **區塊之間的重覆百分比 (Overlap percentage between chunks):** `20`
- 進階設定 (Advanced settings)
- **Data deletion Policy:** `Delete`
- **[資料來源2]** (點擊 **add data source** 新增)
- **資料來源名稱 (Data source name):** `data-source-regulation-docs-rich`
- **S3 URI:** `s3://genai-rag-documents-949464569222-us-west-2/rich-format/`
- **剖析策略 (Parsing strategy):** `基礎模型作為剖析器 (Foundation models as a parser)` > `Claude Sonnet 4 v1`
>[!Tip] 提醒
> 由於教學環境有資源使用限制 (Throttling),因此在 Workshop 時不使用
- **分塊策略 (Chunking strategy):** `語義分塊 (Semantic chunking)`
- **區塊的字符大小上限:** `8192`
- 進階設定 (Advanced settings)
- **Data deletion Policy:** `Delete`
- *步驟 (3/4):* 選取內嵌項目模型並設定向量存放區 (Select embeddings model and configure vector store)
- **內嵌項目模型 (Embedding model):** `Titan Text Embeddings v2`
- **向量資料庫 (Vector database):** `快速建立新的向量儲存 - 建議值` > `Amazon OpenSearch Serverless`
- *步驟 (4/4)*: 檢閱並建立 (Review and create)
- 點擊 **建立知識庫 (Create knowledge base)**
>[!Tip] 提醒
>**此處約需 5~10 分鐘進行 Knowledge Base 環境部署 (請勿關閉頁面)**
>
[**[ ⤴️ 回到目錄]**](#目錄)
---
### 2-4. 同步資料 (Embedding)
1. 當環境建置完成,前往 **資料來源 (Data source)** 分別選擇 `data-source-regulation-docs-text` 及 `data-source-regulation-docs-rich`,接著點擊 **同步 (Sync)**

>[!Tip] 提醒
>**此處約需 5 ~ 10 分鐘進行資料向量處理**
>
[**[ ⤴️ 回到目錄]**](#目錄)
---
### 2-5. 測試知識庫
1. 資料完成同步後,即可點擊 **測試知識庫 (Test Knowledge Base)** 進行知識庫測試:
- 選取模型 `Anthropic > Claude Sonnet 4 v1`:
```
金融機構將應用系統部署上雲時,需要遵循哪些規範要求?
金融機構上雲在選擇受委託機構時需要進行哪些盡職調查?
保險業將應用系統部署上雲時,需要遵循哪些規範要求?
保險業如何監督和管理受委託機構的作業品質?
金融機構跟保險業在上雲的規範中,主要有哪些差異?
金融業在資訊安全方面,有哪些需要符合的要求?
我今年 40 歲,我何時才可以申請退休?退休時我應該怎麼做才能夠申請到最多的退休金?
```
:::spoiler **回應結果示範**
- `金融機構將應用系統部署上雲時,需要遵循哪些規範要求?`

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

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

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

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

- `金融業在資訊安全方面,有哪些需要符合的要求?`

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

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

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

- **篩選條件:** `target = insurance`
- `保險業將應用系統部署上雲時,需要遵循哪些規範要求?`
- **分解查詢 (Break down queries):** `checked`
- `金融機構跟保險業在上雲的規範中,主要有哪些差異?`
:::spoiler **回應結果示範**
- `保險業將應用系統部署上雲時,需要遵循哪些規範要求?`

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


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

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

3. 在右方主視窗中,點擊 **儀表板 (Dashboard)**,以檢視 Knowledge Base 使用的 OpenSearch Service 儲存內容:

- 點擊 **Explore on my own**

- 展開左上方的漢堡圖示  展開),點擊 **OpenSearch Dashboards** > **Discover**

- 點擊 **Create index pattern**

- 在 **Index pattern name** 中輸入 `bedrock-knowledge-base-default-index`,並點擊 **Next step**

- 點擊 **Create index pattern**

- 再次展開左上方的漢堡圖示  展開),點擊 **OpenSearch Dashboards** > **Discover**

- 您現在可以檢視及觀察 Embedding 的處理內容

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