Explore mais sobre o que o RAG Cookbook tem a oferecer para obter um insight mais aprofundado das soluções RAG atuais

Um leadspace recolorido usando o leadspace do Watson para atenção ao cliente como base.
Visão geral

No âmbito do rastreamento da web e da indexação de documentos, metodologias eficazes de fragmentação são cruciais para otimizar o desempenho e a relevância da pesquisa. Ao lidar com páginas da web em HTML ou PDFs, a estratégia empregada pode afetar significativamente a eficiência e a precisão da sua aplicação de pesquisa. Aqui está um guia abrangente de metodologias de fragmentação eficazes para diferentes circunstâncias, particularmente no contexto do uso do Elasticsearch como um armazenamento de vetores. 

 

Segmentação de documentos

As páginas da web variam muito em tamanho e estrutura. Para um processamento eficiente:

  • HTML Parsing: divide páginas HTML em partes gerenciáveis com base em tags HTML (por exemplo, <p> para parágrafos, <div> para seções).
  • Extração de conteúdo: o foco é extrair conteúdo relevante, como texto principal, títulos e dados estruturados.
Estratégia de fragmentação
  • Por URL: trate cada URL como um documento separado. Esse método é simples e útil para sites em que cada página é relativamente pequena e autônoma.
  • Por seções da página: segmente documentos por seções significativas (por exemplo, artigos, post de blog). Essa abordagem é benéfica para conteúdo longo e sites com tipos de conteúdo diversos.
  • Extensão do conteúdo: evite blocos muito grandes; busque um equilíbrio entre a granularidade necessária para a relevância da busca e o desempenho. Fragmentos menores podem melhorar a precisão da pesquisa, mas podem aumentar a sobrecarga de processamento.
Pipeline de processamento
  • Utilize bibliotecas como Beautiful Soup ou Scrapy para extrair dados da web.
  • Normalize o texto removendo tags HTML e corrigindo problemas de codificação.
  • Aplique analisadores específicos do idioma (por exemplo: stemming, stop words) para melhorar a precisão da pesquisa.
Desafios com códigos HTML mais antigos

Quando o rastreamento da web envolve código HTML mais antigo, isso pode afetar significativamente a qualidade dos fragmentos extraídos para indexação no Elasticsearch. Veja a seguir alguns dos principais desafios e estratégias de mitigação:

Inconsistências estruturais

Tags e atributos fora do padrão:

  • O código HTML mais antigo pode usar tags ou atributos fora do padrão que os analisadores modernos talvez não manipulem corretamente ou não compreendam totalmente.
  • Isso pode levar à extração incompleta ou incorreta de fragmentos de conteúdo, especialmente se o rastreador depender de bibliotecas de análise HTML padrão.

Elementos aninhados e obsoletos:

  • O HTML antigo geralmente inclui elementos aninhados ou tags obsoletas, como <font>, <center> ou <strike>, que podem não ser analisados corretamente pelos analisadores HTML modernos.
  • Como resultado, a segmentação de conteúdo com base nesses elementos pode produzir partes fragmentadas ou estruturadas incorretamente.

Qualidade e relevância do conteúdo

Estilo e formatação inline:

  • O HTML mais antigo pode depender muito do estilo e das tags de formatação inline (<font>, <b>, <i> etc.), que podem sobrecarregar o texto extraído e reduzir a qualidade dos fragmentos indexados.
  • A qualidade da pesquisa pode sofrer à medida que o Elasticsearch analisa e indexa esses fragmentos, possivelmente afetando a relevância nos resultados da pesquisa.

Estrutura de documento inconsistente:

  • A falta de estrutura padronizada de documentos em páginas HTML antigas pode levar a tamanhos de blocos e segmentos de conteúdo inconsistentes.
  • Essa inconsistência torna desafiador estabelecer limites claros entre seções de conteúdo significativas, afetando a granularidade dos fragmentos e a relevância da busca.

Desafios técnicos

Problemas de codificação e caracteres:

  • Páginas HTML mais antigas podem ter problemas de codificação, como conjuntos de caracteres ou entidades incorretos (&nbsp;, &lt;), que requerem tratamento adequado durante a extração de texto.
  • O tratamento incorreto desses elementos pode resultar em texto ilegível ou representação incorreta do conteúdo em blocos indexados.

Script e conteúdo dinâmico:

  • Elementos dinâmicos e scripts incorporados em páginas HTML mais antigas (por exemplo, JavaScript, Flash) podem não ser processados de forma eficaz por mecanismos de busca básicos.
  • Isso pode levar à extração incompleta de conteúdo ou à omissão de texto gerado dinamicamente, afetando a abrangência de fragmentos indexados.

Estratégias de mitigação

