📚 RAG (Retrieval-Augmented Generation) na Prática
Combine LLMs com bases de conhecimento para respostas precisas, atualizadas e livres de alucinações.
Conceito Central
A revolução do conhecimento contextualizado
"RAG = LLM + Sua Base de Conhecimento. Respostas fundamentadas em SEUS dados, não em dados genéricos."
O RAG (Retrieval-Augmented Generation) representa uma mudança fundamental na forma como interagimos com LLMs. Em vez de depender apenas do conhecimento estático embutido no modelo durante o treinamento, RAG permite que o modelo acesse e utilize informações externas em tempo real.
Isso resolve três problemas críticos: alucinações (informações inventadas), conhecimento desatualizado (modelos são congelados no tempo), e falta de especificidade (modelos não conhecem seus dados internos). Com RAG, você obtém respostas precisas, verificáveis e atualizadas.
Tópicos do Módulo
LLMs tradicionais têm um problema fundamental: seu conhecimento é estático. Eles são treinados em dados até uma data de corte e não sabem nada sobre eventos posteriores ou sobre seus dados internos específicos.
RAG (Retrieval-Augmented Generation) resolve isso adicionando uma etapa de recuperação de dados externos antes da geração. O fluxo é simples: receba uma pergunta → busque informações relevantes em sua base de conhecimento → passe essas informações como contexto para o LLM → gere resposta fundamentada.
O resultado? Redução drástica de alucinações, respostas sempre atualizadas e capacidade de responder com base em documentos proprietários que o modelo nunca viu durante o treinamento.
💡 Exemplo Prático
Sem RAG: "Qual foi o faturamento da empresa no Q3 de 2024?" → LLM alucina um número ou diz que não sabe.
Com RAG: Sistema busca o relatório financeiro Q3/2024, extrai dados relevantes, LLM responde com precisão: "Segundo o relatório financeiro, o faturamento foi de R$ 12,3M."
🎯 Ponto-Chave
RAG transforma LLMs genéricos em especialistas do seu domínio específico.
Um sistema RAG completo possui dois componentes principais: o Recuperador (Retriever) e o Gerador (Generator).
Fluxo completo em 5 etapas:
- 1. Indexação: Documentos são divididos em chunks e convertidos em embeddings vetoriais, armazenados em um banco de dados vetorial.
- 2. Query: Usuário faz uma pergunta ao sistema.
- 3. Recuperação: A pergunta é convertida em embedding e busca-se os chunks mais similares no banco vetorial.
- 4. Aumento (Augmentation): Os chunks recuperados são adicionados como contexto ao prompt.
- 5. Geração: O LLM gera a resposta baseada no contexto fornecido.
🔍 Analogia
Pense em RAG como um estudante fazendo uma prova: em vez de confiar apenas na memória (LLM puro), ele pode consultar livros e anotações (Retriever) antes de escrever a resposta (Generator).
Chunking é o processo de dividir documentos grandes em pedaços menores e gerenciáveis. Por quê? LLMs têm limite de contexto (tokens) e chunks pequenos facilitam a recuperação precisa.
Estratégias de Chunking:
- • Por tamanho fixo: Dividir a cada N caracteres ou tokens (ex: 500 tokens com overlap de 50)
- • Por estrutura: Respeitar parágrafos, seções, capítulos
- • Semântico: Usar NLP para identificar mudanças de tópico
Embeddings são representações vetoriais que capturam o significado semântico do texto. Textos similares têm embeddings próximos no espaço vetorial.
Modelos populares: OpenAI text-embedding-ada-002, Sentence-Transformers (all-MiniLM-L6-v2, multi-qa-mpnet-base), Cohere Embed.
⚙️ Dica de Implementação
Use overlap entre chunks (ex: 10-20% do tamanho do chunk) para não perder contexto nas fronteiras. Chunk muito pequeno = perda de contexto. Chunk muito grande = informação irrelevante.
Bancos de dados vetoriais são otimizados para busca por similaridade usando ANN (Approximate Nearest Neighbor). Eles permitem encontrar os K vetores mais próximos de uma query em milissegundos, mesmo com milhões de documentos.
Principais opções:
☁️ Pinecone
Cloud-native, escalável, fácil de usar. Ótimo para começar e produção.
🔷 Weaviate
Open-source, GraphQL API, suporta módulos de ML integrados.
🎨 Chroma
Leve, open-source, perfeito para desenvolvimento e prototipagem.
⚡ FAISS
Facebook AI, biblioteca C++/Python. Ultra-rápido, requer mais setup.
📏 Métricas de Similaridade
- • Cosseno: Mede ângulo entre vetores (mais comum para texto)
- • Euclidiana: Distância em linha reta
- • Dot Product: Produto escalar (usado por OpenAI)
No RAG, o LLM recebe o contexto recuperado e o sintetiza em uma resposta fluente e coerente. Ele NÃO precisa "saber" tudo - apenas saber compreender e sintetizar o que é fornecido.
Template típico de prompt RAG:
Você é um assistente especializado. Use APENAS as informações
do contexto abaixo para responder à pergunta do usuário.
Se a resposta não estiver no contexto, diga claramente
"Não encontrei essa informação nos documentos fornecidos."
CONTEXTO:
{chunks_recuperados}
PERGUNTA DO USUÁRIO:
{user_query}
RESPOSTA:
🎯 Pontos Críticos
- • Instrua explicitamente o LLM a se limitar ao contexto fornecido
- • Peça citações ou referências quando possível
- • Configure temperatura baixa (0.0-0.3) para respostas mais determinísticas
Avaliar a qualidade de um sistema RAG é essencial para garantir que ele está funcionando corretamente e melhorando ao longo do tempo.
Métricas principais:
- • Hit Rate (Recall@K): Em quantos % dos casos o documento correto está nos top K resultados?
- • MRR (Mean Reciprocal Rank): Em que posição, em média, aparece o documento correto?
- • Faithfulness: A resposta está fundamentada no contexto ou alucinou?
- • Answer Relevancy: A resposta realmente responde à pergunta?
🧪 Frameworks de Avaliação
- RAGAs: Framework completo para avaliar RAG (Context Precision, Context Recall, Faithfulness, Answer Relevancy)
- ARES: Automated RAG Evaluation System usando LLMs como juízes
- TruLens: Observabilidade e avaliação end-to-end
💡 Dica
Crie um conjunto de teste com perguntas e respostas esperadas (golden dataset). Avalie periodicamente seu sistema contra esse conjunto.
RAG básico funciona, mas técnicas avançadas levam a qualidade a outro nível:
🔀 Hybrid Search
Combina busca vetorial (semântica) com busca lexical (BM25). Captura tanto significado quanto correspondências exatas de palavras-chave.
🎯 Re-ranking
Após recuperação inicial, um modelo de re-ranking (ex: Cohere Rerank, Cross-Encoder) reordena resultados para melhor precisão.
🔄 Query Transformations
Reformule ou expanda a query original. Técnicas: HyDE (Hypothetical Document Embeddings), Query Expansion, Step-back Prompting.
🗜️ Context Compression
Use um LLM para resumir/filtrar chunks recuperados antes de passar para o LLM final. Reduz custos e melhora precisão.
🚀 Resultado
Essas técnicas podem aumentar o hit rate de ~60% (RAG básico) para >85% (RAG avançado).
Vamos construir um sistema RAG básico usando LangChain + OpenAI + Chroma.
📝 Código Completo (Python)
from langchain.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 1. Carregar documentos
loader = DirectoryLoader('./docs', glob="**/*.txt", loader_cls=TextLoader)
documents = loader.load()
# 2. Chunking
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)
# 3. Criar embeddings e armazenar no Chroma
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)
# 4. Criar retriever
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# 5. Criar chain RAG
llm = ChatOpenAI(model="gpt-4", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
return_source_documents=True
)
# 6. Fazer pergunta
result = qa_chain({"query": "Qual é a política de férias da empresa?"})
print(result['result'])
print("Fontes:", [doc.metadata for doc in result['source_documents']])
🎯 O que acontece aqui?
- 1. Carrega todos os .txt da pasta ./docs
- 2. Divide em chunks de 500 chars com overlap de 50
- 3. Cria embeddings e armazena no Chroma (local)
- 4. Quando você faz uma pergunta, busca os 3 chunks mais relevantes
- 5. Passa os chunks como contexto para o GPT-4
- 6. Retorna resposta + documentos fonte
💬 Chatbots de Suporte
Responda dúvidas de clientes com base em documentação, FAQs e base de conhecimento interna.
Ex: Intercom, Zendesk AI
🔍 Pesquisa Interna
Encontre informações em milhares de documentos corporativos instantaneamente.
Ex: Glean, Notion AI
📄 Análise de Documentos
Extraia insights de contratos, relatórios financeiros, documentos jurídicos.
Ex: Harvey AI (jurídico)
💻 Assistentes de Programação
Responda dúvidas sobre sua codebase específica, padrões e arquitetura.
Ex: GitHub Copilot Chat com RAG
📊 Estatística Impressionante
Empresas que implementam RAG relatam redução de 70-90% em alucinações e aumento de 3-5x na satisfação do usuário comparado a LLMs puros.
O RAG está evoluindo rapidamente. Estas são as tendências mais promissoras:
🎨 RAG Multimodal
Indexar e recuperar não apenas texto, mas imagens, vídeos, áudio. Modelos como GPT-4V e Gemini já suportam entrada multimodal.
🔄 Self-Correcting RAG
Sistemas que detectam quando a resposta está incorreta ou incompleta e automaticamente refinam a busca e tentam novamente.
🤖 RAG + Agentes
Integração de RAG com sistemas de agentes que podem decidir quando e como usar retrieval, executar ações e iterar.
⚡ RAG em Edge
Modelos menores e mais eficientes permitindo RAG rodar localmente em dispositivos, garantindo privacidade total.
🔮 Previsão
Até 2026, RAG será tão fundamental quanto APIs REST são hoje. Todo sistema que usa LLM usará alguma forma de retrieval.