将自然语言翻译成查询 DSL OpenSearch 和 Elasticsearch 查询 - AWS 规范指引

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

将自然语言翻译成查询 DSL OpenSearch 和 Elasticsearch 查询

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

Summary

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

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

该解决方案无需使用传统意义上的迁移或部署工具。相反,它侧重于演示通过使用将自然语言查询转换为查询 DSL 的概念验证 (PoC)。 LLMs

  • 该模式使用 Jupyter 笔记本作为设置环境和实现转换的 step-by-step指南。 text-to-query

  • 它使用 Amazon Bedrock 进行访问 LLMs,这对于解释自然语言和生成适当的查询至关重要。

  • 该解决方案专为与 Amazon OpenSearch 服务配合使用而设计。您可以遵循类似的流程来执行 Elasticsearch,还可以针对类似的搜索引擎来调整所生成的查询。

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

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

先决条件和限制

先决条件

为了有效地使用 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 控制台,然后选择模型访问权限。在下一个屏幕上,选择启用特定的模型,然后选择下面这三个模型:

    • Claude 3 Sonnet

    • Claude 3.5 Sonnet

    • Claude 3 Haiku

  • 正确的 IAM 策略和 IAM 角色。要在中运行笔记本 AWS 账户,您的 AWS Identity and Access Management (IAM) 角色需要SagemakerFullAccess策略以及 “其他信息” 部分中提供的策略,您可以命名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 定价

    • 维护。为了跟上 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 升级注意事项

    • 不支持直接降级。如果需要,请使用快照进行回滚。

    • 升级时,请查看兼容性矩阵和发行说明,了解是否推出了任何重大更改。

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 版本的映射文档。

  • 分析工具版本。如果您正在使用分析器、标记器或者其他的文本分析工具,它们的行为或可用性可能会在不同的版本之间发生变化。

架构

目标架构

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

用于在 Amazon Bedrock 中将自然语言翻译成查询 DSL 的架构。

其中:

  1. 用户输入和系统提示以及一些少样本提示示例。在此过程中,用户首先提供一个自然语言查询或者请求生成架构。

  2. Amazon Bedrock。系统将输入内容发送到 Amazon Bedrock,后者将充当用于访问 Claude LLM 的接口。

  3. Claude 3 Sonnet LLM。Amazon Bedrock 使用 Claude 3 系列中的 Claude 3 Sonnet LLMs 来处理输入。它解释并生成相应的 Elasticsearch 或 OpenSearch 查询 DSL。对于架构请求,它会生成合成的 Elasticsearch 或 OpenSearch 映射。

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

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

  6. 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 转换成一款强大、可扩展、生产就绪型的解决方案。在完全部署之前,建议您全面测试每个组件和整个系统。

工具

工具

  • Amazon SageMaker AI 笔记本是用于机器学习开发的完全托管的 Jupyter 笔记本电脑。这种模式使用笔记本作为交互式环境,在 Amazon A SageMaker I 中进行数据探索、模型开发和实验。笔记本电脑可与其他 SageMaker AI 功能无缝集成,并且 AWS 服务.

  • Python 是一种通用的计算机编程语言。此模式将 Python 用作一种核心语言来实现该解决方案。

  • Amazon Bedrock 是一项完全托管的服务,它通过统一的 API 提供来自领先的人工智能初创公司和亚马逊的高性能基础模型 (FMs) 供您使用。Amazon Bedrock 提供 LLMs 对自然语言处理的访问权限。此模式使用 Anthropic Claude 3 模型。

  • 适用于 Python (Boto3) 的 AWS SDK是一款软件开发套件,可帮助您将 Python 应用程序、库或脚本与 AWS 服务(包括 Amazon Bedrock)集成。

  • Amazon S OpenSearch er vice 是一项托管服务,可帮助您在 AWS 云中部署、运营和扩展 OpenSearch 服务集群。此模式使用 OpenSearch 服务作为生成查询 DSL 的目标系统。

代码存储库

此模式的代码可在 Text-to-QueryDSL使用 Claude 3 模型的 GitHub 提示工程存储库中找到。此示例使用一款健康社交媒体应用程序,用于为与这款健康应用程序相关联的用户和用户配置文件创建帖子。

最佳实践

使用该解决方案时,请考虑以下事项:

  • 需要适当的 AWS 凭证和权限才能访问 Amazon Bedrock

  • 与使用 AWS 服务 和相关的潜在成本 LLMs

  • 要对所生成的查询进行验证和潜在的修改,了解查询 DSL 非常重要

操作说明

Task说明所需技能

设置 开发环境。

注意

有关此模式中此步骤以及其他步骤的详细说明和代码,请参阅GitHub 存储库中的综合演练。

  1. 使用 pip 安装所需的 Python 软件包,包括 boto3numpyawscliopensearch-pyrequests-aws4auth

  2. 导入必要的模块,例如来自 opensearchpyboto3jsonosopensearch;来自 OpensearchpyRequestsHttpConnection;来自 opensearchpy.helperssagemakertimerandomrebulk;以及来自 requests_aws4authAWS4Auth

