IA Aplicada26 min leitura

Como implementar RAG na sua empresa em 2 semanas

Guia prático para criar um sistema de busca inteligente sobre documentos internos usando Retrieval-Augmented Generation — com stack, custos e armadilhas.

NuPtechs

IA & Machine Learning

Principais pontos
  • RAG = Busca vetorial + LLM: o modelo responde com base nos seus documentos, não no treinamento geral
  • Três problemas que RAG resolve e LLM puro não: dados proprietários, atualização contínua e citação de fontes
  • Stack mínima viável: LlamaIndex + OpenAI Embeddings (text-embedding-3-small) + Pinecone + GPT-4o
  • Semana 1: ingestão, chunking e indexação; Semana 2: API de query + interface + monitoramento
  • Custo mensal para 500 docs + 5.000 queries: R$ 80-200. Para 5.000 docs + 50.000 queries: R$ 500-1.500
  • Avalie qualidade com 3 métricas: Faithfulness, Relevance e Context Precision — framework RAGAS automatiza

O que é RAG e por que toda empresa com dados internos precisa considerar

RAG (Retrieval-Augmented Generation) é a técnica de conectar um LLM a uma base de documentos externa para que as respostas sejam baseadas no conteúdo real da empresa — não no conhecimento de treinamento do modelo.

O problema que RAG resolve é simples de entender: LLMs como GPT-4o ou Claude sabem muito sobre o mundo geral, mas nada sobre sua empresa. Se você perguntar "qual a política de reembolso da NuPtechs?", o modelo vai inventar uma resposta plausível — com linguagem confiante, formatação impecável, e informação completamente fabricada. Isso é alucinação, e é o maior risco de usar LLMs em ambiente corporativo sem RAG.

Com RAG, o fluxo muda fundamentalmente:

  1. Indexação (offline): Seus documentos (PDFs, manuais, contratos, wiki, emails) são divididos em blocos (chunks), transformados em vetores numéricos via modelo de embedding, e armazenados em um banco vetorial (Pinecone, pgvector, Weaviate).
  2. Retrieval (em tempo real): A pergunta do usuário também vira um vetor. O banco vetorial retorna os K documentos/chunks mais similares semanticamente.
  3. Generation (em tempo real): O LLM recebe a pergunta + os documentos relevantes no contexto e gera uma resposta fundamentada, citando as fontes.

RAG vs. Fine-tuning vs. Contexto direto

AbordagemPara que serveCustoAtualização
RAGRespostas sobre dados que mudam frequentementeBaixo (embedding + query)Instantânea (re-indexe o doc)
Fine-tuningMudar o estilo/comportamento do modeloAlto ($500-5.000/treino)Lenta (retreino completo)
Contexto diretoPoucos docs (<20 páginas)MínimoInstantânea

Regra prática: Se tem menos de 20 páginas de conteúdo, cole tudo no contexto do prompt (sem RAG). Se tem 20-100.000 páginas, use RAG. Se quer mudar como o modelo escreve ou raciocina (não o que sabe), fine-tuning.

RAG vs. Fine-tuning

Fine-tuning muda o comportamento do modelo (como ele responde). RAG muda o conteúdo que ele conhece. Para dados empresariais em mudança contínua, RAG é 10× mais prático e 100× mais barato do que fine-tuning.

Quando RAG é a solução certa (e quando não é)

RAG é ideal quando:

  • Dados proprietários: Manuais técnicos, contratos, políticas internas, base de conhecimento de suporte, documentação de produtos, regulamentações setoriais específicas.
  • Atualização frequente: Adicionar ou atualizar documentos é instantâneo (re-indexe o doc específico). Re-treinar um modelo leva semanas e custa milhares de dólares.
  • Transparência exigida: O usuário precisa ver de onde veio a informação. RAG cita as fontes (nome do arquivo, página, seção). LLM puro não consegue.
  • Compliance e auditoria: Regulações exigem rastreabilidade das respostas — "por que o sistema disse isso?". Com RAG, a resposta é: "porque está na página 47 do contrato X".
  • Volume médio-alto de docs: De 20 a 100.000 documentos. Acima disso, técnicas adicionais (hierarquias, roteamento) são necessárias.

