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
- 01Ingestão — pegar PDFs, planilhas, páginas internas, transcrições e quebrar em chunks coerentes (não em pedaços fixos de 500 caracteres).
- 02Embedding — transformar cada chunk em um vetor que captura o significado semântico.
- 03Indexação — guardar em um vector store (Postgres com pgvector, Pinecone, Qdrant) com metadados úteis pra filtragem.
- 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).
// 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.
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