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.
As páginas da web variam muito em tamanho e estrutura. Para um processamento eficiente:
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:
Tags e atributos fora do padrão:
Elementos aninhados e obsoletos:
Estilo e formatação inline:
Estrutura de documento inconsistente:
Problemas de codificação e caracteres:
Script e conteúdo dinâmico:
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:
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.
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.
Casos de uso:
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.
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.
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.
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.
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/
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:
Limitações:
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.
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:
Limitações:
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)
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:
Limitações:
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:
Limitações:
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)
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:
Limitações:
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/
Atualizado em: 15 de novembro de 2024