Partilhar via


Fase de fragmentação RAG

Depois de reunir os seus documentos de teste e consultas e executar uma análise de documentos durante a fase de preparação, a próxima fase é a segmentação. Dividir os documentos em partes de tamanho apropriado que contêm conteúdo semanticamente relevante é crucial para o sucesso da implementação do Retrieval-Augmented Generation (RAG). Passar documentos inteiros ou pedaços superdimensionados é caro, pode sobrecarregar os limites de token do modelo e não produz os melhores resultados. Passar informações para um modelo de linguagem que é irrelevante para a consulta pode resultar em respostas imprecisas ou não relacionadas. Você precisa otimizar o processo de passar informações relevantes e remover informações irrelevantes usando estratégias eficazes de fragmentação e pesquisa. Essa abordagem minimiza falsos positivos e falsos negativos, e maximiza os verdadeiros positivos e os verdadeiros negativos.

Chunks que são demasiado pequenos e não contêm contexto suficiente para abordar a consulta podem levar a maus resultados. O contexto relevante que existe em várias partes pode não ser capturado. A chave é implementar abordagens de fragmentação eficazes para seus tipos de documentos específicos e suas estruturas e conteúdo específicos. Há várias abordagens de fragmentação a considerar, cada uma com suas próprias implicações de custo e eficácia, dependendo do tipo e da estrutura do documento ao qual são aplicadas.

Este artigo descreve várias abordagens de fragmentação e examina como a estrutura de seus documentos pode influenciar a abordagem de fragmentação escolhida.

Este artigo faz parte de uma série. Leia a introdução antes de continuar.

Economia fragmentada

Ao determinar a sua estratégia geral de fragmentação, deve-se considerar o seu orçamento e os seus requisitos de qualidade e taxa de processamento para a coleção de documentos. Há custos de engenharia para o projeto e implementação de cada implementação de fragmentação exclusiva e custos de processamento por documento que diferem dependendo da abordagem. Se seus documentos tiverem mídia incorporada ou vinculada, você deve considerar a economia do processamento desses elementos. Para fragmentação, esse processamento geralmente usa modelos de linguagem para gerar descrições da mídia. Essas descrições são então fragmentadas. Uma abordagem alternativa para alguns meios é passá-los tal como estão para um modelo multimodal na fase de inferência. No entanto, essa abordagem não afeta a economia fragmentada.

As seções a seguir examinam a economia da fragmentação de imagens e a solução geral.

Economia de fragmentação de imagens

Há um custo para usar um modelo de linguagem para gerar uma descrição de uma imagem que você fragmenta. Por exemplo, serviços baseados em nuvem, como o Serviço Azure OpenAI, cobram por transação ou em uma base de provisionamento pré-pago. Imagens maiores incorrem em um custo maior. Através da sua análise de documentos, você deve determinar quais imagens são valiosas para fragmentar e quais imagens você deve ignorar. A partir daí, você precisa entender o número e os tamanhos das imagens em sua solução. Em seguida, você deve pesar o valor de dividir as descrições de imagem em relação ao custo para gerar essas descrições.

Uma maneira de determinar quais imagens processar é usar um serviço como Azure AI Vision para classificar imagens, marcar imagens ou fazer a deteção de logotipo. Você pode usar os resultados e indicadores de confiança para determinar se a imagem adiciona valor significativo e contextual e deve ser processada. As chamadas para Visão podem ser menos dispendiosas do que as chamadas para modelos linguísticos, pelo que esta abordagem pode resultar em poupanças de custos. Experimente para determinar quais níveis de confiança e quais classificações ou tags fornecem os melhores resultados para seus dados. Outra opção é construir o seu próprio modelo de classificador. Se você adotar essa abordagem, certifique-se de considerar os custos para criar, hospedar e manter seu próprio modelo.

Outra estratégia de otimização de custos é armazenar em cache usando o padrão Cache-Aside. Você pode gerar uma chave baseada no hash da imagem. Como primeira etapa, verifique se você tem um resultado armazenado em cache de uma execução anterior ou de um documento processado anteriormente. Se o fizer, poderá utilizar esse resultado. Essa abordagem elimina os custos de chamar um classificador ou um modelo de linguagem. Se não houver cache, quando você chamar o classificador ou o modelo de idioma, armazenará o resultado em cache. Futuras chamadas para esta imagem irão usar a cache.

