# 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) [**[ ⤴️ 回到目錄]**](#目錄) ---