Capítulo 2

Chunking

A decisão mais importante do RAG: como você divide o documento em pedaços menores antes de guardar no banco vetorial.

⚖️ Por que o Chunking importa?

📈

Chunk muito grande

  • • Inclui ruído irrelevante
  • • Dilui relevância
  • • Custo alto de tokens
  • • Modelos perdem foco
📉

Chunk muito pequeno

  • • Perde contexto
  • • Não responde perguntas complexas
  • • Fragmentação excessiva
  • • Relevância fragmentada

🛠️ 3 Estratégias de Chunking

Chunking FixoTamanho fixo (500 chars)Chunking SemânticoPor parágrafos/seçõesChunking com SobreposiçãoOverlap de 50 chars✅ RecomendadoSemântico: preserva contexto
1

Fixo

Divisão por tamanho exato (ex: 500 caracteres). Simples, mas pode quebrar parágrafos no meio.

Laravel — chunk fixo
$text = $documento->conteudo;
$chunks = collect(mb_str_split($text, 500))
  ->filter()
  ->values();
2

Semântico

Divisão por parágrafos ou seções lógicas. Recomendado — preserva contexto.

Laravel — chunk semântico
$chunks = preg_split('/

+/', $documento->conteudo);

$chunks = collect($chunks)
  ->filter(fn($c) => mb_strlen($c) >= 100 
                  && mb_strlen($c) <= 1000);
3

Sobreposição

Chunk de 500 chars com 50 chars de sobreposição. Mantém contexto entre chunks.

Laravel — chunk com overlap
$chunks = [];
$texto = $documento->conteudo;
for ($i = 0; $i < mb_strlen($texto); $i += 450) {
    $chunks[] = mb_substr($texto, $i, 500);
}

📊 Tamanho do Chunk por Documento

Tipo de DocumentoTamanho do ChunkEstratégia
Artigos, posts500-800 charsSemântico
Documentação técnica800-1500 charsSemântico
Contratos longos1500-3000 charsFixo + Overlap
Código-fonte200-500 chars (por função)Por função/método
Emails/SMS100-300 charsFixo
Livros1000-2000 charsSemântico + Overlap

✨ Regra de Ouro

Comece com chunking semântico (por parágrafos) com limites de 100-1000 caracteres. Depois, teste com perguntas reais do seu domínio e ajuste baseado nos resultados. Não existe tamanho "certo" — existe tamanho que funciona para suas perguntas.