Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 11

Chunking Strategies for RAG

Recommended resources

Olá! Bem-vindo à quarta lição do nosso módulo sobre os princípios da Geração Aumentada por Recuperação (RAG).

Introdução

Na lição anterior, exploramos como os vector stores nos permitem armazenar e recuperar embeddings de forma eficiente, resolvendo o desafio de buscar em milhões de documentos em milissegundos. Vimos que a busca por vizinhos mais próximos aproximada (ANN) é a tecnologia-chave que torna o RAG escalável.

Isso nos leva a uma questão fundamental no processo de ingestão de dados: o que exatamente transformamos em um embedding? Se um documento de regras de negócio tem 50 páginas, ou um arquivo de código-fonte tem milhares de linhas, criar um único embedding para o documento inteiro seria ineficaz. Perderíamos a granularidade necessária para encontrar a resposta precisa para uma consulta específica. A solução é o chunking: o processo de dividir documentos grandes em pedaços (chunks) menores e semanticamente significativos.

Nesta lição, nosso objetivo é aplicar várias estratégias de chunking para segmentar documentos longos de forma eficaz para RAG. Exploraremos um espectro de técnicas, desde métodos simples baseados em tamanho até abordagens sofisticadas que entendem a estrutura do seu conteúdo, seja ele prosa, documentação técnica ou código-fonte.


1. Por Que o Chunking é Crucial?

Antes de mergulharmos nas técnicas, é vital entender por que o chunking é uma das etapas mais críticas em um pipeline de RAG. Uma estratégia de chunking mal executada pode arruinar a qualidade das respostas do seu sistema.

O problema central é a perda de contexto. Se um chunk termina no meio de uma frase ou separa um conceito em duas partes, o LLM recebe informações fragmentadas e desconexas, levando a respostas sem sentido ou alucinações. O chunking não é apenas sobre tamanho — é sobre sentido.

25 chunking tricks for RAG that devs actually use

Para entender melhor o que é chunking e por que uma estratégia ruim pode comprometer todo o seu sistema RAG, leia as seções introdutórias do artigo '25 chunking tricks for RAG that devs actually use'.

Leia as seções 'What even is “chunking” in RAG?' e 'Why bad chunking ruins everything'. Preste atenção na analogia com os 'Git diffs' e na anedota sobre a política de licença parental, que ilustra vividamente as consequências de um chunking inadequado.

Toda estratégia de chunking envolve um trade-off fundamental:

  • Chunks pequenos: Aumentam a precisão da busca (é mais fácil encontrar uma correspondência exata para uma consulta específica), mas podem não conter contexto suficiente para que o LLM gere uma resposta completa.
  • Chunks grandes: Preservam mais contexto, mas podem diluir a relevância do sinal, tornando a busca menos precisa e potencialmente incluindo informações irrelevantes no prompt do LLM.

Seu desafio é encontrar o equilíbrio certo para os seus tipos de documentos e padrões de consulta.


2. Uma Hierarquia de Estratégias de Chunking

Vamos explorar as estratégias de chunking em uma progressão lógica, do mais simples ao mais avançado. A estrutura a seguir é inspirada no excelente guia "The 5 Levels of Text Splitting" de Greg Kamradt.

The 5 Levels Of Text Splitting For Retrieval

Para uma visão geral abrangente das estratégias que abordaremos, assista à introdução do vídeo de Greg Kamradt. Ele apresenta os cinco níveis de text splitting que formam a espinha dorsal desta lição.

Assista do início até 06:11. Este segmento define o propósito do chunking, aborda as limitações dos LLMs (janela de contexto e relação sinal-ruído) e apresenta os cinco níveis que vamos explorar: Character, Recursive, Document-Specific, Semantic e Agentic.

5 Chunking Strategies for RAG
Uma visão geral de diferentes estratégias de chunking. Cada uma aborda o desafio de segmentar documentos de maneiras distintas, com diferentes trade-offs.

Nível 1: Fixed-Size Chunking (Character e Token)

Esta é a abordagem mais básica: dividir o texto em blocos de tamanho fixo, seja por contagem de caracteres ou de tokens.

  • Chunk Size: O número de caracteres ou tokens em cada chunk.
  • Chunk Overlap: O número de caracteres ou tokens do final de um chunk que são repetidos no início do próximo. O overlap ajuda a preservar o contexto em torno dos pontos de divisão, mitigando o problema de cortar uma frase ao meio.

Embora simples, essa abordagem é "cega" à estrutura do texto e frequentemente resulta em divisões inoportunas.

Recursive Character Text Splitting Example
Esta imagem ilustra o conceito de dividir um texto em chunks de tamanho fixo com sobreposição (overlap). Observe como as divisões podem ocorrer em locais arbitrários dentro do texto.

The BEST Way to Chunk Text for RAG

Para ver essa estratégia em ação e entender a diferença crucial entre chunking por caracteres e por tokens, assista a este segmento do vídeo 'The BEST Way to Chunk Text for RAG'.

