As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Traduza a linguagem natural em consultas DSL para consultas OpenSearch e Elasticsearch
Tabby Ward, Nicholas Switzer e Breanne Warner, Amazon Web Services
Resumo
Esse padrão demonstra como usar modelos de linguagem grande (LLMs) para converter consultas de linguagem natural em linguagem específica de domínio de consulta (consulta DSL), o que facilita a interação dos usuários com serviços de pesquisa, como OpenSearch o Elasticsearch, sem amplo conhecimento da linguagem de consulta. Esse recurso é particularmente valioso para desenvolvedores e cientistas de dados que desejam aprimorar aplicações baseadas em pesquisa com recursos de consulta em linguagem natural, melhorando a experiência do usuário e a funcionalidade de pesquisa.
O padrão ilustra técnicas de engenharia de prompts, refinamento iterativo e incorporação de conhecimento especializado, todas cruciais na geração de dados sintéticos. Embora essa abordagem se concentre principalmente na conversão de consultas, ela demonstra implicitamente o potencial de aumento de dados e produção escalável de dados sintéticos. Essa base pode ser estendida para tarefas mais abrangentes de geração de dados sintéticos, para destacar o poder de unir entradas de LLMs linguagem natural não estruturadas com saídas estruturadas e específicas do aplicativo.
Essa solução não envolve ferramentas de migração ou implantação no sentido tradicional. Em vez disso, ele se concentra em demonstrar uma prova de conceito (PoC) para converter consultas de linguagem natural em consultas DSL usando. LLMs
O padrão usa um notebook Jupyter como step-by-step guia para configurar o ambiente e implementar a text-to-query conversão.
Ele usa o Amazon Bedrock para acessar LLMs, que são cruciais para interpretar a linguagem natural e gerar consultas apropriadas.
A solução foi projetada para funcionar com o Amazon OpenSearch Service. Você pode seguir um processo semelhante para o Elasticsearch, e é possível adaptar as consultas geradas para mecanismos de pesquisa semelhantes.
O Query DSL
Esse padrão usa técnicas como solicitação de poucas fotos, solicitações do sistema, saída estruturada, encadeamento de solicitações, provisão de contexto e solicitações específicas de tarefas para conversão de DSL. text-to-query Para obter definições e exemplos dessas técnicas, consulte a seção Informações adicionais.
Pré-requisitos e limitações
Pré-requisitos
Para usar o caderno Jupyter com eficiência para converter consultas em linguagem natural em query DSL, você precisa:
Familiaridade com cadernos Jupyter. Compreensão básica de como navegar e executar código em um ambiente de caderno Jupyter.
Ambiente Python. Um ambiente Python funcional, preferencialmente Python 3.x, com as bibliotecas necessárias instaladas.
Elasticsearch ou OpenSearch conhecimento. Conhecimento básico do Elasticsearch or OpenSearch, incluindo sua arquitetura e como realizar consultas.
Conta da AWS. Um ativo Conta da AWS para acessar o Amazon Bedrock e outros serviços relacionados.
Bibliotecas e dependências. Instalação de bibliotecas específicas mencionadas no notebook, como
boto3para AWS interação e quaisquer outras dependências necessárias para a integração do LLM.Acesso a modelos no Amazon Bedrock. Esse padrão usa três Claude LLMs da Anthropic. Abra o console do Amazon Bedrock
e escolha Acesso a modelos. Na próxima tela, escolha Habilitar modelos específicos e selecione estes três modelos: Claude 3 Sonnet
Claude 3.5 Sonnet
Claude 3 Haiku
Políticas do IAM e perfil do IAM adequados. Para executar o notebook em um Conta da AWS, sua função AWS Identity and Access Management (IAM) requer a
SagemakerFullAccesspolítica, bem como a política fornecida na seção Informações adicionais, que você pode nomearAPGtext2querydslpolicy. Essa política inclui a assinatura dos três modelos do Claude listados.
Ter esses pré-requisitos estabelecidos garante uma experiência tranquila ao trabalhar com o notebook e implementar a funcionalidade. text-to-query
Limitações
Status da prova de conceito. Este projeto serve principalmente como uma prova de conceito (PoC). Ele demonstra o potencial do uso LLMs para converter consultas de linguagem natural em DSL de consulta, mas pode não estar totalmente otimizado ou pronto para produção.
Limitações do modelo:
Restrições da janela de contexto. Ao usar os LLMs que estão disponíveis no Amazon Bedrock, esteja ciente das limitações da janela de contexto:
Modelos do Claude (em setembro de 2024):
Claude 3 Opus: 200 mil tokens
Claude 3 Sonnet: 200 mil tokens
Claude 3 Haiku: 200 mil tokens
Outros modelos no Amazon Bedrock podem ter tamanhos de janela de contexto diferentes. Para obter as informações mais atualizadas, consulte a documentação mais recente.
Disponibilidade do modelo. A disponibilidade de modelos específicos no Amazon Bedrock pode variar. Certifique-se de ter acesso aos modelos necessários antes de implementar essa solução.
Limitações adicionais
Complexidade das consultas. A eficácia da linguagem natural para a conversão em query DSL pode variar dependendo da complexidade da consulta de entrada.
Compatibilidade da versão. A consulta DSL gerada pode precisar de ajustes com base na versão específica do Elasticsearch ou na OpenSearch que você usa.
Desempenho. Este padrão fornece uma implementação de PoC, portanto, a velocidade e a precisão da geração de consultas podem não ser ideais para uso em produção em grande escala.
Custos. O uso LLMs no Amazon Bedrock gera custos. Esteja ciente da estrutura de preços do modelo escolhido. Para obter mais informações, consulte Preços do Amazon Bedrock.
Manutenção. Atualizações regulares nos prompts e na seleção de modelos podem ser necessárias para acompanhar os avanços na tecnologia de LLMs e as mudanças na sintaxe da query DSL.
Versões do produto
Essa solução foi testada no Amazon OpenSearch Service. Se você quiser usar o Elasticsearch, talvez seja necessário fazer algumas alterações para replicar a funcionalidade exata desse padrão.
OpenSearch compatibilidade de versões. OpenSearch mantém a compatibilidade com versões anteriores nas versões principais. Por exemplo:
OpenSearch Os clientes 1.x geralmente são compatíveis com clusters OpenSearch 1.x.
OpenSearch Os clientes 2.x geralmente são compatíveis com clusters OpenSearch 2.x.
No entanto, é sempre melhor usar a mesma versão secundária para o cliente e o cluster, quando possível.
OpenSearch Compatibilidade de API. OpenSearch mantém a compatibilidade da API com o Elasticsearch OSS 7.10.2 para a maioria das operações. No entanto, existem algumas diferenças, especialmente nas versões mais recentes.
OpenSearch considerações de atualização:
Não há suporte para downgrades diretos. Use snapshots para reversão, se necessário.
Ao atualizar, verifique a matriz de compatibilidade e as notas de versão para ver se há alterações significativas.
Considerações para o Elasticsearch
Versão do Elasticsearch. A versão principal do Elasticsearch que você está usando é crucial, pois a sintaxe e os recursos da consulta podem mudar entre as versões principais. Atualmente, a versão estável mais recente é o Elasticsearch 8.x. Certifique-se de que as consultas sejam compatíveis com sua versão específica do Elasticsearch.
Versão da biblioteca de query DSL do Elasticsearch. Se você estiver usando a biblioteca de Python de query DSL do Elasticsearch, certifique-se de que a versão corresponda à sua versão do Elasticsearch. Por exemplo:
Para o Elasticsearch 8.x, use uma versão de
elasticsearch-dslposterior ou igual à 8.0.0, mas anterior à 9.0.0.Para o Elasticsearch 7.x, use uma versão de
elasticsearch-dslposterior ou igual à 7.0.0, mas anterior à 8.0.0.
Versões da biblioteca do cliente. Se você estiver usando o cliente oficial do Elasticsearch ou um cliente específico de linguagem, certifique-se de que ele seja compatível com sua versão do Elasticsearch.
Versão da query DSL. A query DSL evolui com as versões do Elasticsearch. Alguns tipos ou parâmetros de consulta podem estar obsoletos ou serem introduzidos em versões diferentes.
Versão de mapeamento. A maneira de definir mapeamentos para os índices pode mudar entre as versões. Sempre verifique a documentação de mapeamento para sua versão específica do Elasticsearch.
Versões de ferramentas de análise. Se você estiver usando analisadores, tokenizadores ou outras ferramentas de análise de texto, o comportamento ou a disponibilidade deles pode mudar entre as versões.
Arquitetura
Arquitetura de destino
O diagrama a seguir ilustra a arquitetura desse padrão.

