---
# System prepended metadata

title: Amazon Bedrock Workshop for FSI (2. Knowledge Bases for RAG)

---

# 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 上方右鍵點擊圖示 ![圖片](https://hackmd.io/_uploads/Sk4NlndbJg.png =30x) 並開啟新分頁以啟用 **AWS CloudShell**
    ![image](https://hackmd.io/_uploads/SJ6iC_cYJl.png =500x)
    
2. 關閉歡迎使用視窗，以進入 AWS CloudShell 操作畫面
    ![圖片](https://hackmd.io/_uploads/Sy8JMnuZkg.png)
    ![圖片](https://hackmd.io/_uploads/B1V1txFWkg.png)

3. 輸入 `q` 以使用 Amazon Q Developer CLI。
    ![image](https://hackmd.io/_uploads/ByKZUPrcel.png)

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
    ```
    ![image](https://hackmd.io/_uploads/B1_X3NI9gx.png)
    ![image](https://hackmd.io/_uploads/r1NS24Icll.png)

:::

#### [Option 2] 通過 AWS CloudShell (Shell Script)

:::spoiler **操作步驟**
1. 於 AWS Management Console 上方右鍵點擊圖示 ![圖片](https://hackmd.io/_uploads/Sk4NlndbJg.png =30x) 並開啟新分頁以啟用 **AWS CloudShell**
    ![image](https://hackmd.io/_uploads/SJ6iC_cYJl.png =500x)
    
2. 關閉歡迎使用視窗，以進入 AWS CloudShell 操作畫面
    ![圖片](https://hackmd.io/_uploads/Sy8JMnuZkg.png)
    ![圖片](https://hackmd.io/_uploads/B1V1txFWkg.png)

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
    ```
    
    ![圖片](https://hackmd.io/_uploads/r1iCUfqgee.png)

:::

#### [Option 3] 通過 AWS Management Console

:::spoiler **操作步驟**
1. 下載資料 (以法規文件為例)，並將其解壓縮：https://d1wcvekt3937ya.cloudfront.net/knowledge-base-rag-documents.zip
![圖片](https://hackmd.io/_uploads/S157Df5xex.png =300x)

2. 進入 **Amazon S3** 服務
![圖片](https://hackmd.io/_uploads/HJWGJkjy1x.png)

3. 點擊 **建立儲存貯體 (Create bucket)**
![圖片](https://hackmd.io/_uploads/BkvS1yoykx.png)

4. 輸入 `genai-rag-documents-[Account_ID]-us-west-2` 作為儲存貯體名稱 (Bucket name)，當中 `[Account_ID]` 請覆蓋成您所使用的 AWS Account ID。完成後請點擊 **建立儲存貯體 (Create bucket)**
![圖片](https://hackmd.io/_uploads/rkE0yJik1e.png)

    >[!Tip] 提醒
    >**S3 為物件儲存服務 (Object Storage)，Bucket Name 亦可作為 URL，因此需全球唯一命名，不能與任何其他 S3 Bucket Name 重疊，此外 S3 需為全為小寫英文字及連字號組成。**

5. 將下載的檔案及目錄上傳至建立的 S3 Bucket 中。
![圖片](https://hackmd.io/_uploads/SyRy_z5ell.png)

    >[!Tip] 提醒
    >**請注意 Amazon Bedrock Knowledge Bases 尚不支援非英文組成的目錄，請勿使用非英文的目錄。檔名則不在此限 (可使用中文)。**
:::
    
[**[ ⤴️ 回到目錄]**](#目錄)

---

### 2-2. 啟用模型調用日誌記錄 (Optional)

#### [Option 1] 通過 AWS CloudShell (Q for CLI)

:::spoiler **操作步驟**

1. 輸入以下 prompt 已啟用模型調用日誌記錄：
    ```
    啟用Amazon Bedrock模型調用日誌記錄(包含文字、影像、內嵌項目、Video)，將日誌指定存放至CloudWatch，並設定日誌保留7天。設定過程中需考量資安要求，並遵循最小授權原則。
    ```
    ![image](https://hackmd.io/_uploads/ryOVuNL5el.png)

:::

#### [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"
    ```
    
    ![圖片](https://hackmd.io/_uploads/ry3fbcGMyx.png)

:::

#### [Option 3] 通過 AWS Management Console

:::spoiler **操作步驟**
1. 進入 **Amazon CloudWatch** 服務
![圖片](https://hackmd.io/_uploads/rJ1tzehxke.png)

2. 進入 **日誌 (Logs) > 日誌群組 (Log groups)**
![圖片](https://hackmd.io/_uploads/SJQKXxnxke.png)

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

4. 進入 **Amazon Bedrock** 服務
![圖片](https://hackmd.io/_uploads/S1YeGJiJyl.png)

5. 在左方導覽列 (如果沒有出現導覽列，可點擊左上方的漢堡圖示 ![圖片](https://hackmd.io/_uploads/r1pw9kpyJg.png =30x) 展開)，點擊 **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** 服務
![圖片](https://hackmd.io/_uploads/S1YeGJiJyl.png)

2. 在左方導覽列 (如果沒有出現導覽列，可點擊組左上方的漢堡圖示 ![圖片](https://hackmd.io/_uploads/r1pw9kpyJg.png =30x) 展開)，點擊 **Build** > **知識庫 (Knowledge bases)** 來快速建立 RAG 應用
![image](https://hackmd.io/_uploads/r1JcFNIcxl.png =100x)

3. 在右方主視窗中，點擊 **建立 (Create)** > **知識庫 (使用向量存放區) (Knowledge Base with vector store)**，並完成以下步驟 (未提及的參數設定可保留預設)：
![image](https://hackmd.io/_uploads/ryc3tNIqex.png)
    - *步驟 (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 環境部署 (請勿關閉頁面)**
    >![圖片](https://hackmd.io/_uploads/rk0pk9Oxll.png)

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

---
    
### 2-4. 同步資料 (Embedding)

1. 當環境建置完成，前往 **資料來源 (Data source)** 分別選擇 `data-source-regulation-docs-text` 及 `data-source-regulation-docs-rich`，接著點擊 **同步 (Sync)**
![image](https://hackmd.io/_uploads/S1aC3YqF1x.png =400x)

    >[!Tip] 提醒
    >**此處約需 5 ~ 10 分鐘進行資料向量處理**
    >![image](https://hackmd.io/_uploads/B1AeaKqY1g.png =400x)

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

---

### 2-5. 測試知識庫

1. 資料完成同步後，即可點擊 **測試知識庫 (Test Knowledge Base)** 進行知識庫測試：
    -  選取模型 `Anthropic > Claude Sonnet 4 v1`：
    ```
    金融機構將應用系統部署上雲時，需要遵循哪些規範要求？
    金融機構上雲在選擇受委託機構時需要進行哪些盡職調查？
    保險業將應用系統部署上雲時，需要遵循哪些規範要求？
    保險業如何監督和管理受委託機構的作業品質？
    金融機構跟保險業在上雲的規範中，主要有哪些差異？
    金融業在資訊安全方面，有哪些需要符合的要求？
    我今年 40 歲，我何時才可以申請退休？退休時我應該怎麼做才能夠申請到最多的退休金？
    ```

    :::spoiler **回應結果示範**
    - `金融機構將應用系統部署上雲時，需要遵循哪些規範要求？`
        ![image](https://hackmd.io/_uploads/SynNMrIqeg.png)

    - `金融機構上雲在選擇受委託機構時需要進行哪些盡職調查？`
        ![image](https://hackmd.io/_uploads/r1IvzBUceg.png)
        
    - `保險業將應用系統部署上雲時，需要遵循哪些規範要求？`
        ![image](https://hackmd.io/_uploads/SkU5MB8ceg.png)

    - `保險業如何監督和管理受委託機構的作業品質？`
        ![image](https://hackmd.io/_uploads/HJ73MSUqlx.png)

    - `金融機構跟保險業在上雲的規範中，主要有哪些差異？`
        ![image](https://hackmd.io/_uploads/HkN0zHI9ee.png)

    - `金融業在資訊安全方面，有哪些需要符合的要求？`
        ![image](https://hackmd.io/_uploads/BkdlmBLqgl.png)

    - `我今年 40 歲，我何時才可以申請退休？退休時我應該怎麼做才能夠申請到最多的退休金？`
        ![image](https://hackmd.io/_uploads/HJXMmrLcle.png)

    - `公司進行組織調整時，對於以下幾種員工的權益保障有何不同：懷孕女性員工、正在請職業災害補償的員工、一般正職員工、特別休假即將到期的員工`
        ![image](https://hackmd.io/_uploads/By-d7SL5xg.png)
    :::

2. 點擊![圖片](https://hackmd.io/_uploads/H1pl7m6k1e.png =30x)以展開組態設定，來進行不同的嘗試：
    ![圖片](https://hackmd.io/_uploads/B1TJw_vhyg.png =400x)
    - **篩選條件：** `target = insurance`
        - `保險業將應用系統部署上雲時，需要遵循哪些規範要求？`
    - **分解查詢 (Break down queries):** `checked`
        - `金融機構跟保險業在上雲的規範中，主要有哪些差異？`
            
    :::spoiler **回應結果示範**
    - `保險業將應用系統部署上雲時，需要遵循哪些規範要求？`
        ![image](https://hackmd.io/_uploads/S1OA7rLqgl.png)
    - `金融機構跟保險業在上雲的規範中，主要有哪些差異？`
        ![image](https://hackmd.io/_uploads/HkEzNS89ll.png)
        ![圖片](https://hackmd.io/_uploads/BJCsA4qegx.png)
    :::
   
[**[ ⤴️ 回到目錄]**](#目錄)

---
    
### 2-6. 至 Amazon OpenSearch 檢視 Embeddings 處理內容
1. 進入 **Amazon OpenSearch Service** 服務
![圖片](https://hackmd.io/_uploads/ByuRb5Oegx.png)

2. 在左方導覽列 (如果沒有出現導覽列，可點擊左上方的漢堡圖示 ![圖片](https://hackmd.io/_uploads/r1pw9kpyJg.png =30x) 展開)，點擊 **Serverless** > **Collections**
![圖片](https://hackmd.io/_uploads/HyTemqulxl.png =200x)


3. 在右方主視窗中，點擊 **儀表板 (Dashboard)**，以檢視 Knowledge Base 使用的 OpenSearch Service 儲存內容：
    ![圖片](https://hackmd.io/_uploads/Sk1dVc_ege.png)
    - 點擊 **Explore on my own**
        ![圖片](https://hackmd.io/_uploads/BJlbpS9Olxx.png =300x)
    - 展開左上方的漢堡圖示 ![圖片](https://hackmd.io/_uploads/r1pw9kpyJg.png =30x) 展開)，點擊 **OpenSearch Dashboards** > **Discover**
        ![圖片](https://hackmd.io/_uploads/ryiMO5_glg.png =300x)
    - 點擊 **Create index pattern**
        ![圖片](https://hackmd.io/_uploads/BJiLO5_xxl.png)
    - 在 **Index pattern name** 中輸入 `bedrock-knowledge-base-default-index`，並點擊 **Next step**
        ![圖片](https://hackmd.io/_uploads/SkZs9qOlee.png)
    - 點擊 **Create index pattern**
        ![圖片](https://hackmd.io/_uploads/Bk16c9Oxge.png)
    - 再次展開左上方的漢堡圖示 ![圖片](https://hackmd.io/_uploads/r1pw9kpyJg.png =30x) 展開)，點擊 **OpenSearch Dashboards** > **Discover**
        ![圖片](https://hackmd.io/_uploads/ryiMO5_glg.png =300x)
    - 您現在可以檢視及觀察 Embedding 的處理內容
        ![圖片](https://hackmd.io/_uploads/ryzsPS5eeg.png)
      
[**[ ⤴️ 回到目錄]**](#目錄)
    
---