- Data Hackers Newsletter
- Posts
- RAG: confira as melhores estratégias de chunking
RAG: confira as melhores estratégias de chunking
Conheça as melhores estratégicas de chunking, que está entre as técnicas mais importantes para desenvolver aplicações com LLMs e vector databases
O chunking é uma das técnicas mais importantes — e muitas vezes negligenciadas — no desenvolvimento de aplicações com LLMs e vector databases. Se você já trabalhou com Retrieval Augmented Generation (RAG) ou sistemas de busca semântica, provavelmente já se deparou com resultados inconsistentes ou respostas imprecisas. A causa? Uma estratégia de chunking inadequada.
Neste artigo, vamos explorar em profundidade o que é chunking, por que ele é essencial para suas aplicações de IA, e como escolher a melhor estratégia para seu caso de uso específico.
O que é chunking?
No contexto de aplicações com LLMs, chunking é o processo de dividir textos grandes em segmentos menores chamados chunks (pedaços, em tradução livre).
É uma técnica de pré-processamento essencial que otimiza a relevância do conteúdo armazenado em vector databases. O desafio está em encontrar chunks grandes o suficiente para conter informações significativas, mas pequenos o suficiente para garantir performance e baixa latência em workloads como RAG e workflows com agentes de IA.
Por que precisamos de chunking?
Existem duas razões fundamentais pelas quais o chunking é necessário em qualquer aplicação envolvendo vector databases ou LLMs:
1. Limitações de context window dos embedding models
Todos os modelos de embedding possuem context windows que determinam a quantidade de informação em tokens que pode ser processada em um único vetor de tamanho fixo. Exceder essa janela significa que os tokens extras serão truncados ou descartados antes do processamento.
Isso é potencialmente prejudicial porque contexto importante pode ser removido da representação do texto, impedindo que seja encontrado durante uma busca.
2. Garantir chunks com informação relevante para busca
Não basta apenas dimensionar os dados corretamente para o modelo; os chunks resultantes precisam conter informações relevantes para a busca. Se um chunk contém sentenças que não fazem sentido sem contexto, elas podem não aparecer nos resultados da query.
Regra prática: se um chunk de texto faz sentido para um humano sem o contexto ao redor, também fará sentido para o modelo de linguagem.
O papel do chunking em semantic search
Em sistemas de busca semântica, indexamos um corpus de documentos, cada um contendo informações valiosas sobre um tópico específico. Devido ao funcionamento dos embedding models, esses documentos precisam ser divididos em chunks, e a similaridade é determinada por comparações no nível de chunk com o vetor da query de entrada.
Se os chunks forem muito pequenos ou muito grandes, isso pode levar a resultados de busca imprecisos ou oportunidades perdidas de surfar conteúdo relevante. Portanto, encontrar o tamanho ideal de chunk é crucial para garantir que os resultados sejam precisos e relevantes.
Chunking para aplicações com agentes e RAG
Agentes de IA podem precisar de acesso a informações atualizadas de databases para chamar ferramentas, tomar decisões e responder a queries dos usuários. Os chunks retornados de buscas sobre databases consomem contexto durante uma sessão e fundamentam as respostas do agente.
Assim como a busca semântica depende de uma boa estratégia de chunking para fornecer outputs utilizáveis, aplicações com agentes precisam de chunks significativos de informação para prosseguir. Se um agente for mal informado ou receber informações sem contexto suficiente, pode desperdiçar tokens gerando alucinações ou chamando as ferramentas erradas.
Chunking e LLMs de contexto longo
Em alguns casos, como ao usar o1 ou Claude 4 Sonnet com janela de contexto de 200k, documentos não fragmentados ainda podem caber no contexto. Ainda assim, usar chunks grandes pode aumentar latência e custo nas respostas downstream.
Além disso, modelos de embedding e LLMs de contexto longo sofrem com o problema "lost-in-the-middle", onde informações relevantes enterradas dentro de documentos longos são perdidas, mesmo quando incluídas na geração. A solução é garantir que a quantidade ideal de informação seja passada para o LLM downstream, o que necessariamente reduz latência e garante qualidade.
Variáveis a considerar ao escolher uma estratégia de chunking
Várias variáveis desempenham um papel na determinação da melhor estratégia de chunking:
Que tipo de dado está sendo fragmentado? Você está trabalhando com documentos longos, como artigos ou livros, ou conteúdo mais curto, como tweets, descrições de produtos ou mensagens de chat? Documentos pequenos podem não precisar ser fragmentados, enquanto maiores podem exibir estrutura que informará a estratégia, como sub-cabeçalhos ou capítulos.
Qual embedding model você está usando? Diferentes modelos têm capacidades distintas para informação, especialmente em domínios especializados como código, finanças, medicina ou jurídico. A forma como esses modelos são treinados pode afetar fortemente seu desempenho na prática.
Quais são suas expectativas para comprimento e complexidade das queries dos usuários? Serão curtas e específicas ou longas e complexas? Isso pode informar a maneira como você escolhe fragmentar seu conteúdo.
Como os resultados recuperados serão utilizados na sua aplicação específica? Por exemplo, serão usados para busca semântica, question answering, RAG ou mesmo um workflow com agentes?
Métodos de chunking
Fixed-size chunking
Esta é a abordagem mais comum e direta: simplesmente decidimos o número de tokens no chunk e usamos esse número para dividir documentos em chunks de tamanho fixo. Geralmente, esse número é o tamanho máximo da context window do embedding model (como 1024 para llama-text-embed-v2, ou 8196 para text-embedding-3-small).
Fixed-sized chunking será o melhor caminho na maioria dos casos, e recomendamos começar aqui e iterar apenas se for insuficiente.
Content-aware chunking
Embora o chunking de tamanho fixo seja fácil de implementar, pode ignorar estrutura crítica dentro de documentos que pode ser usada para informar chunks relevantes. Content-aware chunking refere-se a estratégias que aderem à estrutura para ajudar a informar o significado dos chunks.
Sentence and paragraph splitting
Alguns embedding models são otimizados para embeddings no nível de sentença. Mas às vezes, sentenças precisam ser extraídas de datasets de texto maiores que não são pré-processados. Nesses casos, é necessário usar sentence chunking. Algumas abordagens incluem:
Naive splitting: dividir sentenças por pontos ("."), novas linhas ou espaços em branco
NLTK: biblioteca Python popular para trabalhar com dados de linguagem humana, oferece tokenizador treinado
spaCy: biblioteca poderosa para tarefas de NLP com recurso sofisticado de segmentação de sentenças
Recursive character level chunking
O LangChain implementa um RecursiveCharacterTextSplitter que tenta dividir texto usando separadores em uma ordem específica. O comportamento padrão usa os separadores ["\n\n", "\n", " ", ""] para quebrar parágrafos, sentenças e palavras dependendo do tamanho do chunk.
É um meio-termo excelente entre sempre dividir em um caractere específico e usar um divisor mais semântico.
Document structure-based chunking
Ao fragmentar documentos grandes como PDFs, DOCX, HTML, code snippets, arquivos Markdown e LaTeX, métodos especializados podem ajudar a preservar a estrutura original:
Tipo de Documento | Considerações |
|---|---|
Contém headers, texto, tabelas que requerem pré-processamento | |
HTML | Tags como |
Markdown | Reconhecer sintaxe (headings, listas, code blocks) para divisão inteligente |
LaTeX | Parsing de comandos e ambientes para respeitar organização lógica |
Semantic chunking
Uma técnica experimental introduzida por Greg Kamradt aponta que um tamanho global de chunk pode ser trivial demais para levar em conta o significado de segmentos dentro do documento.
O semantic chunking envolve:
Quebrar documento em sentenças
Agrupar cada sentença com sentenças adjacentes
Gerar embeddings para esses grupos
Comparar distância semântica entre cada grupo e seu predecessor
Identificar onde o tópico ou tema muda, definindo limites do chunk
Contextual chunking com LLMs
Às vezes, não é possível fragmentar informações de um documento complexo maior sem perder contexto totalmente. Isso acontece quando documentos têm centenas de páginas, mudam de tópicos frequentemente ou requerem entendimento de muitas porções relacionadas.
A Anthropic introduziu o contextual retrieval em 2024 para resolver esse problema. A técnica envolve:
Processar documento inteiro com Claude
Gerar descrição contextualizada para cada chunk
Anexar descrição ao chunk antes de embedar
Descrição retém significado de alto nível do documento no chunk
Como descobrir a melhor estratégia para sua aplicação
Selecionando um range de tamanhos de chunk
Uma vez que seus dados estão pré-processados, escolha um range de tamanhos potenciais para testar. A escolha deve levar em conta:
Natureza do conteúdo (mensagens curtas vs documentos longos)
Embedding model e suas capacidades (limites de tokens)
Equilíbrio entre preservar contexto e manter precisão
Comece explorando variedade de tamanhos:
Chunks menores (128 ou 256 tokens) para capturar informação semântica granular
Chunks maiores (512 ou 1024 tokens) para reter mais contexto
Avaliando performance de cada tamanho de chunk
Para testar vários tamanhos, você pode usar múltiplos índices ou um único índice com múltiplos namespaces. Com um dataset representativo:
Crie embeddings para os tamanhos de chunk que deseja testar
Salve-os em seu índice
Execute série de queries para avaliar qualidade
Compare performance dos vários tamanhos de chunk
Este é provavelmente um processo iterativo, testando diferentes tamanhos contra diferentes queries até determinar o tamanho de chunk com melhor performance.
Post-processing com chunk expansion
Você não está completamente casado com sua estratégia de chunking. Ao consultar dados fragmentados em vector database, a informação recuperada é tipicamente os chunks semanticamente mais similares. Mas usuários, agentes ou LLMs podem precisar de mais contexto ao redor.
Chunk expansion é uma forma fácil de pós-processar dados fragmentados, recuperando chunks vizinhos dentro de uma janela para cada chunk em um conjunto recuperado. Chunks podem ser expandidos para parágrafos, páginas ou até documentos inteiros.
Combinar uma estratégia de chunking com boa chunk expansion na consulta pode garantir buscas de baixa latência sem comprometer contexto.
Perguntas frequentes sobre chunking
Qual o tamanho ideal de chunk?
Não existe tamanho único ideal. Depende do seu embedding model, tipo de conteúdo e caso de uso. Comece com fixed-size chunking usando o tamanho da context window do seu modelo e itere baseado em performance.
Preciso fragmentar documentos curtos?
Não necessariamente. Se um documento inteiro (como um tweet ou descrição de produto) cabe confortavelmente na context window do seu embedding model, você pode embedá-lo diretamente.
Semantic chunking é sempre melhor que fixed-size?
Não. Semantic chunking é mais complexo e computacionalmente caro. Fixed-size chunking funciona bem para muitos casos de uso e deve ser seu ponto de partida.
Como o chunking afeta RAG?
Chunking adequado é crítico para RAG. Chunks muito grandes podem diluir informação relevante, enquanto chunks muito pequenos podem perder contexto necessário para gerar respostas precisas.
Conclusão
Chunking pode parecer direto na maioria dos casos — mas pode apresentar desafios quando você se afasta do caminho tradicional. Não há solução única para chunking, então o que funciona para um caso de uso pode não funcionar para outro.
A chave é entender seu domínio, seu embedding model e suas necessidades de aplicação. Comece simples com fixed-size chunking, meça resultados e itere conforme necessário. Com experimentação cuidadosa e avaliação rigorosa, você encontrará a estratégia de chunking ideal para sua aplicação.
Quer começar a experimentar com estratégias de chunking? Explore exemplos práticos e implemente chunking via aplicações como busca semântica, RAG ou aplicações com agentes usando vector databases de alta performance.