

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

# 將自然語言轉換為查詢 DSL for OpenSearch 和 Elasticsearch 查詢
<a name="translate-natural-language-query-dsl-opensearch-elasticsearch"></a>

*Tabby Ward、Nicholas Switzer 和 Breanne Warner，Amazon Web Services*

## 總結
<a name="translate-natural-language-query-dsl-opensearch-elasticsearch-summary"></a>

此模式示範如何使用大型語言模型 (LLMs) 將自然語言查詢轉換為查詢網域特定的語言 （查詢 DSL)，讓使用者更輕鬆地與搜尋服務互動，例如 OpenSearch 和 Elasticsearch，而無需對查詢語言有廣泛的了解。對於想要使用自然語言查詢功能增強以搜尋為基礎的應用程式，最終改善使用者體驗和搜尋功能的開發人員和資料科學家來說，此資源特別有用。

模式說明了提示性工程、反覆精簡和納入專業知識的技術，這些技術對於合成資料產生至關重要。雖然此方法主要著重於查詢轉換，但隱含地展示了資料擴增和可擴展性合成資料生產的可能性。此基礎可以擴展到更全面的合成資料產生任務，以強調 LLMs使用結構化、應用程式特定的輸出橋接非結構化自然語言輸入的能力。

此解決方案在傳統意義上不涉及遷移或部署工具。相反地，它著重於示範使用 LLMs概念驗證 (PoC)。
+ 模式使用 Jupyter 筆記本做為step-by-step指南。 text-to-query 
+ 它使用 Amazon Bedrock 存取 LLMs，這對於解譯自然語言和產生適當的查詢至關重要。
+ 解決方案旨在與 Amazon OpenSearch Service 搭配使用。您可以遵循 Elasticsearch 的類似程序，而產生的查詢可能會適應類似的搜尋引擎。

