本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将自然语言翻译成查询DSL OpenSearch 和 Elasticsearch 查询
由 Tabby Ward (AWS)、Nicholas Switzer (AWS) 和 Breanne Warner () 创作 AWS
摘要
此模式演示了如何使用大型语言模型 (LLMs) 将自然语言查询转换为特定于查询域的语言(查询DSL),这使用户无需对查询语言有大量了解即可更轻松地与搜索服务(例如 OpenSearch 和 Elasticsearch)进行交互。对于希望通过自然语言查询功能增强基于搜索的应用程序,从而最终改善用户体验和搜索功能的开发人员和数据科学家来说,此资源特别有价值。
该模式说明了快速工程、迭代完善和整合专业知识的技术,所有这些对于合成数据生成都至关重要。尽管这种方法主要侧重于查询转换,但它隐含地证明了数据增强和可扩展合成数据生成的潜力。这一基础可以扩展到更全面的合成数据生成任务,以突出将非结构化自然语言输入与结构化、特定于应用程序的输出联系起来的力量。LLMs
此解决方案不涉及传统意义上的迁移或部署工具。相反,它侧重于演示DSL通过使用LLMs将自然语言查询转换为查询的概念验证 (PoC)。
该模式使用 Jupyter 笔记本作为设置环境和实现转换的 step-by-step指南。 text-to-query
它使用 Amazon Bedrock 进行访问LLMs,这对于解释自然语言和生成适当的查询至关重要。
该解决方案专为与 Amazon OpenSearch 服务配合使用而设计。您可以在 Elasticsearch 上遵循类似的流程,生成的查询有可能适用于类似的搜索引擎。
查询DSL
这种模式使用诸如少镜头提示、系统提示、结构化输出、提示链接、上下文配置和特定于任务的转换提示等技术。 text-to-query DSL有关这些技术的定义和示例,请参阅 “其他信息” 部分。
先决条件和限制
先决条件
要有效地使用 Jupyter 笔记本将自然语言查询转换为DSL查询查询,您需要:
熟悉 Jupyter 笔记本电脑。基本了解如何在 Jupyter 笔记本环境中浏览和运行代码。
Python 环境。一个工作的 Python 环境,最好是 Python 3.x,并安装了必要的库。
弹性搜索或知识。 OpenSearch Elasticsearch 或的基础知识 OpenSearch,包括其架构和如何执行查询。
AWS 账户。 已激活 AWS 账户 访问 Amazon Bedrock 和其他相关服务。
库和依赖关系。安装笔记本中提到的特定库,例如
boto3
用于 AWS 交互的库,以及LLM集成所需的任何其他依赖项。在 Amazon Bedrock 中访问模型。这个模式使用了 Anthropic 中的三个 Clau LLMs de。打开 Amazon Bedrock 控制台
,然后选择模型访问权限。在下一个屏幕上,选择 “启用特定模型”,然后选择以下三个模型: 库罗德 3 十四行诗
克劳德 3.5 十四行诗
Claude 3 俳句
适当的IAM政策和IAM角色。要在中运行笔记本 AWS 账户,你的 AWS Identity and Access Management (IAM) 角色需要
SagemakerFullAccess
策略以及 “其他信息” 部分中提供的策略,你可以命名APGtext2querydslpolicy
。本政策包括订阅列出的三款 Claude 模型。
具备这些先决条件可确保您在使用笔记本电脑和实现 text-to-query功能时获得流畅的体验。
限制
概念验证状态。该项目主要用作概念验证 (PoC)。它展示了使用将自然语言查询LLMs转换为查询的潜力DSL,但它可能尚未完全优化或尚未准备好投入生产。
型号限制:
上下文窗口约束。使用 Amazon Bedrock 上提供的内容时,请注意上下文窗口的限制:LLMs
克劳德模型(截至 2024 年 9 月):
Claude 3 Opus:20 万个代币
Claude 3 十四行诗:20 万个代币
Claude 3 Haiku:200,000
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 在大多数操作中都保持与 Elasticsearch OSS 7.10.2 的API兼容性。但是,存在一些差异,尤其是在较新的版本中。
OpenSearch 升级注意事项:
不支持直接降级。如果需要,可使用快照进行回滚。
升级时,请查看兼容性表和发行说明,了解是否有任何重大更改。
弹性搜索注意事项
弹性搜索版本。您正在使用的 Elasticsearch 的主要版本至关重要,因为主要版本之间的查询语法和功能可能会发生变化。目前,最新的稳定版本是 Elasticsearch 8.x。请确保您的查询与您的特定的 Elasticsearch 版本兼容。
Elasticsearch 查询DSL库版本。如果你使用的是 Elasticsearch 查询 Pyth DSL on 库,请确保其版本与你的 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版本。查询会随着 Elasticsearch 版本DSL而发展。某些查询类型或参数可能会在不同的版本中被弃用或引入。
映射版本。为索引定义映射的方式以及在版本之间发生变化。请务必查看您的特定 Elasticsearch 版本的映射文档。
分析工具版本。如果您使用的是分析器、分词器或其他文本分析工具,则它们的行为或可用性可能会在不同版本之间发生变化。
架构
目标架构
下图阐明了该模式的架构。