Para mitigar o impacto do código HTML antigo na qualidade dos fragmentos durante a indexação do Elasticsearch na web, considere as seguintes estratégias:

  • Use bibliotecas de análise robustas: empregue bibliotecas de análise de HTML avançadas que possam lidar com várias versões de HTML e elementos fora do padrão.
  • Normalizar o texto: pré-processe o texto extraído para normalizar a formatação e remover tags ou atributos desnecessários.
  • Limpar o conteúdo: filtre elementos irrelevantes ou obsoletos durante o processo de extração para melhorar a qualidade dos fragmentos indexados.
  • Adapte a lógica de extração: desenvolva uma lógica personalizada para lidar com peculiaridades específicas de páginas HTML mais antigas, garantindo uma segmentação mais precisa em fragmentos de conteúdo significativos.
  • Atualizações regulares: mantenha a lógica do rastreador e a análise de bibliotecas para se adaptar às mudanças nos padrões da web e nas práticas de HTML ao longo do tempo.

Ao lidar com esses desafios de forma proativa, você pode aprimorar a qualidade dos fragmentos de conteúdo extraídos de páginas HTML mais antigas, melhorando assim a eficácia geral e a relevância das aplicações de pesquisa baseadas no Elasticsearch.

Indexação de PDFs

Extração de conteúdo PDF

  • Extraia texto de PDFs considerando elementos como títulos, parágrafos e tabelas.
  • Trate os metadados (título, autor, data) separadamente para indexação.

Estratégia de fragmentação

  • Por documento: trate cada arquivo PDF como um documento individual para fins de indexação.
  • Por página: como alternativa, divida os PDFs em partes com base em páginas ou seções lógicas, se necessário.
  • Blocos de texto: segmente grandes blocos em unidades menores com base em quebras naturais no conteúdo (por exemplo: parágrafos).

Desafios, fatos e mitos da extração de texto

  • Fato: os PDFs podem conter imagens ou documentos digitalizados, o que exige OCR (Optical Character Recognition) para extração de texto. O Watsonx Discovery tem OCR; então, isso não deve ser um problema.
  • Lide com problemas de codificação e formatação de texto exclusivos dos PDFs (por exemplo, hifenização, quebras de linha).

Pipeline de indexação

  • Normalize o texto extraído, removendo caracteres especiais e tratando a hifenização.
  • Aplique analisadores específicos de idioma ao texto processado para aprimorar os recursos de pesquisa.
Considerações

Considerações Gerais

  • Desempenho: equilibra o tamanho dos fragmentos para obter um desempenho eficiente de indexação e consulta.
  • Relevância: garantes que os fragmentos capturem segmentos de conteúdo significativos para resultados de pesquisa precisos.
  • Sobrecarga de indexação: considera a sobrecarga de indexar grandes volumes de dados; otimizar as configurações de indexação e a alocação de fragmentos no Elasticsearch.
  • Qualidade da pesquisa: testa e refina as consultas de pesquisa para garantir que elas forneçam resultados relevantes em documentos fragmentados.

Escolhendo um método de fragmentação

  • Características do conteúdo: para mensagens curtas, a fragmentação em nível de frase pode ser suficiente. Para documentos longos, considere a fragmentação baseado no conteúdo ou até mesmo explore a fragmentação heterogênea com uma combinação de diferentes tamanhos de fragmentos.
  • Requisitos da aplicação: se a eficiência computacional for fundamental, a fragmentação em blocos de tamanho fixo pode ser um bom ponto de partida. Se a recuperação rica em contexto for crucial, a fragmentação baseada no conteúdo é a melhor opção.

Em resumo, a melhor estratégia de fragmentação para usar o Elasticsearch com rastreamento da web ou indexação de PDFs envolve dividir o conteúdo em unidades gerenciáveis (documentos, páginas, seções) que equilibram a granularidade com a eficiência na indexação e na consulta. Ajuste a estratégia com base na natureza da fonte de conteúdo (por exemplo, páginas da web vs. PDFs) e requisitos específicos da sua aplicação de pesquisa. Ao implementar essas metodologias, você pode melhorar o desempenho e a precisão do seu mecanismo de busca, fornecendo aos usuários resultados mais relevantes e precisos.

Comparação de metodologias de fragmentação

Benefícios Simplicidade, fácil de gerenciar

 

Casos de uso:

 
  • <b style=" font-family: inherit; ">Websites with small, self-contained pages:<span style=" font-family: inherit; "> Fácil de gerenciar cada URL como um documento separado.
  • Situações em que cada URL representa um documento distinto: garanta clareza e simplicidade no manuseio de documentos.
Benefícios Granularidade aprimorada, relevância reforçada para consultas de pesquisa

 

Casos de uso: 

Sites de conteúdo longo: aumenta a relevância da pesquisa ao segmentar artigos ou postagens grandes.