RAG NÃO é a solução certa quando:

  • Volume muito baixo: Menos de 20 páginas de conteúdo — cole tudo no contexto do prompt. Mais simples, mais barato, melhor resultado.
  • Dados não-textuais sem OCR: Imagens, vídeos, plantas técnicas. RAG trabalha com texto. Para imagens, precisa OCR/descrição primeiro.
  • Cálculos e raciocínio complexo: RAG recupera informação, não calcula. Para "calcule o reajuste do contrato X", integre com código de cálculo, não com RAG.
  • Dados estruturados em banco SQL: Se os dados estão em tabelas SQL, uma query direta ou text-to-SQL é mais eficiente que vetorizar rows.
  • Quando a resposta precisa ser exata: RAG introduz variabilidade na geração. Para respostas que precisam ser letra por letra iguais (disclaimer legal, dosagem médica), use busca exata, não RAG.
Qualidade antes de volume

50 documentos limpos, bem formatados e atualizados produzem RAG melhor do que 5.000 com ruído, duplicatas e versões conflitantes. Curadoria é 60% do sucesso de um RAG.

Arquitetura de produção: componentes e decisões

Stack mínima viável (MVP)

ComponenteOpção recomendadaAlternativasCusto mensal
FrameworkLlamaIndexLangChain, HaystackGrátis (open source)
Embeddingstext-embedding-3-small (OpenAI)Cohere embed-v3, Voyage AI~R$ 5 (até 5M tokens/mês)
Vector StorePinecone Serverlesspgvector, Weaviate, QdrantR$ 0-50 (até 1M vetores)
LLMGPT-4o miniClaude 3.5 Haiku, Gemini FlashR$ 30-100 (5k queries)
APIFastAPI (Python)Flask, Express.jsR$ 50 (servidor básico)
InterfaceStreamlit (interno) ou Next.js (produção)Gradio, ChainlitR$ 0-50

Stack de produção (alta disponibilidade)

Para uso com mais de 50 usuários simultâneos e documentos críticos:

  • Fila de ingestão: Redis ou SQS para processar uploads de documentos assincronamente
  • Cache de queries: Redis com TTL (queries frequentes não precisam re-consultar o LLM)
  • Re-ranker: Cohere Rerank ou cross-encoder local para reordenar os chunks após a busca vetorial
  • Fallback de LLM: Se GPT-4o estiver fora, redirecionar para Claude ou vice-versa automaticamente
  • Monitoramento: Log de cada query, chunks retornados, resposta gerada, e score de similaridade

Decisão: Pinecone vs. pgvector

Pinecone: Gerenciado, escala automaticamente, sem operação. Ideal quando não quer gerenciar infra de banco vetorial. Custo a partir de R$ 0 (free tier) até R$ 500+/mês em volume alto.

pgvector: Extensão do PostgreSQL. Se já usa PostgreSQL, adiciona busca vetorial ao mesmo banco. Ideal quando quer simplificar a stack e já tem expertise em PostgreSQL. Performance excelente para até ~5M vetores.

Recomendação: Comece com Pinecone para velocidade. Migre para pgvector quando quiser consolidar infra ou quando o custo de Pinecone superar o de gerenciar pgvector.

Métricas automatizadas com RAGAS

Avalie seu RAG semanalmente com 3 métricas: Faithfulness (resposta sustentada pelos docs?), Relevance (responde a pergunta?) e Context Precision (chunks retornados corretos?). RAGAS automatiza — não dependa de avaliação manual.

Semana 1: Ingestão, chunking e indexação de documentos

Dia 1-2: Setup do ambiente e loader de documentos

Instale LlamaIndex e configure os loaders para os formatos da sua base:

from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
from llama_index.vector_stores.pinecone import PineconeVectorStore

# Suporta PDF, Word, TXT, Markdown, HTML, CSV, JSON
documents = SimpleDirectoryReader(
    "./docs",
    recursive=True,
    filename_as_id=True,       # ID do doc = nome do arquivo
    required_exts=[".pdf", ".docx", ".md", ".txt"]
).load_data()

print(f"Carregados {len(documents)} documentos")

Dia 3-4: Chunking — a decisão mais impactante na qualidade

Chunking é dividir documentos em blocos menores para indexação. A qualidade do RAG depende diretamente da qualidade do chunking:

  • Chunks muito grandes (2000+ tokens): Diluem o significado. A busca vetorial retorna chunks parcialmente relevantes, o LLM tem que filtrar ruído.
  • Chunks muito pequenos (50-100 tokens): Perdem contexto. Uma frase isolada pode ser ambígua sem as frases anteriores.
  • Sweet spot: 256-512 tokens com overlap de 50-100 tokens

Estratégias de chunking por tipo de documento

