Como ingerir dados no Elasticsearch através do LlamaIndex

Um guia passo a passo sobre como ingerir dados e realizar buscas usando RAG com LlamaIndex.

O Elasticsearch permite que você indexe dados de maneira rápida e flexível. Experimente gratuitamente na nuvem ou execute-o localmente para ver como a indexação pode ser fácil.

Neste artigo, implementaremos um mecanismo de busca para FAQs usando o LlamaIndex para indexar os dados. O Elasticsearch servirá como nosso banco de dados de vetores, permitindo a busca vetorial, enquanto o RAG (Retrieval-Augmented Generation) enriquecerá o contexto, fornecendo respostas mais precisas.

O que é o LlamaIndex?

O LlamaIndex é uma estrutura que facilita a criação de agentes e fluxos de trabalho baseados em Modelos de Linguagem de Grande Porte (LLMs, na sigla em inglês) para interagir com dados específicos ou privados. Permite a integração de dados de diversas fontes (APIs, PDFs, bases de dados) com LLMs, possibilitando tarefas como pesquisa, extração de informações e geração de respostas contextualizadas.

Conceitos-chave:

  • Agentes: Assistentes inteligentes que utilizam LLMs para executar tarefas, desde respostas simples até ações complexas.
  • Fluxos de trabalho: Processos de várias etapas que combinam agentes, conectores de dados e ferramentas para tarefas avançadas.
  • Aumento de contexto: uma técnica que enriquece o modelo de aprendizagem linear (LLM) com dados externos, superando suas limitações de treinamento.

Integração do LlamaIndex com o Elasticsearch:

O Elasticsearch pode ser usado de diversas maneiras com o LlamaIndex:

  • Fonte de dados: Utilize o Elasticsearch Reader para extrair os documentos.
  • Modelo de embeddings: Codifica dados em vetores para buscas semânticas.
  • Armazenamento vetorial: Utilize o Elasticsearch como repositório para busca de documentos vetorizados.
  • Armazenamento avançado: configure estruturas como resumos de documentos ou grafos de conhecimento.

Utilizando LlamaIndex e Elasticsearch para construir uma busca de perguntas frequentes (FAQ).

Preparação de dados

Usaremos as Perguntas Frequentes do Elasticsearch Service como exemplo. Cada pergunta foi extraída do site e salva em um arquivo de texto individual. Você pode usar qualquer abordagem para organizar os dados; neste exemplo, optamos por salvar os arquivos localmente.

Arquivo de exemplo:

Após salvar todas as perguntas, o diretório ficará assim:

Instalação de dependências

Implementaremos a ingestão e a pesquisa usando a linguagem Python, sendo a versão utilizada a 3.9. Como pré-requisito, será necessário instalar as seguintes dependências:

O Elasticsearch e o Kibana serão criados com o Docker, configurados via docker-compose.yml para executar a versão 8.16.2. Isso facilita a criação do ambiente local.

Ingestão de documentos usando LlamaIndex

Os documentos serão indexados no Elasticsearch usando o LlamaIndex. Primeiro, carregamos os arquivos com SimpleDirectoryReader, que permite carregar arquivos de um diretório local. Após carregar os documentos, iremos indexá-los usando o VectorStoreIndex.

Os Vector Stores no LlamaIndex são responsáveis por armazenar e gerenciar incorporações de documentos. O LlamaIndex suporta diferentes tipos de armazenamentos vetoriais e, neste caso, usaremos o Elasticsearch. No StorageContext, configuramos a instância do Elasticsearch. Como o contexto é local, não foram necessários parâmetros adicionais. Para configurações em outros ambientes, consulte a documentação para verificar os parâmetros necessários: Configuração do ElasticsearchStore.

Por padrão, o LlamaIndex usa o modelo text-embedding-ada-002 da OpenAI para gerar embeddings. No entanto, neste exemplo, usaremos o modelo text-embedding-3-small . É importante ressaltar que será necessária uma chave de API da OpenAI para usar o modelo.

Abaixo está o código completo para ingestão de documentos.

