Guia Técnico · IA Aplicada

Como desenvolver
sistemas RAG

Retrieval-Augmented Generation na prática: aprenda a construir uma pipeline completa com embeddings, banco vetorial, chunking estratégico e geração de respostas com LLMs — do zero ao sistema em produção.

Por Pedro Lealdino Filho — Cientista de Dados Sênior

Leitura: ~14 min

RAG — Retrieval-Augmented Generation — é a técnica que permite conectar um modelo de linguagem à sua base de conhecimento privada. Em vez de depender apenas do que o modelo aprendeu durante o treinamento, o sistema recupera documentos relevantes em tempo real e os entrega como contexto para a geração da resposta. O resultado: uma IA que sabe sobre os seus dados, com muito menos alucinações.

Por que LLMs sozinhos não bastam

Modelos de linguagem como Claude e GPT-4 são treinados com uma fotografia do conhecimento humano até uma certa data. Isso cria três limitações críticas para aplicações empresariais: conhecimento desatualizado (o modelo não sabe o que aconteceu depois do corte de treinamento), ausência de dados privados (documentos internos, manuais, contratos, dados de clientes não fazem parte do treinamento) e alucinações (quando o modelo não sabe algo, ele frequentemente inventa uma resposta plausível).

Fine-tuning — retreinar o modelo com seus dados — é uma solução possível, mas cara, demorada e rígida. Cada vez que sua base de conhecimento muda, você precisa retreinar. Para a maioria das empresas, isso é inviável. RAG resolve todos os três problemas de forma mais elegante: você mantém o modelo genérico intacto e conecta a ele uma base de conhecimento que pode ser atualizada a qualquer momento, sem retreinamento.

O impacto prático é enorme. Um chatbot de suporte que responde com base nos seus manuais técnicos reais. Um assistente jurídico que consulta a jurisprudência mais recente do seu escritório. Uma ferramenta de análise que conhece cada relatório interno já produzido. Tudo isso se torna viável com RAG — e sem precisar de uma equipe de ML para manter.


Embeddings e busca vetorial: o coração do RAG

Para entender RAG, você precisa entender embeddings. Um embedding é uma representação numérica de um texto — um vetor de centenas ou milhares de números que captura o significado semântico daquele texto. Textos com significado semelhante produzem vetores próximos no espaço matemático; textos com significados diferentes produzem vetores distantes.

É essa propriedade que torna a busca semântica possível. Quando um usuário faz uma pergunta, ela é convertida em um vetor de embedding. O sistema então busca no banco vetorial os documentos cujos vetores estão mais próximos do vetor da pergunta — ou seja, os documentos semanticamente mais relevantes para aquela consulta.

A beleza da busca vetorial é que ela funciona por significado, não por palavras exatas. Uma pergunta sobre "como cancelar minha assinatura" vai recuperar documentos que falam em "rescisão de contrato", "encerramento de plano" e "desativação de conta" — mesmo que as palavras não coincidam. Isso é fundamentalmente diferente e muito mais poderoso do que a busca por palavras-chave tradicional.

"RAG não faz o modelo mais inteligente — faz ele mais informado sobre o que você sabe."

Dividir para conquistar: estratégias de chunking

Antes de gerar embeddings, seus documentos precisam ser divididos em pedaços menores — os chunks. O tamanho e a estratégia de chunking têm impacto direto na qualidade do sistema, e é aqui que muitos projetos erram.

Chunking por tamanho fixo é o mais simples: divida o texto em blocos de N tokens com alguma sobreposição (overlap) entre os blocos consecutivos. A sobreposição garante que frases que cruzam a fronteira entre chunks não se percam. É um bom ponto de partida, mas ignora a estrutura do documento.

Chunking por separador semântico respeita a estrutura natural do texto — parágrafos, seções, tópicos. É mais complexo de implementar, mas produz chunks mais coerentes. Para documentos com estrutura clara (manuais, contratos, artigos), esse método tende a gerar resultados superiores.