Python、pip、AWS 软件开发工具包

设置 AWS 访问权限。

设置 Amazon Bedrock 客户端和 SageMaker AI 会话。检索 A SageMaker I 执行角色的 Amazon 资源名称 (ARN),以便日后在创建 OpenSearch 无服务器集合时使用。

IAM、AWS CLI、亚马逊 Bedrock、亚马逊 SageMaker

加载健康应用程序架构。

从预定义的文件中,读取并解析用于健康帖子和用户配置文件的 JSON 架构。将架构转换成字符串,以便稍后在提示中使用。

DevOps 工程师、通用 AWS、Python、JSON
Task说明所需技能

创建一个基于 LLM 的数据生成器。

执行 generate_data() 函数,以便使用 Claude 3 模型来调用 Amazon Bedrock Converse API。为 Sonnet、 IDs Sonnet 3.5 和 Haiku 设置模型:

model_id_sonnet3_5 = "anthropic.claude-3-5-sonnet-20240620-v1:0" model_id_sonnet = "anthropic.claude-3-sonnet-20240229-v1:0" model_id_haiku = "anthropic.claude-3-haiku-20240307-v1:0"
Python、Amazon Bedrock API、LLM 提示

创建合成健康帖子。

generate_data() 函数与一个特定的消息提示结合使用,以便根据所提供的架构来创建合成健康帖子条目。此函数调用过程类似于如下所示:

health_post_data = generate_data(bedrock_rt, model_id_sonnet, system_prompt, message_healthpost, inference_config)
Python、JSON

创建合成用户配置文件。

generate_data() 函数与一个特定的消息提示结合使用,以便根据所提供的架构来创建合成用户配置文件条目。这与生成健康帖子类似,但使用了一个不同的提示。

Python、JSON
Task说明所需技能

设置 OpenSearch 无服务器集合。

使用 Boto3 创建具有适当加密、网络和访问策略的 OpenSearch 无服务器集合。此集合创建过程类似于如下所示:

collection = aoss_client.create_collection(name=es_name, type='SEARCH')

有关 OpenSearch 无服务器的更多信息,请参阅AWS 文档

OpenSearch 无服务器、IAM

定义 OpenSearch 索引。

根据预定义的架构映射,使用 OpenSearch 客户端为健康帖子和用户个人资料创建索引。此索引创建过程类似于如下所示:

response_health = oss_client.indices.create(healthpost_index, body=healthpost_body)
OpenSearch,JSON

将数据加载到 OpenSearch。

运行 ingest_data () 函数,将合成健康帖子和用户配置文件批量插入各自的索引中。 OpenSearch 此函数使用来自 opensearch-py 的批量助手:

success, failed = bulk(oss_client, actions)
Python、 OpenSearch API、批量数据操作
Task说明所需技能

设计一些少样本提示示例。

将 Claude 3 模型用作用于生成查询的少样本示例,以便生成示例查询和相应的自然语言问题。系统提示包括以下示例:

system_prompt_query_generation = [{"text": f"""You are an expert query dsl generator. ... Examples: {example_prompt} ..."""}]
LLM 提示、查询 DSL

创建一个 text-to-query DSL 转换器。

实施此系统提示,其中包含架构、数据以及一些用于生成查询的少样本示例。使用此系统提示,将自然语言查询转换成查询 DSL。此函数调用过程类似于如下所示:

query_response = generate_data(bedrock_rt, model_id, system_prompt_query_generation, query, inference_config)
Python、Amazon Bedrock API、LLM 提示

开启测试查询 DSL。 OpenSearch

运行 query_oss () 函数,对 OpenSearch 无服务器集合运行生成的查询 DSL 并返回结果。该函数使用 OpenSearch 客户端的搜索方法:

response = oss_client.search(index="_all", body=temp)
Python、 OpenSearch API、查询 DSL
Task说明所需技能

创建一个测试查询集。

根据合成数据和架构,使用 Claude 3 来生成另一组测试问题:

test_queries = generate_data(bedrock_rt, model_id_sonnet, query_system_prompt, query_prompt, inference_config)
LLM 提示

评估此次查询 DSL 转换的准确性。

通过运行查询来测试生成的查询 DSL, OpenSearch 并分析返回的结果的相关性和准确性。这包括运行查询并检查命中次数:

output = query_oss(response1) print("Response after running query against Opensearch") print(output)
Python、数据分析、查询 DSL

对 Claude 3 模型执行基准测试。

比较用于生成查询的不同 Claude 3 模型(Haiku、Sonnet、Sonnet 3.5)的准确性和延迟性能。要进行比较,请更改您调用 generate_data()时的 model_id,然后测量执行时间。

Python、性能基准测试
Task说明所需技能

开发一个清理流程。

使用后,请从 OpenSearch 无服务器集合中删除所有索引。

Python、AWS 开发工具包、 OpenSearch API

相关资源

附加信息

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.