O fluxo de trabalho simples a seguir integra todos esses processos de otimização de custos:

  1. Verifique se o processamento da imagem está armazenado em cache. Em caso afirmativo, use os resultados armazenados em cache.

  2. Execute o classificador para determinar se você deve processar a imagem. Armazene em cache o resultado da classificação. Se a sua lógica de classificação determinar que a imagem acrescenta valor, avance para o passo seguinte.

  3. Gere a descrição da sua imagem. Armazene o resultado em cache.

Economia da solução global

Considere os seguintes fatores ao avaliar o custo da sua solução geral:

  • Número de implementações de fragmentação exclusivas: Cada implementação exclusiva tem custos de engenharia e manutenção. Certifique-se de considerar o número de tipos de documentos exclusivos em sua coleção e as compensações de custo versus qualidade de implementações exclusivas para cada um.

  • Custo por documento de cada implementação: Algumas abordagens de fragmentação podem resultar em partes de melhor qualidade, mas têm um custo financeiro e temporal mais alto para gerar essas partes. Por exemplo, usar um modelo pré-criado no Azure AI Document Intelligence provavelmente tem um custo por documento mais alto do que uma implementação de análise de texto puro, mas pode resultar em partes melhores.

  • Número de documentos iniciais: O número de documentos iniciais que você precisa processar para iniciar sua solução.

  • Número de documentos incrementais: O número e a taxa de novos documentos que você deve processar para a manutenção contínua do sistema.

Carregamento e fragmentação

Durante a fragmentação, você deve primeiro carregar o documento na memória em algum formato. Em seguida, o código de fragmentação opera sobre a representação do documento na memória. Você pode combinar o código de carregamento com a fragmentação ou pode separar o carregamento numa fase própria. A abordagem que você escolhe deve ser baseada principalmente em restrições arquitetônicas e suas preferências. As seções a seguir exploram brevemente ambas as opções e fornecem recomendações gerais.

Carregamento e fragmentação separados

Há várias razões pelas quais você pode optar por separar as fases de carregamento e fragmentação. Talvez você queira encapsular a lógica no código de carregamento. Você pode querer persistir o resultado do código de carregamento antes de fragmentar, especialmente quando você experimenta várias permutações de fragmentação para economizar tempo ou custo de processamento. Por fim, pode querer executar o código de carregamento e fragmentação em processos separados por motivos de arquitetura, como compartimentação de processos ou segmentação de segurança, o que envolve a remoção de dados pessoais.

Encapsular a lógica no código de carregamento

Você pode optar por encapsular a lógica de pré-processamento na fase de carregamento. Essa abordagem simplifica o código de fragmentação porque não requer nenhum pré-processamento. O pré-processamento pode ser tão simples quanto remover ou anotar partes do documento que você deseja ignorar na análise do documento, como marcas d'água, cabeçalhos e rodapés, para tarefas mais complexas, como reformatar o documento. Por exemplo, você pode incluir as seguintes tarefas de pré-processamento na fase de carregamento:

  • Remova ou anote itens que você deseja ignorar.

  • Substitua referências de imagem por descrições de imagens. Durante essa fase, você usa um modelo de linguagem grande para gerar uma descrição para a imagem e atualizar o documento com essa descrição. Se você determinar na fase de análise do documento que há texto ao redor que fornece contexto valioso para a imagem, passe esse texto, juntamente com a imagem, para o modelo de linguagem grande.

  • Transfira ou copie imagens para o armazenamento de ficheiros, como o Armazenamento Azure Data Lake, para serem processadas separadamente do texto do documento. Se você determinar na análise do documento que há texto ao redor que fornece contexto valioso para a imagem, armazene esse texto junto com a imagem no armazenamento de arquivos.

  • Reformate as tabelas para que sejam processadas mais facilmente.

Manter o resultado do código de carregamento

Há várias razões pelas quais você pode optar por persistir o resultado do código de carregamento. Um motivo é se você quiser a capacidade de inspecionar os documentos depois que eles forem carregados e pré-processados, mas antes que a lógica de fragmentação seja executada. Outra razão é que você pode querer executar uma lógica de fragmentação diferente no mesmo código pré-processado enquanto ele está em desenvolvimento ou em produção. A persistência do código carregado acelera esse processo.

Execute o carregamento e fragmentação de código em processos separados

Separe o código de carregamento e fragmentação em processos separados para ajudar a executar várias implementações de fragmentação em relação ao mesmo código pré-processado. Esta separação também lhe permite executar o carregamento e o código de fragmentação em diferentes ambientes de computação e em diferentes hardware. Você pode usar esse design para dimensionar de forma independente a computação usada para carregar e fragmentar.

Combine carregamento e divisão em partes

