voltar para o blog
Engenharia·04 de abril de 2026·8 min de leitura

RAG na prática: como construímos uma base de conhecimento que escala

RAG não é mágica e não é opcional. É a diferença entre um agente que inventa respostas e um que cita fonte. Aqui está como montamos do zero.

📚

Toda vez que alguém pergunta "como faço pra IA conhecer minha empresa?", a resposta certa é RAG — Retrieval-Augmented Generation. Em vez de tentar enfiar tudo no prompt ou fazer fine-tuning caro, você dá ao modelo a habilidade de buscar pedaços relevantes de informação na hora da resposta.

Os 4 passos de um RAG bem feito

  1. 01Ingestão — pegar PDFs, planilhas, páginas internas, transcrições e quebrar em chunks coerentes (não em pedaços fixos de 500 caracteres).
  2. 02Embedding — transformar cada chunk em um vetor que captura o significado semântico.
  3. 03Indexação — guardar em um vector store (Postgres com pgvector, Pinecone, Qdrant) com metadados úteis pra filtragem.
  4. 04Recuperação — na hora do prompt, buscar os top-K chunks mais similares e injetar no contexto antes de chamar o LLM.

Onde quase todo mundo erra: o chunking

É tentador quebrar o texto em pedaços de tamanho fixo. É também a melhor forma de degradar a qualidade do RAG. Um parágrafo cortado no meio perde contexto; um cabeçalho separado da seção gera ruído.

O que fazemos: chunking semântico — respeitar limites naturais (parágrafos, seções, perguntas em FAQ), com overlap configurável e metadados que carregam o contexto pai (ex.: o título da seção viaja com cada chunk dela).

typescript
// Chunking semântico simplificado
function chunk(doc: Document, max = 1200, overlap = 150) {
  const sections = splitBySections(doc.content);
  const chunks: Chunk[] = [];

  for (const section of sections) {
    const paras = section.text.split(/\n\n+/);
    let buf = "";
    for (const p of paras) {
      if ((buf + p).length > max) {
        chunks.push({
          text: buf,
          meta: { ...doc.meta, section: section.title }
        });
        buf = buf.slice(-overlap) + p;
      } else {
        buf += "\n\n" + p;
      }
    }
    if (buf) chunks.push({ text: buf, meta: { ...doc.meta, section: section.title } });
  }
  return chunks;
}

Embedding: qual modelo escolher

Pra português, em 2026 o que entrega o melhor custo-benefício é text-embedding-3-large da OpenAI ou voyage-large-2 da Voyage. Modelos open-source como E5 funcionam bem pra inglês, menos pra português jurídico/técnico.

Vector store: Postgres ou dedicado?

A regra que aplicamos: até 5M chunks, Postgres com pgvector resolve com folga, custa menos e simplifica infra (você já tem Postgres). Acima disso, ou quando precisa de filtros complexos com baixa latência, Qdrant ou Pinecone fazem sentido.

O hack que ninguém te conta: re-ranking

Buscar os top-K por similaridade vetorial é só metade do trabalho. A outra metade é re-rankear esses K com um modelo mais sofisticado (Cohere Rerank, ou um LLM pequeno) pra escolher os 3 melhores antes de passar pro modelo principal. Custa pouco e melhora MUITO a qualidade da resposta final.

#RAG#embeddings#vector store#Anthropic

Quer aplicar isso na sua operação?

A engenharia da HLT pega de onde o post para — diagnóstico, arquitetura, deploy e operação contínua.

Falar com a engenharia