Assista da marca de 03:52 a 10:19. Preste atenção em: Como o chunking por caracteres funciona e o papel do overlap. Por que o chunking por tokens é conceitualmente mais alinhado com o funcionamento dos LLMs, já que eles processam texto como tokens, não como caracteres.

Nível 2: Recursive Character Splitting

Esta é a estratégia mais recomendada como ponto de partida para a maioria das aplicações de RAG. Em vez de usar um tamanho fixo cegamente, ela tenta dividir o texto de forma inteligente, respeitando sua estrutura natural.

Ela funciona com uma lista hierárquica de separadores. Por padrão, a ordem costuma ser:

  1. Quebras de parágrafo (\n\n)
  2. Quebras de linha (\n)
  3. Espaços ( )
  4. Caracteres (como último recurso)

O algoritmo tenta dividir o texto pelo primeiro separador da lista. Se os chunks resultantes ainda forem maiores que o chunk_size definido, ele passa para o próximo separador da lista e tenta novamente com esses chunks grandes. Esse processo recursivo garante que as divisões ocorram em limites semanticamente lógicos sempre que possível.

The 5 Levels Of Text Splitting For Retrieval

Para uma demonstração prática do Recursive Character Splitting, vamos voltar ao vídeo de Greg Kamradt.

Assista do trecho 16:03 a 20:56. O vídeo mostra como essa técnica evita cortar palavras ao meio e tende a preservar parágrafos e frases, resultando em chunks mais coerentes. A visualização no 'chunkviz.com' é particularmente esclarecedora.

Nível 3: Document-Specific Splitting

Aqui é onde o chunking se torna realmente poderoso para o seu projeto. A ideia é adaptar a estratégia de divisão à estrutura inerente do tipo de documento que você está processando. Para seu agente de código, isso é essencial.

