

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将自然语言翻译成查询 DSL OpenSearch 和 Elasticsearch 查询
<a name="translate-natural-language-query-dsl-opensearch-elasticsearch"></a>

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

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

此模式演示了如何使用大型语言模型 (LLMs) 将自然语言查询转换为查询域特定的语言（查询 DSL），这使用户无需对查询语言有大量了解即可更轻松地与搜索服务（例如 OpenSearch 和 Elasticsearch）进行交互。对于希望通过自然语言查询功能来增强基于搜索的应用程序，最终改善用户体验和搜索功能的开发人员和数据科学家来说，这一资源特别有用。

此模式说明了用于提示工程、迭代改进和专业知识整合的各项技术，当生成合成数据时，所有这些技术都能发挥至关重要的作用。尽管这种方法主要侧重于查询转换，但它隐式展示了在数据增强和可扩展合成数据生成方面的潜力。这一基础可以扩展到更全面的合成数据生成任务，以突出将非结构化自然语言输入与结构化、特定于应用程序的输出联系起来的力量。 LLMs 

该解决方案无需使用传统意义上的迁移或部署工具。相反，它侧重于演示通过使用将自然语言查询转换为查询 DSL 的概念验证 (PoC)。 LLMs
+ 该模式使用 Jupyter 笔记本作为设置环境和实现转换的 step-by-step指南。 text-to-query
+ 它使用 Amazon Bedrock 进行访问 LLMs，这对于解释自然语言和生成适当的查询至关重要。
+ 该解决方案专为与 Amazon OpenSearch 服务配合使用而设计。您可以遵循类似的流程来执行 Elasticsearch，还可以针对类似的搜索引擎来调整所生成的查询。

