A geração aumentada por recuperação deixou de ser uma curiosidade acadêmica há anos. Em 2026, é a abordagem padrão para colocar um LLM à frente de seus próprios documentos sem precisar pagar por ajuste fino de um modelo ou correr o risco de ele inventar respostas com confiança. O padrão é simples de descrever, mas repleto de armadilhas na implementação: encontrar o texto certo, entregá-lo ao modelo e deixar que o modelo escreva a resposta.
Este é um guia prático de construção, não uma revisão bibliográfica. Ao final, você saberá exatamente quais componentes um pipeline RAG funcional requer em 2026, quais ferramentas específicas e versões de modelos usar, além de um esboço mínimo de código que pode ser executado localmente ou contra uma API. Verificamos todos os números de versão, preços e benchmarks listados abaixo em fontes atualizadas — pois o pior bug em um pipeline RAG é aquele copiado de um post de blog escrito para bibliotecas do ano anterior.
Principais conclusões
- Seis etapas, nesta ordem: dividir em partes, gerar embeddings, armazenar, recuperar, reordenar e gerar. Pular o reordenador resulta em desempenho visivelmente pior nos resultados principais; pular a avaliação significa que você nunca saberá se funcionou.
- Divisão em partes simples vence. Divisão recursiva com cerca de 512 tokens e sobreposição de 10–20% superou técnicas sofisticadas de divisão semântica (69% vs. 54% de acurácia) em benchmark de 2026. Comece por aí.
- Embeddings: nomic-embed-text (768 dimensões, gratuito, local) para protótipos; OpenAI text-embedding-3-large (US$ 0,13 por 1 milhão de tokens, 3072 dimensões) ou Voyage-3.5 para alta qualidade em larga escala.
- Banco de dados vetorial: pgvector, se você já usa Postgres; Qdrant v1.18 (licença Apache 2.0, em Rust), quando precisa de busca filtrada rápida; Chroma, para trabalhos locais rápidos.
- Frameworks: LangChain 1.x (com runtime LangGraph) para fluxos baseados em agentes; LlamaIndex 0.14.x para aplicações com foco em recuperação — e é possível executar um pipeline útil com cerca de 40 linhas de código, sem depender de nenhum desses frameworks.
- Adicione um reordenador. Cohere Rerank 3.5 (US$ 2 por 1.000 buscas) ou o modelo de código aberto BGE-reranker-v2-m3 (gratuito, com latência de ~50–100 ms em GPU) melhora significativamente a relevância dos resultados top-k de forma econômica.
- Como realmente funciona um pipeline RAG
- Etapa 1: Divida seus documentos em partes
- Etapa 2: Escolha um modelo de embedding
- Etapa 3: Armazene os vetores em um banco de dados vetorial
- Etapa 4: Recupere e reordene
- Etapa 5: Enriqueça o prompt e gere a resposta
- Etapa 6: Um esboço mínimo de código
- Etapa 7: Avalie — não pule esta etapa
- Perguntas frequentes
- Conclusão
- Artigos relacionados
Como realmente funciona um pipeline RAG
Um sistema RAG possui duas fases. Indexação ocorre uma única vez (ou sempre que seus documentos forem alterados): você divide os arquivos-fonte em partes, converte cada parte em um vetor usando um modelo de embedding e armazena esses vetores em um banco de dados. Consulta ocorre a cada requisição: você transforma a pergunta do usuário em um embedding, encontra as partes mais similares, opcionalmente as reordena, insere as melhores delas no prompt e chama um LLM.
Essa é toda a ideia. A engenharia está nos detalhes — tamanho das partes, qual modelo de embedding escolher, quantos resultados recuperar, se deve ou não reordenar e como medir se qualquer parte disso realmente funciona. Se você deseja entender os fundamentos conceituais antes de construir, nosso explicador sobre RAG aborda a teoria; este artigo trata da implementação prática. E, se você ainda está decidindo entre RAG e personalização direta do modelo, a comparação entre ajuste fino e RAG é o ponto ideal para começar — para a maioria das equipes que alimentam um LLM com dados privados e dinâmicos, RAG é a solução mais econômica e sustentável.
Etapa 1: Divida seus documentos em partes
Modelos de embedding possuem um limite de contexto e, mais importante, perdem precisão em trechos longos. Por isso, dividimos os documentos em partes. O consenso de 2026, embasado em benchmarks e não em impressões subjetivas, é despretensioso: use um divisor recursivo por caracteres com alvo aproximado de 512 tokens com sobreposição de 10–20% (50–100 tokens).
Uma avaliação realizada em fevereiro de 2026 com 50 documentos reais revelou que a divisão recursiva ingênua em blocos de 512 tokens obteve 69% de precisão na recuperação, enquanto a fragmentação semântica — que tenta dividir nos limites de significado — alcançou apenas 54%. O motivo é simples: a fragmentação semântica gerou trechos com média de 43 tokens, muito pequenos para fornecer ao modelo contexto suficiente para responder. Enquanto isso, um estudo distinto realizado em janeiro de 2026, utilizando recuperação SPLADE, constatou que a sobreposição entre trechos acrescentava custo de indexação sem trazer benefício mensurável no conjunto de dados analisado. A conclusão honesta é: comece com trechos recursivos de tamanho fixo e só recorra à fragmentação semântica ou por página se suas métricas de avaliação comprovarem, em seus documentos específicos, que essa abordagem é realmente necessária.
Etapa 2: Escolha um modelo de embedding
Essa é a decisão mais impactante do fluxo de trabalho, e a diferença entre as opções é real. Abaixo estão as alternativas dignas de consideração em meados de 2026, com dados verificados.
| Modelo | Dimensões | Contexto | Preço por 1 milhão de tokens | Observações |
|---|---|---|---|---|
| nomic-embed-text v1.5 | 768 (MRL 64–768) | 8,192 | Gratuito (local) | 274 MB; a escolha padrão local |
| mxbai-embed-large | 1024 | 512 | Gratuito (local) | 670 MB; qualidade superior, contexto curto |
| BGE-M3 | 1024 + esparsa | 8,192 | Gratuito (local) | Licença MIT, suporte a mais de 100 idiomas |
| OpenAI text-embedding-3-small | 1536 | 8,191 | $0.02 | Referência econômica via API |
| OpenAI text-embedding-3-large | 3072 | 8,191 | $0.13 | US$ 0,065 via Batch API |
| Voyage-3.5 | 2048 (MRL 256–2048) | 32,000 | $0.06 | Supera o modelo 3-large em cerca de 8% nas tarefas de recuperação |
| Gemini Embedding | 3072 | — | API | Líder no MTEB v2 (~68,3) |
Para um protótipo, comece localmente com nomic-embed-text — é rápido, gratuito, roda facilmente em um laptop com 16 GB de RAM e, segundo relatos, supera o antigo modelo da OpenAI text-embedding-ada-002. Para produção, o campo de modelos de código aberto realmente alcançou o patamar comercial: o BGE-M3 é o modelo robusto sob licença MIT adotado como padrão pela maioria das pilhas auto-hospedadas, enquanto o Voyage-3.5 e o Gemini Embedding lideram os benchmarks de APIs gerenciadas. Há uma única regra essencial: qualquer modelo usado para incorporar seus documentos deve também ser usado para incorporar suas consultas. Misturar modelos de forma silenciosa destrói completamente a eficácia da recuperação.
Etapa 3: Armazene os vetores em um banco de dados vetorial
Uma vez obtidas as incorporações, elas precisam ser armazenadas em algum lugar capaz de suportar buscas rápidas por vizinhos mais próximos. Em 2026, há três níveis razoáveis para isso.
Opte por estes
- pgvector 0.8 se você já utiliza Postgres. Com um índice HNSW, oferece latência p95 de um dígito a dois dígitos baixos (milissegundos) para 1 milhão de vetores. A versão 0.8 introduziu varreduras iterativas, garantindo que consultas filtradas retornem um número suficiente de resultados. Nenhuma nova infraestrutura necessária.
- Qdrant v1.18 (licença Apache 2.0, escrito em Rust), quando filtros são críticos. Seu algoritmo ACORN (introduzido na versão 1.16) resolve o clássico problema de 'filtros prejudicam minha taxa de recuperação' ao ampliar dinamicamente a busca HNSW sob filtros restritivos, sendo uma das melhores opções disponíveis para buscas filtradas. Pode ser auto-hospedado com um único comando Docker.
- Chroma para prototipagem local. Melhor experiência para desenvolvedores, modo embutido, zero operações — ideal até você ultrapassar suas necessidades iniciais.
Atenção para
- Serviços gerenciados cobram conforme uso e podem surpreender: com 100 milhões de vetores, o Pinecone pode custar mais de US$ 5.000/mês, enquanto uma instância auto-hospedada de Qdrant ou pgvector em suas próprias máquinas virtuais costuma ser bem mais econômica. Faça uma auditoria antes de escalar.
- A construção de índices HNSW é lenta em larga escala, e o índice pode atingir ~8 GB para 1 milhão de vetores com dimensão 1536 (use halfvec para reduzir esse valor aproximadamente pela metade).
- O hardware de armazenamento domina o desempenho: a mesma configuração de pgvector atingiu cerca de 410 QPS em SSDs em nuvem, contra 2.150 QPS em unidades NVMe.
Uma análise mais detalhada está disponível em nosso guia de bancos de dados vetoriais, mas, para a maioria das equipes, a árvore de decisões é simples: já usa Postgres → pgvector; precisa de filtragem intensa ou bilhões de vetores → Qdrant ou Milvus; está apenas experimentando → Chroma.
Etapa 4: Recupere e reordene
A recuperação propriamente dita consiste em uma única chamada: incorporar a consulta, solicitar ao banco de dados os k trechos mais próximos (k entre 20 e 50 é típico). Contudo, a similaridade vetorial bruta é uma ferramenta grosseira. Um reordenador (reranker) — um modelo cross-encoder que avalia individualmente cada par consulta-documento — reorganiza esses candidatos e destaca os realmente relevantes antes que cheguem ao modelo gerador.
O padrão consolidado é: recuperar os 50 melhores trechos com seu bi-encoder, aplicar o reordenador e manter os 5–10 melhores. O Cohere Rerank 3.5 custa US$ 0,002 por pesquisa (US$ 2 por 1.000 pesquisas) e tipicamente adiciona latência na ordem de 100–300 ms. Se você possui uma GPU e deseja custo zero por consulta, o modelo de código aberto BGE-reranker-v2-m3 executa em cerca de 50–100 ms e suporta conteúdo multilíngue. A reordenação é uma das melhorias com maior impacto e menor esforço possível — a maioria dos fluxos de trabalho que 'recuperam lixo' simplesmente omite esse passo.
Etapa 5: Enriqueça o prompt e gere a resposta
Agora monte o prompt: uma breve instrução de sistema orientando o modelo a responder exclusivamente com base no contexto fornecido, nos trechos reordenados e na pergunta do usuário. Em seguida, invoque seu LLM.
Quanto ao modelo gerador, você pode optar por execução local ou via API. Localmente, através de OllamaOllama, o ponto ideal em 2026 é um modelo da classe 8B — como o Qwen3 8B ou o Llama 3.1 8B em quantização Q4_K_M — que cabe em 8–12 GB de VRAM e opera a mais de 40 tokens/segundo em GPUs modernas. O Qwen3 14B (~8–9 GB em quantização Q4) representa um salto significativo, com janela de contexto de 128K tokens, permitindo inserir mais texto recuperado. Para uma opção hospedada com maior capacidade, modelos de ponta via API funcionam bem; nosso tutorial sobre chatbot com a API Claude explica esse caminho integralmente. Um lembrete útil de profissionais: em RAG, a qualidade da recuperação normalmente importa mais do que o tamanho do modelo — trechos bem estruturados, um bom incorporador e um LLM pequeno superam um modelo gigantesco alimentado com contexto ruim.
Etapa 6: Um esboço mínimo de código
Abaixo está um fluxo de trabalho completo executado localmente usando LangChain 1.x, Chroma e Ollama. Ele indexa um documento e responde a uma pergunta — sem necessidade de chaves de API.
# pip install langchain langchain-community langchain-chroma langchain-ollama
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_ollama import OllamaEmbeddings, ChatOllama
from langchain_chroma import Chroma
# 1. Carregar + fragmentar (~512 tokens, ~15% de sobreposição; tamanhos em caracteres)
docs = TextLoader("handbook.txt").load()
chunks = RecursiveCharacterTextSplitter(
chunk_size=2000, chunk_overlap=300
).split_documents(docs)
# 2. Incorporar + 3. Armazenar
embeddings = OllamaEmbeddings(model="nomic-embed-text")
store = Chroma.from_documents(chunks, embeddings)
# 4. Recuperar (top 4)
retriever = store.as_retriever(search_kwargs={"k": 4})
# 5. Enriquecer + gerar
llm = ChatOllama(model="qwen3:8b")
question = "Qual é o prazo para reembolso?"
context = "nn".join(d.page_content for d in retriever.invoke(question))
prompt = (f"Responda APENAS com base no contexto fornecido. Caso a informação não esteja presente, diga isso.nn"
f"Contexto:n{context}nnPergunta: {question}")
print(llm.invoke(prompt).content)
Esse é todo o ciclo. Para adicionar reordenação, insira um ContextualCompressionRetriever com um cross-encoder entre as etapas 4 e 5. Com o LlamaIndex 0.14.x, o mesmo fluxo geralmente exige menos código graças às suas abstrações de recuperação projetadas especificamente para esse fim — é a melhor escolha para aplicações com forte ênfase em recuperação, enquanto o runtime LangGraph da LangChain se destaca quando você precisa de agentes com estado e múltiplas etapas. (Escolher uma camada de orquestração é um tópico à parte; consulte nossa comparação de frameworks para agentes de IA.)
Etapa 7: Avalie — não pule esta etapa
A diferença entre uma demonstração e um produto real é a medição. A ferramenta padrão é RAGAS, que avalia fidelidade (a resposta permaneceu fiel ao contexto fornecido?), precisão do contexto e recall do contexto, utilizando um modelo de linguagem como juiz. Crie um pequeno conjunto de 20 a 50 pares de perguntas e respostas extraídos de seus documentos reais e execute-o a cada alteração.
É assim também que você toma todas as decisões anteriores de forma honesta. Deve migrar para fragmentação semântica? Adicionar um reranker? Aumentar o valor de k de 4 para 8? Não chute — altere apenas uma variável, execute novamente o RAGAS e mantenha a mudança somente se os resultados numéricos melhorarem. Sem esse ciclo, você estará ajustando cegamente.
Perguntas frequentes
Quanto custa executar um pipeline RAG?
Quase gratuito para prototipagem. Com embeddings locais no Ollama, Chroma e um LLM local, seu único custo é o consumo de energia elétrica. Em escala maior, os principais custos são o banco de dados vetorial (uma instância auto-hospedada do Qdrant ou do pgvector em sua própria máquina virtual é drasticamente mais barata do que ofertas gerenciadas, que podem ultrapassar US$ 5.000 por mês com 100 milhões de vetores) e, caso use APIs, os embeddings (o OpenAI text-embedding-3-large custa US$ 0,13 por milhão de tokens) além das chamadas de geração.
Preciso de um banco de dados vetorial ou posso usar um banco de dados convencional?
Você precisa de busca vetorial, mas não necessariamente de um produto dedicado. O pgvector adiciona essa funcionalidade ao PostgreSQL e lida com 1 milhão de vetores com baixa latência p95 (na faixa de poucos milissegundos em NVMe, maior em SSDs na nuvem), portanto, se você já executa o PostgreSQL, pode evitar inteiramente a adoção de nova infraestrutura. Opte por um banco de dados dedicado, como o Qdrant, quando precisar de filtragem intensiva por metadados ou lidar com bilhões de vetores.
Qual tamanho de fragmento devo usar?
Comece com cerca de 512 tokens e sobreposição de 10–20%, usando um divisor recursivo. Uma avaliação de 2026 constatou que esse método superou a fragmentação semântica em 69% contra 54% quanto à precisão de recuperação. Mude para técnicas de fragmentação mais sofisticadas apenas se suas métricas de avaliação mostrarem ganhos concretos nos seus documentos específicos.
Um reranker é realmente necessário?
Não para obter algo funcional, mas é uma das melhorias de qualidade mais econômicas disponíveis. Recupere um conjunto amplo (top 50), reordene com o Cohere Rerank 3.5 ou com o modelo de código aberto BGE-reranker-v2-m3 e mantenha apenas os 5–10 melhores resultados. A maioria dos pipelines que apresentam trechos irrelevantes simplesmente omite esse passo.
Posso construir um sistema RAG sem usar LangChain ou LlamaIndex?
Sim. O ciclo principal — incorporar, pesquisar, formatar prompt, gerar — consiste em cerca de 40 linhas de Python puro, chamando diretamente seu modelo de incorporação, cliente do banco de dados vetorial e modelo de linguagem. Os frameworks economizam tempo com carregadores, rerankers e orquestração agêntica, mas são opcionais, e uma implementação do zero oferece controle total sobre cada etapa.
Devo usar um modelo local ou uma API para geração?
Um modelo local (via Ollama, com um modelo de 8B em 8–12 GB de VRAM) é excelente para privacidade, controle de custos e uso offline. Uma API oferece um limite superior de qualidade e elimina totalmente a necessidade de operações. Muitas equipes fazem protótipos localmente para iterar com baixo custo e depois escolhem, caso a caso, entre modelos locais e APIs conforme a sensibilidade dos dados e o orçamento.
Como manter o índice atualizado à medida que os documentos mudam?
Reincorpore e insira apenas as alterações, em vez de reconstruir tudo. Registre um hash de conteúdo ou uma data de modificação para cada documento-fonte e, ao atualizar, exclua os trechos antigos desse documento e insira os novos. A maioria dos bancos de dados vetoriais suporta inserções e exclusões condicionais por filtro de metadados, tornando as atualizações incrementais bastante diretas.
Conclusão
Construir um pipeline RAG em 2026 é genuinamente acessível: seis etapas, um punhado de ferramentas maduras e cerca de 40 linhas de código para um protótipo funcional. As armadilhas não estão na arquitetura — estão nas configurações padrão. Use fragmentos simples de 512 tokens, garanta compatibilidade entre os modelos de incorporação usados nas consultas e nos documentos, adicione um reranker e nunca realize ajustes sem o RAGAS integrado ao ciclo de avaliação. Comece local e gratuitamente com o nomic-embed-text, o Chroma e um modelo de 8B no Ollama; substitua componentes individualmente pelo pgvector, Qdrant, Voyage ou por uma API de ponta somente quando seus números de avaliação — e não um post de blog — indicarem essa necessidade. Acerte a recuperação e até mesmo um modelo pequeno o levará surpreendentemente longe.
