

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Amazon Bedrock 代理程式和知識庫開發全自動聊天式助理
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases"></a>

*Jundong Qiao、Shai Cao、Noah Hamilton、Kiowa Jackson、Praveen Kumar Jeyarajan 和 Kara Yang、Amazon Web Services*

## 摘要
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-summary"></a>

許多組織在建立能夠協調各種資料來源以提供完整答案的聊天式助理時，都會面臨挑戰。此模式提供一種解決方案，用於開發聊天式助理，能夠以直接的部署來回應文件和資料庫的查詢。

從 [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) 開始，這項全受管生成式人工智慧 (AI) 服務提供廣泛的進階基礎模型 (FMs)。這有助於高效建立生成式 AI 應用程式，並高度重視隱私權和安全性。在文件擷取的內容中，[擷取增強生成 (RAG)](https://docs.aws.amazon.com/sagemaker/latest/dg/jumpstart-foundation-models-customize-rag.html) 是一種樞紐功能。它使用[知識庫](https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base.html)，透過來自外部來源的內容相關資訊來增強 FM 提示。[Amazon OpenSearch Serverless](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-overview.html) 索引做為 Amazon Bedrock 知識庫後方的向量資料庫。此整合是透過仔細的提示詞工程來增強，以將不正確的情況降至最低，並確保回應錨定在實際文件中。對於資料庫查詢，Amazon Bedrock FMs 會將文字查詢轉換為結構化 SQL 查詢，並結合特定參數。這可讓您從資料庫管理的[AWS Glue 資料庫](https://docs.aws.amazon.com/glue/latest/dg/define-database.html)精確擷取資料。[Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html) 用於這些查詢。

為了處理更複雜的查詢，實現全面的答案需要來自文件和資料庫的資訊。[Amazon Bedrock 的代理](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html)程式是一項生成式 AI 功能，可協助您建置自主代理程式，了解複雜的任務並將其分解為更簡單的協同運作任務。由 Amazon Bedrock 自動代理程式協助，從簡化任務中擷取的洞見組合可增強資訊的合成，進而產生更徹底且詳盡的答案。此模式示範如何在自動化解決方案中使用 Amazon Bedrock 和相關的生成式 AI 服務和功能來建置聊天式助理。

## 先決條件和限制
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶
+ Docker，[已安裝](https://docs.docker.com/engine/install/)
+ AWS Cloud Development Kit (AWS CDK)，[已安裝](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_tools)並[引導](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_bootstrap)至 `us-east-1`或 `us-west-2` AWS 區域
+ AWS CDK [已安裝](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) Toolkit 2.114.1 版或更新版本
+ AWS Command Line Interface (AWS CLI)，[已安裝](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)並[設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
+ Python 3.11 版或更新版本，[已安裝](https://www.python.org/downloads/)
+ 在 Amazon Bedrock 中，[啟用對 Claude 2、Claude 2.1、Claude Instant 和 Titan Embeddings G1 的存取](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html) – 文字 G1 

**限制**
+ 此解決方案會部署到單一 AWS 帳戶。
+ 此解決方案只能在支援 Amazon Bedrock 和 Amazon OpenSearch Serverless AWS 區域 的 中部署。如需詳細資訊，請參閱 [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-regions.html) 和 [Amazon OpenSearch Serverless](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-overview.html#serverless-regions) 的文件。

**產品版本**
+ Llama-index 0.10.6 版或更新版本
+ Sqlalchemy 2.0.23 版或更新版本
+ Opensearch-py 2.4.2 版或更新版本
+ Requests\$1aws4auth 1.2.3 版或更新版本
+ 適用於 Python (Boto3) 的 AWS SDK 1.34.57 版或更新版本

## Architecture
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-architecture"></a>

**目標技術堆疊 **

[AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html) 是開放原始碼軟體開發架構，用於在程式碼中定義雲端基礎設施並透過其佈建 AWS CloudFormation。此模式中使用的 AWS CDK 堆疊會部署下列 AWS 資源： 
+ AWS Key Management Service (AWS KMS)
+ Amazon Simple Storage Service (Amazon S3)
+ AWS Glue Data Catalog，適用於 AWS Glue 資料庫元件
+ AWS Lambda
+ AWS Identity and Access Management (IAM)
+ Amazon OpenSearch Serverless
+ Amazon Elastic Container Registry (Amazon ECR) 
+ Amazon Elastic Container Service (Amazon ECS)
+ AWS Fargate
+ Amazon Virtual Private Cloud (Amazon VPC)
+ [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) 

**目標架構 **

![\[使用 Amazon Bedrock 知識庫和代理程式的架構圖\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/15372718-3a5d-4918-9cfa-422c455f288d/images/ff19152e-0bb6-4758-a6dd-4f6140e55113.png)


圖表顯示使用多個 AWS 區域的單一 AWS 中全面的雲端原生設定 AWS 服務。聊天式助理的主要界面是在 Amazon ECS 叢集上託管的 [Streamlit](https://docs.streamlit.io/) 應用程式。 [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/) 會管理可存取性。透過此界面進行的查詢會啟用 `Invocation` Lambda 函數，然後與 Amazon Bedrock 的代理程式連接。此代理程式會透過諮詢 Amazon Bedrock 的知識庫或叫用 `Agent executor` Lambda 函數來回應使用者查詢。此函數會在預先定義的 API 結構描述之後，觸發與代理程式相關聯的一組動作。Amazon Bedrock 的知識庫使用 OpenSearch Serverless 索引作為向量資料庫基礎。此外，`Agent executor`函數會產生透過 Amazon Athena 針對 AWS Glue 資料庫執行的 SQL 查詢。

## 工具
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-tools"></a>

**AWS 服務**
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html) 是一種互動式查詢服務，可協助您使用標準 SQL 直接在 Amazon Simple Storage Service (Amazon S3) 中分析資料。
+ [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) 是一項全受管服務，可讓您透過統一 API 使用來自領導 AI 新創公司的高效能基礎模型 (FMs) 和 Amazon。
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) 是一種軟體開發架構，可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您 AWS 服務 透過命令列 shell 中的命令與 互動。
+ [Amazon Elastic Container Service (Amazon ECS)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) 是快速、可擴展的容器管理服務，可協助您執行、停止和管理叢集上的容器。
+ [Elastic Load Balancing ](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)會將傳入的應用程式或網路流量分散到多個目標。例如，您可以將流量分散到一或多個可用區域中的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、容器和 IP 地址。
+ [AWS Glue](https://docs.aws.amazon.com/glue/) 是全受管擷取、轉換和載入 (ETL) 服務。它可協助您可靠地分類、清理、擴充和移動資料存放區和資料串流之間的資料。此模式使用 AWS Glue 爬蟲程式和 AWS Glue Data Catalog 資料表。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需按使用的運算時間付費。
+ [Amazon OpenSearch Serverless](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-overview.html) 是 Amazon OpenSearch Service 的隨需無伺服器組態。在此模式中，OpenSearch Serverless 索引可做為 Amazon Bedrock 知識庫的向量資料庫。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。

**其他工具**
+ [Streamlit](https://docs.streamlit.io/) 是一種開放原始碼 Python 架構，可用來建立資料應用程式。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [genai-bedrock-agent-chatbot](https://github.com/awslabs/genai-bedrock-agent-chatbot/) 儲存庫中使用。程式碼儲存庫包含下列檔案和資料夾：
+ `assets` 資料夾 – 靜態資產，例如架構圖表和公有資料集。
+ `code/lambdas/action-lambda` 資料夾 – Lambda 函數的 Python 程式碼，可做為 Amazon Bedrock 代理程式的動作。
+ `code/lambdas/create-index-lambda` 資料夾 – 建立 OpenSearch Serverless 索引之 Lambda 函數的 Python 程式碼。
+ `code/lambdas/invoke-lambda` 資料夾 – 叫用 Amazon Bedrock 代理程式的 Lambda 函數的 Python 程式碼，該代理程式直接從 Streamlit 應用程式呼叫。
+ `code/lambdas/update-lambda` 資料夾 – Lambda 函數的 Python 程式碼，會在透過 部署資源之後更新或刪除 AWS 資源 AWS CDK。
+ `code/layers/boto3_layer` 資料夾 – 建立 Boto3 layer 的 AWS CDK 堆疊，在所有 Lambda 函數之間共用。
+ `code/layers/opensearch_layer` 資料夾 – 建立 OpenSearch Serverless layer 的 AWS CDK 堆疊，會安裝所有相依性來建立索引。
+ `code/streamlit-app` 資料夾 – 在 Amazon ECS 中做為容器映像執行的 Python 程式碼。
+ `code/code_stack.py` – AWS CDK 建立 AWS 資源的建構 Python 檔案。
+ `app.py` – 在目標 AWS 帳戶中部署 AWS 資源的 AWS CDK 堆疊 Python 檔案。
+ `requirements.txt` – 必須為 安裝的所有 Python 相依性清單 AWS CDK。
+ `cdk.json` – 輸入檔案，用來提供建立資源所需的值。此外，您可以在`context/config`欄位中相應地自訂解決方案。如需自訂的詳細資訊，請參閱[其他資訊](#develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-additional)一節。

## 最佳實務
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-best-practices"></a>
+ 此處提供的程式碼範例僅用於proof-of-concept(PoC) 或試行目的。如果您想要將程式碼帶入生產環境，請務必使用下列最佳實務：
  + 啟用 [Amazon S3 存取記錄](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html)
  + 啟用 [VPC 流程日誌](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html)
+ 設定 Lambda 函數的監控和提醒。如需詳細資訊，請參閱[監控和疑難排解 Lambda 函數](https://docs.aws.amazon.com/lambda/latest/dg/lambda-monitoring.html)。如需最佳實務，請參閱[使用 AWS Lambda 函數的最佳實務](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)。

## 史詩
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-epics"></a>

### 在本機工作站上設定 AWS 登入資料
<a name="set-up-aws-credentials-on-your-local-workstation"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 匯出帳戶和區域的變數。 | 若要使用環境變數提供 的 AWS 登入 AWS CDK 資料，請執行下列命令。<pre>export CDK_DEFAULT_ACCOUNT=<12-digit AWS account number><br />export CDK_DEFAULT_REGION=<Region></pre> | AWS DevOps，DevOps 工程師 | 
| 設定 AWS CLI 具名設定檔。 | 若要為帳戶設定 AWS CLI 具名設定檔，請遵循[組態和登入資料檔案設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)中的指示。 | AWS DevOps，DevOps 工程師 | 

### 設定您的環境
<a name="set-up-your-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將儲存庫複製到您的本機工作站。 | 若要複製儲存庫，請在終端機中執行下列命令。<pre>git clone https://github.com/awslabs/genai-bedrock-agent-chatbot.git</pre> | DevOps 工程師，AWS DevOps | 
| 設定 Python 虛擬環境。 | 若要設定 Python 虛擬環境，請執行下列命令。<pre>cd genai-bedrock-agent-chatbot<br />python3 -m venv .venv<br />source .venv/bin/activate</pre>若要設定所需的相依性，請執行下列命令。<pre>pip3 install -r requirements.txt</pre> | DevOps 工程師，AWS DevOps | 
| 設定 AWS CDK 環境。 | 若要將程式碼轉換為 AWS CloudFormation 範本，請執行命令 `cdk synth`。 | AWS DevOps，DevOps 工程師 | 

### 設定和部署應用程式
<a name="configure-and-deploy-the-application"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在帳戶中部署資源。 | 若要 AWS 帳戶 使用 在 中部署資源 AWS CDK，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases.html)成功部署後，您可以使用 CloudFormation 主控台的**輸出**索引標籤上提供的 URL 來存取聊天式助理應用程式。 | DevOps 工程師，AWS DevOps | 

### 清除解決方案中的所有 AWS 資源
<a name="clean-up-all-aws-resources-in-the-solution"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 移除 AWS 資源。 | 測試解決方案之後，若要清除資源，請執行命令 `cdk destroy`。 | AWS DevOps，DevOps 工程師 | 

## 相關資源
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-resources"></a>

**AWS 文件**
+ Amazon Bedrock 資源：
  + [模型存取](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html)
  + [基礎模型的推論參數](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html)
  + [Amazon Bedrock 的代理程式](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html)
  + [Amazon Bedrock 的知識庫](https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base.html)
+ [使用 Python 建置 Lambda 函數](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)
+ AWS CDK 資源：
  + [開始使用 AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)
  + [對 AWS CDK 常見問題進行故障診斷](https://docs.aws.amazon.com/cdk/v2/guide/troubleshooting.html)
  + [在 Python AWS CDK 中使用](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-python.html)
+ [上的生成式 AI 應用程式建置器 AWS](https://docs.aws.amazon.com/solutions/latest/generative-ai-application-builder-on-aws/solution-overview.html)

**其他 AWS 資源**
+ [Amazon OpenSearch Serverless 的向量引擎](https://aws.amazon.com/opensearch-service/serverless-vector-engine/)

**其他資源**
+ [LlamaIndex 文件](https://docs.llamaindex.ai/en/stable/)
+ [串流文件](https://docs.streamlit.io/)

## 其他資訊
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-additional"></a>

**使用您自己的資料自訂聊天式助理**

若要整合自訂資料以部署解決方案，請遵循這些結構化準則。這些步驟旨在確保無縫且有效率的整合程序，讓您能夠使用自訂資料有效地部署解決方案。

*用於知識庫資料整合*

**資料準備**

1. 找到 `assets/knowledgebase_data_source/`目錄。

1. 將資料集放在此資料夾中。

**組態調整**

1. 開啟 `cdk.json` 檔案。

1. 導覽至 `context/configure/paths/knowledgebase_file_name` 欄位，然後相應地更新。

1. 導覽至 `bedrock_instructions/knowledgebase_instruction` 欄位，然後更新它，以準確反映新資料集的細微差別和內容。

*用於結構資料整合*

**資料組織**

1. 在 `assets/data_query_data_source/`目錄中，建立子目錄，例如 `tabular_data`。

1. 將您的結構化資料集 （可接受的格式包括 CSV、JSON、ORC 和 Parquet) 放入這個新建立的子資料夾。

1. 如果您要連線到現有的資料庫，請在 `create_sql_engine()`中更新 函數`code/lambda/action-lambda/build_query_engine.py`以連線到您的資料庫。

**組態和程式碼更新**

1. 在 `cdk.json` 檔案中，更新 `context/configure/paths/athena_table_data_prefix` 欄位以符合新的資料路徑。

1. 透過整合與資料集對應的新text-to-SQL範例`code/lambda/action-lambda/dynamic_examples.csv`進行修訂。

1. 修改`code/lambda/action-lambda/prompt_templates.py`以鏡像結構化資料集的屬性。

1. 在 `cdk.json` 檔案中，更新 `context/configure/bedrock_instructions/action_group_description` 欄位以解釋 `Action group` Lambda 函數的目的和功能。

1. 在 `assets/agent_api_schema/artifacts_schema.json` 檔案中，說明 `Action group` Lambda 函數的新功能。

*一般更新*

在 `cdk.json` 檔案中，在 `context/configure/bedrock_instructions/agent_instruction`區段中，提供 Amazon Bedrock 代理程式預期功能和設計用途的完整描述，並將新整合的資料納入考量。