Chunking hierárquico cria uma estrutura em dois níveis: chunks menores para recuperação precisa e chunks maiores (ou o documento inteiro) para contexto. Quando um chunk pequeno é recuperado, o sistema também inclui o contexto mais amplo ao redor dele — aumentando a coerência da resposta gerada.

Uma regra prática útil: o chunk precisa conter informação suficiente para ser compreendido de forma independente, mas não tão longo que dilua o sinal de relevância para a busca. Para começar, tente 512 tokens com 10% de sobreposição e ajuste a partir dos resultados que observar.

A arquitetura completa

A pipeline RAG passo a passo

Um sistema RAG completo tem duas fases: indexação (offline, executada uma vez ou periodicamente) e recuperação + geração (online, executada a cada consulta do usuário).

1

Ingestão e pré-processamento dos documentos

Carregue seus documentos — PDFs, Word, páginas web, arquivos de texto, banco de dados. Extraia o texto e aplique limpeza básica: remova cabeçalhos/rodapés repetitivos, normalize espaços, trate caracteres especiais. Ferramentas como pypdf, docling ou unstructured facilitam esse processo para diferentes formatos.

2

Chunking — divisão em pedaços menores

Divida cada documento em chunks usando a estratégia adequada para seu tipo de conteúdo. Junto com cada chunk, armazene metadados: nome do arquivo de origem, número da página, data de criação, categoria, autor. Esses metadados serão usados para filtragem e para incluir citações nas respostas geradas.

3

Geração de embeddings

Passe cada chunk por um modelo de embedding para obter sua representação vetorial. Modelos recomendados: text-embedding-3-small (OpenAI, rápido e econômico), voyage-large-2 (Anthropic, alta qualidade), ou modelos open-source como nomic-embed-text via Ollama para uso local sem custo de API.

4

Armazenamento no banco vetorial

Armazene os vetores e os metadados no banco vetorial de sua escolha. Para prototipagem: Chroma (local, sem infra). Para produção: Pinecone, Qdrant ou Weaviate. Se já usa PostgreSQL, o pgvector adiciona busca vetorial sem nova infraestrutura.

5

Retrieval — recuperação dos chunks relevantes

Quando o usuário faz uma pergunta, ela é convertida em embedding e o banco retorna os K chunks mais similares (tipicamente K=3 a 10). Para sistemas mais robustos, aplique reranking — um modelo secundário que reordena os resultados com base na relevância real para a consulta, não apenas na similaridade cossenoidal.

6

Geração — montagem do prompt e resposta do LLM

Monte um prompt que inclua: a instrução de sistema, os chunks recuperados como contexto e a pergunta do usuário. Instrua explicitamente o modelo a basear-se apenas no contexto fornecido e a indicar quando a informação não estiver disponível. O LLM gera a resposta final com base nesse contexto enriquecido.

RAG em Python: do zero ao funcionando

O código abaixo mostra as partes essenciais de um sistema RAG usando a API da Anthropic para geração e Chroma como banco vetorial local. É um ponto de partida funcional que você pode adaptar ao seu caso de uso:

# Fase 1: Indexação (executada uma vez) import anthropic import chromadb from openai import OpenAI embed_client = OpenAI() chroma = chromadb.PersistentClient(path="./rag_db") collection = chroma.get_or_create_collection("documentos") def indexar_documento(texto: str, doc_id: str, metadados: dict): chunks = criar_chunks(texto, tamanho=512, overlap=50) for i, chunk in enumerate(chunks): embedding = embed_client.embeddings.create( model="text-embedding-3-small", input=chunk ).data[0].embedding collection.add( ids=[f"{doc_id}_chunk_{i}"], embeddings=[embedding], documents=[chunk], metadatas=[{**metadados, "chunk_index": i}] ) # Fase 2: Retrieval + Geração (executada a cada consulta) anthropic_client = anthropic.Anthropic() def responder(pergunta: str, k: int = 5) -> str: # Busca semântica q_embed = embed_client.embeddings.create( model="text-embedding-3-small", input=pergunta ).data[0].embedding resultados = collection.query(query_embeddings=[q_embed], n_results=k) contexto = "\n\n---\n\n".join(resultados["documents"][0]) # Geração com Claude resposta = anthropic_client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, system="""Você é um assistente especializado. Responda SOMENTE com base no contexto fornecido. Se a informação não estiver no contexto, diga explicitamente que não encontrou nos documentos disponíveis.""", messages=[{ "role": "user", "content": f"Contexto:\n{contexto}\n\nPergunta: {pergunta}" }] ) return resposta.content[0].text

