---
# System prepended metadata

title: 實驗環境準備

---

# 事前檔案下載
[file path](https://drive.google.com/file/d/12lKpiWG1boUTXlyMe9Dwy_CaYCKRsy85/view?usp=drive_link)

檔案來源：
https://support.maicoin.com/zh-TW/support/solutions


# 1.實驗環境準備
## 1.1 使用 AWS 練習環境
1. 進入課程提供的 AWS Workshop Studio 網址，並點擊 「Email one-time password (OTP)」，以獲得一次性臨時密碼。
![image](https://hackmd.io/_uploads/ByOQLtntyx.png)
2. 輸入自己的 Email 以用於接收一次性臨時密碼 ，並點擊 「傳送密碼」。
提醒

活動期間使用相同 Email 進行登入將會使用相同的練習環境
>[!TIP]提醒
>活動期間使用相同 Email 進行登入將會使用相同的練習環境

3. 進入自己的 Email 以取得 9 碼 Passcode。
![image](https://hackmd.io/_uploads/rJQStK2K1x.png)

4. 將 9 碼 Passcode 填入，並點擊 「登入」。
![image](https://hackmd.io/_uploads/rJJ8tK2Ykg.png)

5. 登入並進行環境使用要求條款後，請勾選 「I agree with the Terms and Conditions」，並點擊 「Join event」。
![image](https://hackmd.io/_uploads/SJTwtY2tkl.png)
![image](https://hackmd.io/_uploads/Byw_YKht1e.png)

6. 點擊 「Open AWS console」，以開啟 AWS Management Console。
![image](https://hackmd.io/_uploads/BJStKK2tJl.png)

>[!TIP]提醒
>練習過程中，若 AWS Management Console 逾時登出，可再次點擊此連結以重新登入並更新憑證

7. 進入 AWS Management Console 後，即完成登入。
![image](https://hackmd.io/_uploads/ryVjFK2FJe.png)

# 2.實作
## 2-1 RAG說明
* Pre-processing data
為了啟用有效的私人數據檢索，一種常見的做法是首先將文檔拆分成可管理的 chunks，以便於檢索。然後，將這些 chunks 轉換為 embeddings 並寫入向量索引，同時保持與原始文檔的映射關係。這些 embeddings 用於確定查詢與數據源中的文本之間的語義相似性。下圖說明了向量資料庫的數據預處理過程。
![image](https://hackmd.io/_uploads/SJ_asYntke.png)
* Runtime execution
在運行時，使用 embedding model 將用戶的查詢轉換為向量。接著，查詢 vector index 以找到與用戶查詢語義相似的 chunks，通過比較文檔向量和用戶查詢向量來進行。最後一步，通過從 vector index 檢索到的 chunks 增強用戶的提示，並將提示與額外的上下文一同發送給模型，從而生成回應給用戶。下圖說明了 RAG 在運行時如何增強對用戶查詢的回應。
![image](https://hackmd.io/_uploads/HJERot2Ykg.png)


## 介面檢查
1. 確認區域為 **奧勒岡 (Oregon)**，並確認使用者為 WSParticipantRole/Participant，避免誤用到貴司 AWS Account
![image](https://hackmd.io/_uploads/rkdTht2Fye.png)

2. 點擊 **齒輪圖示**  可以更換為您習慣的語言
![image](https://hackmd.io/_uploads/BJC22t2Y1g.png)



## 2-2 前置作業 - S3資料上傳

1. 建立 S3 Bucket 以存放用於 RAG 的資料

2. 進入 Amazon S3 服務
![image](https://hackmd.io/_uploads/HJXqJqnKyl.png)

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

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

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

5. 將下載的檔案及目錄上傳至建立的 S3 Bucket 中。

![Screenshot 2025-02-23 at 5.14.22 PM](https://hackmd.io/_uploads/B1n1dv_5kx.png)
![Screenshot 2025-02-23 at 5.17.31 PM](https://hackmd.io/_uploads/B1nkuw_5yl.png)
![image](https://hackmd.io/_uploads/HJUvsvO5ke.png)

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


## 2-3 前置作業 - 啟用模型存取
1. 進入 Amazon Bedrock 服務
![image](https://hackmd.io/_uploads/By80hF2Kkg.png)

2. 進入 模型存取權 (Model access) 來啟用欲存取的 Foundation Models (FMs)
![image](https://hackmd.io/_uploads/Hk0gTKhFke.png)

3. 您可點擊 啟用所有模型 (Enable all models) 來啟用所有的 FMs 存取權限
![image](https://hackmd.io/_uploads/S1YWaK2YJx.png)

>[!Warning]注意
>此處選擇 Enable all models 是為在 Workshop 簡化操作之目的，在您自己的 AWS 環境時，請按照您的實際需求選擇所需的 FMs


4. 等待一段時間，確認 FMs 的存取狀態為 已授予存取權 (access granted)
![image](https://hackmd.io/_uploads/ryPqTK2Yye.png)


>[!TIP]提醒
>提交模型存取權後，部分模型存取權請求會失敗，在此實驗環>境屬於正常，僅需確認以下模型有成功授予存取權即可
>Titan Text Embeddings V2
>Claude 3.5 Sonnet v2

## 2-3 建立知識庫（Knowledge Bases）
![image](https://hackmd.io/_uploads/SJ_asYntke.png)


1. 進入 Amazon Bedrock 服務
![image](https://hackmd.io/_uploads/BkeQItWq1l.png)

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

3. 在右方主視窗中，點擊 建立知識庫 > Knowledge Base with vector store，並完成以下步驟 (未提及的參數設定可保留預設)：
![image](https://hackmd.io/_uploads/Skvr8F-9ke.png)

* a. 提供知識庫詳細資訊 (Provide knowledge base details)
    * 知識庫名稱: maicoin-document-kb
    * Data Source: Amazon S3
    * Log deliveries - Application logs: Add > To Amazon CloudWatch Logs

* b. 設定資料來源 (Configure data source)
    * 資料來源名稱: data-source-maicoin-doc
    * S3 URI: 瀏覽 S3 並選取 > s3://genai-rag-documents-[Account-ID]/
    * Parsing strategy: Amazon Bedrock default parser
    * 分塊策略: 未分塊
    
>[!Note]  說明
>Parsing strategy
>* Amazon Bedrock default parser
Amazon 預設的解析器，僅會解析純文字，此項不會產生費用。
>* Amazon Bedrock Data Automation as parser - Preview
>Amazon 提供的解析器，可有效處理多模態資料，包括文字和影像，而無需提供任何額外的提示。
>* Foundation models as a parser
使用基礎模型或推論描述檔來處理多模型資料，包括文字和影像。此剖析器可讓您選擇自訂用於資料擷取的提示。
>
> 分塊策略
>* 預設分塊
將內容分割成大約 300 個字符的文字區塊。分塊化程序會遵守句子界限，確保在每個分塊內保留完整的句子。
>* 固定大小分塊
可以透過指定每個分塊的字符數量和重疊百分比來設定所需的分塊大小，從而提供靈活性，以符合您的特定需求。
>* 語意分塊
語意分塊是一種自然語言處理技術，可將文字分割為有意義的區塊，以增強理解和資訊擷取。旨在透過專注於語意內容，而非僅語法結構來提高擷取準確性。
>* 階層分塊
階層分塊涉及將資訊組織到子區塊和父區塊的巢狀結構。建立資料來源時，您可以定義父區塊大小、子區塊大小，以及在每個區塊之間重疊的字符數量。若資料源具備檔案目錄，較爲合適此策略。 

* c. 選取內嵌項目模型並設定向量存放區 (Select embeddings model and configure vector store)
    * 內嵌項目模型: Titan Text Embeddings v2
    * 向量資料庫: 快速建立新的向量儲存 – 建議值 > Amazon OpenSearch Serverless
* d. 檢閱並建立 (Review and create)
    * 點擊 建立知識庫 (Create knowledge base)
    * 
>[!TIP]提醒
>需要等待3 - 5分鐘


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

1. 當環境建置完成，前往 資料來源 (Data source) 選擇 `data-source-maicoin-doc` 並點擊 同步 (Sync)
![image](https://hackmd.io/_uploads/ry1Vp5-51l.png)

>[!Note]  說明
>點擊 同步 (Sync) 按鈕後，可拉到畫面上方，會顯示說明 資料來源已啟動同步，需要等待幾分鐘時間 (約為 3 分鐘)
>![image](https://hackmd.io/_uploads/SkZva9bqkg.png)

2. 點選進去 `data-source-maicoin-doc`，查看 同步歷史記錄，確認以下資訊
* 狀態為完成 (Completed)

## 2-5. 測試知識庫
1. 資料完成同步後，即可在右方聊天視窗進行知識庫測試，在 選取模型 (Select model) 選擇 Anthropic > Claude 3.5 Sonnet v2：

* a.嘗試以下範例
```
新用戶台幣入金限額調整
```
![image](https://hackmd.io/_uploads/S1AJCjb9kx.png)

* b. 嘗試以下範例
```
MAX 新台幣入金完整教學
```
![image](https://hackmd.io/_uploads/S1qhCi-cJx.png)

# 3. Amazon Bedrock 代理程式 - Agents
![agent1](https://hackmd.io/_uploads/HkxNyKO9ke.png)

## 3-1. 建立 Agent
1. 進入 Amazon Bedrock 服務
![image](https://hackmd.io/_uploads/BkE4-2W5Jx.png)

2. 點擊 代理程式 (Agents) 來快速建立 RAG 與 API 整合應用
![image](https://hackmd.io/_uploads/H1VIb2-cJg.png)

3. 點擊 建立代理程式 (Create Agent)
![image](https://hackmd.io/_uploads/BJEwW2-5yg.png)
![Screenshot 2025-02-19 at 9.56.05 AM](https://hackmd.io/_uploads/SJgfonzckx.png)

    * 名稱 (Name): `maicoin_agent`
    
4. 設定 Agent
![Screenshot 2025-02-23 at 5.54.11 PM](https://hackmd.io/_uploads/rk2ue_d9kg.png)


    * 選取模型 (Select model)： Anthropic > Claude 3.5 Sonnet v2
    * 代理程式指示 (Agent Prompt):
    你是虛擬貨幣產品的諮詢專家，你將依據問題決定要查詢內部知識庫(Knowledge base)還是呼叫 API。除了虛擬貨幣產品問題、crypto產品諮詢外，其他無關的問題請回答：「抱歉，我沒有這方面的知識」。所有的對答都需要使用台灣中文，並列出參考的附件檔案。
    * 其他設定 (Additional settings)
    使用者輸入 (User input)： Enabled
    
5. 上述完成後，先點擊右上角 儲存 (Save) 以建立 Agent
![Screenshot 2025-02-23 at 3.45.09 PM](https://hackmd.io/_uploads/Hy_7MUO5yg.png)

6. 測試 Agent
詢問 ： 新用戶台幣入金限額調整
![image](https://hackmd.io/_uploads/BJDGZuu51e.png)
詢問 ： 請問現在比特幣價格？
![image](https://hackmd.io/_uploads/rJ9_WuO5ye.png)

## 3-2. 建立動作群組 (API 整合)
1. 在上個步驟建立完成的 `maicoin_agent` 裡面，找到 動作群組 (Action groups) 區塊並點擊 新增 (Add)
![image](https://hackmd.io/_uploads/rkWozU_9kg.png)

輸入動作群組名稱 (Enter Action group name)： crypto-application
* Enable confirmation of action group function - 選用 ： Enabled
* 描述 (Description)： 處理crypto相關的諮詢

* 動作群組類型 (Action group type): 使用函數詳細資訊進行定義

* 動作群組調用 (Action group invocation): 快速建立一個新的 Lambda 函數 - 建議值

![Screenshot 2025-02-23 at 3.56.21 PM](https://hackmd.io/_uploads/BkJRV8O91l.png)

* 新增 動作群組函數 1，輸入資訊如下：
    * 名稱 (Name): price_check
    * 描述 (Description): 查詢cpyto現在價格，只有支援 : "BTCUSDT", "DOGEUSDT", "LTCUSDT"
    * 參數 (Parameters): 
        * 名稱 ： currencies
        * 描述 : "BTCUSDT", "DOGEUSDT", "LTCUSDT"
        * 類型 ： string
        * 必要 ： True

2. 上述完成後請點擊 建立 (Create)
3. 建立完成後，請按下 儲存 (Save)，以儲存 Agent 設定


## 3-3. 調整 API 程式
1. 前往 Amazon Lambda 服務
![image](https://hackmd.io/_uploads/rJMrS8uqJg.png)

2. 點擊自動生成的 Lambda function (函數): 函數名稱為 crypto-application 開頭
![Screenshot 2025-02-23 at 6.08.53 PM](https://hackmd.io/_uploads/SyNJV_dcJe.png)


3. 取代程式碼 dummy_lambda.py
```python=

import json
import urllib3

def lambda_handler(event, context):
    agent = event['agent']
    actionGroup = event['actionGroup']
    function = event['function']
    parameters = event.get('parameters', [])


    
    if function == "price_check" :
        currency =  event.get('parameters')[0]['value']

        result = get_currency(currency)
   
    
        # symbol = result['body']['symbol']
        # price = str(result['body']['price'])

    # Execute your business logic here. For more information, refer to: https://docs.aws.amazon.com/bedrock/latest/userguide/agents-lambda.html
    responseBody =  {
        "TEXT": {
            "body": result['body']
        }
    }

    action_response = {
        'actionGroup': actionGroup,
        'function': function,
        'functionResponse': {
            'responseBody': responseBody
        }

    }

    dummy_function_response = {'response': action_response, 'messageVersion': event['messageVersion']}
    # print("Response: {}".format(dummy_function_response))

    return dummy_function_response



def get_currency(currency):
    # Binance API URL
    api_url = "https://api.api-ninjas.com/v1/cryptoprice?symbol="
    
    # 允許的貨幣對列表
    allowed_currencies = ["BTCUSDT", "DOGEUSDT", "LTCUSDT"]
    
    # 從event中取得symbol參數
    symbol = currency

    # 檢查symbol是否在允許的列表內
    if symbol not in allowed_currencies:
        return {
            'statusCode': 400,
            'body': json.dumps({
                'error': 'Invalid currency pair. Only the following are allowed: BTCUSDT, DOGEUSDT, LTCUSDT'
            })
        }

    # 創建urllib3的HTTP連接池
    http = urllib3.PoolManager()
    headers = {
        "X-Api-Key": "PjB7WWICsByKl5y9D8QrmA==yPlDDnehRaL3LCKG"
    }
    # 呼叫Binance API取得價格
    try:
        response = http.request('GET', api_url + symbol,headers=headers)
        print('*'*20)
        print(response,response.data)
        # 檢查返回的狀態碼
        if response.status == 200:
            # 解析API返回的JSON資料
            data = json.loads(response.data.decode('utf-8'))
            price = str(data.get('price'))
            
            return {
                'statusCode': 200,
                'body': json.dumps({
                    'symbol': symbol,
                    'price': price
                })
            }
        else:
            # 返回非200狀態碼的錯誤
            return {
                'statusCode': response.status,
                'body': json.dumps({
                    'error': f"Error fetching data from Binance API: Status code {response.status}"
                })
            }
    
    except urllib3.exceptions.HTTPError as e:
        # 處理API請求錯誤
        return {
            'statusCode': 500,
            'body': json.dumps({
                'error': f"Error fetching data from Binance API: {str(e)}"
            })
        }

```

4. 完成後點擊左方的 Deploy 按鈕
![image](https://hackmd.io/_uploads/SJLCp8d5Jl.png)

5. 測試Agent
``` 
請問現在BTC價格
```
![image](https://hackmd.io/_uploads/SJvrxD_5kg.png)


# 4. 整合知識庫
1. 進入 Amazon Bedrock 服務
![image](https://hackmd.io/_uploads/BkLW0U_qJl.png)

2. 點擊 代理程式 (Agents) 並進入 maicoin_agent

3. 點擊 在代理程式建置器中編輯
![Screenshot 2025-02-24 at 9.39.51 AM](https://hackmd.io/_uploads/SyZECrF91x.png)


4. 前往 知識庫 (Knowledge bases) 並點擊 新增 (Add)
![image](https://hackmd.io/_uploads/r1gKCUOq1e.png)
    * 選取知識庫 (Select knowledge base)： maincoin-document-kb
    * 代理程式的知識庫指示 (Knowledge base instructions for Agent)： 查詢及回應有關MaiCoin頁面相關的資訊
    
5. 完成後點擊 Add 以整合知識庫
6. 點擊 儲存 (Save) 以保存 Agent 相關設定
7. 點擊 準備 (Prepare) 以準備進行 Agent 測試

8. 測試 Agent
完成上面步驟後，可在畫面右方進行 Agent 測試，並嘗試測試使用者正在諮詢客服機器人：
    * 開啟機器人諮詢對話
```
新用戶台幣入金限額調整
```
![image](https://hackmd.io/_uploads/SymQ0u_qJe.png)




# 結語
恭喜完成 Workshop 所有實作步驟，經過此 Workshop 後，您已熟悉如何使用 Amazon Bedrock 建立與設定 知識庫 Knowledge bases 與 代理程式 Agent。

接下來，您可以嘗試使用其他公開文件檔案 建立新的 Knowledge bases，接著使用代理程式 Agent 進行串接。

若有任何問題，也歡迎您隨時與我們聯絡。