[查詢 DSL](https://opensearch.org/docs/latest/query-dsl/) 是一種靈活的 JSON 型搜尋語言，用於在 Elasticsearch 和 OpenSearch 中建構複雜的查詢。它可讓您在搜尋操作的查詢參數中指定查詢，並支援各種查詢類型。DSL 查詢包含分葉查詢和複合查詢。分葉查詢會搜尋特定欄位中的特定值，並包含全文、術語層級、地理、聯結、跨度和特殊化查詢。複合查詢可做為多個分葉或複合子句的包裝函式，並結合其結果或修改其行為。查詢 DSL 支援建立複雜的搜尋，範圍從簡單的所有相符查詢，到產生高度特定結果的複雜多子句查詢。對於需要進階搜尋功能、彈性查詢建構和 JSON 型查詢結構的專案，查詢 DSL 特別有價值。

此模式使用技術，例如少量擷取提示、系統提示、結構化輸出、提示鏈結、內容佈建，以及text-to-query DSL 轉換的任務特定提示。如需這些技術的定義和範例，請參閱[其他資訊](#translate-natural-language-query-dsl-opensearch-elasticsearch-additional)一節。

## 先決條件和限制
<a name="translate-natural-language-query-dsl-opensearch-elasticsearch-prereqs"></a>

**先決條件**

若要有效地使用 Jupyter 筆記本將自然語言查詢轉換為查詢 DSL 查詢，您需要：
+ **熟悉 Jupyter 筆記本**。對如何在 Jupyter 筆記本環境中導覽和執行程式碼的基本了解。
+ **Python 環境**。運作中的 Python 環境，最好是 Python 3.x，並已安裝必要的程式庫。
+ **Elasticsearch 或 OpenSearch 知識**。Elasticsearch 或 OpenSearch 的基本知識，包括其架構以及如何執行查詢。
+ **AWS 帳戶**。 AWS 帳戶 用於存取 Amazon Bedrock 和其他相關服務的作用中 。
+ **程式庫和相依性**。安裝筆記本中提及的特定程式庫，例如`boto3` AWS 互動，以及 LLM 整合所需的任何其他相依性。
+ **Amazon Bedrock 內的模型存取**。此模式使用來自 Anthropic LLMs。開啟 [Amazon Bedrock 主控台](https://console.aws.amazon.com/bedrock/)，然後選擇**模型存取**。在下一個畫面上，選擇**啟用特定模型**，然後選取這三個模型：
  + Claude 3 Sonnet
  + Claude 3.5 Sonnet
  + Claude 3 Haiku
+ **適當的 IAM 政策和 IAM 角色**。若要在 中執行筆記本 AWS 帳戶，您的 AWS Identity and Access Management (IAM) 角色需要 `SagemakerFullAccess` 政策以及[其他資訊](#translate-natural-language-query-dsl-opensearch-elasticsearch-additional)區段中提供的政策，您可以將其命名為 `APGtext2querydslpolicy`。此政策包含訂閱列出的三個 Claude 模型。

備妥這些先決條件可確保在使用筆記本時獲得順暢的體驗，並實作text-to-query功能。

**限制**
+ **概念狀態證明**。此專案主要用於概念驗證 (PoC)。它示範了使用 LLMs 將自然語言查詢轉換為查詢 DSL 的可能性，但它可能尚未完全最佳化或可供生產使用。
+ **模型限制**：

  **內容視窗限制***條件。*使用 Amazon Bedrock 上可用的 LLMs 時，請注意內容時段限制：

  Claude 模型 （截至 2024 年 9 月）：
  + Claude 3 Opus：200，000 個字符
  + Claude 3 Sonnet：200，000 個字符
  + Claude 3 Haiku：200，000 個字符

  Amazon Bedrock 上的其他模型可能會有不同的內容視窗大小。請務必檢查最新的文件以取得最新資訊。

  **模型可用性***。 *Amazon Bedrock 上特定模型的可用性可能會有所不同。在實作此解決方案之前，請確定您能夠存取所需的模型。
+ **其他限制**
  + **查詢複雜性**。查詢 DSL 轉換的自然語言有效性可能會因輸入查詢的複雜性而有所不同。
  + **版本相容性**。產生的查詢 DSL 可能需要根據您使用的 Elasticsearch 或 OpenSearch 特定版本進行調整。
  + **效能**。此模式提供 PoC 實作，因此查詢產生速度和準確性可能不最適合大規模生產使用。
  + **成本**：在 Amazon Bedrock 中使用 LLMs 會產生成本。請注意所選模型的定價結構。如需詳細資訊，請參閱 [Amazon Bedrock 定價](https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-pricing.html)。
  + **維護**。為了跟上 LLM 技術的進展和查詢 DSL 語法的變更，可能需要定期更新提示和模型選擇。

**產品版本**

此解決方案已在 Amazon OpenSearch Service 中測試。如果您想要使用 Elasticsearch，您可能需要進行一些變更，才能複寫此模式的確切功能。
+ **OpenSearch 版本相容性**。** **OpenSearch 在主要版本中維持回溯相容性。例如：
  + OpenSearch 1.x 用戶端通常與 OpenSearch 1.x 叢集相容。
  + OpenSearch 2.x 用戶端通常與 OpenSearch 2.x 叢集相容。

  不過，最好盡可能同時針對用戶端和叢集使用相同的次要版本。
+ **OpenSearch API 相容性**。** **OpenSearch 針對大多數操作維持與 Elasticsearch OSS 7.10.2 的 API 相容性。不過，存在一些差異，特別是在較新的版本中。
+ **OpenSearch 升級考量**事項：
  + 不支援直接降級。視需要使用快照進行轉返。
  + 升級時，請檢查[相容性矩陣和版本備註](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/supported-operations.html)是否有任何重大變更。

**Elasticsearch 考量事項**
+ **Elasticsearch 版本**。您使用的 Elasticsearch 主要版本至關重要，因為查詢語法和功能可能會在主要版本之間變更。目前，最新的穩定版本是 Elasticsearch 8.x。請確定您的查詢與您的特定 Elasticsearch 版本相容。
+ **Elasticsearch 查詢 DSL 程式庫版本**。如果您使用的是 Elasticsearch 查詢 DSL Python 程式庫，請確定其版本與您的 Elasticsearch 版本相符。例如：
  + 對於 Elasticsearch 8.x，請使用大於或等於 8.0.0 但小於 9.0.0 的`elasticsearch-dsl`版本。
  + 對於 Elasticsearch 7.x，請使用大於或等於 7.0.0 但小於 8.0.0 的`elasticsearch-dsl`版本。
+ **用戶端程式庫版本**。無論您是使用官方 Elasticsearch 用戶端還是特定語言用戶端，請確定它與您的 Elasticsearch 版本相容。
+ **查詢 DSL 版本**。查詢 DSL 會隨著 Elasticsearch 版本而演進。某些查詢類型或參數可能會遭到取代，或在不同的版本中引入。
+ **映射版本**。定義索引映射和版本之間變更的方式。請務必檢查特定 Elasticsearch 版本的映射文件。
+ **分析工具版本**。如果您使用的是分析器、權杖化器或其他文字分析工具，其行為或可用性可能會在版本之間變更。

## Architecture
<a name="translate-natural-language-query-dsl-opensearch-elasticsearch-architecture"></a>

**目標架構**

下圖說明此模式的架構。

![\[用於翻譯自然語言以在 Amazon Bedrock 中查詢 DSL 的架構。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/75296405-2893-4328-9551-9bcc6ec7fd3e/images/ffb1b893-d23c-4e1c-b679-8063b4f85a8a.png)


其中：

1. 使用者輸入和系統提示，其中包含少量的提示範例。程序從提供自然語言查詢或產生結構描述請求的使用者開始。

1. Amazon Bedrock。輸入會傳送到 Amazon Bedrock，做為存取 Claude LLM 的界面。

1. Claude 3 Sonnet LLM。Amazon Bedrock 使用來自 Claude 3 系列 LLMs Claude 3 Sonnet 來處理輸入。它會解譯並產生適當的 Elasticsearch 或 OpenSearch 查詢 DSL。對於結構描述請求，它會產生合成 Elasticsearch 或 OpenSearch 映射。

1. 查詢 DSL 產生。對於自然語言查詢，應用程式會取得 LLM 的輸出，並將其格式化為有效的 Elasticsearch 或 OpenSearch Service 查詢 DSL。

1. 合成資料產生。應用程式也會採用結構描述來建立合成 Elasticsearch 或 OpenSearch 資料，以載入 OpenSearch Serverless 集合進行測試。

1. OpenSearch 或 Elasticsearch。產生的查詢 DSL 會針對所有索引上的 OpenSearch Serverless 集合進行查詢。JSON 輸出包含來自 OpenSearch Serverless 集合中資料的相關資料和*命*中次數。

**自動化和擴展**

此模式提供的程式碼專為 PoC 用途而建置。以下清單提供一些建議，讓您進一步自動化和擴展解決方案，並將程式碼移至生產環境。這些增強功能超出此模式的範圍。
+ 容器化：
  + Dockerize 應用程式以確保不同環境的一致性。
  + 使用 Amazon Elastic Container Service (Amazon ECS) 或 Kubernetes 等容器協同運作平台進行可擴展的部署。
+ 無伺服器架構：
  + 將核心功能轉換為 AWS Lambda 函數。
  + 使用 Amazon API Gateway 為自然語言查詢輸入建立 RESTful 端點。
+ 非同步處理：
  + 實作 Amazon Simple Queue Service (Amazon SQS) 將傳入的查詢排入佇列。
  + 使用 AWS Step Functions 來協調處理查詢和產生查詢 DSL 的工作流程。
+ 快取：
  + 實作機制以快取提示。
+ 監控和記錄：
  + 使用 Amazon CloudWatch 進行監控和提醒。
  + 使用 Amazon CloudWatch Logs 或 Amazon OpenSearch Service 實作集中式日誌記錄，以進行日誌分析。
+ 安全性增強功能：
  + 實作 IAM 角色以進行精細存取控制。
  + 使用 AWS Secrets Manager 安全地存放和管理 API 金鑰和登入資料。
+ 多區域部署：
  + 請考慮在多個 之間部署解決方案 AWS 區域 ，以改善延遲和災難復原。
  + 使用 Amazon Route 53 進行智慧型請求路由。

透過實作這些建議，您可以將此 PoC 轉換為強大、可擴展且可供生產使用的解決方案。我們建議您在完全部署之前徹底測試每個元件和整個系統。

## 工具
<a name="translate-natural-language-query-dsl-opensearch-elasticsearch-tools"></a>

**工具**
+ [Amazon SageMaker AI 筆記本](https://aws.amazon.com/sagemaker/notebooks/)是全受管的 Jupyter 筆記本，用於機器學習開發。此模式使用筆記本做為互動式環境，在 Amazon SageMaker AI 中進行資料探索、模型開發和實驗。筆記本可與其他 SageMaker AI 功能 和 無縫整合 AWS 服務。
+ [Python](https://www.python.org/) 是一種一般用途的電腦程式設計語言。此模式使用 Python 做為核心語言來實作解決方案。
+ [Amazon Bedrock](https://aws.amazon.com/bedrock/) 是一項全受管服務，可讓您透過統一 API 使用來自領導 AI 新創公司的高效能基礎模型 (FMs) 和 Amazon。Amazon Bedrock 提供 LLMs的存取權，以進行自然語言處理。此模式使用 Anthropic Claude 3 模型。
+ [適用於 Python (Boto3) 的 AWS SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) 是一種軟體開發套件，可協助您整合 Python 應用程式、程式庫或指令碼 AWS 服務，包括 Amazon Bedrock。
+ [Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/what-is.html) 是一項受管服務，可協助您在 AWS 雲端中部署、操作和擴展 OpenSearch Service 叢集。此模式使用 OpenSearch Service 做為產生查詢 DSL 的目標系統。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [Prompt Engineering Text-to-QueryDSL 中使用 Claude 3 Models](https://github.com/aws-samples/text-to-queryDSL/blob/main/text2ES_prompting_guide.ipynb) 儲存庫。此範例使用運作狀態社交媒體應用程式，為與運作狀態應用程式相關聯的使用者和使用者設定檔建立貼文。

## 最佳實務
<a name="translate-natural-language-query-dsl-opensearch-elasticsearch-best-practices"></a>

使用此解決方案時，請考慮下列事項：
+ 需要適當的 AWS 登入資料和許可才能存取 Amazon Bedrock
+ 與使用 AWS 服務 和 LLMs相關的潛在成本
+ 了解查詢 DSL 驗證並可能修改所產生查詢的重要性

## 史詩
<a name="translate-natural-language-query-dsl-opensearch-elasticsearch-epics"></a>

### 設定環境並準備資料
<a name="set-up-the-environment-and-prepare-data"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定開發環境。 | 如需此模式和此模式中其他步驟的詳細說明和程式碼，請參閱 [GitHub 儲存庫](https://github.com/aws-samples/text-to-queryDSL/blob/main/text2ES_prompting_guide.ipynb)中的完整演練。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/translate-natural-language-query-dsl-opensearch-elasticsearch.html) | Python、pip、AWS 開發套件 | 
| 設定 AWS 存取權。 | 設定 Amazon Bedrock 用戶端和 SageMaker AI 工作階段。擷取 SageMaker AI 執行角色的 Amazon Resource Name (ARN)，以供日後建立 OpenSearch Serverless 集合時使用。 | IAM、AWS CLI、Amazon Bedrock、Amazon SageMaker | 
| 載入運作狀態應用程式結構描述。 | 從預先定義的檔案讀取和剖析運作狀態文章和使用者設定檔的 JSON 結構描述。將結構描述轉換為字串以供稍後在提示中使用。 | DevOps 工程師、一般 AWS、Python、JSON | 

### 產生合成資料
<a name="generate-synthetic-data"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 LLM 型資料產生器。 | 實作 **generate\$1data()** 函數，以 Claude 3 模型呼叫 Amazon Bedrock Converse API。設定 Sonnet、Sonnet 3.5 和 Haiku IDs：<pre>model_id_sonnet3_5 = "anthropic.claude-3-5-sonnet-20240620-v1:0" <br />model_id_sonnet = "anthropic.claude-3-sonnet-20240229-v1:0" <br />model_id_haiku = "anthropic.claude-3-haiku-20240307-v1:0"</pre> | Python、Amazon Bedrock API、LLM 提示 | 
| 建立合成運作狀態文章。 | 使用 **generate\$1data()** 函數搭配特定訊息提示，根據提供的結構描述建立合成運作狀態文章項目。函數呼叫如下所示：<pre>health_post_data = generate_data(bedrock_rt, model_id_sonnet, system_prompt, message_healthpost, inference_config)</pre> | Python、JSON | 
| 建立合成使用者設定檔。 | 使用 **generate\$1data()** 函數搭配特定訊息提示，根據提供的結構描述建立合成使用者設定檔項目。這類似於產生運作狀態文章，但使用不同的提示。 | Python、JSON | 

### 設定 OpenSearch 和擷取資料
<a name="set-up-opensearch-and-ingest-data"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定 OpenSearch Serverless 集合。 | 使用 Boto3 建立具有適當加密、網路和存取政策的 OpenSearch Serverless 集合。集合建立如下所示：<pre>collection = aoss_client.create_collection(name=es_name, type='SEARCH')</pre> 如需 OpenSearch Serverless 的詳細資訊，請參閱 [AWS 文件](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless.html)。 | OpenSearch Serverless、IAM | 
| 定義 OpenSearch 索引。 | 根據預先定義的結構描述映射，使用 OpenSearch 用戶端建立運作狀態文章和使用者設定檔的 indiexe。索引建立如下所示：<pre>response_health = oss_client.indices.create(healthpost_index, body=healthpost_body)</pre> | OpenSearch、JSON | 
| 將資料載入 OpenSearch。 | 執行 **ingest\$1data()** 函數，將合成運作狀態文章和使用者設定檔大量插入各自的 OpenSearch 索引。函數使用來自 的大量協助程式`opensearch-py`：<pre>success, failed = bulk(oss_client, actions)</pre> | Python、OpenSearch API、大量資料操作 | 

### 產生和執行查詢
<a name="generate-and-run-queries"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設計少量擷取提示範例。 | 使用 Claude 3 模型產生範例查詢和對應的自然語言問題，做為產生查詢的少量範例。系統提示包含下列範例：<pre>system_prompt_query_generation = [{"text": f"""You are an expert query dsl generator. ... Examples: {example_prompt} ..."""}]</pre> | LLM 提示、查詢 DSL | 
| 建立text-to-query DSL 轉換器。 | 實作系統提示，其中包含結構描述、資料和少量擷取範例，以產生查詢。使用系統提示將自然語言查詢轉換為查詢 DSL。函數呼叫如下所示：<pre>query_response = generate_data(bedrock_rt, model_id, system_prompt_query_generation, query, inference_config)</pre> | Python、Amazon Bedrock API、LLM 提示 | 
| 在 OpenSearch 上測試查詢 DSL。 | 執行 **query\$1oss()** 函數，針對 OpenSearch Serverless 集合執行產生的查詢 DSL，並傳回結果。函數使用 OpenSearch 用戶端的搜尋方法：<pre>response = oss_client.search(index="_all", body=temp)</pre> | Python、OpenSearch API、查詢 DSL | 

### 測試和評估
<a name="test-and-evaluate"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立測試查詢集。 | 使用 Claude 3 根據合成資料和結構描述產生一組不同的測試問題：<pre>test_queries = generate_data(bedrock_rt, model_id_sonnet, query_system_prompt, query_prompt, inference_config)</pre> | LLM 提示 | 
| 評估查詢 DSL 轉換的準確性。 | 對 OpenSearch 執行查詢，並分析傳回的結果相關性和準確性，以測試產生的查詢 DSL。這包括執行查詢和檢查命中：<pre>output = query_oss(response1) print("Response after running query against Opensearch") print(output)</pre> | Python、資料分析、查詢 DSL | 
| 基準 Claude 3 模型。 | 比較不同 Claude 3 模型 (Haiku、Sonnet、Sonnet 3.5) 在準確性和延遲方面產生查詢的效能。若要比較，請在呼叫 **generate\$1data()** `model_id` 時變更 並測量執行時間。 | Python、效能基準測試 | 

### 清除和記錄
<a name="clean-up-and-document"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 開發清除程序。 | 使用後從 OpenSearch Serverless 集合中刪除所有索引。 | Python、AWS 開發套件、OpenSearch API | 

## 相關資源
<a name="translate-natural-language-query-dsl-opensearch-elasticsearch-resources"></a>
+ [查詢 DSL](https://opensearch.org/docs/latest/query-dsl/) (OpenSearch 文件）
+ [Amazon OpenSearch Service 文件](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/what-is.html)
+ [OpenSearch Serverless 集合](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-manage.html)
+ [Amazon Bedrock 文件](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html)
+ [Amazon SageMaker AI 文件](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html)
+ [適用於 Python (Boto3) 的 AWS SDK 文件](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)

## 其他資訊
<a name="translate-natural-language-query-dsl-opensearch-elasticsearch-additional"></a>

**IAM 政策**

以下是此模式中所用 IAM 角色`APGtext2querydslpolicy`的政策：

```
{
  "Version": "2012-10-17",		 	 	  
  "Statement": [
    { "Effect": "Allow", 
      "Action": [ 
        "bedrock:InvokeModel", 
        "bedrock:InvokeModelWithResponseStream"
      ], 
      "Resource": "*" 
    }, 
    { "Effect": "Allow", 
      "Action": [ 
        "s3:GetObject", 
        "s3:PutObject", 
        "s3:ListBucket"
      ], 
      "Resource": [
        "arn:aws:s3:::sagemaker-*", 
        "arn:aws:s3:::sagemaker-*/*" 
      ] 
    }, 
    { "Effect": "Allow", 
      "Action": [ 
        "logs:CreateLogGroup", 
        "logs:CreateLogStream", 
        "logs:PutLogEvents" 
      ], 
      "Resource": "arn:aws:logs:*:*:log-group:/aws/sagemaker/*" 
    }, 
    { "Effect": "Allow", 
      "Action": [
        "ec2:CreateNetworkInterface", 
        "ec2:DescribeNetworkInterfaces", 
        "ec2:DeleteNetworkInterface" 
      ], 
      "Resource": "*" 
    }, 
    { "Effect": "Allow", 
      "Action": [
        "aoss:*" 
      ], 
      "Resource": "*" 
    }, 
    { "Effect": "Allow", 
      "Action": [ 
        "iam:PassRole", 
        "sagemaker:*" 
      ], 
      "Resource": [ 
        "arn:aws:iam::*:role/*", "*" 
      ], 
      "Condition": { 
        "StringEquals": { 
          "iam:PassedToService": "sagemaker.amazonaws.com" 
          } 
      } 
    }, 
    { "Effect": "Allow", 
      "Action": [ 
        "codecommit:GetBranch", 
        "codecommit:GetCommit", 
        "codecommit:GetRepository", 
        "codecommit:ListBranches", 
        "codecommit:ListRepositories" 
      ], 
      "Resource": "*" 
    }, 
    { "Effect": "Allow", 
      "Action": [ 
        "aws-marketplace:Subscribe" 
      ], 
      "Resource": "*", 
      "Condition": {
        "ForAnyValue:StringEquals": { 
          "aws-marketplace:ProductId": [ 
            "prod-6dw3qvchef7zy", 
            "prod-m5ilt4siql27k", 
            "prod-ozonys2hmmpeu" 
          ]
        } 
      } 
    }, 
    { "Effect": "Allow", 
      "Action": [ 
        "aws-marketplace:Unsubscribe", 
        "aws-marketplace:ViewSubscriptions" 
      ], 
      "Resource": "*" 
    }, 
    { "Effect": "Allow", 
      "Action": "iam:*", 
      "Resource": "*" 
    } 
  ] 
}
```

**Anthropic Claude 3 模型的提示技術**

此模式示範使用 Claude 3 模型進行text-to-query DSL 轉換的下列提示技術。
+ **Few-shot 提示：**Few-shot 提示是改善 Amazon Bedrock 上 Claude 3 模型效能的強大技術。此方法涉及為模型提供少量範例，示範所需的輸入/輸出行為，然後再要求它執行類似的任務。當您在 Amazon Bedrock 上使用 Claude 3 模型時，對於需要特定格式、推理模式或網域知識的任務，少量擷取提示特別有效。若要實作此技術，您通常會使用兩個主要元件來建構提示：範例區段和實際查詢。範例區段包含一或多個說明任務的輸入/輸出對，而查詢區段會顯示您想要回應的新輸入。此方法有助於 Claude 3 了解內容和預期的輸出格式，通常會導致更準確且一致的回應。

  範例：

  ```
  "query": {
    "bool": {
      "must": [
        {"match": {"post_type": "recipe"}},
        {"range": {"likes_count": {"gte": 100}}},
        {"exists": {"field": "media_urls"}}
      ]
    }
  }
  Question: Find all recipe posts that have at least 100 likes and include media URLs.
  ```
+ **系統提示：**除了少量擷取提示之外，Amazon Bedrock 上的 Claude 3 模型也支援使用系統提示。系統提示是在向模型提供特定使用者輸入之前，提供模型整體內容、指示或指導方針的方法。它們特別適用於設定音調、定義模型的角色，或建立整個對話的限制。若要在 Amazon Bedrock 上使用 Claude 3 的系統提示，請在 API 請求的 `system` 參數中包含它。這與使用者訊息分開，並套用於整個互動。詳細的系統提示用於設定內容並提供模型的指導方針。

  範例：

  ```
  You are an expert query dsl generator. Your task is to take an input question and generate a query dsl to answer the question. Use the schemas and data below to generate the query.
  
  Schemas: [schema details]
  Data: [sample data]
  Guidelines: 
  - Ensure the generated query adheres to DSL query syntax
  - Do not create new mappings or other items that aren't included in the provided schemas.
  ```
+ **結構化輸出**：您可以指示模型以特定格式提供輸出，例如 JSON 或在 XML 標籤內。

  範例：

  ```
  Put the query in json tags
  ```
+ **提示鏈結**：筆記本使用一個 LLM 呼叫的輸出做為另一個 LLM 呼叫的輸入，例如使用產生的合成資料來建立範例問題。
+ **內容佈建**：相關內容，包括結構描述和範例資料，會在提示中提供。

  範例：

  ```
  Schemas: [schema details]
  Data: [sample data]
  ```
+ **任務特定的提示**：針對特定任務製作不同的提示，例如產生合成資料、建立範例問題，以及將自然語言查詢轉換為查詢 DSL。

  產生測試問題的範例：

  ```
  Your task is to generate 5 example questions users can ask the health app based on provided schemas and data. Only include the questions generated in the response.
  ```