Combinar o código de carregamento e fragmentação é uma implementação mais simples na maioria dos casos. Muitas das operações que você pode considerar fazer no pré-processamento em uma fase de carregamento separada podem ser realizadas na fase de fragmentação. Por exemplo, em vez de substituir URLs de imagem por uma descrição na fase de carregamento, a lógica de fragmentação pode fazer chamadas para o modelo de linguagem grande para obter uma descrição de texto e fragmentar a descrição.

Quando você tiver formatos de documento como HTML com tags com referências a imagens, certifique-se de que o leitor ou analisador que o código de fragmentação está usando não remova as tags. O código de fragmentação precisa ser capaz de identificar referências de imagem.

Recomendações

Considere as seguintes recomendações ao determinar se deve combinar ou separar sua lógica de fragmentação.

  • Comece combinando a lógica de carregamento e fragmentação. Separe-os quando a sua solução o exigir.

  • Evite converter documentos para um formato intermediário se optar por separar os processos. Este tipo de operação pode resultar em perda de dados.

Abordagens de segmentação

Esta seção fornece uma visão geral das abordagens comuns de fragmentação. Você pode usar várias abordagens na implementação, como combinar o uso de um modelo de linguagem para obter uma representação de texto de uma imagem com muitas das abordagens listadas.

Cada abordagem é acompanhada por uma matriz de tomada de decisão resumida que destaca as ferramentas, os custos associados e muito mais. O esforço de engenharia e os custos de processamento são subjetivos e são incluídos para comparação relativa.

Análise baseada em frases

Essa abordagem direta divide os documentos de texto em partes compostas por frases completas. As vantagens dessa abordagem incluem seu baixo custo de implementação, baixo custo de processamento e sua aplicabilidade a qualquer documento baseado em texto escrito em prosa ou frases completas. Uma desvantagem dessa abordagem é que cada pedaço pode não capturar o contexto completo de uma ideia ou significado. Muitas vezes, várias frases devem ser tomadas juntas para capturar o significado semântico.

Ferramentas : tokenizador de sentença spaCy, divisor de texto recursivo LangChain , tokenizador de sentença NLTK
Esforço de engenharia: Baixo
Custo de processamento: Baixo
Casos de uso: Documentos não estruturados escritos em prosa ou frases completas, e sua coleção de documentos contém um número proibitivo de diferentes tipos de documentos que exigem estratégias individuais de fragmentação
Exemplos: Conteúdo gerado pelo usuário, como feedback aberto de pesquisas, postagens em fóruns, avaliações, mensagens de e-mail, um romance ou um ensaio

Análise de tamanho fixo, com sobreposição

Essa abordagem divide um documento em partes com base em um número fixo de caracteres ou tokens e permite alguma sobreposição de caracteres entre partes. Esta abordagem tem muitas das mesmas vantagens e desvantagens que a análise baseada em frases. Uma vantagem dessa abordagem em relação à análise baseada em frases é a capacidade de obter partes com significados semânticos que abrangem várias frases.

Você deve escolher o tamanho fixo das partes e a quantidade de sobreposição. Como os resultados variam para diferentes tipos de documentos, é melhor usar uma ferramenta como o visualizador de pedaços Hugging Face para fazer análises exploratórias. Você pode usar ferramentas como esta para visualizar como seus documentos são fragmentados com base em suas decisões. Você deve usar tokens BERT em vez de contagens de caracteres ao usar a análise de tamanho fixo. Os tokens BERT são baseados em unidades significativas de linguagem, portanto, preservam mais informações semânticas do que contagens de caracteres.

Ferramentas: divisor de texto recursivo LangChain, visualizador de pedaços Hugging Face
Esforço de engenharia: Baixo
Custo de processamento: Baixo
Casos de uso: Documentos não estruturados escritos em prosa ou em formato não literário, com frases completas ou incompletas. Sua coleção de documentos contém um número proibitivo de diferentes tipos de documentos que exigem estratégias individuais de fragmentação
Exemplos: Conteúdo gerado pelo usuário, como feedback aberto de pesquisas, postagens em fóruns, avaliações, mensagens de e-mail, notas pessoais, notas de pesquisa, listas

Código personalizado

Essa abordagem analisa documentos usando código personalizado para criar blocos. Essa abordagem é mais bem-sucedida para documentos baseados em texto onde a estrutura é conhecida ou pode ser inferida e um alto grau de controle sobre a criação de blocos é necessário. Você pode usar técnicas de análise de texto, como expressões regulares, para criar blocos com base em padrões dentro da estrutura do documento. O objetivo é criar blocos que tenham tamanho semelhante em comprimento e blocos que tenham conteúdo distinto. Muitas linguagens de programação fornecem suporte para expressões regulares, e algumas têm bibliotecas ou pacotes que fornecem recursos de manipulação de cadeia de caracteres mais elegantes.

