# Amazon Bedrock Workshop
## 實驗環境準備
>[!Tip] 提醒
>**建議瀏覽器:Firefox、Chrome**
:+1: **workshop link: https://catalog.us-east-1.prod.workshops.aws/join?access-code=80f3-02d237-c9**
### [Option 1] 使用 AWS 練習環境
:::spoiler **操作步驟**
1. 進入課程提供的 AWS Workshop Studio 網址,並點擊 **「Email one-time password (OTP)」**,以獲得一次性臨時密碼。

2. 輸入**自己的 Email** 以用於接收一次性臨時密碼 ,並點擊 **「傳送密碼」**。

>[!Tip] 提醒
>**活動期間使用相同 Email 進行登入將會使用相同的練習環境**
3. 進入自己的 Email 以取得 **9 碼 Passcode**。

4. 將 9 碼 Passcode 填入,並點擊 **「登入」**。

5. 登入並進行環境使用要求條款後,請勾選 **「I agree with the Terms and Conditions」**,並點擊 **「Join event」**。

==中間省略==

6. 點擊 **「Open AWS console」**,以開啟 AWS Management Console。

>[!Tip] 提醒
>**練習過程中,若 AWS Management Console 逾時登出,可再次點擊此連結以重新登入並更新憑證**
7. 進入 AWS Management Console 後,即完成登入。