Tipo de documentoEstratégiaChunk size
Manuais técnicosPor seção/heading (chunk por H2/H3)Variável (respeita seções)
Contratos jurídicosPor cláusula (separação por numeração)256-512 tokens
Emails/tickets de suporteCada email/ticket = 1 chunkVariável (por mensagem)
FAQs/Knowledge baseCada pergunta+resposta = 1 chunkVariável (por par Q&A)
Documentos longos (relatórios)Token-based com overlap512 tokens, 100 overlap

Dia 5: Embedding e indexação

from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core.node_parser import SentenceSplitter

# Chunking
parser = SentenceSplitter(chunk_size=512, chunk_overlap=100)
nodes = parser.get_nodes_from_documents(documents)

# Embedding + Indexação
embed_model = OpenAIEmbedding(model="text-embedding-3-small")
vector_store = PineconeVectorStore(pinecone_index=pinecone_index)
index = VectorStoreIndex(
    nodes,
    vector_store=vector_store,
    embed_model=embed_model,
    show_progress=True
)
print(f"Indexados {len(nodes)} chunks")

Para 500 documentos de ~10 páginas cada: indexação em ~15 minutos, custo de embeddings ~R$ 5.

Dia 5 (continuação): Metadados — o segredo da precisão

Não indexe apenas texto. Adicione metadados a cada chunk:

  • Obrigatórios: nome do arquivo, data de criação/atualização, seção/capítulo
  • Recomendados: autor, departamento, tipo de documento, nível de confidencialidade
  • Avançados: versão do documento, tags temáticas, idioma

Metadados permitem filtros na query: "busque apenas em contratos do departamento jurídico atualizados nos últimos 6 meses".

Threshold obrigatório

Sem similarity cutoff (≥0.72), o sistema retorna chunks para TODA query — mesmo sem resposta na base. Resultado: alucinação com citação de fonte incorreta. Sempre defina cutoff mínimo.

Semana 2: API de query, interface e go-live

Dia 1-2: API de query com controles de qualidade

from llama_index.core.postprocessor import SimilarityPostprocessor query_engine = index.as_query_engine( similarity_top_k=5, response_mode="compact", node_postprocessors=[ SimilarityPostprocessor(similarity_cutoff=0.72) ] ) response = query_engine.query("Qual o prazo de garantia dos contratos?") print(response.response) # resposta gerada print(response.source_nodes) # chunks citados com score

Parâmetros-chave:

  • similarity_top_k=5: Retorna os 5 chunks mais similares. Mais chunks = mais contexto mas mais custo de tokens.
  • similarity_cutoff=0.72: Ignora chunks com score abaixo de 0.72. Sem cutoff, o sistema retorna chunks irrelevantes com aparência de confiança.
  • response_mode="compact": Sumariza a resposta dos chunks. Alternativa: "tree_summarize" para queries complexas sobre muitos documentos.

Dia 3: Interface para usuários

Para uso interno (5-20 usuários): Streamlit resolve em 2-4h. Chat interface com histórico, display de fontes citadas, e filtros por tipo de documento.

Para uso em produção (50+ usuários): API FastAPI com autenticação + frontend React/Next.js. Adicione: rate limiting, cache de queries frequentes, e logging de interações.

Para integração com WhatsApp: n8n com nó HTTP Request chama a API FastAPI. O bot recebe mensagem → envia query à API RAG → retorna resposta formatada para WhatsApp.

Dia 4: Monitoramento e feedback loop

Implemente desde o dia 1:

  • Log de queries: Registre toda query, os chunks retornados, os scores, e a resposta gerada. Isso é ouro para melhorar o sistema.
  • Queries sem resposta: Quando o score máximo dos chunks está abaixo do cutoff, registre a query como "gap na base". Essas são documentos que faltam.
  • Feedback do usuário: Botões simples (👍/👎) na resposta. Feedback negativo = chunk errado ou resposta mal formulada.
  • Dashboard: Queries/dia, taxa de resposta (% de queries com score acima do cutoff), queries mais frequentes, docs mais citados.

Dia 5: Testes e go-live

Antes de liberar para todos os usuários:

  1. Crie um conjunto de 30 perguntas de teste com respostas esperadas
  2. Execute todas as queries e compare respostas geradas vs. esperadas
  3. Meça: Faithfulness (resposta tem suporte nos docs?), Relevance (responde a pergunta?), Context Precision (docs retornados são os certos?)
  4. Ajuste parâmetros (chunk size, top_k, cutoff, response_mode) até atingir qualidade aceitável
  5. Go-live com 10% dos usuários → coleta de feedback → ajustes → 100%

