Marcio Cunha

Como estruturar RAG confiável com chunking semântico

Aprenda na prática como engenheiros evitam respostas erradas em IAs dividindo textos por contexto e limpando ruídos vetoriais.

Marcio Cunha•5 min
Também disponível em:EnglishEspañol
Resumo
  • A quebra semântica preserva frases completas ao detectar mudanças reais de contexto no texto original.
  • Modelos cross-encoders reclassificam os trechos recuperados examinando a relação direta com a pergunta do usuário.
  • Filtros de similaridade de cosseno ajudam a descartar documentos vagos antes de alimentar o modelo de linguagem.
  • Pipelines de ingestão robustos exigem testes de estresse com perguntas complexas e ambíguas.
  • Sistemas RAG otimizados reduzem alucinações e cortam custos operacionais de processamento em nuvem.

O que é um sistema RAG e por que o chunking tradicional falha

Quando conversamos com uma inteligência artificial corporativa, muitas vezes precisamos que ela consulte documentos internos da empresa. Esse mecanismo é conhecido como RAG (Retrieval-Augmented Generation, ou geração aumentada por recuperação), que busca trechos relevantes de textos antes de formular a resposta. Na prática, isso funciona como um assistente que vai até uma gaveta de arquivos, lê as páginas certas e depois resume tudo para você. Contudo, o grande calcanhar de Aquiles desse processo acontece na etapa de ingestão de dados, especificamente quando picotamos os documentos longos em pedaços menores chamados chunks.

O método tradicional de divisão de texto costuma ser puramente mecânico: corta-se o arquivo a cada quinhentos caracteres, independentemente do que está escrito. Na prática, isso significa que frases inteiras e explicações cruciais são cortadas ao meio, separando o sujeito do predicado ou isolando uma conclusão do seu argumento principal. Quando o sistema transforma esses pedaços truncados em números vetoriais para guardar no banco de dados, o sentido original se perde. Como detalhamos ao analisar como mitigar alucinações em RAG com validação cruzada, dados mal estruturados na entrada geram falhas em cascata nas respostas geradas.

Como funciona o chunking semântico na prática

Para resolver o problema do corte cego, utilizamos o chunking semântico, uma técnica que analisa a mudança real de assunto entre os parágrafos de um documento. Em vez de contar caracteres, o algoritmo mede a distância matemática de significado entre frases consecutivas usando um modelo de linguagem menor. Quando percebe que o tema mudou bruscamente, ele insere uma quebra natural de contexto. Na prática, isso garante que um bloco de texto contenha apenas uma ideia completa, facilitando muito o trabalho de busca da inteligência artificial.

Implementar essa lógica em Python exige combinar bibliotecas de manipulação de texto com modelos compactos de vetorização. Abaixo, mostramos um trecho funcional que calcula a variação de similaridade entre sentenças para decidir exatamente onde aplicar o corte semântico:

import numpy as np

def semantic_chunking_split(sentences, embeddings, threshold=0.75):
    chunks = []
    current_chunk = [sentences[0]]
    
    for i in range(1, len(sentences)):
        sim = np.dot(embeddings[i], embeddings[i-1]) / (
            np.linalg.norm(embeddings[i]) * np.linalg.norm(embeddings[i-1])
        )
        if sim >= threshold:
            current_chunk.append(sentences[i])
        else:
            chunks.append(' '.join(current_chunk))
            current_chunk = [sentences[i]]
    
    if current_chunk:
        chunks.append(' '.join(current_chunk))
    return chunks

Esse código percorre uma lista de frases e seus respectivos vetores numéricos. Quando a similaridade matemática entre a frase atual e a anterior cai abaixo do limite estipulado, o script fecha o bloco atual e inicia um novo. Esse cuidado cirúrgico na preparação dos dados é o primeiro passo para construir uma infraestrutura robusta de memória vetorial para agentes de IA sem perda de contexto.

Reduzindo o ruído vetorial com limiares de relevância

Mesmo com uma quebra semântica impecável, os bancos de dados vetoriais costumam retornar mais resultados do que o necessário quando o usuário faz uma pergunta. Se pedirmos por um procedimento de segurança e o sistema trouxer trechos sobre política de férias apenas porque usam palavras parecidas, teremos o chamado ruído vetorial. Na prática, esse lixo informacional confunde o modelo final, fazendo com que ele ignore a resposta correta ou invente dados para preencher a lacuna.

Para eliminar esse ruído, aplicamos um filtro de pontuação de similaridade (cosine similarity threshold) logo após a busca inicial no banco. Definimos um piso mínimo de relevância, descartando qualquer trecho que fique abaixo dessa nota de corte, por mais que o banco tente exibi-lo. Essa etapa funciona como um segurança na porta de uma festa exclusiva: se o documento não apresentar uma compatibilidade genuína com a dúvida do usuário, ele é sumariamente barrado antes de chegar às mãos do modelo gerador.

Ajustando a precisão com modelos Cross-Encoders

Depois de filtrar os melhores blocos pelo método vetorial tradicional, ainda existe um desafio oculto: a ordem de relevância. Os modelos de busca rápida calculam vetores de forma isolada, o que nem sempre reflete a sutileza da pergunta feita pelo usuário. Para corrigir essa distorção de ranking, inserimos uma etapa de reclassificação utilizando um modelo especializado chamado cross-encoder. Na prática, o cross-encoder lê a pergunta e cada documento candidato simultaneamente, comparando palavra por palavra com atenção total ao contexto.

Embora essa verificação cruzada seja computacionalmente mais pesada e lenta para grandes massas de dados, ela é aplicada apenas aos dez ou vinte melhores resultados trazidos pela busca vetorial rápida. O ganho de precisão compensa amplamente o custo de processamento, garantindo que o trecho mais útil fique rigorosamente na primeira posição do prompt. Como vimos ao debater estratégias avançadas de persistência para agentes autônomos, refinar o fluxo de recuperação elimina ambiguidades e acelera a tomada de decisão do sistema.

Validando o pipeline de ingestão em ambiente de produção

Construir o pipeline perfeito no papel não garante sucesso quando os dados reais começam a chegar. Relatórios em PDF mal formatados, tabelas complexas convertidas em texto bruto e notas de rodapé perdidas podem sabotar todo o esforço de engenharia. Por isso, a validação contínua da ingestão deve ser tratada como parte integrante do código da aplicação, com testes automatizados que simulam perguntas difíceis e conferem se o chunk correto foi recuperado.

Além disso, monitorar o uso de memória e a latência de resposta ajuda a identificar gargalos antes que afetem os usuários finais. Pequenos ajustes nos parâmetros de tamanho máximo do chunk e na sobreposição de texto entre blocos vizinhos fazem toda a diferença na taxa de acerto do sistema. Com uma arquitetura limpa, o RAG deixa de ser uma fonte constante de frustração e se torna um ativo confiável para o negócio.

Considerações finais sobre engenharia de recuperação

Investir tempo e esforço na modelagem correta da ingestão de dados separa os protótipos frágeis das aplicações corporativas de alto desempenho. O chunking semântico, somado a filtros rigorosos de ruído e reclassificação com cross-encoders, transforma pilhas de documentos desorganizados em uma base de conhecimento cirúrgica. Ao entender e controlar cada etapa desse fluxo em Python, o engenheiro ganha autonomia para resolver problemas reais de alucinação e garantir total confiabilidade nas respostas entregues pela inteligência artificial.