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/
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).