Ferramentas :Python (re, regex, BeautifulSoup, lxml, html5lib, marko), R (stringr, xml2), Julia (Gumbo.jl)
Esforço de engenharia: médio
Custo de processamento: Baixo
Casos de uso: Documentos semi-estruturados onde a estrutura pode ser inferida
Exemplos: Pedidos de patentes, documentos de pesquisa, apólices de seguro e roteiros

Reforço do modelo de linguagem

Você pode usar modelos de linguagem para criar blocos. Por exemplo, você pode usar um modelo de linguagem grande, como GPT-4, para gerar representações textuais de imagens ou resumos de tabelas que podem ser usadas como partes. O aumento do modelo de linguagem é usado com outras abordagens de fragmentação, como código personalizado.

Se a análise do documento determinar que o texto antes ou depois da imagem ajuda a responder a algumas perguntas de requisitos, passe esse contexto extra para o modelo de linguagem. É importante experimentar para determinar se esse contexto extra melhora o desempenho da sua solução.

Se a lógica de fragmentação dividir a descrição da imagem em vários blocos, certifique-se de incluir o URL da imagem em cada bloco. Inclua o URL da imagem em cada parte para garantir que os metadados sejam retornados para todas as consultas atendidas pela imagem. Esta etapa é crucial para cenários em que o usuário final precisa acessar a imagem de origem por meio dessa URL ou usar imagens brutas durante o tempo de inferência.

Ferramentas :Azure OpenAIOpenAI
Esforço de engenharia: médio
Custo de processamento: Alto
Casos de uso: Imagens, tabelas
Exemplos: Gerar representações textuais de tabelas e imagens, resumir transcrições de reuniões, discursos, entrevistas ou podcasts

Análise de layout de documentos

As bibliotecas e serviços de análise de layout de documentos combinam recursos de reconhecimento ótico de caracteres com modelos de aprendizagem profunda para extrair a estrutura e o texto dos documentos. Os elementos estruturais podem incluir cabeçalhos, rodapés, títulos, cabeçalhos de seção, tabelas e figuras. O objetivo é fornecer um melhor significado semântico ao conteúdo contido nos documentos.

As bibliotecas e serviços de análise de layout de documento expõem um modelo que representa o conteúdo estrutural e textual do documento. Você ainda precisa escrever um código que interaja com o modelo.

Observação

O Document Intelligence é um serviço baseado na nuvem que exige que carregue o seu documento. Você precisa garantir que seus regulamentos de segurança e conformidade permitam que você carregue documentos para esses serviços.

Ferramentas :modelos de análise de documentos de inteligência documental, Donut, Layout Parser
Esforço de engenharia: médio
Custo de processamento: Médio
Casos de uso: Documentos semi-estruturados
Exemplos: Artigos de notícias, páginas web, currículos

Modelo pré-construído

Serviços como o Document Intelligence fornecem modelos pré-construídos que você pode aproveitar para vários tipos de documentos. Alguns modelos são treinados para tipos de documentos específicos, como o formulário de imposto W-2 dos EUA, enquanto outros visam um gênero mais amplo de tipos de documentos, como faturas.

Ferramentas :modelos pré-construídos de inteligência documental, Power Automate processamento inteligente de documentos, LayoutLMv3
Esforço de engenharia: Baixo
Custo de processamento: Médio/Alto
Casos de uso: Documentos estruturados onde existe um modelo pré-construído
Exemplos específicos: Faturas, recibos, cartões de seguro de saúde, formulários W-2

Modelo personalizado

Para documentos altamente estruturados onde não existe um modelo pré-construído, talvez seja necessário criar um modelo personalizado. Essa abordagem pode ser eficaz para imagens ou documentos altamente estruturados, o que dificulta o uso de técnicas de análise de texto.

Ferramentas :modelos personalizados de Inteligência DocumentalTesseract
Esforço de engenharia: Alto
Custo de processamento: Médio/Alto
Casos de uso: Documentos estruturados onde um modelo pré-construído não existe
Exemplos: Cronogramas de reparo e manutenção automotiva, histórico escolar, registros, manuais técnicos, procedimentos operacionais, diretrizes de manutenção

Estrutura do documento

Os documentos variam na quantidade de estrutura que possuem. Alguns documentos, como formulários governamentais, têm uma estrutura complexa e bem conhecida, como um formulário de imposto W-2 dos EUA. No outro extremo do espectro estão documentos não estruturados, como notas de forma livre. O grau de estrutura de um tipo de documento é um bom ponto de partida para determinar uma abordagem de fragmentação eficaz. Embora não existam regras específicas, esta secção fornece-lhe algumas orientações a seguir.