:::
### [Option 2] 通過 AWS Management Console Signin Console 登入
:::spoiler **操作步驟**
1. 進入 [AWS Management Console](https://console.aws.amazon.com/),並輸入 **Account ID / Alias** 及 Admin 的 **User Name** 及 **Password** 後,點擊 **「Sign in」** 登入。

2. 進入 AWS Management Console 後,即完成登入。

:::
### [Option 3] 通過 AWS Identity Center 登入 (Optional)
:::spoiler **操作步驟**
1. 進入 AWS Identity Center 登入網址,並輸入 **Username** 及 **Password**,完成後點擊 **「Sign in」**。

2. 登入後,選擇**對應 AWS Account 的 Admin 權限**後,點擊連結以登入。

3. 進入 AWS Management Console 後,即完成登入。

:::
---
### :key: 啟用模型存取權
1. 確認區域為 **奧勒岡 (Oregon)**

2. 點擊 **齒輪圖示 ** 可以更換為您習慣的語言

3. 進入 **Amazon Bedrock** 服務

4. 進入 **模型存取權 (Model access)** 來啟用欲存取的 Foundation Models (FMs)

5. 您可點擊 **啟用所有模型 (Enable all models)** 來啟用所有的 FMs 存取權限

>[!Warning] 注意
>此處選擇 Enable all models 是為在 Workshop 簡化操作之目的,在您自己的 AWS 環境時,請按照您的實際需求選擇所需的 FMs
6. 等待一段時間,確認 FMs 的存取狀態為 **已授予存取權 (access granted)**

>[!Note] 資訊
>若您使用的是課程所提供的練習環境,由於教學環境的限制,部分模型在教學環境中限制使用,因此若出現以下錯誤屬於正常情況
>
---
## 1. Amazon Bedrock Foundation Model 使用概覽
### 1.1. Amazon Bedrock 環境使用概覽
1. 進入 **遊樂場 (Playground)** 可針對 FMs 進行快速的測試

- **選取模型:** `Anthropic > Claude 3.5 Sonnet v2`
- **系統提示 (System Prompt):**
```
你是一位專業的資深程式開發人員,擅長各種程式語言。你的任務是協助使用者生成程式碼,並依據專業知識提供合適的程式碼及修改建議。請遵循以下規則:
1. 使用台灣中文進行對話。
2. 根據使用者的需求和問題,提供相應的程式碼解決方案。
3. 如果使用者提供了現有的程式碼,請仔細審閱並提出改進建議。
4. 提供詳細的解釋和註解,以幫助使用者理解程式碼的邏輯和功能。
5. 保持專業、友好和耐心的態度,確保使用者能夠輕鬆地理解你的解釋。
請以下列格式回覆:
<程式碼>
[在此插入相關程式碼]
</程式碼>
<解釋>
[在此提供詳細的解釋和註解]
</解釋>
```
- **使用者提示 (User Prompt):**
```
撰寫一支運行於 Lambda 的 Python 程式,包含 putObject 及 getObject functions 來上傳/下載物件到 S3 bucket,並須包含以下參數:
<參數>
- bucket_name: s3 bucket 的名稱
- object_name: 上傳/下載的物件名稱
- data: 上傳下載的檔案
</參數>
需提供呼叫範例
```
:::spoiler **回應結果示範**

:::
>[!Note] 說明
>在與 Anthropic Claude FM 對話時,主要有三種不同的提示類型:
> - **系統提示 (System Prompt):** 用於在與 Claude 提出問題或任務之前,為 Claude 定義情境、說明和規則。
> - **使用者提示 (User Prompt):** 使用者所提供的問題或任務等指示,對話必須以使用者提示開始
> - **助理提示 (Assistant Prompt):** Claude 的回應
>
>
>
>您有三個參數可以調整生成結果:
> - **Temperature:** 控制回答的隨機性,較低值更為精確、較高值更具創意
> - **TopP:** 控制字詞選擇範圍,較低值偏保守、較高值偏多樣
> - **TopK:** 限制候選詞數量,較低值偏保守、較高值具創意(40-100)
- **使用者提示 (User Prompt):**
- 上傳圖片:

- `根據此菜單圖片,大杯黑糖牛奶多少錢?`
- `黑糖牛奶多少錢?`
- `中杯黑糖牛奶+小杯espresso多少錢?`
:::spoiler **回應結果示範**
- 根據此菜單圖片,大杯黑糖牛奶多少錢?

- 黑糖牛奶多少錢?

- 中杯黑糖牛奶+小杯espresso多少錢?

:::
---
### 1.2 Anthropic Claude 的 prompt engineering 技巧
**:+1: Anthropic Claude Prompt Engineering 參考連結:https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview**
1. **提供清晰且具體的提示詞 (Be clear and direct)**
- *不夠清晰與具體的提示詞範例*
- **使用者提示:**
```
幫我移除以下客服日誌內容的PII:
理專:您好,我是理財專員王小明。請問是林大華嗎?
客戶:是的,我是林大華。
理專:林先生您好,我這邊需要確認一下您的個人資料,方便告訴我您的出生年月日嗎?
客戶:好的,我的生日是1980年5月15日。
理專:謝謝。請問您的聯絡電話是0912345678嗎?
客戶:沒錯,那是我的手機號碼。
理專:好的。Email地址還是example@email.com嗎?
客戶:對,email沒變。
理專:最後確認一下您的住址,是台北市中山區中山北路十段100號5樓嗎?
客戶:是的,地址正確。
理專:非常感謝您的配合。最後想請教一下,您家裡目前有幾個人居住呢?
客戶:我們家裡有4個人,包括我、太太和兩個小孩。
理專: 了解了,謝謝您提供這些資訊。
```
:::spoiler **回應結果示範**


:::
---
- *清晰並具體的提示詞範例*
- **使用者提示:**
```
請依照以下步驟處理客服日誌內容:
1.掃描並標示出所有PII資訊
2.將個人識別資訊按以下要求處理(理專姓名不用遮罩):
- 姓名 -> 替換成[姓名]
- 姓氏 -> 替換成[姓氏]
- 生日 -> 替換成[生日]
- 身分證字號 -> 使用*遮罩中間三碼 (*按字數產生)
- 電話號碼 -> 使用*字元遮罩中間三碼 (*按字數產生)
- 電子郵件 -> 使用x字元遮罩非 Domain 部分 (x按字數產生)
- 銀行帳號 -> 替換成[帳號]
- 信用卡號 -> 替換成[卡號]
- 地址 -> 替換成[地址]
3. 只輸出經過遮罩處理的完整內容,並保留原格式
以下是需要處理的客服日誌內容:
理專:您好,我是理財專員王小明。請問是林大華嗎?
客戶:是的,我是林大華。
理專:林先生您好,我這邊需要確認一下您的個人資料,方便告訴我您的出生年月日嗎?
客戶:好的,我的生日是1980年5月15日。
理專:謝謝。請問您的聯絡電話是0912345678嗎?
客戶:沒錯,那是我的手機號碼。
理專:好的。Email地址還是example@email.com嗎?
客戶:對,email沒變。
理專:最後確認一下您的住址,是台北市中山區中山北路十段100號5樓嗎?
客戶:是的,地址正確。
理專:非常感謝您的配合。最後想請教一下,您家裡目前有幾個人居住呢?
客戶:我們家裡有4個人,包括我、太太和兩個小孩。
理專: 了解了,謝謝您提供這些資訊。
```
:::spoiler **回應結果示範**


:::
>[!Important] 小技巧
>為了確保您的提示能夠有效被 Claude 理解,請遵循「清晰提示的黃金法則 (Golden Rule of Clear Prompting)」:
>向同事或朋友展示您的提示,並要求他們遵循指示回答。如果他們能夠回答您想要的確切結果,那麼您的提示對於 Claude 來說可能也足夠清晰。請記住,雖然 Claude 是一個強大的 FM,但它還是需要依賴您的具體指示來提供最佳結果 (他不會心電感應)。透過提供清晰、直接且結構良好的提示,您可以釋放 Claude 的潛力並產生您想要的結果。
---
2. **通過系統提示賦予 Claude 角色扮演 (Give Claude a role - system prompts)**
- *沒有角色扮演的提示詞範例*
- **系統提示:** 無
- **使用者提示:**
```
請跟我對練銷售基金的情境。我是理財專員,你是客戶。
我們開始對話吧。
```
```
您好,請問您最近有資金需求嗎?
```
```
請問您怎麼稱呼?
```
:::spoiler **回應結果示範**

:::
---
- *各種角色扮演提示詞範例*
- **系統提示:**
```
你現在是一位45歲的科技公司中階主管李小姐,具有以下特徵:
1. 年收入180萬,有200萬閒置資金
2. 已婚,有一個12歲的小孩
3. 投資風險承受度中等
4. 過去投資經驗以定存為主
5. 對投資理財有興趣但知識有限
6. 個性謹慎,需要詳細解釋才會做決定
7. 主要投資目標是子女教育基金
你將扮演這個角色與理財專員進行對話。你應該:
- 在理財專員詢問前不主動提出明確需求
- 提出符合你背景的問題和疑慮
- 表達合理的投資考量和顧慮
- 需要清楚的風險說明
- 在未完全理解產品前不輕易同意
```
- **使用者提示:**
```
請跟我對練銷售基金的情境。我是理財專員,你是客戶。
我們開始對話吧。
```
```
您好,請問您最近有資金需求嗎?
```
:::spoiler **回應結果示範**

:::
---
- **系統提示:**
```
你現在是一位45歲的科技公司中階主管李小姐,具有以下特徵:
1. 年收入180萬,有200萬閒置資金
2. 已婚,有一個12歲的小孩
3. 投資風險承受度中等
4. 過去投資經驗以定存為主
5. 對投資理財有興趣但知識有限
6. 個性謹慎,需要詳細解釋才會做決定
7. 主要投資目標是子女教育基金
8. 奧客性格,講話非常尖酸刻薄,話少
你將扮演這個角色與理財專員進行對話。你應該:
- 在理財專員詢問前不主動提出明確需求
- 提出符合你背景的問題和疑慮
- 表達合理的投資考量和顧慮
- 需要清楚的風險說明
- 在未完全理解產品前不輕易同意
```
- **使用者提示:**
```
請跟我對練銷售基金的情境。我是理財專員,你是客戶。
我們開始對話吧。
```
```
您好,請問您最近有資金需求嗎?
```
:::spoiler **回應結果示範**

:::
>[!Important] 小技巧
>提供有關您希望 Claude 扮演的角色,並且清晰詳細的背景資訊。您提供的資訊越多,Claude 就越能理解並體現所需的角色。
>通過嘗試不同的角色和不同的提示,找到適合您的情境的最佳結果。
---
3. **使用 XML Tags 來結構化定義提示 (Use XML tags)**
- *將 XML Tags 用於定義情境*
- **系統提示:**
```
你是一個名叫小幸的線上伴侶AI,你將以理解和同理的方式與我進行對話
<特質>
- 溫暖親切的性格
- 善於傾聽和同理
- 正向但不過度樂觀
- 適時給予建議但不強迫
</特質>
<互動規則>
<情緒回應>
- 優先確認用戶的情緒狀態
- 使用同理心回應
- 給予情緒支持和認同
</情緒回應>
<對話風格>
- 使用溫和友善的語氣
- 適當使用表情符號增加親近感
- 避免過於正式的用語
</對話風格>
<建議模式>
- 先傾聽後建議
- 提供具體可行的建議
- 尊重用戶的選擇
</建議模式>
<特殊設定>
- 你是喵星人,結尾都會說「喵~」
- 以台灣國語回應
</特殊設定>
</互動規則>
```
- **使用者提示:**
```
我今天感到很沮喪,因為工作上遇到了挫折。
```
:::spoiler **回應結果示範**

:::
---
- *將 XML Tags 用於結構化回應*
- **使用者提示:**
```
請分析以下Email內容,並使用XML標籤萃取重要資訊,需包含以下標籤:
<會議基本資訊>
<會議名稱/>
<日期時間/>
<地點/>
</會議基本資訊>
<議程內容/>
<聯絡資訊>
<聯絡人/>
<聯絡方式/>
</聯絡資訊>
<寄件人資訊>
<姓名/>
<職稱/>
</寄件人資訊>
<email>
主旨:【會議通知】2024年第一季產品策略會議
各位主管好,
謹訂於2024年1月15日(一)下午2點至5點,在台北總公司大樓12樓會議室A,舉行2024年第一季產品策略會議。
會議重點如下:
1. 2023年第四季產品銷售成果報告
2. 2024年第一季新產品上市計畫
3. 通路策略調整提案
請各部門準備相關報告,如有會議相關問題請聯繫專案助理王小明(分機2345)。
敬祝 順心
專案經理
張美玲
</email>
```
:::spoiler **回應結果示範**

:::
- *匯出 JSON 格式*
- **使用者提示:**
```
請分析以下Email內容,並使用JSON格式萃取重要資訊,需包含以下標籤:
<會議基本資訊>
<會議名稱/>
<日期時間/>
<地點/>
</會議基本資訊>
<議程內容/>
<聯絡資訊>
<聯絡人/>
<聯絡方式/>
</聯絡資訊>
<寄件人資訊>
<姓名/>
<職稱/>
</寄件人資訊>
<email>
主旨:【會議通知】2024年第一季產品策略會議
各位主管好,
謹訂於2024年1月15日(一)下午2點至5點,在台北總公司大樓12樓會議室A,舉行2024年第一季產品策略會議。
會議重點如下:
1. 2023年第四季產品銷售成果報告
2. 2024年第一季新產品上市計畫
3. 通路策略調整提案
請各部門準備相關報告,如有會議相關問題請聯繫專案助理王小明(分機2345)。
敬祝 順心
專案經理
張美玲
</email>
```
:::spoiler **回應結果示範**


:::
>[!Important] 小技巧
>- 使用可說明其所包含內容的描述性標籤名稱(例如:<instructions>、<example>、<rules>)。
>- 在整個提示中保持標籤名稱一致。
>- 始終包含開始 (<tag>) 和結束 (</tag>) 標記,包括在引用它們時,例如「使用 <doc></doc> 標記中的文檔,回答此問題」。
>- 您可以運用巢狀結構來使用 XML 標籤,儘管超過五層的巢狀結構可能會降低效能,具體取決於使用情境的複雜性。
---
4. **讓 Claude 思考 (Let Claude think - *Chain of Thought*)**
- *沒有 CoT 的提示詞範例*
- **使用者提示:**
```
你是一位資深理財顧問,負責為客戶提供投資組合建議。
請根據以下客戶資料,推薦合適的投資組合:
<基本資料>
- 王小姐,35歲,科技業產品經理
- 年收入:150萬
</基本資料>
<現有資產>
- 活存 80萬
- 定存 100萬
- 股票 50萬
- 基金 30萬
</現有資產>
<保險>
- 定期壽險 200萬
- 醫療險
</保險>
<消費習慣>
- 月支出約4萬
- 常在百貨公司購物
- 每年固定出國旅遊2次
</消費習慣>
```
:::spoiler **回應結果示範**


:::
---
- *請 Claude 思考並提供 CoT 的提示詞範例*
- **使用者提示:**
```
你是一位資深理財顧問,負責為客戶提供投資組合建議。
請根據以下客戶資料,請仔細思考推薦的邏輯,列出思考過程,並推薦合適的投資組合:
<基本資料>
- 王小姐,35歲,科技業產品經理
- 年收入:150萬
</基本資料>
<現有資產>
- 活存 80萬
- 定存 100萬
- 股票 50萬
- 基金 30萬
</現有資產>
<保險>
- 定期壽險 200萬
- 醫療險
</保險>
<消費習慣>
- 月支出約4萬
- 常在百貨公司購物
- 每年固定出國旅遊2次
</消費習慣>
```
:::spoiler **回應結果示範**




:::
---
- *提供具體 CoT 的提示詞範例*
- **使用者提示:**
```
你是一位資深理財顧問,運用結構化思考為客戶提供全方位的投資組合建議。請依照以下思考鏈進行分析:
<COT>
1. 風險評估步驟
- 分析客戶年齡與職業特性
- 評估收入穩定性
- 檢視現有投資組合風險程度
- 考量消費習慣對投資的影響
2. 資產配置分析
- 計算各類資產佔比
- 評估現有配置的優缺點
- 檢視流動性需求
- 分析現有保險保障適足性
3. 缺口分析
- 計算理財目標所需資金
- 評估現有保障缺口
- 分析投資報酬需求
- 考量通膨影響
4. 投資組合建議
- 提出具體資產配置比例
- 建議適合的投資產品
- 說明預期報酬與風險
- 提供階段性投資建議
</COT>
請根據以下客戶資料,依序進行分析並推薦合適的投資組合:
<基本資料>
- 王小姐,35歲,科技業產品經理
- 年收入:150萬
</基本資料>
<現有資產>
- 活存 80萬
- 定存 100萬
- 股票 50萬
- 基金 30萬
</現有資產>
<保險>
- 定期壽險 200萬
- 醫療險
</保險>
<消費習慣>
- 月支出約4萬
- 常在百貨公司購物
- 每年固定出國旅遊2次
</消費習慣>
請針對每個步驟提供詳細說明,並在最後整合成完整的投資建議方案。
```
:::spoiler **回應結果示範**






:::
>[!Important] 小技巧
>- 除非允許 Claude 輸出其思考過程,否則思考無法發生。沒辦法讓 Claude 在背景思考,只回最終的答案。
>- 逐步推理將增加 Claude 輸出的提示長度,這可能會影響延遲。在決定是否使用此技術時請考慮這種權衡。
---
5. **使用範例回答作為回應參考 (Use examples - *few-shot*)**
- *沒有範例回答*
- **系統提示:**
```
你是一個SQL專家,可以將自然語言轉換成SQL查詢語句。
```
- **使用者提示:**
```
資料庫結構如下:
- customers(customer_id, name, age, city)
- orders(order_id, customer_id, order_date, total_amount)
- products(product_id, product_name, price)
- order_details(order_id, product_id, quantity)
請幫我寫一個SQL查詢:找出台北市消費金額超過10萬元的客戶名單,並顯示他們的總消費金額。
```
:::spoiler **回應結果示範**



:::
---
- *提供範例回答*
- **系統提示**
```
你是一位SQL專家,可以將自然語言轉換為SQL查詢語句。我會先提供幾個範例,請依照類似的模式處理後續的查詢需求。
<資料庫結構>
customers(customer_id, name, age, city)
orders(order_id, customer_id, order_date, total_amount)
products(product_id, product_name, price)
order_details(order_id, product_id, quantity)
</資料庫結構>
<範例1>
<需求>查詢台中市的客戶及其訂單總數</需求>
<SQL>
SELECT c.name, COUNT(o.order_id) as order_count
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
WHERE c.city = '台中市'
GROUP BY c.customer_id, c.name;
</SQL>
</範例1>
<範例2>
<需求>找出購買過商品 'iPhone 14' 的客戶名單</需求>
<SQL>
SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_details od ON o.order_id = od.order_id
JOIN products p ON od.product_id = p.product_id
WHERE p.product_name = 'iPhone 14';
</SQL>
</範例2>
<範例3>
<需求>計算每個客戶在2023年的平均訂單金額</需求>
<SQL>
SELECT c.name, AVG(o.total_amount) as avg_amount
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE YEAR(o.order_date) = 2023
GROUP BY c.customer_id, c.name;
</SQL>
</範例3>
```
- **使用者提示:**
```
請幫我寫一個SQL查詢:找出台北市消費金額超過10萬元的客戶名單,並顯示他們的總消費金額。
```
:::spoiler **回應結果示範**

:::
>[!Important] 小技巧
>建立理想的範例集通常需要迭代和細化。如果 Claude 的表現不太符合您的期望,請考慮以下因素:
>- **分析輸出:** 在 Claude 的回應中尋找與您想要的偏離的部分。這可以幫助您識別範例可能不清楚、誤導或不充分的地方。
>- **新增更多範例:** 如果 Claude 難以處理某些類型的輸入,請提供專門針對這些場景的其他範例。
>- **修改現有範例:** 有時,即使對範例進行微小調整也會產生顯著差異。嘗試不同的措詞、格式或結構,看看哪種最有效。
>- **尋求 Claude 的幫助:** 編寫有效的範例可能具有挑戰性!您可以要求 Claude 評估您的範例對於給定任務的多樣性或相關性,或根據一組現有範例產生新範例。
---
6. **預填 Claude 的回應 (Prefill Claude’s response)**
>[!Important] 小技巧
>- 使用 Claude 時,您可以透過預先填入**助理提示**來指導其接下來的回應。這項技術可讓您引導 Claude 的動作、跳過引言、強制執行 JSON 或 XML 等特定格式,甚至幫助 Claude 在角色扮演場景中保持角色一致性。
>- 在某些情況下, Claude 的表現沒有達到預期,可以通過預填回應來提高 Claude 的表現。
---
7. **串連複雜提示 (Chain complex prompts)**
>[!Important] 小技巧
>建立複雜的提示涉及以結構化方式組合各種元素,結構良好的提示的關鍵組成部分包括:
>- **任務背景 (Task context):** 提供有關人工智慧應承擔的角色或其應承擔的目標和整體任務的背景。
>- **語氣脈絡 (Tone context):** 指定 AI 應使用的語氣(如果對互動很重要)。
>- **詳細的任務描述和規則 (Detailed task description and rules):** 擴展人工智慧應執行的具體任務及其必須遵循的任何規則。
>- **範例 (Examples):** 提供一個或多個理想響應範例供人工智慧模擬。
>- **輸入資料 (Input data):** 包括 AI 需要在提示內處理的任何數據,包含在相關 XML 標籤中。(例如對話歷史)
>- **立即任務 (Immediate task):** 提醒人工智慧其當前任務或應滿足的特定請求。
>- **逐步思考 (CoT):** 指導人工智慧在給出答案之前逐步思考,特別是對於多步驟任務。
>- **輸出格式 (Output formatting):** 如有必要,指定 AI 回應所需的格式。
>- **預填回應 (Prefilled responses):** 可以選擇用幾句話開始人工智慧的回應,以引導其行為或輸出。
>
>
---
8. **長文件資料 (Long context tips)**
>[!Important] 小技巧
>- **將長文件資料放在最前面:** 將長文件和輸入(~20K+ tokens)放在提示頂部附近,在您的提示和範例上方。這可以顯著提高 Claude 的表現。
>- **使用 XML Tag 建立文件內容和描述資料:** 使用多個文件時,為了清晰起見,請將每個文件放在 <document> 標籤中,並利用巢狀結構將 <document_content>、<source> 以及其他描述資料放在子標籤內。
>- **將回應結構化放置,並引用於推理:** 對於長文件任務,請要求 Claude 在執行任務之前先萃取文件的相關部分放置於 XML Tag,再要求其依據產生的 XML Tag 內容進行推理。這有助於 Claude 消除文件中其餘內容的「噪音」。
---
9. **避免產生幻覺 (Avoiding Hallucinations)**
>[!Important] 小技巧
>在系統或使用者提示中加入:`如果你不確定或沒有足夠的資料來提供有信心的答案,只需說「我不知道」或「我不確定」。`
---
## 2. Amazon Bedrock Knowledge Bases (Vector Store) for RAG
### 2-1. 建立 S3 Bucket 以存放用於 RAG 的資料
#### [Option 1] 通過 AWS CloudShell
:::spoiler **操作步驟**
1. 於 AWS Management Console 上方右鍵點擊圖示  並開啟新分頁以啟用 **AWS CloudShell**

>[!Tip] 說明
>AWS CloudShell 是一個基於瀏覽器的 Shell 環境,可以更輕鬆地安全地管理、探索 AWS 資源並與之互動。 CloudShell 直接使用您的控制台憑證進行預先驗證,並預先安裝了常用的開發和維運工具,而無需在您的本機中安裝或設定軟體。透過 AWS CloudShell,您可以使用 AWS 命令列介面 (AWS CLI) 快速執行腳本,使用 AWS 開發工具包 (AWS SDK) 實驗 AWS 服務 API,或使用各種工具來提高工作效率。
2. 關閉歡迎使用視窗,以進入 AWS CloudShell 操作畫面


3. 執行以下指令,以下載資料 (以法規文件為例),將其解壓縮,並放置於 S3 Bucket
```bash!
DEMO_FILE="https://aws.bardlan.com/iui"
AWS_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
BUCKET_NAME="s3://genai-rag-documents-$AWS_ACCOUNT"
# 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 2] 通過 AWS Management Console
:::spoiler **操作步驟**
1. 下載資料 (以法規文件為例),並將其解壓縮:https://aws.bardlan.com/iui

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

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

4. 輸入 `genai-rag-documents-[Account_ID]` 作為儲存貯體名稱 (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
:::spoiler **操作步驟**
1. 於 AWS Management Console 上方右鍵點擊圖示  並開啟新分頁以啟用 **AWS CloudShell**

>[!Tip] 說明
>AWS CloudShell 是一個基於瀏覽器的 Shell 環境,可以更輕鬆地安全地管理、探索 AWS 資源並與之互動。 CloudShell 直接使用您的控制台憑證進行預先驗證,並預先安裝了常用的開發和維運工具,而無需在您的本機中安裝或設定軟體。透過 AWS CloudShell,您可以使用 AWS 命令列介面 (AWS CLI) 快速執行腳本,使用 AWS 開發工具包 (AWS SDK) 實驗 AWS 服務 API,或使用各種工具來提高工作效率。
2. 關閉歡迎使用視窗,以進入 AWS CloudShell 操作畫面


3. 執行以下指令,以啟用 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 2] 通過 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. 在左方導覽列 (如果沒有出現導覽列,可點擊組左上方的漢堡圖示  展開),點擊 **知識庫 (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 source:** `s3://genai-rag-documents-[Account-ID]/text-format/`
- **剖析策略 (Parsing strategy):** `Amazon Bedrock 預設剖析器`
- **分塊策略 (Chunking strategy):** `語義分塊 (Semantic chunking)`
- **區塊的字符大小上限:** `8192`
- 進階設定
- **Data deletion Policy:** `Delete`
- **[資料來源2]** (點擊 **add data source** 新增)
- **資料來源名稱 (Data source name):** `data-source-regulation-docs-rich`
- **S3 source:** `s3://genai-rag-documents-949464569222/rich-format/`
- **剖析策略 (Parsing strategy):** `基礎模型作為剖析器 (Foundation models as a parser)` > `Claude 3 Haiku v1`
>[!Tip] 提醒
> 由於教學環境有資源使用限制 (Throttling),若您使用自己的 AWS 環境進行測試,可評估使用能力較強的 Claude 3 Sonnet v1
- **分塊策略 (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 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. 資料完成同步後,即可在右方聊天視窗進行知識庫測試 (在 **選取模型 (Select model)** 選擇 `Anthropic > Claude 3.5 Sonnet v2`):
```
金融機構將應用系統部署上雲時,需要遵循哪些規範要求?
金融機構上雲在選擇受委託機構時需要進行哪些盡職調查?
保險業將應用系統部署上雲時,需要遵循哪些規範要求?
保險業如何監督和管理受委託機構的作業品質?
金融機構跟保險業在上雲的規範中,主要有哪些差異?
金融業在資訊安全方面,有哪些需要符合的要求?
我今年 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 的處理內容

---
## 3. Amazon Bedrock Knowledge Bases (Vector Store) for GraphRag
### 3-1. 建立 S3 Bucket 以存放用於 RAG 的資料 *(若您已經完成 2-1 章節,此處可跳過)*
#### [Option 1] 通過 AWS CloudShell
:::spoiler **操作步驟**
1. 於 AWS Management Console 上方右鍵點擊圖示  並開啟新分頁以啟用 **AWS CloudShell**

>[!Tip] 說明
>AWS CloudShell 是一個基於瀏覽器的 Shell 環境,可以更輕鬆地安全地管理、探索 AWS 資源並與之互動。 CloudShell 直接使用您的控制台憑證進行預先驗證,並預先安裝了常用的開發和維運工具,而無需在您的本機中安裝或設定軟體。透過 AWS CloudShell,您可以使用 AWS 命令列介面 (AWS CLI) 快速執行腳本,使用 AWS 開發工具包 (AWS SDK) 實驗 AWS 服務 API,或使用各種工具來提高工作效率。
2. 關閉歡迎使用視窗,以進入 AWS CloudShell 操作畫面


3. 執行以下指令,以下載資料 (以法規文件為例),將其解壓縮,並放置於 S3 Bucket
```bash!
DEMO_FILE="https://aws.bardlan.com/iui"
AWS_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
BUCKET_NAME="s3://genai-rag-documents-$AWS_ACCOUNT"
# Download file
if ! wget $DEMO_FILE -O "tw-regulatory-documents.zip"; then
echo "Failed to download file"
exit 1
fi
# Create directory for extraction
mkdir -p tw-regulatory-documents
# Extract files to the specific directory
if ! unzip "tw-regulatory-documents.zip" -d "tw-regulatory-documents"; then
echo "Failed to extract zip file"
exit 1
fi
# Change directory
cd "tw-regulatory-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 2] 通過 AWS Management Console
:::spoiler **操作步驟**
1. 下載資料 (以法規文件為例),並將其解壓縮:https://aws.bardlan.com/iui

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

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

4. 輸入 `genai-rag-documents-[Account_ID]` 作為儲存貯體名稱 (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
:::spoiler **操作步驟**
1. 於 AWS Management Console 上方右鍵點擊圖示  並開啟新分頁以啟用 **AWS CloudShell**

>[!Tip] 說明
>AWS CloudShell 是一個基於瀏覽器的 Shell 環境,可以更輕鬆地安全地管理、探索 AWS 資源並與之互動。 CloudShell 直接使用您的控制台憑證進行預先驗證,並預先安裝了常用的開發和維運工具,而無需在您的本機中安裝或設定軟體。透過 AWS CloudShell,您可以使用 AWS 命令列介面 (AWS CLI) 快速執行腳本,使用 AWS 開發工具包 (AWS SDK) 實驗 AWS 服務 API,或使用各種工具來提高工作效率。
2. 關閉歡迎使用視窗,以進入 AWS CloudShell 操作畫面


3. 執行以下指令,以啟用 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 2] 通過 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. 在左方導覽列 (如果沒有出現導覽列,可點擊左上方的漢堡圖示  展開),點擊 **知識庫 (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 source:** `s3://genai-rag-documents-[Account-ID]/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 3.5 Sonnet v2`):
```
金融機構將應用系統部署上雲時,需要遵循哪些規範要求?
金融機構上雲在選擇受委託機構時需要進行哪些盡職調查?
保險業將應用系統部署上雲時,需要遵循哪些規範要求?
保險業如何監督和管理受委託機構的作業品質?
金融機構跟保險業在上雲的規範中,主要有哪些差異?
我今年 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 的處理內容

---
## 4. Amazon Bedrock Agents
### 4-1. 建立 Agent
1. 進入 **Amazon Bedrock** 服務

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

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

- **名稱 (Name):** `cloud-advisor`
- **選取模型 (Select model):** `Claude 3.5 Sonnet v2`
- **代理程式指示 (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 **回應結果示範**
- `我想問上雲法規`

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

- `我要申請系統上雲`

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

- `我要請假`

:::
## 5. Amazon Bedrock Flows
### 5-1. 建立 Flow
1. 進入 **Amazon Bedrock** 服務

2. 點擊 **流程 (Flow)**

3. 點擊 **建立流程**

4. 輸入以下參數,完成後點擊 **建立**
- 名稱:`chatbot-flow`
- 服務角色名稱: `建立並使用新的服務名稱`

### 5-2. 設計 Flow
接下來,我們將進行 Chatbot 的流程建立,流程設計將利用大語言模型辨別客戶發問的問題,來評估是否要幫助客戶重新定義問題:

成品預計呈現如下:

1. 移除 **Flow input** 與 **Flow output** 之間的線,並且加入提示(Prompts) 節點於畫布中

2. 設定該 **提示 (Prompts)** 節點的設定如下:
- 節點名稱: `rewrite_evalution`
- 選擇 `在節點中定義`
- 選取模型 `Anthropic > Claude 3.5 Sonnet v2`
- 訊息:
```
你是一位金融上雲諮詢助手,專門為用戶提供以下服務:
<services>
- 解答有關金融上雲法規的問題
- 處理上雲遷移申請
- 查詢上雲遷移申請狀態
</services>
你將仔細理解問題,並按照所提供的服務進行問題完整度的評估,並選擇該問題最合適的定義 (只選一個),回應時只需要回應定義,禁止提供任何評論
<question>
{{user_question}}
</question>
<definition>
more_info_required: 問題相當模糊或與服務範圍無關,建議用戶提供更完整的資訊
rewrite_required: 問題在服務範圍內,但不夠清晰與明確,需要近一步修飾成更具體的問題
qualified_question: 問題很明確,且符合在服務範圍
</definition>
<response>
[ONE of definition]
</response>
```
- 完成後將 **Flow input** 接上 **Prompts** *rewrite_evalution*

3. 加入 **條件 (Condition)** 節點於畫布中,並調整以下設定:
- 節點名稱:`rewrite_condition`
- 輸入名稱:`definition`
- 條件1:
- 名稱: `qualified_question`
- 條件:`definition == "qualified_question"`
- 條件2:
- 名稱: `rewrite_required`
- 條件:`definition == "rewrite_required"`
- 完成後將 **Prompts** *rewrite_evalution* 接上 **Condition** *rewrite_condition*

4. 加入 **代理程式 (Agent)** 節點於畫布中,並調整以下設定:
- 節點名稱:`cloud_advisor`
- 代理程式:`cloud-advisor`
- 代理程式別名:`AgentTestAlias`
- 關閉 *promptAttributes* 及 *sessionAttributes* 的 `啟用選用輸入`
- 完成後將 **Condition** *rewrite_condition* 中 *qualified_question* 接上 **Agents** *cloud_advisor*,並且將 **Flow input** 接入 **Agents** *cloud_advisor* 的 input:

5. 將 **Agents** *cloud_advisor* 接入 **Flow output**,並調整 **Flow output** 設定:
- 節點名稱:`agent_reply`

6. 加入 **提示 (Prompt)** 節點於畫布中,並調整以下設定:
- 節點名稱:`rewrite_generation`
- 選擇 `在節點中定義`
- 選取模型 `Anthropic > Claude 3.5 Sonnet v2`
- 訊息:
```
你將仔細理解及評估用戶提出的問題,並依循服務範圍及規則評估,並進行用戶問題的優化及重寫,回應時只需要重寫問題,禁止提供任何評論
<question>
{{user_question}}
</question>
<services>
- 解答有關金融上雲法規的問題
- 處理上雲遷移申請
- 查詢上雲遷移申請狀態
</services>
<rules>
- 仔細理解客戶的問題,並思考調整策略及做法,並協助重新撰寫更清晰具體且完整的問題
- 所有的對話內容都必須使用台灣中文
</rules>
<response>
[重寫問題]
</response>
```
- 完成後將 **Condition** *rewrite_condition* 中 *rewrite_generation* 接上 **Prompt** *rewrite_generation*,並且將 **Flow input** 接入 **Prompts** *rewrite_generation* 的 input:

7. 加入 **代理程式 (Agent)** 節點於畫布中,並調整以下設定:
- 節點名稱:`rewrite_cloud_advisor`
- 代理程式:`cloud-advisor`
- 代理程式別名:`AgentTestAlias`
- 關閉 *promptAttributes* 及 *sessionAttributes* 的 `啟用選用輸入`
- 完成後將 **Prompts** *rewrite_generation* 接上 **Agents** *rewrite_cloud_advisor*,並且將 **Prompts** 接入 **Agents** *cloud_advisor* 的 input:

8. 加入 **流程輸出 (Flow output)** 節點於畫布中,並調整以下設定:
- 節點名稱:`agent_reply_with_rewrite`
- 將 **Agents** *rewrite_cloud_advisor* 接入 **Flow output** *agent_reply_with_rewrite*

9. 加入 **流程輸出 (Flow output)** 節點於畫布中,並調整以下設定:
- 節點名稱:`unknown_question`
- 將 **Condition** *rewrite_condition* 接入 **Flow output** *unknown_question*,並且將 **Prompts** 接入 **Flow output** *unknown_question* 的 input:

10. 以上步驟完成後,按下右上方的 
### 5-3. 測試 Flow
1. 於右方測試框進行 Flow 測試

```
嗨
金融法規有哪些?
保險業者上雲需要注意哪些事項?
```
:::spoiler **回應結果示範**



:::
---
## 6. Amazon Bedrock Guardrails
### 6-1. 建立 Guardrail
1. 進入 **Amazon Bedrock** 服務

2. 點擊 **防護機制 (Guardrail)**

3. 點擊 **建立防護機制**

4. 按照以下步驟並完成相關設定,完成後點擊 **建立防護機制**
- *步驟 (1/6)*:提供防護機制詳細資訊
- **名稱:** `chatbot-restriction`

- *步驟 (2/6)*:設定內容篩選條件
- 啟用 `危害性類別篩選條件`
- 啟用 `提示攻擊篩選條件`

- *步驟 (3/6)*:新增拒絕的主題
- **名稱:** `investment-advice`
- **定義:** `投資建議`

- *步驟 (4/6)*:新增單詞篩選條件
- 啟用 `篩選粗俗語言`
- **新增自訂單詞或短語:** `你媽`

- *步驟 (5/6)*:新增敏感資訊篩選條件
- 新增 PII 類型:
- **名稱 (Name):** 防護機制行為 `遮罩 (Mask)`
- **IPv4 位址:** 防護機制行為 `區塊 (Block)`
- *步驟 (6/6)*:新增內容關聯查詢依據檢查
- 啟用 `依據檢查`
- 啟用 `相關性檢查`

### 6-2. 測試 Guardrail
1. 可於右方測試框進行 Guardrail 測試

:::spoiler **回應結果示範**




:::
---
## 其他相關參考資料
- Mapping the Mind of a Large Language Model: https://www.anthropic.com/research/mapping-mind-language-model
- Anthropic Claude System Prompt: https://docs.anthropic.com/en/release-notes/system-prompts
- [AWS Samples] Bedrock Claude Chat: https://github.com/aws-samples/bedrock-claude-chat
- Workshop: https://hackmd.io/@dennisc/Sk3FCxdJkg
---