Como elevar a qualidade do seu sistema RAG

Hybrid search (busca híbrida): combine busca vetorial (semântica) com busca por palavras-chave BM25. A busca vetorial captura similaridade semântica; o BM25 captura termos exatos — nomes próprios, siglas, códigos de produto. Juntas, as duas cobrem os casos que cada uma deixaria passar individualmente. Qdrant e Weaviate suportam isso nativamente.

Reranking: após recuperar os K chunks iniciais, passe-os por um modelo de reranking (como os da Cohere ou da Jina AI) que avalia cada chunk individualmente em relação à consulta e reordena por relevância real. Esse passo geralmente melhora a precisão de forma significativa com custo computacional baixo.

Query expansion e HyDE: reformule a pergunta do usuário antes de buscar. No HyDE (Hypothetical Document Embeddings), você pede ao LLM que escreva um documento hipotético que responderia à pergunta — e então usa o embedding desse documento hipotético para buscar. Documentos reais similares ao hipotético tendem a ser mais relevantes que os encontrados pela pergunta original.

Citação de fontes: instrua o modelo a citar quais documentos e seções usou para gerar cada parte da resposta. Isso aumenta a confiança dos usuários e permite auditoria. Passe os metadados de origem junto com cada chunk no prompt e peça explicitamente que os cite na resposta.

Bancos vetoriais

Qual banco vetorial escolher?

Banco Melhor para Hospedagem Custo
Chroma Prototipagem rápida e desenvolvimento local Local ou self-hosted Open-source (gratuito)
Pinecone Produção gerenciada com escala e baixa latência Cloud (gerenciado) Gratuito até 1M vetores / pago acima
Qdrant Produção com hybrid search e filtros avançados Cloud ou self-hosted Open-source ou cloud pago
Weaviate Multimodalidade (texto + imagens) e GraphQL Cloud ou self-hosted Open-source ou cloud pago
pgvector Quem já usa PostgreSQL e quer evitar nova infra Self-hosted (PostgreSQL) Open-source (gratuito)
FAISS Busca vetorial em memória de altíssima performance Biblioteca Python (local) Open-source (gratuito)

O que faz sistemas RAG falharem na prática

Chunks grandes demais ou pequenos demais. Chunks grandes demais diluem o sinal de relevância — o chunk recuperado pode ser o correto, mas a resposta para a pergunta está afogada em texto irrelevante. Chunks pequenos demais perdem contexto — a frase relevante está lá, mas sem as frases ao redor ela não faz sentido. Calibrar o tamanho do chunk é uma das alavancas de melhoria mais impactantes.

Documentos ruins entram na base. RAG não melhora documentação mal escrita — ele a amplifica. Se seus manuais internos têm informações contraditórias ou desatualizadas, o sistema vai recuperar e servir essas informações ruins com a aparência de autoridade. Cuide da qualidade dos documentos de entrada antes de construir o sistema.

Ausência de avaliação sistemática. Muitos projetos RAG são construídos, testados informalmente com algumas perguntas e então declarados "prontos". Sem um conjunto de avaliação — perguntas com respostas conhecidas para medir precisão, recall e qualidade da resposta — é impossível saber se mudanças no sistema estão melhorando ou piorando os resultados. Construa o benchmark antes de otimizar.

Contexto insuficiente no prompt. O modelo só pode gerar uma resposta tão boa quanto o contexto que recebe. Se os chunks recuperados não contêm a informação necessária — seja porque o retrieval falhou, seja porque o chunking separou informações que deveriam estar juntas — o modelo vai alucinar ou dizer que não sabe. A causa-raiz quase sempre está no retrieval, não no modelo generativo.


