Agora que você reuniu seus documentos e consultas de teste e realizou uma análise de documentos na fase de preparação, a próxima fase é o agrupamento. Dividir documentos em uma coleção de partes de tamanho correto, cada um contendo conteúdo semanticamente relevante, é um fator essencial para o sucesso de sua implementação da Geração Aumentada de Recuperação (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 irrelevante para a consulta pode levar a alucinações. Você precisa otimizar o processo de passar informações relevantes e remover informações irrelevantes. Você faz essa otimização usando estratégias eficazes de agrupamento e pesquisa para minimizar falsos positivos e falsos negativos e maximizar verdadeiros positivos e verdadeiros negativos.
Passar partes que são muito pequenas e não contêm contexto suficiente para abordar a consulta também leva a resultados ruins. O contexto relevante que existe em vários fragmentos pode não ser capturado. A arte é implementar abordagens de fragmentação eficazes para seus tipos de documentos e suas estruturas de conteúdo específicos. Há várias abordagens a serem consideradas, 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.
Economia da fragmentação
Ao determinar sua estratégia geral de agrupamento, você deve considerar seu orçamento, juntamente com seus requisitos de qualidade e transferência para seu corpus de documentos. Há custos de engenharia para o projeto e a implementação de cada implementação de fragmentação exclusiva e custos de processamento de documentos que diferem, dependendo da abordagem. Se seus documentos tiverem mídia incorporada ou vinculada, você deve considerar a economia do processamento desses elementos. Para agrupamento, esse processamento geralmente usa modelos de linguagem para gerar descrições da mídia, e essas descrições são então partidas. Uma abordagem alternativa com algumas mídias é passá-las como estão para um modelo multimodal no momento da inferência, mas essa abordagem não afetaria a economia de agrupamento.
Esta seção examina a economia de imagens em agrupamento e a solução geral.
Economia de agrupamento de imagens
Há um custo para usar um modelo de linguagem para gerar uma descrição de uma imagem que é então partida. Por exemplo, serviços baseados em nuvem, como o OpenAI do Azure, cobram por transação básica ou em uma base de provisionamento pré-pago. Imagens maiores incorrem em um custo maior. Por meio da análise de documentos, você deve determinar quais imagens são valiosas para agrupar e quais imagens você deve ignorar. A partir daí, você precisa entender o número e os tamanhos das imagens em sua solução e deve pesar o valor de agrupar as descrições de imagem em relação ao custo de gerar essas descrições.
Uma maneira de determinar quais imagens processar é usar um serviço como o Visão de IA do Azure para classificar imagens, marcar imagens ou fazer a detecção de logotipo. Em seguida, você pode usar os resultados e os indicadores de confiança para determinar se a imagem agrega valor contextual significativo e deve ser processada. As chamadas para a Visão de IA do Azure podem ser mais baratas do que as chamadas para modelos de linguagem, portanto, essa abordagem pode levar a economia de custos. Você precisa experimentar para determinar quais níveis de confiança e quais classificações ou tags fornecem os melhores resultados para seus dados. Outra opção é criar seu próprio modelo de classificador. Você precisa levar em conta os custos de criação, hosting e manutenção de seu próprio modelo de classificador.
Outra otimização de custo é o armazenamento em cache usando o padrão cache-aside. Você pode gerar uma chave com base no hash da imagem. Como primeira etapa, você pode verificar se tem um resultado em cache de uma execução anterior ou de um documento processado anteriormente. Se você fizer isso, poderá usar esse resultado. Essa abordagem evita que você tenha os custos de chamar um classificador ou um modelo de linguagem. Se não houver cache, ao chamar o classificador ou o modelo de linguagem, você armazenará o resultado em cache. Chamadas futuras para essa imagem usariam o cache.
Um fluxo de trabalho simples integrando todos esses processos de otimização de custos seria:
- Verifique se o processamento da imagem foi armazenado em cache. Se for o caso, use os resultados armazenados em cache.
- Execute o classificador para determinar se você deve processar a imagem. Armazene em cache o resultado da classificação. Prossiga somente se sua lógica de classificação disser para você fazer isso.
- Gere a descrição para sua imagem. Armazene o resultado em cache.
Economia da solução geral
A seguir estão os fatores a serem considerados ao analisar o custo de sua solução geral:
- Número de implementações de fragmentação exclusivas - Cada implementação exclusiva tem custos de engenharia e de manutenção. Você precisa considerar o número de tipos de documentos exclusivos em seu corpus 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 levar a fragmentações de melhor qualidade, mas têm um custo financeiro e de tempo mais alto para gerar esses fragmentos. Por exemplo, usar um modelo predefinido no IA do Azure para Informação de Documentos provavelmente tem um custo por documento mais alto do que uma implementação de análise de texto puro, mas pode levar a fragmentos 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 agrupamento
Logicamente, durante o agrupamento, você deve primeiro carregar o documento na memória em algum formato. O código de agrupamento opera na representação na memória do documento. Você pode optar por combinar o código de carregamento com o agrupamento em partes ou pode separar o carregamento em sua própria fase. A abordagem escolhida deve ser amplamente baseada em restrições arquitetônicas e suas preferências. Esta seção explora brevemente ambas as opções e, em seguida, fornece algumas recomendações gerais.
Carregamento e agrupamento separados
Há vários motivos pelos quais você pode optar por separar as fases de carregamento e agrupamento. Talvez você queira encapsular a lógica no código de carregamento. Talvez você queira persistir o resultado do código de carregamento antes de agrupar, especialmente ao experimentar várias permutações de agrupamento para economizar tempo ou custo de processamento. Por fim, talvez você queira executar o código de carregamento e agrupamento em processos separados por razões de arquitetura, como bulkheading de processo ou segmentação de segurança envolvendo a remoção de PII.
Encapsular lógica no código de carregamento
Você pode optar por encapsular a lógica de pré-processamento na fase de carregamento. Isso simplifica o código de agrupamento porque ele não precisa fazer nenhum pré-processamento. O pré-processamento pode ser tão simples quanto remover ou anotar partes do documento que você determinou que deseja ignorar na análise de documentos, como marcas d'água, cabeçalhos e rodapés, ou tão complexo quanto reformatar o documento. Veja a seguir alguns exemplos de pré-processamento que você pode optar por encapsular na fase de carregamento:
- Remova ou anote itens que você deseja ignorar.
- Substitua as referências de imagem por descrições de imagem. Durante essa fase, você usa um LLM para gerar uma descrição para a imagem e atualizar o documento com essa descrição. Se você determinou na análise do documento que há texto ao redor que fornece um contexto valioso para a imagem, passe-o, junto com a imagem, para o LLM.
- Baixe ou copie imagens para o armazenamento de arquivos, como o Azure Data Lake, para serem processadas separadamente do texto do documento. Se você determinou na análise do documento que há texto ao redor que fornece um contexto valioso para a imagem, será necessário armazenar esse texto junto com a imagem no armazenamento de arquivos.
- Reformate as tabelas para que sejam processadas com mais facilidade.
Persistência do resultado do código de carregamento
Há vários motivos pelos 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 agrupamento seja executada. Outro motivo é que você pode querer executar uma lógica de agrupamento diferente no mesmo código pré-processado durante o desenvolvimento ou em produção. Persistir o código carregado acelera esse processo.
Execute o carregamento e o agrupamento de código em processos separados
Separar o código de carregamento e agrupamento em processos separados ajuda a habilitar a execução de várias implementações de agrupamento no mesmo código pré-processado. Essa separação também permite que você execute o carregamento e o agrupamento de código em diferentes ambientes de computação e em diferentes hardwares. Além disso, esse design permite escalar independentemente a computação usada para carregamento e agrupamento.
Combinar carregamento e agrupamento
Combinar o código de carregamento e agrupamento é 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 agrupamento. Por exemplo, em vez de substituir URLs de imagem por uma descrição na fase de carregamento, a lógica de agrupamento pode fazer chamadas para o LLM para obter uma descrição de texto e agrupar em partes a descrição.
Quando você tem formatos de documento como HTML que têm tags com referências a imagens, você precisa garantir que o leitor ou analisador que está usando o código de agrupamento não remova as tags. O código de agrupamento precisa ser capaz de identificar referências de imagem.
Recomendações
Veja a seguir algumas recomendações a serem consideradas ao determinar se você combina ou separa sua lógica de agrupamento.
- Comece combinando a lógica de carregamento e agrupamento. Separe-os quando sua solução exigir.
- Evite converter documentos para um formato intermediário se optar por separar os processos. Operações como essa podem ter perdas.
Abordagens de fragmentação
Esta seção fornece uma visão geral de algumas abordagens comuns de fragmentação. Esta lista não pretende ser exaustiva, mas sim mostrar algumas abordagens representativas comuns. 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 estão incluídos para comparação relativa.
Análise baseada em sentenças
Essa abordagem direta divide documentos de texto em fragmentações compostas por frases completas. Os benefícios dessa abordagem incluem que é barata de implementar, tem baixo custo de processamento e pode ser aplicada a qualquer documento baseado em texto escrito em prosa ou frases completas. Um desafio com essa abordagem é que cada fragmento pode não capturar o contexto completo de um pensamento ou significado. Muitas vezes, várias frases devem colocadas juntas para capturar o significado semântico.
Ferramentas: tokenizador de frases SpaCy, divisor de texto recursivo LangChain, tokenizador de frases NLTK
Esforço de engenharia: Baixo
Custo de processamento: Baixo
Casos de uso: documentos não estruturados escritos em prosa ou frases completas, e seu corpus de documentos contém um número proibitivo de diferentes tipos de documentos para criar estratégias individuais de fragmentação para
Exemplos: conteúdo gerado pelo usuário, como feedback aberto de pesquisas, postagens em fóruns, resenhas, mensagens de email, um romance ou um ensaio
Análise de tamanho fixo (com sobreposição)
Essa abordagem divide um documento em fragmentações, com base em um número fixo de caracteres ou tokens e permite alguma sobreposição de caracteres entre fragmentações. Essa abordagem tem muitas das mesmas vantagens e desvantagens que a análise baseada em frases. Uma vantagem dessa abordagem sobre a análise baseada em frases é que é possível obter fragmentações com significado semântico que abrange várias frases.
Você deve escolher o tamanho fixo dos fragmentos e a quantidade de sobreposição. Como os resultados diferem para diferentes tipos de documento, é melhor usar uma ferramenta como o visualizador de blocos HuggingFace para fazer análises exploratórias. Ferramentas como essa permitem que você visualize como seus documentos são fragmentados, de acordo com as suas decisões. É uma prática recomendada usar tokens BERT sobre 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 fragmentos Hugging Face
Esforço de engenharia: Baixo
Custo de processamento: Baixo
Casos de uso: Documentos não estruturados escritos em prosa ou não prosa com frases completas ou incompletas. Seu corpus de documentos contém um número proibitivo de diferentes tipos de documentos para criar estratégias individuais de fragmentação para
Exemplos: conteúdo gerado pelo usuário, como feedback aberto de pesquisas, postagens em fóruns, avaliações, mensagens de email, notas de pesquisa ou listas
Código personalizado
Essa abordagem analisa documentos usando código personalizado para criar fragmentos. Essa abordagem é mais bem-sucedida para documentos baseados em texto em que a estrutura é conhecida ou pode ser inferida e um alto grau de controle sobre a criação de fragmentos será necessário. Você pode usar técnicas de análise de texto, como expressões regulares, para criar fragmentos com base em padrões dentro da estrutura do documento. O objetivo é criar fragmentos que tenham tamanho semelhante e fragmentos que tenham conteúdo distinto. Muitas linguagens de programação fornecem suporte para expressões regulares, e algumas têm bibliotecas ou pacotes que oferecem 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 semiestruturados em que a estrutura pode ser inferida
Exemplos: registros de patentes, artigos de pesquisa, apólices de seguro, scripts e roteiros
Aumento do modelo de linguagem
Modelos de linguagem podem ser usados para criar partes. Casos de uso comuns são 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 fragmentos. O aumento do modelo de linguagem é usado com outras abordagens de agrupamento, como código personalizado.
Se você determinou na parte de imagens da seção de análise do documento que o texto antes ou depois da imagem é necessário para responder a algumas perguntas, você precisa passar esse contexto adicional para o modelo de linguagem. É importante experimentar para determinar se esse contexto adicional melhora ou não o desempenho da sua solução.
Se sua lógica de agrupamento dividir a descrição da imagem em várias partes, certifique-se de incluir o URL da imagem em cada parte. Incluir a URL da imagem em cada parte garante que os metadados sejam retornados para todas as consultas que a imagem atende, especialmente para cenários em que o usuário final requer a capacidade de acessar a imagem de origem por meio dessa URL ou deseja usar imagens brutas durante o tempo de inferência.
Ferramentas: Azure OpenAI, OpenAI
Esforço de engenharia: Médio
Custo de processamento: Alto
Casos de uso: imagens, tabelas
Exemplos: gerar representações de texto de tabelas e imagens, resumir transcrições de reuniões, discursos, entrevistas ou podcasts
Análise de layout do documento
As bibliotecas e os serviços de análise de layout de documentos combinam recursos de reconhecimento óptico de caracteres (OCR) com modelos de aprendizado profundo para extrair a estrutura de documentos e de texto. Os elementos estruturais podem incluir cabeçalhos, rodapés, títulos, títulos de seções, tabelas e figuras. O objetivo é dar melhor significado semântico ao conteúdo contido nos documentos.
As bibliotecas e os serviços de análise de layout de documento expõem um modelo que representa o conteúdo, estrutural e de texto, do documento. Você ainda precisa escrever código que interaja com o modelo.
Observação
O IA do Azure para Informação de Documentos é um serviço baseado em nuvem que requer que você carregue seu documento no serviço. Você precisa garantir que seus regulamentos de segurança e de conformidade permitam que você carregue documentos em serviços como este.
Ferramentas: modelos de análise do IA do Azure para Informação de Documentos, Donut, Layout Parser
Esforço de engenharia: Médio
Custo de processamento:: Médio
Casos de uso: documentos semiestruturados
Exemplos: artigos de notícias, páginas da Web, currículos
Modelo predefinido
Há serviços, como o IA do Azure para Informação de Documentos, que oferecem modelos predefinidos que você pode aproveitar para vários tipos de documento. Alguns modelos são treinados para tipos de documentos específicos, como o formulário W-2 de impostos dos EUA, enquanto outros visam um gênero mais amplo de tipos de documento, como uma fatura.
Ferramentas: modelos predefinidos do IA do Azure para Informação de Documentos, Processamento inteligente de documentos Power Automate, LayoutLMv3
Esforço de engenharia: Baixo
Custo do processamento: Médio/Alto
Casos de uso: documentos estruturados em que existe um modelo predefinido
Exemplos específicos: faturas, recibos, cartão de seguro de saúde, formulário W-2
Modelo personalizado
Para documentos altamente estruturados em que não existe um modelo predefinido, talvez seja necessário criar um modelo personalizado. Essa abordagem pode ser eficaz para imagens ou documentos altamente estruturados, dificultando o uso de técnicas de análise de texto.
Ferramentas: modelos personalizados de IA do Azure para Informação de Documentos,Tesseract
Esforço de engenharia: alto
Custo do processamento: Médio/Alto
Casos de uso: documentos estruturados em que um modelo predefinido não existe
Exemplos: cronogramas de reparo e manutenção automotiva, históricos acadêmicos e registros, manuais técnicos, procedimentos operacionais, diretrizes de manutenção
Estrutura do documento
Os documentos variam na quantidade de estrutura que têm. Alguns documentos, como formulários do governo, têm uma estrutura complexa e bem conhecida, como um documento fiscal 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 haja regras rígidas e rápidas, esta seção fornece algumas diretrizes a serem seguidas.
Diagrama mostrando abordagens de fragmentação por estrutura do documento.
Figura 1. A abordagem de fragmentação se ajusta à estrutura do documento
Documentos estruturados
Documentos estruturados, às vezes chamados de documentos de formato fixo, têm layouts definidos. Os dados nesses documentos estão localizados em locais fixos. Por exemplo, a data, ou o sobrenome do cliente, é encontrado no mesmo local em todos os documentos do mesmo formato fixo. Exemplos de documentos de formato fixo são o documento fiscal W-2 dos EUA.
Documentos de formato fixo podem ser imagens digitalizadas de documentos originais que foram preenchidos à mão ou têm estruturas de layout complexas, dificultando o processamento com uma abordagem básica de análise de texto. Uma abordagem comum para processar estruturas de documentos complexas é usar modelos de aprendizado de máquina para extrair dados e aplicar significado semântico a esses dados, sempre que possível.
Exemplos: formulário W-2, cartão de seguro
Abordagens comuns: modelos predefinidos, modelos personalizados
Documentos semiestruturados
Documentos semiestruturados não têm um formato nem esquema fixo, como o formulário W-2, mas oferecem consistência em relação ao formato ou esquema. Por exemplo, todas as faturas não são dispostas da mesma forma, mas, no entanto, em geral, elas têm um esquema consistente. Você pode esperar que uma fatura tenha uma invoice number
e alguma forma de bill to
e ship to
nome e endereço, 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 body
, title
, H1
e p
que podem ser usados para adicionar significado semântico ao texto ao redor.
Assim como os documentos estruturados, os documentos semiestruturados com estruturas de layout complexas são difíceis de processar com a análise de texto. Para esses tipos de documento, os modelos de aprendizado de máquina são uma boa abordagem. Existem modelos predefinidos para determinados domínios que têm esquemas consistentes, como faturas, contratos ou seguro de saúde. Considere a criação de modelos personalizados para estruturas complexas nas quais não existe um modelo predefinido.
Exemplos: faturas, recibos, páginas da Web, arquivos de markdown
Abordagens comuns:: modelos de análise de documentos
Estrutura inferida
Alguns documentos têm uma estrutura, mas não são escritos em marcação. Para esses documentos, a estrutura deve ser inferida. Um bom exemplo é o seguinte documento de regulamentação da UE.
Diagrama mostrando um regulamento da UE como exemplo de um documento com estrutura inferida.
Figura 2. Regulamentação da UE que mostra uma 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 esse pode não justificar 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 o seu corpus for 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 o regulamento da UE no exemplo, o código personalizado pode ter um maior custo-benefício.
Exemplos: documentos legais, scripts, especificações de fabricação
Abordagens comuns: código personalizado, modelos personalizados
Documentos não estruturados
Uma boa abordagem para documentos com pouca ou nenhuma estrutura é baseada em frases ou de tamanho fixo com abordagens de sobreposiçã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 ou de pesquisa
Abordagens comuns: baseadas em frases ou em limites com sobreposição
Experimentação
Embora os melhores ajustes para cada uma das abordagens de agrupamento estejam listados, 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, levando em conta o número de recursos que você tem, a habilidade técnica de seus recursos e o volume de documentos que você precisa processar. Para chegar a uma estratégia de fragmentação ideal, você precisa observar as vantagens e as compensações de cada uma das abordagens testadas para garantir que está escolhendo a abordagem apropriada para seu caso de uso.