Custos reais por volume: de startup a enterprise

PerfilDocumentosQueries/mêsCusto/mês
Departamental50-200500-2.000R$ 50-150
PME200-2.0002.000-10.000R$ 150-500
Médio porte2.000-10.00010.000-50.000R$ 500-1.500
Enterprise10.000-100.00050.000-500.000R$ 1.500-8.000

Decomposição de custos

  • Embeddings (indexação): ~R$ 0,005 por página de documento. Custo único por documento (re-embed só quando o doc muda).
  • Embeddings (query): ~R$ 0,001 por query envida ao modelo de embedding.
  • LLM (geração): O custo principal. GPT-4o mini: ~R$ 0,005 por query simples. GPT-4o: ~R$ 0,05 por query. Claude 3.5 Sonnet: ~R$ 0,05 por query.
  • Vector store: Pinecone Serverless: R$ 0 (free tier até 100k vetores) a R$ 50-500/mês em volume alto. pgvector: incluso no custo do PostgreSQL existente.
  • Servidor API: R$ 50-200/mês (Railway, Render) ou incluído em infraestrutura existente.

Estratégias de redução de custo

  • Cache de queries: Queries idê nticas retornam resposta cacheada sem re-consultar o LLM. Reduz custo em 30-60% em bases com queries repetitivas (suporte, FAQ).
  • Modelo menor para triagem: GPT-4o mini ou Claude Haiku para queries simples, GPT-4o ou Claude Sonnet apenas para queries complexas. Roteamento automático.
  • Batch embedding: Indexe documentos em lote, não um por um. Custo de embedding em batch é ~20% menor.
  • pgvector: Se já tem PostgreSQL, pgvector elimina o custo de um serviço vetorial separado.

Os 8 erros que mais degradam a qualidade do RAG

1. Chunks muito grandes (2000+ tokens)

Diluem o significado. O vetor representa uma "média semântica" do chunk — quanto maior, mais genérico o vetor. Resultado: chunks parcialmente relevantes com score aceitável mas conteúdo irrelevante para a pergunta específica.

2. Sem metadados nos chunks

Indexar apenas o texto puro do documento perde informação crucial: "isso é do contrato de 2024 ou de 2020?" Sem metadados, o sistema não consegue filtrar por data, departamento, tipo de documento, ou qualquer outro critério além de similaridade semântica.

3. Threshold de similaridade zero

Sem cutoff mínimo, o sistema SEMPRE retorna chunks — mesmo para perguntas que não têm resposta na base. O LLM recebe chunks irrelevantes e inventa uma resposta "baseada" neles. O usuário recebe uma alucinação com citação de fonte incorreta — pior do que não ter resposta.

4. Documentos desatualizados na base

RAG com documentos velhos gera respostas incorretas com aparência de alta confiança. "A política de reembolso é X" — baseado na versão de 2022, não na atual. Implemente: TTL por documento, re-indexação scheduled, ou workflow de aprovação para updates.

5. Não monitorar queries sem resposta

Queries com score baixo (abaixo do cutoff) são gaps reais na base de conhecimento. Se 20% das queries não têm resposta, sua base está incompleta. Registre essas queries e use para priorizar quais documentos adicionar.

6. Prompt de geração genérico

O prompt que envolve os chunks retornados e a query é tão importante quanto o retrieval. Um prompt genérico ("responda a pergunta com base nos documentos") perde oportunidades de: instruir formato de resposta, definir nível de detalhe, proibir extrapolações, e exigir citação de fontes.

7. Não testar com perguntas negativas

Teste não apenas o que o RAG deve responder, mas o que NÃO deve. Perguntas fora do escopo (sobre concorrentes, dados pessoais, assuntos não-empresariais) devem retornar "não tenho informação sobre isso" — não uma resposta fabricada.

8. Indexar tudo de uma vez sem curadoria

100 documentos limpos, bem formatados e atualizados produzem um RAG significativamente melhor do que 10.000 documentos com ruído, duplicatas, versões conflitantes, e conteúdo irrelevante. Comece com os 50 documentos mais consultados e expanda com curadoria.

Estratégias avançadas: re-ranking, chunking hierárquico e hybrid search

Re-ranking: segunda passagem de qualidade

A busca vetorial é rápida mas imprecisa — ela compara embeddings, não entende contexto. Um re-ranker (Cohere Rerank, BGE Reranker) faz uma segunda avaliação nos top-K chunks usando um modelo mais sofisticado (cross-encoder) que compara query + chunk diretamente.

