本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将自然语言翻译成查询 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
此模式使用诸如少镜头提示、系统提示、结构化输出、提示链接、上下文配置和特定于任务的 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。系统将输入内容发送到 Amazon Bedrock,后者将充当用于访问 Claude LLM 的接口。
Claude 3 Sonnet LLM。Amazon Bedrock 使用 Claude 3 系列中的 Claude 3 Sonnet LLMs 来处理输入。它解释并生成相应的 Elasticsearch 或 OpenSearch 查询 DSL。对于架构请求,它会生成合成的 Elasticsearch 或 OpenSearch 映射。
生成查询 DSL。对于自然语言查询,应用程序会获取 LLM 的输出并将其格式化为有效的 Elasticsearch 或 OpenSearch 服务查询 DSL。
生成合成数据。该应用程序还使用架构来创建合成的 Elasticsearch,或者将 OpenSearch 数据加载到 OpenSearch 无服务器集合中进行测试。
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 存储库
| 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 设置模型:
| Python、Amazon Bedrock API、LLM 提示 |
创建合成健康帖子。 | 将 generate_data() 函数与一个特定的消息提示结合使用,以便根据所提供的架构来创建合成健康帖子条目。此函数调用过程类似于如下所示:
| Python、JSON |
创建合成用户配置文件。 | 将 generate_data() 函数与一个特定的消息提示结合使用,以便根据所提供的架构来创建合成用户配置文件条目。这与生成健康帖子类似,但使用了一个不同的提示。 | Python、JSON |
| Task | 说明 | 所需技能 |
|---|---|---|
设置 OpenSearch 无服务器集合。 | 使用 Boto3 创建具有适当加密、网络和访问策略的 OpenSearch 无服务器集合。此集合创建过程类似于如下所示:
有关 OpenSearch 无服务器的更多信息,请参阅AWS 文档。 | OpenSearch 无服务器、IAM |
定义 OpenSearch 索引。 | 根据预定义的架构映射,使用 OpenSearch 客户端为健康帖子和用户个人资料创建索引。此索引创建过程类似于如下所示:
| OpenSearch,JSON |
将数据加载到 OpenSearch。 | 运行 ingest_data () 函数,将合成健康帖子和用户配置文件批量插入各自的索引中。 OpenSearch 此函数使用来自
| Python、 OpenSearch API、批量数据操作 |
| Task | 说明 | 所需技能 |
|---|---|---|
设计一些少样本提示示例。 | 将 Claude 3 模型用作用于生成查询的少样本示例,以便生成示例查询和相应的自然语言问题。系统提示包括以下示例:
| LLM 提示、查询 DSL |
创建一个 text-to-query DSL 转换器。 | 实施此系统提示,其中包含架构、数据以及一些用于生成查询的少样本示例。使用此系统提示,将自然语言查询转换成查询 DSL。此函数调用过程类似于如下所示:
| Python、Amazon Bedrock API、LLM 提示 |
开启测试查询 DSL。 OpenSearch | 运行 query_oss () 函数,对 OpenSearch 无服务器集合运行生成的查询 DSL 并返回结果。该函数使用 OpenSearch 客户端的搜索方法:
| Python、 OpenSearch API、查询 DSL |
| Task | 说明 | 所需技能 |
|---|---|---|
创建一个测试查询集。 | 根据合成数据和架构,使用 Claude 3 来生成另一组测试问题:
| LLM 提示 |
评估此次查询 DSL 转换的准确性。 | 通过运行查询来测试生成的查询 DSL, OpenSearch 并分析返回的结果的相关性和准确性。这包括运行查询并检查命中次数:
| Python、数据分析、查询 DSL |
对 Claude 3 模型执行基准测试。 | 比较用于生成查询的不同 Claude 3 模型(Haiku、Sonnet、Sonnet 3.5)的准确性和延迟性能。要进行比较,请更改您调用 generate_data()时的 | 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.