em que:
Entrada do usuário e prompt do sistema com exemplos de prompts few-shot. O processo começa com um usuário que fornece uma consulta em linguagem natural ou uma solicitação para geração de esquema.
Amazon Bedrock. A entrada é enviada para o Amazon Bedrock, que serve como interface para acessar o LLM do Claude.
LLM Sonnet do Claude 3 O Amazon Bedrock usa o Claude 3 Sonnet da família Claude 3 para processar LLMs a entrada. Ele interpreta e gera o Elasticsearch ou OpenSearch DSL de consulta apropriado. Para solicitações de esquema, ele gera mapeamentos ou Elasticsearch sintéticos. OpenSearch
Geração de query DSL. Para consultas em linguagem natural, o aplicativo pega a saída do LLM e a formata em uma DSL de consulta válida do Elasticsearch ou OpenSearch Service.
Geração de dados sintéticos. O aplicativo também usa esquemas para criar Elasticsearch sintético ou OpenSearch dados para serem carregados em uma coleção sem OpenSearch servidor para testes.
OpenSearch ou Elasticsearch. A consulta DSL gerada é consultada em relação a uma coleção OpenSearch Serverless em todos os índices. A saída JSON contém os dados relevantes e o número de ocorrências dos dados que residem na coleção OpenSearch Serverless.
Automação e escala
O código fornecido com esse padrão é criado estritamente para fins de PoC. A lista a seguir fornece algumas sugestões para automatizar e escalar ainda mais a solução e mover o código para a produção. Esses aprimoramentos estão fora do escopo desse padrão.
Conteinerização:
Coloque a aplicação em um contêiner do Docker para garantir a consistência em diferentes ambientes.
Use plataformas de orquestração de contêiner, como o Amazon Elastic Container Service (Amazon ECS) ou o Kubernetes, para implantações escaláveis.
Arquitetura com tecnologia sem servidor:
Converta a funcionalidade principal em AWS Lambda funções.
Use o Amazon API Gateway para criar RESTful endpoints para a entrada da consulta em linguagem natural.
Processamento assíncrono:
Implemente o Amazon Simple Queue Service (Amazon SQS) para enfileirar consultas recebidas.
Use AWS Step Functions para orquestrar o fluxo de trabalho de processamento de consultas e geração de consultas DSL.
Armazenamento em cache:
Implemente um mecanismo para armazenar os prompts em cache.
Monitoramento e registro em log:
Use a Amazon CloudWatch para monitoramento e alertas.
Implemente o registro centralizado com o Amazon CloudWatch Logs ou o Amazon OpenSearch Service para análise de registros.
Melhorias de segurança:
Implemente perfis do IAM para controle de acesso refinado.
Use AWS Secrets Manager para armazenar e gerenciar com segurança as chaves e credenciais da API.
Implantação multirregião:
Considere implantar a solução em vários Regiões da AWS para melhorar a latência e a recuperação de desastres.
Use o Amazon Route 53 para roteamento inteligente de solicitações.
Ao implementar essas sugestões, você pode transformar essa PoC em uma solução robusta, escalável e pronta para produção. Convém testar completamente cada componente e todo o sistema antes da implantação completa.
Ferramentas
Ferramentas
Os notebooks Amazon SageMaker AI são notebooks
Jupyter totalmente gerenciados para desenvolvimento de aprendizado de máquina. Esse padrão usa notebooks como um ambiente interativo para exploração de dados, desenvolvimento de modelos e experimentação na Amazon SageMaker AI. Os notebooks oferecem integração perfeita com outros recursos de SageMaker IA e. Serviços da AWS Python
é uma linguagem de programação de computador de uso geral. Este padrão usa Python como a linguagem principal para implementar a solução. O Amazon Bedrock
é um serviço totalmente gerenciado que disponibiliza modelos básicos de alto desempenho (FMs) das principais startups de IA e da Amazon para seu uso por meio de uma API unificada. O Amazon Bedrock fornece acesso ao processamento LLMs de linguagem natural. Este padrão usa modelos da Anthropic para o Claude 3. AWS SDK para Python (Boto3)
é um kit de desenvolvimento de software que ajuda você a integrar seu aplicativo, biblioteca ou script em Python, incluindo o Amazon Serviços da AWS Bedrock. O Amazon OpenSearch Service é um serviço gerenciado que ajuda você a implantar, operar e escalar clusters de OpenSearch serviços na nuvem da AWS. Esse padrão usa o OpenSearch Service como o sistema de destino para gerar a consulta DSL.
Repositório de código
O código desse padrão está disponível no repositório GitHub Prompt Engineering Text-to-QueryDSL Using Claude 3 Models
Práticas recomendadas
Ao trabalhar com esta solução, considere o seguinte:
A necessidade de AWS credenciais e permissões adequadas para acessar o Amazon Bedrock
Custos potenciais associados ao uso Serviços da AWS e LLMs
A importância de ter conhecimento em query DSL para validar e possivelmente modificar as consultas geradas
Épicos
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Configure o ambiente de desenvolvimento. |
| Python, pip, AWS SDK |
Configure o AWS acesso. | Configure o cliente Amazon Bedrock e a sessão de SageMaker IA. Recupere o Amazon Resource Name (ARN) para SageMaker a função de execução de IA para uso posterior na criação OpenSearch da coleção Serverless. | IAM, AWS CLI, Amazon Bedrock, Amazon SageMaker |
Carregue os esquemas de aplicações de saúde. | Leia e analise esquemas JSON para publicações de saúde e perfis de usuário com base em arquivos predefinidos. Converta esquemas em strings para uso posterior em prompts. | DevOps engenheiro, AWS geral, Python, JSON |
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Crie um gerador de dados baseado em LLM. | Implemente a função generate_data() para chamar a API Converse do Amazon Bedrock com modelos do Claude 3. Configure o modelo IDs para Sonnet, Sonnet 3.5 e Haiku:
| Python, API do Amazon Bedrock, prompts de LLM |
Crie publicações de saúde sintéticas. | Use a função generate_data() com um prompt de mensagem específico para criar entradas de publicação de saúde sintéticas com base no esquema fornecido. Este é um exemplo de chamada de função:
| Python, JSON |
Crie perfis de usuário sintéticos. | Use a função generate_data() com um prompt de mensagem específico para criar entradas de perfil de usuário sintéticas com base no esquema fornecido. O processo é semelhante à geração de publicações de saúde, mas usa um prompt diferente. | Python, JSON |
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Configure uma coleção OpenSearch sem servidor. | Use o Boto3 para criar uma coleção OpenSearch sem servidor com políticas apropriadas de criptografia, rede e acesso. Este é um exemplo de criação da coleção:
Para obter mais informações sobre o OpenSearch Serverless, consulte a AWS documentação. | OpenSearch Sem servidor, IAM |
Defina OpenSearch índices. | Crie índices para postos de saúde e perfis de usuário usando o OpenSearch cliente, com base nos mapeamentos de esquema predefinidos. Este é um exemplo de criação do índice:
| OpenSearch, JSON |
Carregue dados em OpenSearch. | Execute a função ingest_data () para inserir em massa as publicações de saúde sintéticas e os perfis de usuário em seus respectivos índices. OpenSearch A função usa o assistente de operações em massa de
| Python, OpenSearch API, operações de dados em massa |
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Crie alguns exemplos de prompts few-shot. | Gere exemplos de consultas e perguntas em linguagem natural correspondentes usando modelos do Claude 3 para servir como exemplos de few-shot para a geração de consultas. O prompt do sistema inclui estes exemplos:
| Prompts de LLM, query DSL |
Crie um conversor text-to-query DSL. | Implemente o prompt do sistema, que inclui esquemas, dados e exemplos de few-shot, para geração de consultas. Use o prompt do sistema para converter consultas em linguagem natural em query DSL. Este é um exemplo de chamada de função:
| Python, API do Amazon Bedrock, prompts de LLM |
Teste a consulta DSL ativada. OpenSearch | Execute a função query_oss () para executar a consulta DSL gerada na coleção OpenSearch Serverless e retornar os resultados. A função usa o método de pesquisa do OpenSearch cliente:
| Python, OpenSearch API, consulta DSL |
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Crie um conjunto de consultas de teste. | Use o Claude 3 para gerar um conjunto diversificado de perguntas de teste com base nos dados e esquemas sintéticos:
| Prompts de LLM |
Avalie a precisão da conversão de query DSL. | Teste a consulta DSL gerada executando consultas OpenSearch e analisando a relevância e a precisão dos resultados retornados. Isso envolve executar a consulta e inspecionar as ocorrências:
| Python, análise de dados, query DSL |
Compare os modelos do Claude 3 | Compare a performance de diferentes modelos do Claude 3 (Haiku, Sonnet, Sonnet 3.5) para geração de consultas em termos de precisão e latência. Para comparar, altere o | Python, avaliação comparativa de performance |
| Tarefa | Description | Habilidades necessárias |
|---|---|---|
Desenvolva um processo de limpeza. | Exclua todos os índices da coleção OpenSearch Serverless após o uso. | Python, SDK da AWS, API OpenSearch |
Recursos relacionados
Mais informações
Política do IAM
Esta é a política APGtext2querydslpolicy para o perfil do IAM usado neste padrão:
{ "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": "*" } ] }
Técnicas de geração de prompts com modelos da Anthropic para o Claude 3
Esse padrão demonstra as seguintes técnicas de solicitação para conversão text-to-query DSL usando modelos Claude 3.
Prompts few-shot: a geração de prompts few-shot é uma técnica poderosa para melhorar a performance dos modelos do Claude 3 no Amazon Bedrock. Essa abordagem envolve fornecer ao modelo um pequeno número de exemplos que demonstram o input/output comportamento desejado antes de solicitar que ele execute uma tarefa semelhante. Quando você usa modelos do Claude 3 no Amazon Bedrock, os prompts few-shot podem ser particularmente eficazes para tarefas que exigem formatação específica, padrões de raciocínio ou conhecimento de domínio. Para implementar essa técnica, você normalmente estrutura seu prompt com dois componentes principais: a seção de exemplo e a consulta real. A seção de exemplo contém um ou mais input/output pares que ilustram a tarefa, e a seção de consulta apresenta a nova entrada para a qual você deseja uma resposta. Esse método ajuda o Claude 3 a entender o contexto e o formato de saída esperado e geralmente resulta em uma resposta mais precisa e consistente.
Exemplo:
"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.
Prompts do sistema: além de alguns prompts few-shot, os modelos do Claude 3 no Amazon Bedrock também oferecem suporte ao uso de prompts do sistema. Os prompts do sistema são uma forma de fornecer contexto geral, instruções ou diretrizes ao modelo antes de apresentá-lo com entradas específicas do usuário. Eles são particularmente úteis para definir o tom, definir o perfil do modelo ou estabelecer restrições para toda a conversa. Para usar um prompt do sistema com o Claude 3 no Amazon Bedrock, inclua o parâmetro
systemda sua solicitação de API. Esse processo é separado das mensagens do usuário e se aplica a toda a interação. Os prompts detalhados do sistema são usados para definir o contexto e fornecer diretrizes para o modelo.Exemplo:
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.Saída estruturada: você pode instruir o modelo a fornecer a saída em formatos específicos, como JSON ou em marcações XML.
Exemplo:
Put the query in json tagsEncadeamento de prompts: o caderno usa a saída de uma chamada de LLM como entrada para outra, como usar dados sintéticos gerados para criar exemplos de perguntas.
Fornecimento de contexto: o contexto relevante, incluindo esquemas e dados de amostra, é fornecido nos prompts.
Exemplo:
Schemas: [schema details] Data: [sample data]Prompts de tarefas específicas: prompts diferentes são criados para tarefas específicas, como gerar dados sintéticos, criar exemplos de perguntas e converter consultas em linguagem natural em query DSL.
Exemplo para gerar perguntas de teste:
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.