Métricas para medir a qualidade do seu RAG

Avaliar RAG exige medir dois sistemas separados: o retriever e o gerador. Para o retriever, as métricas principais são recall@K (quantas das respostas corretas estavam entre os K chunks recuperados) e MRR (Mean Reciprocal Rank — quão alta na lista o chunk correto aparece). Para o gerador, avalie faithfulness (a resposta é fiel ao contexto fornecido?), relevância da resposta e corretude factual.

Frameworks como RAGAS automatizam boa parte dessa avaliação — eles usam um LLM como juiz para avaliar as respostas do seu sistema em um conjunto de perguntas de referência. É imperfeito, mas muito melhor do que não avaliar. O custo de um conjunto de avaliação bem construído se paga rapidamente em tempo economizado depurando problemas às cegas.

Dúvidas frequentes

Perguntas sobre sistemas RAG

O que é RAG (Retrieval-Augmented Generation)?

RAG é uma técnica que conecta um modelo de linguagem (LLM) a uma base de conhecimento externa. Em vez de depender apenas do que aprendeu durante o treinamento, o modelo consulta documentos relevantes em tempo real antes de gerar a resposta. O resultado é uma IA que responde com base em informações atualizadas e específicas do seu domínio, com muito menos alucinações.

Qual a diferença entre RAG e fine-tuning?

Fine-tuning modifica os pesos do modelo com novos dados — é caro, demorado e precisa ser refeito quando os dados mudam. RAG mantém o modelo intacto e conecta a uma base de conhecimento que pode ser atualizada a qualquer momento. Para a maioria dos casos empresariais — chatbots de suporte, assistentes de documentação, buscas internas — RAG é mais rápido, barato e flexível.

O que é um banco de dados vetorial?

Um banco de dados vetorial armazena representações numéricas de textos (embeddings) e permite buscas por similaridade semântica — encontrando documentos com significado próximo ao da consulta, mesmo que as palavras exatas não coincidam. Os principais são: Pinecone, Weaviate, Qdrant, Chroma e pgvector (extensão do PostgreSQL).

O que são embeddings?

Embeddings são representações numéricas de texto em um espaço vetorial de alta dimensão. Textos com significado semelhante ficam próximos nesse espaço, o que permite buscar por similaridade semântica. Modelos de embedding populares: text-embedding-3-small (OpenAI), voyage-large-2 (Anthropic) e modelos open-source como nomic-embed-text.

Qual o tamanho ideal de chunk para RAG?

Não existe um tamanho universal — depende do tipo de documento e da natureza das consultas. Como ponto de partida: chunks de 512 tokens com 10–20% de sobreposição funcionam bem para a maioria dos casos. Documentos técnicos densos beneficiam-se de chunks menores (256 tokens); textos narrativos longos, de chunks maiores (1024 tokens). O ideal é experimentar e medir a qualidade do retrieval.

Como melhorar a qualidade de um sistema RAG?

As principais alavancas são: (1) chunking estratégico — tamanhos e estratégias adequados ao tipo de documento; (2) reranking — modelo secundário que reordena os chunks recuperados; (3) hybrid search — combinar busca vetorial com BM25; (4) query expansion — reformular a consulta antes de buscar; (5) metadados e filtros — restringir a busca por fonte, data ou categoria antes da busca semântica.

Pedro Lealdino Filho
Sobre o autor

Pedro Lealdino Filho

Cientista de Dados Sênior em um dos maiores bancos da América Latina e PhD em Educação Matemática. Especialista em IA aplicada e Ciência da Decisão. Publica semanalmente sobre IA, dados e estratégia na newsletter Dataverso.

Quer ir além?

Construa sistemas de IA
que funcionam de verdade

Workshops e cursos com Pedro Lealdino Filho para equipes que querem implementar RAG, agentes e IA generativa em produção — com rigor e resultados mensuráveis.

Ver Cursos Workshops para Empresas