Diagrama que mostra abordagens de fragmentação por estrutura do documento.

Documentos estruturados

Os documentos estruturados, por vezes referidos como documentos de formato fixo, têm esquemas definidos. Os dados nestes documentos estão localizados em locais fixos. Por exemplo, a data, ou o nome da família do cliente, é encontrado no mesmo local em todos os documentos do mesmo formato fixo. Um exemplo de um documento de formato fixo é o documento fiscal W-2 dos EUA.

Os documentos de formato fixo podem ser imagens digitalizadas de documentos originais que foram preenchidos à mão ou têm estruturas de layout complexas. Esse formato dificulta o processamento usando uma abordagem básica de análise de texto. Uma abordagem típica para processar estruturas de documentos complexas é usar modelos de aprendizado de máquina para extrair dados e aplicar significado semântico a esses dados, quando possível.

Exemplos: formulário W-2, cartão de seguro
Abordagens típicas: Modelos pré-construídos, modelos personalizados

Documentos semi-estruturados

Os documentos semiestruturados não têm um formato ou esquema fixo, como o formulário W-2, mas fornecem consistência em relação ao formato ou esquema. Por exemplo, nem todas as faturas são apresentadas da mesma forma. No entanto, eles geralmente têm um esquema consistente. Pode esperar que uma fatura tenha um número de fatura e alguma forma de nome e endereço de cobrança e de envio, entre outros dados. Uma página da Web pode não ter consistências de esquema, mas tem elementos estruturais ou de layout semelhantes, como corpo, título, H1e p, que podem adicionar significado semântico ao texto ao redor.

Assim como os documentos estruturados, os documentos semiestruturados que têm estruturas de layout complexas são difíceis de processar usando a análise de texto. Para esses tipos de documentos, os modelos de aprendizado de máquina são uma boa abordagem. Existem modelos pré-construídos para determinados domínios que têm esquemas consistentes, como faturas, contratos ou documentos de seguro de saúde. Considere a criação de modelos personalizados para estruturas complexas onde não existe um modelo pré-construído.

Exemplos: Faturas, recibos, páginas web, ficheiros markdown
Abordagens típicas: Modelos de análise de documentos

Estrutura inferida

Alguns documentos têm uma estrutura, mas não são escritos em marcação. Para estes documentos, a estrutura deve ser inferida. Um bom exemplo é o seguinte documento de regulamentação da UE.

Diagrama que mostra um regulamento da UE como exemplo de documento com estrutura inferida.

Como você pode entender claramente a estrutura do documento e não há modelos conhecidos para ele, você pode determinar que pode escrever código personalizado. Um formato de documento como este pode não garantir o esforço para criar um modelo personalizado, dependendo do número de documentos diferentes desse tipo com os quais você está trabalhando. Por exemplo, se a sua coleção contiver todos os regulamentos da UE ou leis estaduais dos EUA, um modelo personalizado pode ser uma boa abordagem. Se você estiver trabalhando com um único documento, como a regulamentação da UE no exemplo, o código personalizado pode ser mais econômico.

Exemplos: documentos de lei, scripts, especificações de fabricação
Abordagens típicas: Código personalizado, modelos personalizados

Documentos não estruturados

Uma boa abordagem para documentos que têm pouca ou nenhuma estrutura são baseados em frases ou tamanho fixo com abordagens sobrepostas.

Exemplos: Conteúdo gerado pelo usuário, como feedback aberto de pesquisas, postagens em fóruns, avaliações, mensagens de e-mail, notas pessoais, notas de pesquisa
Abordagens típicas: Baseadas em frases ou em limites com sobreposição

Experimentação

Este artigo descreve as abordagens de fragmentação mais adequadas para cada tipo de documento, mas, na prática, qualquer uma das abordagens pode ser apropriada para qualquer tipo de documento. Por exemplo, a análise baseada em frases pode ser apropriada para documentos altamente estruturados ou um modelo personalizado pode ser apropriado para documentos não estruturados. Parte da otimização de sua solução RAG é experimentar várias abordagens de fragmentação. Considere o número de recursos que você tem, a habilidade técnica de seus recursos e o volume de documentos que você tem que processar. Para alcançar uma estratégia de fragmentação ideal, observe as vantagens e compensações de cada abordagem que você testa para garantir que você escolha a abordagem apropriada para seu caso de uso.

Próximo passo