Sites com tipos de conteúdo diversos: permite melhor organização e recuperação de conteúdos variados.

 

Benefícios Equilíbrio entre granularidade e desempenho, maior precisão de pesquisa

 

Casos de uso: 

Sites com muito conteúdo: garante que os fragmentos não sejam muito grandes, melhorando a precisão e o desempenho da pesquisa.

Sites em que fragmentos extremamente grandes não são desejáveis: equilibra a necessidade de indexação detalhada com o desempenho.

Benefícios Eficiência computacional, desempenho previsível

 

Casos de uso: 

- Aplicações com elevados requisitos de eficiência computacional: desempenho previsível e utilização de recursos.

Tarefas de processamento de dados padronizadas: adequadas para ambientes em que tamanhos uniformes de fragmentos são benéficos.

Benefícios Controle refinado do conteúdo, resultados de pesquisa altamente relevantes

 

Casos de uso: 

 

Indexação de mensagens curtas: ideal para pesquisa e recuperação precisas em textos breves.

- Aplicações de análise de texto: permite a análise detalhada e a compreensão de segmentos curtos.

Benefícios Fragmentação com reconhecimento de contexto, aumento da relevância da pesquisa

 

Casos de uso: 

Documentos longos com conteúdo variado: garante que fragmentos mantenham um contexto significativo.

Análise de conteúdo detalhada: melhora a qualidade dos resultados da pesquisa mantendo o contexto.

Benefícios Segmentação lógica, legibilidade aprimorada

 

Casos de uso:

Indexação de PDF: trata cada página como uma unidade lógica, aprimorando a legibilidade e a capacidade de pesquisa.

Documentos em que cada página é uma unidade distinta: mantém a integridade do conteúdo baseado nas páginas.

 

Benefícios Pausas naturais no conteúdo, melhor gestão do conteúdo estruturado

 

Casos de uso: 

Documentos grandes com quebras de parágrafo claras: facilitam a leitura e o processamento.

Indexação de documentos estruturados: garante que as seções significativas sejam indexadas separadamente.

Soluções IBM

Fragmentação no watsonx

A plataforma IBM watsonx permite e acelera a implementação de padrões RAG e permite a fragmentação e a compreensão de documentos.  O watsonx Orchestrate, em conjunto com o watsonx Discovery, permite a fragmentação de documentos desde pouco código/no-code até implementações de soluções mais personalizadas. 

Os métodos listados são considerações comuns sobre técnicas de fragmentação a serem implementadas em um caso de uso de RAG. A técnica híbrida está disponível com o watsonx para proporcionar melhor precisão e velocidade. O processo geral divide um documento por frases únicas, para garantir uma granularidade significativa. Em seguida, as frases são agrupadas em fragmentos usando um LLM. O LLM avalia se o contexto da frase se ajusta ao fragmento; caso contrário, um novo fragmento é Iniciado. Utilizando esse fragmento, metadados relevantes são extraídos por meio do LLM; isso inclui título, ID e resumo.

Para obter mais informações sobre esse método, consulte este blog da IBM: https://developer.ibm.com/articles/awb-enhancing-llm-performance-document-chunking-with-watsonx/

Ferramentas de código aberto

Fragmentação sintática

A fragmentação sintática usa uma abordagem baseada em estrutura para separar o texto com base na formatação do documento. O mais comum e natural é que os títulos das seções funcionem como separadores. Entretanto, com formatos de documento sem informações codificadas (ou seja, PDF), os tamanhos de fonte podem ser usados como um marcador para separar fragmentos.

Pontos fortes:

  • Implementação simples

Limitações:

  • O algoritmo pressupõe uma hierarquia informacional; portanto, marcadores sintáticos podem ser perdidos

A fragmentação sintática pode ser benéfica em circunstâncias em que a estrutura topológica do documento é previsível e está claramente formatada para particionamento.

Fragmentação de tamanho fixo

Na fragmentação de tamanho fixo, os dados de entrada são divididos em fragmentos de tamanho igual. Esse método geralmente separa o texto em tamanhos predefinidos com base no número de tokens, é simples de implementar e entender, tornando-o adequado para tarefas em que os dados de entrada têm um tamanho consistente e previsível.

Pontos fortes:

  • Fácil de implementar e entender
  • Computacionalmente eficiente

Limitações:

  • Rígido e não se ajusta ao contexto do texto
  • Pode omitir informações contextuais importantes no texto

A fragmentação de tamanho fixo é mais adequada em casos em que os dados de entrada são previsíveis e não precisam de contexto detalhado.

from langchain.text_splitter import CharacterTextSplitter

# Texto de exemplo
text = "The quick brown fox jumps over the lazy dog."

# Criar um divisor para fragmentos de tamanho fixo
splitter = CharacterTextSplitter(chunk_size=10, chunk_overlap=0)