[查询 DSL](https://opensearch.org/docs/latest/query-dsl/) 是一种灵活的、基于 JSON 的搜索语言，用于在 Elasticsearch 和. OpenSearch 它能够让您在搜索操作的查询参数中指定查询，并且支持多种查询类型。DSL 查询包括叶查询和复合查询。叶查询会在某些字段中搜索特定的值，并且包括全文查询、术语级查询、地理查询、联接查询、跨度查询和专业查询。复合查询充当多个叶子句或复合子句的包装器，并合并它们的结果或者修改它们的行为。查询 DSL 支持创建复杂的搜索，从简单的完全匹配查询到可生成详细结果的复杂多子句查询，无所不包。对于需要高级搜索功能、灵活的查询构造和基于 JSON 的查询结构的那些项目来说，查询 DSL 特别有用。

此模式使用诸如少镜头提示、系统提示、结构化输出、提示链接、上下文配置和特定于任务的 DSL 转换提示等技术。 text-to-query有关这些技术的定义和示例，请参阅[其他信息](#translate-natural-language-query-dsl-opensearch-elasticsearch-additional)部分。

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

**先决条件**

为了有效地使用 Jupyter Notebook 将自然语言查询转换成查询 DSL 查询，您需要：
+ **熟悉 Jupyter Notebook**。基本了解如何在 Jupyter Notebook 环境中浏览和运行代码。
+ **Python 环境**。一个有效的 Python 环境，最好是 Python 3.x，并且安装了必要的库。
+ **弹性搜索或知识。 OpenSearch **Elasticsearch 或的基础知识 OpenSearch，包括其架构和如何执行查询。
+ **AWS 账户**。 已激活 AWS 账户 访问 Amazon Bedrock 和其他相关服务。
+ **库和依赖项**。安装笔记本中提到的特定库，例如`boto3`用于 AWS 交互的库，以及 LLM 集成所需的任何其他依赖项。
+ **Amazon Bedrock 内的模型访问权限**。这个模式使用了 Anthropic 中的三个 Clau LLMs de。打开 [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：20 万个词元
  + Claude 3 Sonnet：20 万个词元
  + Claude 3 Haiku：20 万个词元

  Amazon Bedrock 上的其他模型可能具有不同的上下文窗口大小。有关最新信息，请查阅最新的文档。

  **模型可用性***。*Amazon Bedrock 上的特定模型的可用性可能不尽相同。在实施该解决方案之前，请确保您可以访问所需的模型。
+ **其他限制**
  + **查询的复杂性** 自然语言对查询 DSL 转换的有效性可能不尽相同，具体情况取决于输入查询的复杂性。
  + **版本兼容性**。生成的查询 DSL 可能需要根据特定的 Elasticsearch 版本或您 OpenSearch 使用的版本进行调整。
  + **性能**。此模式实施了 PoC，因此对于大规模生产用途，可能无法实现最佳的查询生成速度和准确性。
  + **成本**。 LLMs 在 Amazon Bedrock 中使用会产生成本。请注意所选模型的定价结构。有关详情，请参阅 [Amazon Bedrock 定价](https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-pricing.html)。
  + **维护**。为了跟上 LLM 技术的进展和查询 DSL 语法的变化，可能需要定期更新提示和模型选择。

**产品版本**

此解决方案已在 Amazon OpenSearch 服务中进行了测试。如果您希望使用 Elasticsearch，可能必须进行一些更改，才能复制此模式的确切功能。
+ **OpenSearch 版本兼容性**。 **OpenSearch **在主要版本中保持向后兼容性。例如：
  + OpenSearch 1.x 客户端通常与 OpenSearch 1.x 集群兼容。
  + OpenSearch 2.x 客户端通常与 OpenSearch 2.x 集群兼容。

  然而，客户端和集群最好尽量使用相同的次要版本。
+ **OpenSearch API 兼容性**。 **OpenSearch **在大多数操作中都保持 API 与 Elasticsearch OSS 7.10.2 的兼容性。但是存在一些差异，尤其是在更高的版本中。
+ **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 版本的映射文档。
+ **分析工具版本**。如果您正在使用分析器、标记器或者其他的文本分析工具，它们的行为或可用性可能会在不同的版本之间发生变化。

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

**目标架构**

下图说明了此模式的架构。

![用于在 Amazon Bedrock 中将自然语言翻译成查询 DSL 的架构。](http://docs.aws.amazon.com/zh_cn/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 系列中的 Claude 3 Sonnet LLMs 来处理输入。它解释并生成相应的 Elasticsearch 或 OpenSearch 查询 DSL。对于架构请求，它会生成合成的 Elasticsearch 或 OpenSearch 映射。

1. 生成查询 DSL。对于自然语言查询，应用程序会获取 LLM 的输出并将其格式化为有效的 Elasticsearch 或 OpenSearch 服务查询 DSL。

1. 生成合成数据。该应用程序还使用架构来创建合成的 Elasticsearch，或者将 OpenSearch 数据加载到 OpenSearch 无服务器集合中进行测试。

1. OpenSearch 或 Elasticsearch 生成的 Query DSL 将针对所有索引上的 OpenSearch 无服务器集合进行查询。JSON 输出包含位于 OpenSearch 无服务器集合中的数据的相关数据和*命*中次数。

**自动化和扩展**

此模式附带的代码完全是为了 PoC 目的而构建的。为了进一步自动化和扩展该解决方案以及将代码转移到生产环境中，如下列表提供了一些建议。此模式不包含这些增强。
+ 容器化：
  + 将应用程序 Docker 化，以便在不同的环境之间确保一致性。
  + 使用 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 L CloudWatch ogs 或 Amazon OpenSearch 服务实现集中日志记录以进行日志分析。
+ 安全增强功能：
  + 实施 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 A SageMaker I 中进行数据探索、模型开发和实验。笔记本电脑可与其他 SageMaker AI 功能无缝集成，并且 AWS 服务.
+ [Python](https://www.python.org/) 是一种通用的计算机编程语言。此模式将 Python 用作一种核心语言来实现该解决方案。
+ [Amazon Bedrock](https://aws.amazon.com/bedrock/) 是一项完全托管的服务，它通过统一的 API 提供来自领先的人工智能初创公司和亚马逊的高性能基础模型 (FMs) 供您使用。Amazon Bedrock 提供 LLMs 对自然语言处理的访问权限。此模式使用 Anthropic Claude 3 模型。
+ [AWS SDK for Python (Boto3)](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)是一款软件开发套件，可帮助您将 Python 应用程序、库或脚本与 AWS 服务（包括 Amazon Bedrock）集成。
+ [Amazon S OpenSearch er](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/what-is.html) vice 是一项托管服务，可帮助您在 AWS 云中部署、运营和扩展 OpenSearch 服务集群。此模式使用 OpenSearch 服务作为生成查询 DSL 的目标系统。

**代码存储库**

此模式的代码可在[ Text-to-QueryDSL使用 Claude 3 模型的 GitHub 提示工程](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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置 开发环境。 | 有关此模式中此步骤以及其他步骤的详细说明和代码，请参阅[GitHub 存储库](https://github.com/aws-samples/text-to-queryDSL/blob/main/text2ES_prompting_guide.ipynb)中的综合演练。1. 使用 **pip** 安装所需的 Python 软件包，包括 `boto3`、`numpy`、`awscli`、`opensearch-py` 和 `requests-aws4auth`。<br />2. 导入必要的模块，例如来自 `opensearchpy` 的 `boto3`、`json`、`os`、`opensearch`；来自 `Opensearchpy` 的 `RequestsHttpConnection`；来自 `opensearchpy.helpers`、`sagemaker`、`time`、`random`、`re` 的 `bulk`；以及来自 `requests_aws4auth` 的 `AWS4Auth`。 | Python、pip、AWS 软件开发工具包 | 
| 设置 AWS 访问权限。 | 设置 Amazon Bedrock 客户端和 SageMaker AI 会话。检索 A SageMaker I 执行角色的 Amazon 资源名称 (ARN)，以便日后在创建 OpenSearch 无服务器集合时使用。 | IAM、AWS CLI、亚马逊 Bedrock、亚马逊 SageMaker | 
| 加载健康应用程序架构。 | 从预定义的文件中，读取并解析用于健康帖子和用户配置文件的 JSON 架构。将架构转换成字符串，以便稍后在提示中使用。 | DevOps 工程师、通用 AWS、Python、JSON | 

### 生成合成数据
<a name="generate-synthetic-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个基于 LLM 的数据生成器。 | 执行 **generate\_data()** 函数，以便使用 Claude 3 模型来调用 Amazon Bedrock Converse API。为 Sonnet、 IDs Sonnet 3.5 和 Haiku 设置模型：<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\_data()** 函数与一个特定的消息提示结合使用，以便根据所提供的架构来创建合成健康帖子条目。此函数调用过程类似于如下所示：<pre>health_post_data = generate_data(bedrock_rt, model_id_sonnet, system_prompt, message_healthpost, inference_config)</pre> | Python、JSON | 
| 创建合成用户配置文件。 | 将 **generate\_data()** 函数与一个特定的消息提示结合使用，以便根据所提供的架构来创建合成用户配置文件条目。这与生成健康帖子类似，但使用了一个不同的提示。 | Python、JSON | 

### 设置 OpenSearch 和摄取数据
<a name="set-up-opensearch-and-ingest-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置 OpenSearch 无服务器集合。 | 使用 Boto3 创建具有适当加密、网络和访问策略的 OpenSearch 无服务器集合。此集合创建过程类似于如下所示：<pre>collection = aoss_client.create_collection(name=es_name, type='SEARCH')</pre><br /> 有关 OpenSearch 无服务器的更多信息，请参阅[AWS 文档](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless.html)。 | OpenSearch 无服务器、IAM | 
| 定义 OpenSearch 索引。 | 根据预定义的架构映射，使用 OpenSearch 客户端为健康帖子和用户个人资料创建索引。此索引创建过程类似于如下所示：<pre>response_health = oss_client.indices.create(healthpost_index, body=healthpost_body)</pre> | OpenSearch，JSON | 
| 将数据加载到 OpenSearch。 | 运行 **ingest\_data ()** 函数，将合成健康帖子和用户配置文件批量插入各自的索引中。 OpenSearch 此函数使用来自 `opensearch-py` 的批量助手：<pre>success, failed = bulk(oss_client, actions)</pre> | Python、 OpenSearch API、批量数据操作 | 

### 生成并运行查询
<a name="generate-and-run-queries"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设计一些少样本提示示例。 | 将 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 提示 | 
| 开启测试查询 DSL。 OpenSearch | 运行 **query\_oss ()** 函数，对 OpenSearch 无服务器集合运行生成的查询 DSL 并返回结果。该函数使用 OpenSearch 客户端的搜索方法：<pre>response = oss_client.search(index="_all", body=temp)</pre> | Python、 OpenSearch API、查询 DSL | 

### 测试和评估
<a name="test-and-evaluate"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个测试查询集。 | 根据合成数据和架构，使用 Claude 3 来生成另一组测试问题：<pre>test_queries = generate_data(bedrock_rt, model_id_sonnet, query_system_prompt, query_prompt, inference_config)</pre> | LLM 提示 | 
| 评估此次查询 DSL 转换的准确性。 | 通过运行查询来测试生成的查询 DSL， OpenSearch 并分析返回的结果的相关性和准确性。这包括运行查询并检查命中次数：<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\_data（）**时的 `model_id`，然后测量执行时间。 | Python、性能基准测试 | 

### 清理和记录
<a name="clean-up-and-document"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 开发一个清理流程。 | 使用后，请从 OpenSearch 无服务器集合中删除所有索引。 | Python、AWS 开发工具包、 OpenSearch API | 

## 相关资源
<a name="translate-natural-language-query-dsl-opensearch-elasticsearch-resources"></a>
+ [查询 DSL](https://opensearch.org/docs/latest/query-dsl/)（OpenSearch 文档）
+ [亚马逊 OpenSearch 服务文档](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/what-is.html)
+ [OpenSearch 无服务器集合](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)
+ [亚马逊 SageMaker AI 文档](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html)
+ [AWS SDK for Python (Boto3) 文档](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 转换的以下提示技巧。
+ **少样本提示：**少样本提示是一种强大的技术，可以提高 Amazon Bedrock 上的 Claude 3 模型的性能。这种方法包括在要求模型执行类似任务之前，为模型提供少量示例，以演示所需的 input/output 行为。当您在 Amazon Bedrock 上使用 Claude 3 模型时，对于需要特定格式、推理模式或领域知识的任务，少样本提示可能特别有效。要实现这种技术，通常需要使用两个主要组件来构造提示：示例部分和实际查询。示例部分包含一对或多 input/output 对来说明任务，而查询部分则显示您想要响应的新输入。这种方法可以帮助 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.
  ```