Após a execução, os documentos serão indexados no índice de perguntas frequentes , conforme mostrado abaixo:

Pesquisar com RAG

Para realizar buscas, configuramos o cliente ElasticsearchStore , definindo os campos index_name e es_url com a URL do Elasticsearch. Em retrieval_strategy, definimos a AsyncDenseVectorStrategy para buscas vetoriais. Outras estratégias, como AsyncBM25Strategy (busca por palavra-chave) e AsyncSparseVectorStrategy (vetores esparsos), também estão disponíveis. Mais detalhes podem ser encontrados na documentação oficial.

Em seguida, será criado um objeto VectorStoreIndex , onde configuraremos o vector_store usando o objeto ElasticsearchStore. Com o método as_retriever , realizamos a busca pelos documentos mais relevantes para uma consulta, definindo o número de resultados retornados para 5 através do parâmetro similarity_top_k .

O próximo passo é o RAG. Os resultados da busca vetorial são incorporados a um prompt formatado para o LLM, permitindo uma resposta contextualizada com base nas informações recuperadas.

No PromptTemplate, definimos o formato do prompt, que inclui:

  • Contexto ({context_str}): documentos recuperados pelo recuperador.
  • Consulta ({query_str}): a pergunta do usuário.
  • Instruções: diretrizes para o modelo responder com base no contexto, sem depender de conhecimento externo.

Por fim, o LLM processa a solicitação e retorna uma resposta precisa e contextualizada.

O código completo está abaixo:

Agora podemos realizar nossa busca, por exemplo, "Os serviços da Elastic são gratuitos?" e obter uma resposta contextualizada com base nos próprios dados das perguntas frequentes.

Para gerar esta resposta, foram utilizados os seguintes documentos:

Conclusão

Utilizando o LlamaIndex, demonstramos como criar um sistema de busca de FAQs eficiente com suporte para o Elasticsearch como banco de dados vetorial. Os documentos são ingeridos e indexados usando incorporações, possibilitando buscas vetoriais. Por meio de um PromptTemplate, os resultados da pesquisa são incorporados ao contexto e enviados ao LLM, que gera respostas precisas e contextualizadas com base nos documentos recuperados.

Este fluxo de trabalho integra a recuperação de informações com a geração de respostas contextualizadas para fornecer resultados precisos e relevantes.

Referências

https://www.elastic.co/guide/en/cloud/current/ec-faq-getting-started.html

https://docs.llamaindex.ai/en/stable/api_reference/readers/elasticsearch/

https://docs.llamaindex.ai/en/stable/module_guides/indexing/vector_store_index/

https://docs.llamaindex.ai/en/stable/examples/query_engine/custom_query_engine/

https://www.elastic.co/search-labs/integrations/llama-index

Perguntas frequentes

O que é o LlamaIndex?

O LlamaIndex é uma estrutura que facilita a criação de agentes e fluxos de trabalho baseados em Modelos de Linguagem de Grande Porte (LLMs, na sigla em inglês) para interagir com dados específicos ou privados.

É possível integrar o LlamaIndex com o Elasticsearch?

Sim, o Elasticsearch pode ser usado de várias maneiras com o LlamaIndex, incluindo como fonte de dados (usando o Elasticsearch Reader para extrair documentos), como modelo de incorporação (codificando dados em vetores para buscas semânticas), como armazenamento vetorial (usando o Elasticsearch como repositório para busca de documentos vetorizados) e para armazenamento avançado (configurando estruturas como resumos de documentos ou grafos de conhecimento).

Conteúdo relacionado

Pronto para criar buscas de última geração?

Uma pesquisa suficientemente avançada não se consegue apenas com o esforço de uma só pessoa. O Elasticsearch é impulsionado por cientistas de dados, especialistas em operações de aprendizado de máquina, engenheiros e muitos outros que são tão apaixonados por buscas quanto você. Vamos nos conectar e trabalhar juntos para construir a experiência de busca mágica que lhe trará os resultados desejados.

Experimente você mesmo(a)