# Dividir o texto
chunks = splitter.split(text)

# Imprimir os fragmentos
for chunk in chunks:
 print(chunk)

Fragmentação semântica

A fragmentação semântica separa o texto com base no contexto e agrupa componentes significativos usando técnicas algorítmicas, ela é importante quando o significado do conteúdo é vital na criação de uma resposta, como em documentos jurídicos.

Pontos fortes:

  • Os dados obtidos têm maior precisão e relevância
  • A coesão da base de conhecimento é mantida na fragmentação

Limitações:

  • Implementação complexa utilizando algoritmos sofisticados
  • Computacionalmente mais extensa

Exemplo:

from langchain.text_splitter import RecursiveCharacterTextSplitter

# Texto de exemplo
text = "Steve Jobs was born in California. He co-founded Apple in 1976."

# Criar um divisor para segmentação semântica
splitter = RecursiveCharacterTextSplitter(chunk_size=50, chunk_overlap=10)

# Dividir o texto
chunks = splitter.split(text)

# Imprimir os fragmentos
for chunk in chunks:
 print(chunk)

A fragmentação híbrida usa informações contextuais e estruturais para combinar os pontos fortes da fragmentação de tamanho fixo e da fragmentação semântica. Esse método é melhor usado em situações em que há um grande corpus de dados em casos de uso, com formatação e material variados, como uma base de conhecimento empresarial.

Pontos fortes:

  • Precisão e velocidade ideais com técnicas de fragmentação flexíveis baseadas na estrutura e no contexto da base de conhecimento

Limitações:

  • Mais manutenção e esforço para implementação devido às exigências de recursos

Exemplo:

from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter

# Texto de exemplo
text = "Steve Jobs was born in California. He co-founded Apple in 1976."

# Divisor de tamanho fixo
fixed_size_splitter = CharacterTextSplitter(chunk_size=50, chunk_overlap=10)
fixed_size_chunks = fixed_size_splitter.split(text)

# Divisor semântico
semantic_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
semantic_chunks = semantic_splitter.split(text)

# Imprimir os fragmentos de tamanho fixo
print("Fixed-size chunks:")
for chunk in fixed_size_chunks:
 print(chunk)

# Imprimir os fragmentos semânticos
print("\nSemantic chunks:")
for chunk in semantic_chunks:
 print(chunk)

Segmentação agêntica

Essa estratégia de fragmentação envolve o uso de grandes modelos de linguagem (LLMs) para determinar o comprimento e o conteúdo adequados dos fragmentos de texto com base no contexto em que serão usados. A estratégia é inspirada no conceito de proposições, que envolve extrair declarações independentes de um texto bruto.

Para implementar essa abordagem, a estratégia utiliza um modelo de recuperação proposicional fornecido pelo Langchain para extrair proposições do texto. Essas propostas são, então, alimentadas em um agente baseado em LLM, que determina se cada proposta deve ser incluída em um fragmento existente ou se um novo fragmento deve ser criado.

O agente baseado em LLM usa uma variedade de fatores para fazer essa determinação, incluindo a relevância da proposição para o fragmento atual, a coerência geral do fragmento e os objetivos e intenções do modelo. Ao utilizar LLMs dessa forma, a estratégia visa gerar fragmentos de texto que não sejam apenas coerentes e contextualmente apropriados, mas também estejam alinhados com os objetivos e intenções do modelo.

Pontos fortes:

  • Autonomia: os LLMs podem tomar decisões sobre quais proposições incluir em um fragmento e quando criar um novo fragmento sem intervenção humana, permitindo uma geração de texto mais eficiente e escalável.
  • Coerência: os LLMs são projetados para gerar textos que sejam coerentes e contextualmente apropriados, o que pode ajudar a garantir que os fragmentos gerados sejam significativos e fáceis de entender.

Limitações:

  • Alto custo cumputacional: gerar texto usando LLMs pode ser computacionalmente caro, especialmente para modelos grandes ou complexos. Isso pode limitar a escalabilidade e a praticidade do uso de LLMs para determinadas aplicações.
  • Alucinações: podem ocorrer quando o modelo gera texto com base em seus próprios vieses ou suposições internas, em vez de dados ou contexto reais.

Como podemos implementar algumas dessas técnicas para dividir a documentação em partes menores? Existem muitas bibliotecas de código aberto para executar esses algoritmos e técnicas de fragmentação. Um bom lugar para começar é usando divisores de texto Langchain; consulte a documentação a seguir sobre divisores de texto específicos disponíveis. https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/

Próximas etapas

Obtenha os mais recentes padrões tecnológicos, arquiteturas de solução e publicações de arquitetura da IBM.

  1. Acesse o IBM Architecture Center
Colaboradores

Haneen Bakbak, Luke Major

Atualizado em: 15 de novembro de 2024