其中:
用户输入和系统提示以及少量提示示例。该过程从提供自然语言查询或架构生成请求的用户开始。
Amazon Bedrock。输入内容将发送到 Amazon Bedrock,后者充当访问 Cl LLM aude 的接口。
Claude 3 十四行诗LLM。Amazon Bedrock 使用 Claude 3 系列中的 Claude 3 Sonnet LLMs 来处理输入。它解释并生成相应的 Elasticsearch 或查询。 OpenSearch DSL对于架构请求,它会生成合成的 Elasticsearch 或 OpenSearch 映射。
查询DSL生成。对于自然语言查询,应用程序会获取LLM的输出并将其格式化为有效的 Elasticsearch 或 OpenSearch 服务查询。DSL
合成数据生成。该应用程序还使用架构来创建合成的 Elasticsearch,或者将 OpenSearch 数据加载到 OpenSearch 无服务器集合中进行测试。
OpenSearch 或 Elasticsearch 生成的查询DSL是针对所有索引上的 OpenSearch 无服务器集合进行查询的。 JSON输出包含位于 OpenSearch 无服务器集合中的数据的相关数据和命中次数。
自动化和扩缩
此模式提供的代码严格按照 PoC 目的构建。以下列表为进一步自动化和扩展解决方案以及将代码移至生产环境提供了一些建议。这些增强功能超出了此模式的范围。
容器化:
对应用程序进行 Dockerize 以确保不同环境之间的一致性。
使用诸如亚马逊弹性容器服务 (AmazonECS) 或 Kubernetes 之类的容器编排平台进行可扩展部署。
无服务器架构:
将核心功能转换为 AWS Lambda 函数。
使用 Amazon API Gateway 为自然语言查询输入创建RESTful终端节点。
异步处理:
实施亚马逊简单队列服务 (AmazonSQS) 以对传入的查询进行排队。
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
是一项完全托管的服务,可通过统一的方式提供来自领先的人工智能初创公司和亚马逊的高性能基础模型 (FMs) 供您使用。APIAmazon Bedrock 提供LLMs对自然语言处理的访问权限。此模式使用 Anthropic Claude 3 模型。 AWS SDK for Python (Boto3)
是一款软件开发套件,可帮助您将 Python 应用程序、库或脚本与 AWS 服务(包括 Amazon Bedrock)集成。 Amazon OpenSearch Service 是一项托管服务,可帮助您在AWS云中部署、运营和扩展 OpenSearch 服务集群。此模式使用 OpenSearch 服务作为生成查询的目标系统DSL。
代码存储库
此模式的代码可在 Text-to-QueryDSL使用 Claude 3 模型的 GitHub 提示工程
最佳实践
使用此解决方案时,请考虑以下几点:
需要适当的 AWS 凭证和权限才能访问 Amazon Bedrock
与使用 AWS 服务 和相关的潜在成本 LLMs
了解查询对于验证DSL并可能修改生成的查询非常重要
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
设置开发环境。 | 注意有关此模式中此步骤以及其他步骤的详细说明和代码,请参阅GitHub 存储库
| Python,pip,AWSSDK |
设置 AWS 访问权限。 | 设置 Amazon Bedrock 客户端和 SageMaker AI 会话。检索 A SageMaker I 执行角色的 Amazon 资源名称 (ARN),以便日后在创建 OpenSearch 无服务器集合时使用。 | IAM、AWSCLI、亚马逊 Bedrock、亚马逊 SageMaker |
加载健康应用程序架构。 | 从预定义文件中读取和解析健康帖子和用户个人资料的JSON架构。将架构转换为字符串,以便以后在提示中使用。 | DevOps 工程师,将军AWS,Python,JSON |
任务 | 描述 | 所需技能 |
---|---|---|
创建LLM基于数据生成器。 | 实现 g enerate_data () 函数,使用 Claude 3 模型调用 Amazon Bedrock Converse API。为 Sonnet、IDs Sonnet 3.5 和 Haiku 设置模型:
| Python,Amazon BedrockAPI,提示 LLM |
创建合成生命值帖子。 | 使用带有特定消息提示的 g enerate_data () 函数,根据提供的架构创建合成健康帖子条目。函数调用如下所示:
| Python,JSON |
创建合成用户配置文件。 | 使用带有特定消息提示的 g enerate_data () 函数,根据提供的架构创建综合用户配置文件条目。这与生成生命值帖子类似,但使用的提示不同。 | Python,JSON |
任务 | 描述 | 所需技能 |
---|---|---|
设置 OpenSearch 无服务器集合。 | 使用 Boto3 创建具有适当加密、网络和访问策略的 OpenSearch 无服务器集合。集合的创建如下所示:
有关 OpenSearch 无服务器的更多信息,请参阅AWS 文档。 | OpenSearch 无服务器,IAM |
定义 OpenSearch 索引。 | 根据预定义的架构映射,使用 OpenSearch 客户端为健康帖子和用户个人资料创建索引。索引的创建如下所示:
| OpenSearch, JSON |
将数据加载到 OpenSearch。 | 运行 ingest_data () 函数,将合成健康帖子和用户配置文件批量插入各自的索引中。 OpenSearch 该函数使用来自
| Python OpenSearch API、、批量数据操作 |
任务 | 描述 | 所需技能 |
---|---|---|
设计少量提示示例。 | 使用 Claude 3 模型生成示例查询和相应的自然语言问题,作为查询生成的简短示例。系统提示包括以下示例:
| LLM提示、查询 DSL |
创建 text-to-queryDSL转换器。 | 实现系统提示符,包括架构、数据和少量示例,用于生成查询。使用系统提示将自然语言查询转换为查询DSL。函数调用如下所示:
| Python,Amazon BedrockAPI,提示 LLM |
开DSL启测试查询 OpenSearch。 | 运行 query_oss () 函数,DSL对 OpenSearch 无服务器集合运行生成的查询并返回结果。该函数使用 OpenSearch 客户端的搜索方法:
| Python OpenSearch API、、查询 DSL |
任务 | 描述 | 所需技能 |
---|---|---|
创建测试查询集。 | 使用 Claude 3 根据综合数据和架构生成一组不同的试题:
| LLM提示 |
评估查询DSL转换的准确性。 | DSL通过运行查询来测试生成的查询, OpenSearch 并分析返回的结果的相关性和准确性。这包括运行查询和检查命中:
| Python、数据分析、查询 DSL |
基准 Claude 3 模型。 | 比较不同的 Claude 3 模型(Haiku、Sonnet、Sonnet 3.5)在准确性和延迟方面的查询生成性能。要进行比较,请更改调用 | Python,性能基准测试 |
任务 | 描述 | 所需技能 |
---|---|---|
制定清理流程。 | 使用后从 OpenSearch 无服务器集合中删除所有索引。 | Python,AWSSDK, 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-queryDSL转换的以下提示技巧。
Few-shot 提示:Few-shot 提示是一种强有力的技术,可以提高 Amazon Bedrock 上的 Claude 3 机型的性能。这种方法包括为模型提供少量示例,这些示例演示了说明任务所需的input/output behavior before asking it to perform a similar task. When you use Claude 3 models on Amazon Bedrock, few-shot prompting can be particularly effective for tasks that require specific formatting, reasoning patterns, or domain knowledge. To implement this technique, you typically structure your prompt with two main components: the example section and the actual query. The example section contains one or more 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.
结构化输出:您可以指示模型以特定格式提供输出,例如XML标签内JSON或标签内。
示例:
Put the query in json tags
提示链接:笔记本使用一个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.