Fluxo: Query → busca vetorial (top-20) → re-ranker (selecionar top-5) → LLM gerar resposta

Impacto: Melhora Relevance em 15-30% com custo adicional de ~R$ 0,003 por query.

Chunking hierárquico: contexto sem diluição

Em vez de um nível só de chunks, crie dois:

  • Nivel alto (seção/capítulo): Chunks grandes para contexto geral
  • Nível baixo (parágrafo): Chunks pequenos para precisão

A busca usa chunks pequenos (precisos), mas envia ao LLM o chunk pai (contexto completo). Combina precisão de busca com qualidade de geração.

Hybrid search: vetorial + keyword

Busca vetorial é boa para perguntas semânticas ("como funciona o reajuste?") mas ruim para busca por termos exatos ("contrato nº 2024-0847"). Hybrid search combina:

  • Busca vetorial: Encontra documentos semanticamente similares
  • Busca keyword (BM25): Encontra documentos com termos exatos
  • Fusão (RRF): Combina os resultados das duas buscas com pesos configuráveis

Pinecone e Weaviate suportam hybrid search nativamente. Para pgvector, combine com ts_vector do PostgreSQL.

Multi-modal RAG

Para documentos com tabelas, gráficos ou imagens relevantes:

  • Extraia tabelas como texto estruturado (pandas ou Camelot para PDFs)
  • Descreva imagens com modelo de visão (GPT-4o, Claude) e indexe as descrições
  • Gráficos: converta dados em texto/tabela antes de indexar

Avaliação de qualidade: framework RAGAS e métricas automatizadas

Sem métricas de qualidade, você não sabe se o RAG está funcionando bem ou entregando lixo com configuração elegante. O framework RAGAS (Retrieval Augmented Generation Assessment) automatiza a avaliação:

As 3 métricas essenciais

MétricaO que medeMetaComo melhorar
FaithfulnessA resposta é suportada pelos documentos retornados?>0,85Melhorar prompt de geração, adicionar instrução "só responda com base nos documentos"
Answer RelevancyA resposta responde a pergunta feita?>0,80Ajustar response_mode, melhorar prompt
Context PrecisionOs chunks retornados são os corretos?>0,75Ajustar chunk size, adicionar re-ranker, melhorar metadados

Como rodar RAGAS

from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision

# Dataset de avaliação: 30+ perguntas com respostas esperadas
eval_dataset = [
    {"question": "Qual o prazo de garantia?",
     "answer": "O prazo de garantia é de 12 meses...",
     "contexts": ["Conforme cláusula 8.1, o prazo de garantia..."],
     "ground_truth": "12 meses conforme cláusula 8.1"},
    # ... mais 29 exemplos
]

result = evaluate(
    dataset=eval_dataset,
    metrics=[faithfulness, answer_relevancy, context_precision]
)
print(result)  # DataFrame com scores por query e média geral

Ciclo de melhoria contínua

  1. Execute RAGAS com 30+ perguntas de teste semanalmente
  2. Identifique queries com score baixo em cada métrica
  3. Faithfulness baixo → melhorar prompt ou adicionar guardrails
  4. Relevancy baixo → ajustar top_k, response_mode ou adicionar re-ranker
  5. Context Precision baixo → melhorar chunking, adicionar metadados ou refinar embeddings
  6. Re-teste após ajustes — métricas devem melhorar ou manter

Conclusão: RAG é o caminho mais rápido para IA útil na empresa

RAG não é teoria acadêmica — é a forma mais prática de fazer IA útil sobre dados da sua empresa em 2 semanas e com R$ 100/mês de custo operacional. O fluxo comprovado:

  1. Comece com 50 documentos curados (não 5.000 com lixo misturado)
  2. Use a stack mínima: LlamaIndex + OpenAI Embeddings + Pinecone + GPT-4o mini
  3. Implemente em 2 semanas: Semana 1 indexação, Semana 2 query + interface
  4. Meça desde o dia 1: RAGAS para qualidade, logs para gaps, feedback para melhoria
  5. Itere: Adicione documentos, ajuste chunking, refine prompts com base nos dados

O maior risco não é técnico — é lançar sem curadoria de documentos e sem monitoramento de qualidade. RAG com documentos desatualizados e sem threshold de similaridade gera alucinações com citação de fontes — pior do que não ter RAG. Invista 60% do tempo em qualidade dos dados e 40% em engenharia.

Mapa Mental

4 ramos · 18 conceitos · Ferramenta de revisão

RAG Empresarial
Técnica mnemônica

Use para navegar · Espaço para expandir