Chunk de texto para RAG e LLMs: tamanho, sobreposição e limites que funcionam
Por Equipe Safe Local Tools
RAG falha em silêncio quando o chunk está errado. Pequeno demais perde contexto; grande demais dilui embedding e estoura orçamento de tokens. Cortar a cada 512 caracteres no acaso parte frases e enterra o parágrafo que respondia a pergunta. Aqui você vê chunking para recuperação, overlap, divisão estrutural e por que experimentar no Safe Local Tools localmente evita subir playbook proprietário para demo online antes de chamar API de embedding.

Onde o chunk entra no pipeline
Fluxo típico: ingerir documento, dividir em chunks, embedar cada um, na consulta recuperar top‑k, enfiar no prompt do LLM. Teto de qualidade da resposta é teto de qualidade do chunk — modelo novo não conserta recuperação que nunca puxou o parágrafo certo.
Tokens versus caracteres e overlap 10–20%
Embeddings custam tokens; storage fala em bytes. Docs técnicos com headings costumam começar em ~400–800 tokens respeitando seções; logs de chat ~200–400 com limite de locutor; jurídico talvez 800–1200 com overlap forte; código por função/classe, nunca no meio do bloco sensível.
Overlap compartilha cauda de um chunk com cabeça do próximo para frases que atravessam fronteira aparecerem inteiras em pelo menos um vetor. Custa armazenamento, cobrança de embedding e pode duplicar hits se você não deduplicar — comece com 10–15% do tamanho do chunk e meça recall/precisão em perguntas rotuladas.
Divisão estrutural > comprimento cru
Ordem de preferência de quebras: headings Markdown/HTML, parágrafos (linha dupla), fim de frase, espaço, corte duro só no fim. Tabelas: manter linhas coerentes ou serializar linha a linha repetindo cabeçalho.
Anexe metadados: arquivo, página, título de seção, updated_at, ACL de inquilino, índice e total para reconstruir citação — vetor sem proveniência força modelo a inventar fonte.
Avalie com dados reais
Monte 30–50 perguntas de usuários reais com passagens ouro. Acompanhe recall@k, MRR e fidelidade (juiz LLM ou humano). Mude um hiperparâmetro por vez e logue versão do modelo de embedding.
Modos de falha comuns: navegação e rodapés no chunk, boilerplate repetido dominando similaridade, tabela gigante achatada, doc antigo vencido, mistura de idiomas num índice só. Pré‑processe: tire templates, dedupe cabeçalhos, versione índice.
Busca híbrida, orçamento pós‑recuperação e privacidade
BM25 gosta de tokens raros intactos; vetores gostam de vizinhança semântica — códigos tipo PT-2048-A partidos prejudicam ambos. Mesmo com recall perfeito, k=8 chunks × 600 tokens pode consumir janela inteira — re‑ranqueie para top 3–5 após estágio barato.
Playbooks corporativos não deveriam ir para "experimente nosso chunker" na nuvem aleatória. Safe Local Tools processa texto no navegador para ajustar tamanhos e quebras em rascunhos sensíveis antes de embedar.
Filhos pais: recupere chunk pequeno, expanda para span pai ao montar contexto final. GDPR: apagar arquivo fonte deve apagar vetores órfãos na mesma rotina.
PDF, multilíngue e quando pular RAG
Ordem de extração em PDF pode divergir da leitura visual — valide colunas antes de embedar lixo OCR. Corpora mistos EN/ZH/PT podem precisar splitter distinto ou índice por idioma.
Se o corpus cabe inteiro na janela (~8k tokens no modelo alvo), vetor pode ser overkill — chunk adiciona partes móveis sem ganho.
Agentes com ferramentas devolvem JSON maior do que qualquer chunk deveria engolir: aplique as mesmas regras de divisão ou resuma saída de ferramenta antes de indexar. Filas de revisão humana devem mostrar chunk_id usado — se revisores sempre sobrescrevem trecho recuperado, seu splitter está desalinhado com a pergunta real dos usuários.
Reindexar milhões de vetores porque mudou overlap em 5% é projeto caro; versione configs, use holdout comparativo e só então dispare job completo. Enquanto isso, testar splitter no navegador com texto confidencial permite que PM e engenharia alinhem expectativa sem publicar manual em serviço externo.
Resuma mentalmente a receita: documentação interna começa com headings e ~600 tokens com ~80 de overlap; tickets por segmento de conversa com metadados de ticket; contratos com overlap alto e checagem humana nas respostas; código por símbolo; wiki com navegação removida antes de embedar.
Chunk ruim mata demo que "funcionava no notebook". Conserte recuperação primeiro; só depois discuta qual LLM soa mais esperto. Resuma chunks verbosos ao indexar apenas se o resumo for fiel e versionado junto do texto bruto. Para pré‑visualizar limites sem upload, Experimentar o divisor de texto →