Limpe os documentos antes de RAG
Última atualização:
Limpar um documento para a geração aumentada por recuperação (RAG) significa remover tudo o que não é conteúdo — os cabeçalhos, rodapés, números de página e textos repetidos que um PDF traz em cada página — antes de o texto restante ser dividido em fragmentos, incorporado e armazenado num índice vetorial. É o passo menos glamoroso de uma canalização RAG e o que decide em silêncio se a recuperação funciona: um índice construído com texto por limpar armazena o mesmo mobiliário centenas de vezes e recupera-o como se fosse conhecimento. Este artigo explica por que o mobiliário envenena as incorporações, como a fragmentação funciona realmente, por que a deduplicação pertence ao antes de incorporar, o que retirar e o que conservar, e como avaliar se a limpeza ajudou. Para fazer a limpeza, use o limpador de documentos e leia os seus próprios resultados ao lado deste guia.
Por que o mobiliário de página envenena as incorporações
Um modelo de incorporação transforma um fragmento de texto num vetor que deveria capturar aquilo de que o fragmento trata. Dê-lhe um fragmento que seja metade título do relatório, rodapé de confidencialidade e número de página, e o vetor capturará isso também com fidelidade, o que significa que cada fragmento de um documento longo deriva para o mesmo mobiliário, e fragmentos que deveriam estar longe no espaço vetorial acabam artificialmente perto porque partilham um cabeçalho. A recuperação faz então exatamente o que lhe foi pedido: perguntada pela secção sobre a política de reembolsos, devolve cinco fragmentos cuja sinal partilhado mais forte é o nome da empresa no cabeçalho. Ninguém cometeu um erro de modelação. O índice foi abastecido com ruído em plena força, repetido em cada página, e o ruído que se repete é indistinguível do sinal para um sistema que conta semelhanças.
O dano é pior do que a diluição. Os fragmentos de mobiliário podem ganhar a recuperação sem mais: uma pergunta formulada como o rodapé — sobre confidencialidade, controlo de documentos ou versões — corresponde ao fragmento do rodapé que foi incorporado duzentas vezes melhor do que ao único parágrafo que realmente lhe responde. Os números de página criam uma falha mais subtil, ensinando ao modelo que números soltos são conteúdo, por isso um fragmento que termina em «42» pode ser citado de volta como se o número significasse alguma coisa. E cada fragmento de mobiliário ocupa um lugar num conjunto de resultados top-k finito, empurrando para fora um fragmento genuinamente relevante do contexto que o modelo recebe. Limpar não é, portanto, um arrumo cosmético; é remover um concorrente sistemático do seu próprio conteúdo dentro do seu próprio índice.
Fundamentos da fragmentação: tamanho, sobreposição e limites
Fragmentar é a decisão sobre que unidade é incorporada, e tem três botões. O tamanho equilibra foco e contexto: os fragmentos pequenos, de algumas centenas de caracteres, incorporam uma ideia com nitidez e recuperam com precisão, mas podem chegar sem a frase que dá à ideia as suas condições; os fragmentos grandes, de vários milhares de caracteres, levam o seu contexto consigo mas misturam várias ideias num vetor médio, por isso nenhuma recupera com força. A maioria dos corpus documentais cai em algum ponto intermédio — aproximadamente de 500 a 1.000 caracteres é uma região de partida sensata — e a resposta certa decide-se testando as suas próprias perguntas contra os seus próprios documentos, não copiando um número de uma predefinição. A documentação de divisores de texto da LangChain é um bom mapa das famílias de divisores, dos de caracteres e recursivos aos conscientes da estrutura.
A sobreposição é um seguro contra o segundo botão, os limites. Um divisor que corta a cada 800 caracteres sem importar a estrutura acabará por partir uma definição ao meio, e nenhuma metade se recupera nem se lê bem. Dividir por limites — primeiro parágrafos, depois frases, depois espaços, como fazem os divisores recursivos — mantém as unidades inteiras a maior parte do tempo, e uma sobreposição modesta de dez a vinte por cento repete a borda de um fragmento no início do seguinte, para que um corte que mesmo assim aconteça não deixe órfão o seu contexto. A hierarquia da documentação de analisadores de nós da LlamaIndex faz o mesmo apontamento do lado do carregador: analise em nós que respeitem o documento, e depois divida. Mas nada disto resgata o mobiliário: a sobreposição repete fielmente o cabeçalho também no fragmento seguinte, e é por isso que a limpeza vem antes de fragmentar, nunca depois.
Deduplique antes de incorporar
Os duplicados são o segundo contaminante sistemático, e vêm em duas classes. A primeira é a duplicação de documentos inteiros: o mesmo PDF indexado duas vezes com nomes diferentes, a versão antiga deixada ao lado da nova, o anexo de correio guardado ao lado da cópia da unidade partilhada. A segunda está dentro do documento: a exoneração na página de título e outra vez no apêndice, o resumo repetido à frente de cada capítulo, a tabela colada no corpo e no anexo. Ambas as classes têm o mesmo efeito na recuperação — o texto duplicado é incorporado repetidamente, por isso é recuperado repetidamente, enchendo o top-k com cópias de uma passagem enquanto outras passagens nunca vêm à superfície — e o mesmo efeito no custo, porque paga para incorporar e armazenar cada cópia.
A deduplicação é mais barata antes de incorporar, quando ainda é uma comparação de cadeias. Os duplicados exatos caem com a normalização: colapse os espaços, ignore o mobiliário de página que já retirou, faça o hash do resultado e conserve uma cópia. Os quase duplicados — o mesmo parágrafo com uma data mudada ou um título renumerado — precisam de uma passagem de semelhança, mas até uma tosca apanha o texto repetido que mais dano faz. Duas cautelas mantêm honesta a deduplicação. Primeira, conserve a primeira ocorrência e registe onde estavam as cópias; um aviso repetido em dois capítulos pode ser um dispositivo de segurança deliberado, e removê-lo do registo por completo é uma decisão diferente de removê-lo do índice. Segunda, deduplique depois de limpar, não antes: duas páginas que diferem apenas no seu número de página são duplicados de conteúdo embrulhados em mobiliário diferente, e só o texto limpo o revela.
O que retirar e o que conservar
Retire o que se repete sem informar: cabeçalhos e rodapés correntes, números de página, marcas de água, faixas de confidencialidade, linhas geradas de «impresso em», e as migalhas de navegação que uma exportação de web para PDF carimba em cada página. Conserve o que estrutura: os títulos reais, porque são o sinal de limite de fragmento mais forte que tem e muitas vezes pertencem aos metadados do fragmento; as legendas, porque uma legenda de figura é frequentemente o único texto que diz o que a figura mostra; o conteúdo das tabelas, tratado com cuidado, porque uma tabela despojada perde os títulos de linha e coluna que dão sentido aos seus números; e as listas, cujos itens são unidades naturais. O caso limite é o índice de conteúdos. Como fragmentos, as linhas do índice são mobiliário — uma lista de títulos e números de página que corresponde vagamente a cada consulta e não responde a nenhuma —, mas como metadados essa mesma página de índice é um mapa do documento. Retire-a do texto incorporado e conserve-a nas suas notas sobre o corpus.
O mesmo critério aplica-se dentro do próprio limpador de documentos: o mobiliário e os números de página são marcados por defeito porque é quase sempre seguro retirá-los, enquanto os parágrafos duplicados nunca são marcados por defeito porque a repetição às vezes é o objetivo. A honestidade da extração também importa aqui. Um PDF é um formato estruturado — a norma ISO de PDF, ISO 32000, define as páginas como fluxos de conteúdo de operações de desenho e texto, não como texto fluido —, por isso qualquer extrator aproxima a ordem de leitura, e um PDF digitalizado não tem camada de texto até o OCR lhe dar uma. Se os seus documentos de origem importam também por outras razões, o artigo complementar sobre os seus PDF como parte da acessibilidade do seu site cobre a estrutura etiquetada que ajuda tanto os leitores de ecrã como os extratores.
Avaliar a recuperação depois de limpar
Limpar é uma hipótese — a recuperação vai melhorar — e as hipóteses sobre a qualidade da pesquisa podem testar-se com uma maquinaria embaraçosamente pequena. Reúna vinte a cinquenta perguntas reais que os seus utilizadores fazem de verdade, com a passagem que deveria responder a cada uma anotada à mão. Execute-as contra o índice por limpar e o índice limpo com o mesmo recuperador, as mesmas definições de fragmento e o mesmo top-k, e compare duas coisas: com que frequência a passagem certa aparece nos resultados, e quão alto fica quando aparece. Esse par — cobertura e posição — é o marcador. Se a limpeza está a funcionar, os fragmentos de mobiliário deixam de aparecer nos resultados, as passagens certas sobem, e as perguntas que antes falhavam porque um rodapé superava a resposta começam a passar.
Depois leia as falhas, porque os números sozinhos vão lisonjeá-lo. Um índice limpo pode ganhar cobertura enquanto perde uma pergunta cuja resposta vivia de verdade num resumo repetido que deduplicou, ou num cabeçalho que trazia o nome do produto de que cada fragmento precisava. Essas perdas são informação: dizem-lhe para conservar esse elemento como metadados, ou para antepor o título do documento a cada fragmento deliberadamente em vez de o incorporar por acidente duzentas vezes. Volte a executar a avaliação sempre que o corpus, o divisor ou o modelo de incorporação mudar, e mantenha o conjunto de perguntas versionado ao lado do índice. A qualidade de RAG não é uma propriedade do lançamento; é uma propriedade da manutenção, e um pequeno conjunto de testes fixo é o que transforma um «parece melhor» em algo que pode defender.