Diagrama de arquitetura de um pipeline de Geração Aumentada por Recuperação (RAG) com Elasticsearch e OpenAI.

RAG com Elasticsearch: Guia Prático para Pipelines de IA

Por Anselmo Bispo • 4 min de leitura

A Geração Aumentada por Recuperação (RAG) está transformando a forma como desenvolvedores criam sistemas de busca e perguntas e respostas baseados em Inteligência Artificial. O Elasticsearch, um padrão da indústria para busca de texto completo, evoluiu para um banco de dados vetorial de primeira linha.

Ele oferece busca kNN, vetores esparsos e recuperação híbrida poderosa diretamente. Aqui no Brasil Vibe Coding, vamos detalhar como construir um pipeline RAG de nível de produção usando Elasticsearch como vetor store, integrado com embeddings da OpenAI e GPT-4o.

Por que Escolher Elasticsearch para RAG?

Antes de escrevermos qualquer linha de código, é importante entender por que o Elasticsearch se destaca como seu banco de dados vetorial. Existem muitas opções especializadas, como Pinecone, Weaviate, Qdrant e Chroma, cada uma com seus pontos fortes.

No entanto, o Elasticsearch oferece uma combinação única de recursos que são difíceis de igualar. Ele integra busca densa de vetor kNN e busca de texto completo BM25 simultaneamente, unidas através de Reciprocal Rank Fusion (RRF), sem necessidade de orquestração externa.

Ferramentas operacionais maduras são outro grande benefício, incluindo monitoramento via Kibana, segurança com controle de acesso baseado em função e escalabilidade horizontal comprovada em batalha. Além disso, seus metadados estruturados e embeddings vetoriais residem juntos em um único plano de dados, tornando a busca vetorial filtrada um construtor de consulta nativo.

O Elasticsearch utiliza grafos HNSW (Hierarchical Navigable Small World) — o padrão ouro para algoritmos de vizinho mais próximo aproximado. Isso garante recuperação em menos de 100ms em escala. Sua natureza open-source também evita o aprisionamento tecnológico, dando a você controle total sobre sua infraestrutura.

Arquitetura do Sistema RAG

O pipeline RAG desenvolvido serve como um sistema inteligente de perguntas e respostas sobre documentos. Este sistema é ideal para lidar com um corpus de documentos legais, como contratos, NDAs e políticas de conformidade.

Diagrama de arquitetura de um pipeline RAG com Elasticsearch

Cada pergunta do usuário é primeiro convertida em um vetor denso de 1.536 dimensões, utilizando o modelo text-embedding-3-small da OpenAI. Este vetor é então enviado ao Elasticsearch, que executa uma consulta híbrida de kNN e BM25.

O objetivo é recuperar os principais blocos de documentos mais relevantes. Esses blocos são injetados no prompt do LLM (Large Language Model) como contexto, e o GPT-4o gera uma resposta fundamentada e com citações.

Configurando o Elasticsearch para Vetores

A base de todo o sistema reside no mapeamento do índice. Acertar isso desde o início evita a necessidade de reindexação dolorosa mais tarde. O mapeamento abaixo foi utilizado para o índice /legal-docs:

PUT /legal-docs
{
  "mappings": {
    "properties": {
      "doc_id":    { "type": "keyword" },
      "title":     { "type": "text", "analyzer": "english" },
      "content":   { "type": "text", "analyzer": "english" },
      "category":  { "type": "keyword" },
      "created_at":{ "type": "date" },
      "embedding": {
        "type": "dense_vector",
        "dims": 1536,
        "index": true,
        "similarity": "cosine"
      }
    }
  }
}

Decisão Chave de Design: Por que similaridade de cosseno?
Os embeddings da OpenAI já são normalizados, o que significa que a similaridade de cosseno e o produto escalar produzem classificações idênticas. No entanto, a similaridade de cosseno é mais robusta caso você troque de provedor de embedding ou use vetores não normalizados. Definindo-a corretamente uma vez, você nunca precisará reindexar devido a uma mudança de similaridade.

A estratégia de chunking (divisão em blocos) é, muitas vezes, a decisão mais subestimada em qualquer pipeline RAG. Uma boa chunking garante que o contexto fornecido ao LLM seja relevante e conciso, otimizando a qualidade da resposta gerada.

Conclusão

Construir um pipeline RAG com Elasticsearch é uma abordagem poderosa para sistemas de busca e QA baseados em IA. A combinação de capacidades de busca de texto completo e vetorial do Elasticsearch, juntamente com a inteligência de modelos como o GPT-4o, permite criar soluções robustas e eficientes. Continue acompanhando o Brasil Vibe Coding para mais novidades e guias práticos sobre o universo da programação e Inteligência Artificial.

Tags: RAG Elasticsearch Inteligência Artificial OpenAI GPT-4o

Perguntas Frequentes

O que é Geração Aumentada por Recuperação (RAG)?

RAG é uma técnica que combina a recuperação de informações com a geração de texto, permitindo que sistemas de IA forneçam respostas mais precisas e contextualizadas, buscando dados em uma base de conhecimento antes de gerar uma resposta.

Por que o Elasticsearch é uma boa escolha para um banco de dados vetorial em um pipeline RAG?

O Elasticsearch oferece busca híbrida (kNN e BM25), ferramentas operacionais maduras, plano de dados unificado para metadados e vetores, algoritmos HNSW eficientes e é open-source, evitando o aprisionamento tecnológico.

Como funciona a arquitetura do pipeline RAG com Elasticsearch e OpenAI?

As perguntas do usuário são convertidas em vetores usando modelos da OpenAI, enviados ao Elasticsearch para uma consulta híbrida (kNN + BM25), que recupera blocos de documentos relevantes. Esses blocos são então usados como contexto para um LLM (como GPT-4o) gerar a resposta final.

O que é similaridade de cosseno e por que ela é usada com embeddings da OpenAI?

A similaridade de cosseno é uma métrica usada para determinar a similaridade entre dois vetores. Para embeddings da OpenAI, que já são normalizados, a similaridade de cosseno e o produto escalar produzem classificações idênticas, sendo a similaridade de cosseno mais robusta para diferentes provedores de embedding.

Quais são os componentes chave de um mapeamento de índice do Elasticsearch para vetores?

Um mapeamento de índice para vetores no Elasticsearch inclui campos como `doc_id`, `title`, `content`, `category`, `created_at` e, crucialmente, um campo `embedding` do tipo `dense_vector` com as `dims` (dimensões) e a `similarity` (similaridade, como 'cosine') especificadas.