Chunking para Código (C#, JS, Dart) e Documentação Técnica (Markdown):

Você não pode tratar código-fonte como prosa. Dividir uma função ao meio ou separar uma declaração de classe de seus métodos seria desastroso. Em vez disso, você deve usar estratégias que entendam a sintaxe do código.

  • Recursive Splitting com Separadores de Código: A maneira mais eficaz é usar o RecursiveCharacterTextSplitter com uma lista de separadores personalizada para a linguagem. Para C#, por exemplo, a hierarquia poderia ser ["\nclass ", "\nvoid ", "\npublic ", "\nprivate ", "\n\n", "\n", " "]. Isso prioriza a manutenção de classes e métodos inteiros.
  • Markdown-Aware Splitting: Para arquivos README.md e documentos de arquitetura, use os cabeçalhos (##, ###) como separadores principais para manter seções lógicas unidas.

Chunking para PDFs com Tabelas e Imagens:

Documentos de regras de negócio podem vir em formatos complexos como PDFs. Uma simples extração de texto transformaria tabelas em texto desformatado e ignoraria imagens.

  • Table-Aware Chunking: Use ferramentas como a biblioteca unstructured para extrair tabelas como unidades completas (por exemplo, em formato HTML ou Markdown) e inseri-las como chunks separados.
  • Image Handling: Para imagens ou gráficos, uma abordagem é usar um modelo multimodal (como GPT-4 Vision) para gerar um resumo textual da imagem. Esse resumo pode ser então embarcado e recuperado.

The 5 Levels Of Text Splitting For Retrieval

O vídeo de Greg Kamradt oferece uma excelente demonstração prática de como lidar com esses tipos de documentos.

Assista da marca de 20:51 a 32:09. Preste muita atenção em: Como usar RecursiveCharacterTextSplitter.from_language para código Python e JavaScript. O princípio é idêntico para C# e Dart. A demonstração de extração de tabelas de um PDF como HTML usando a biblioteca unstructured. O fluxo de trabalho para extrair uma imagem de um PDF e gerar um resumo textual dela com um modelo de visão.

Nível 4: Semantic Splitting

As estratégias anteriores se baseiam na estrutura física do texto (parágrafos, funções, etc.). O semantic splitting vai além, dividindo o texto com base no seu significado.

O processo geral é:

  1. Dividir o documento em unidades pequenas, como frases.
  2. Gerar um embedding para cada frase.
  3. Calcular a similaridade (distância de cosseno) entre embeddings de frases consecutivas.
  4. Identificar "pontos de quebra": locais onde a similaridade cai drasticamente, indicando uma mudança de tópico. Esses pontos se tornam os limites dos chunks.

Essa abordagem cria chunks que são semanticamente muito coerentes, mas é computacionalmente mais cara, pois requer a geração de embeddings durante a própria etapa de chunking.

The 5 Levels Of Text Splitting For Retrieval

Greg Kamradt e Adam Lucek fornecem duas perspectivas excelentes sobre o semantic splitting.

Primeiro, assista ao vídeo de Greg Kamradt (32:06 - 47:52). Ele faz uma exploração profunda e visual de como identificar pontos de quebra baseados em embedding, o que será muito interessante dado seu background em processamento de sinais e análise de dados.

The BEST Way to Chunk Text for RAG

Em seguida, assista ao resumo de Adam Lucek, que aborda variações como o 'Cluster Semantic Chunker', que adota uma abordagem de otimização mais global.

Assista de 16:04 a 24:47. Tente captar a diferença conceitual entre o 'semantic chunker' padrão (que usa uma janela deslizante local) e o 'cluster semantic chunker' (que constrói uma matriz de similaridade global).

Nível 5: Agentic & LLM-based Chunking

Esta é a fronteira da pesquisa em chunking. A ideia é usar um LLM para decidir como dividir o texto. Em vez de seguir regras fixas, você instrui o modelo a analisar o documento e identificar as seções lógicas.

Por exemplo, você pode dar ao LLM um documento e um prompt como: "Você é um especialista em análise de documentos. Identifique as seções lógicas neste documento e sugira onde dividi-lo em chunks semanticamente coerentes. Retorne os títulos das seções e suas posições."

Essa abordagem é a mais flexível e ciente do contexto, mas também a mais lenta e cara.

The 5 Levels Of Text Splitting For Retrieval

Para um vislumbre dessa abordagem experimental, vamos novamente aos nossos dois guias.

Assista à explicação de Greg Kamradt sobre 'Agentic Chunking' (47:48 - 01:02:25), onde ele constrói um sistema semelhante a um agente que agrupa proposições de forma iterativa.


3. Framework Prático: Qual Estratégia Usar?

Com tantas opções, como decidir qual usar? A resposta é: comece simples e use uma abordagem híbrida baseada no tipo de conteúdo.

Best Chunking Strategies for RAG (and LLMs) in 2026 - Firecrawl

O artigo 'Best Chunking Strategies for RAG' da Firecrawl oferece um excelente framework de decisão e resume as descobertas de várias pesquisas sobre o tema.

Leia a seção 'Decision framework' e, em seguida, a seção 'What the research says...'. A tabela no framework de decisão é especialmente útil e fornece um guia prático para escolher a estratégia correta para diferentes situações.

Aqui está um plano de ação para o seu projeto específico:

  1. Ponto de Partida (Default): Use Recursive Character Splitting para todo o conteúdo que for prosa (documentos de texto, artigos). É o melhor equilíbrio entre desempenho e simplicidade. Comece com um chunk_size entre 512 e 1024 tokens e um chunk_overlap de 10-20%.

  2. Para Documentos de Regras de Negócio (Google Drive):

    • Se forem documentos de texto (Google Docs), use o Recursive Character Splitting.
    • Se forem PDFs com tabelas e formatação complexa, use uma ferramenta como unstructured.io para fazer o partition_pdf e extrair tabelas e texto de forma estruturada.
  3. Para Guias de Arquitetura (Markdown em repositórios Git):

    • Use RecursiveCharacterTextSplitter.from_language(language="markdown"). Isso usará os cabeçalhos (#, ##, etc.) como separadores prioritários, mantendo as seções do documento intactas.
  4. Para Código-Fonte (C#, React/JS, Dart/Flutter):

    • Use RecursiveCharacterTextSplitter.from_language com as respectivas linguagens (language="c_sharp", language="js", language="dart" se suportado pela biblioteca, ou crie uma lista de separadores customizada). O objetivo é agrupar por classes e funções. Isso é crítico para que o agente receba blocos de código lógicos e funcionais como contexto.

Conclusão

Nesta lição, você aprendeu que o chunking é uma etapa decisiva no sucesso de um sistema RAG. Vimos que não existe uma única "melhor" estratégia; a abordagem ideal depende intrinsecamente da natureza dos seus dados.

Principais Pontos:

  • O chunking equilibra o trade-off entre a precisão da busca (chunks menores) e a preservação do contexto (chunks maiores).
  • Recursive Character Splitting é o ponto de partida recomendado para a maioria dos textos, por ser simples e respeitar a estrutura do documento.
  • Para um projeto complexo como o seu, uma abordagem híbrida é necessária:
    • Use divisores cientes da linguagem para código-fonte.
    • Use divisores cientes de Markdown para documentação técnica.
    • Use ferramentas de parsing de documentos (como unstructured) para PDFs complexos.
  • Semantic e LLM-based chunking são técnicas avançadas e caras, que devem ser consideradas quando a máxima qualidade é necessária e o custo não é um fator limitante.

Na Próxima Lição:

Até agora, cobrimos os três pilares da ingestão de dados para RAG: transformar texto em embeddings, dividir documentos em chunks e armazenar tudo em um vector store. Com nosso banco de conhecimento pronto, o próximo passo é construir o fluxo de recuperação. A próxima lição, "Orquestrar o pipeline fundamental de RAG: recuperar chunks relevantes para uma consulta e aumentar o prompt do LLM", unirá todas essas peças. Veremos como pegar uma consulta do usuário, encontrar os chunks mais relevantes em nosso vector store e passá-los para o LLM para gerar uma resposta informada.