En el ámbito del rastreo web y la indexación de documentos, las metodologías de fragmentación eficaces son cruciales para optimizar el rendimiento y la relevancia de la búsqueda. Cuando se trata de páginas web HTML o PDF, la estrategia que emplee puede afectar significativamente la eficiencia y precisión de su aplicación de búsqueda. Presentamos una guía completa sobre metodologías de fragmentación efectivas para diferentes circunstancias, particularmente en el contexto del uso de Elasticsearch como almacén de vectores.
Las páginas web varían ampliamente en tamaño y estructura. Para un procesamiento eficiente:
Cuando el rastreo web implica código HTML antiguo, puede afectar significativamente la calidad de los fragmentos extraídos para la indexación en Elasticsearch. Estos son algunos desafíos clave y estrategias de mitigación:
Etiquetas y atributos no estándar:
Elementos anidados y obsoletos:
Estilo y formato en línea:
Estructura de un documento inconsistente:
Problemas de codificación y caracteres:
Script y contenido dinámico:
Para mitigar el impacto del código HTML antiguo en la calidad de los fragmentos al rastrear sitios web para la indexación de Elasticsearch, considere las siguientes estrategias:
Al abordar estos desafíos de manera proactiva, puede mejorar la calidad de los fragmentos de contenido extraídos de páginas HTML más antiguas, mejorando así la eficacia y relevancia generales de las aplicaciones de búsqueda basadas en Elasticsearch.
En resumen, la mejor estrategia de fragmentación para usar Elasticsearch con rastreo web o indexación de PDF implica dividir el contenido en unidades manejables (documentos, páginas, secciones) que equilibren la granularidad con la eficiencia en la indexación y consulta. Ajuste la estrategia en función de la naturaleza de la fuente de contenido (por ejemplo, páginas web frente a archivos PDF) y los requisitos específicos de su aplicación de búsqueda. Al implementar estas metodologías, puede mejorar el rendimiento y la precisión de su motor de búsqueda, proporcionando a los usuarios resultados más relevantes y precisos.
Casos de uso:
Casos de uso:
- Sitios web con contenido extenso: mejora la relevancia de las búsquedas al segmentar artículos o publicaciones largos.
- Sitios con tipos de contenido diversos: permite una mejor organización y recuperación de contenido variado.
Casos de uso:
- Sitios web con mucho contenido: garantiza que los fragmentos no sean demasiado grandes, lo que mejora la precisión y el rendimiento de la búsqueda.
- Sitios web en los que no es deseable tener fragmentos extremadamente grandes: equilibra la necesidad de una indexación detallada con el rendimiento.
Casos de uso:
- Aplicaciones con altos requisitos de eficiencia computacional: rendimiento previsible y uso de recursos.
- Tareas de procesamiento de datos estandarizadas: adecuadas para entornos en los que resulta beneficioso utilizar fragmentos de tamaño uniforme.
Casos de uso:
- Indexación de mensajes cortos: ideal para búsquedas y recuperaciones precisas en textos breves.
- Aplicaciones de análisis de texto: permite el análisis detallado y la comprensión de segmentos cortos.
Casos de uso:
- Documentos largos con contenido variado: garantiza que los fragmentos conserven un contexto significativo.
- Análisis detallado de contenido: mejora la calidad de los resultados de búsqueda al mantener el contexto.
Casos de uso:
- Indexación de PDF: trata cada página como una unidad lógica, lo que mejora la legibilidad y la capacidad de búsqueda.
- Documentos en los que cada página es una unidad distinta: mantiene la integridad del contenido basado en páginas.
Casos de uso:
- Documentos grandes con saltos de párrafo claros: facilita la lectura y el procesamiento.
- Indexación estructurada de documentos: garantiza que las secciones significativas se indexen por separado.
La plataforma IBM watsonx habilita y acelera la implementación de patrones RAG y permite la fragmentación y comprensión de documentos. watsonx Orchestrate junto con watsonx Discovery permiten la fragmentación de documentos desde implementaciones de código bajo o sin código hasta implementaciones de soluciones más personalizadas.
Los métodos enumerados son consideraciones comunes de técnicas de fragmentación para implementar en un caso de uso de RAG. La técnica híbrida está disponible en watsonx para proporcionar una mayor precisión y velocidad. El proceso general divide un documento en oraciones individuales, para garantizar una granularidad significativa. Luego, las oraciones se agrupan en fragmentos utilizando un LLM. El LLM evalúa si el contexto de la oración se ajusta al fragmento; de lo contrario, se inicia un nuevo fragmento. Con ese fragmento, se extraen metadatos significativos mediante el LLM; esto incluye título, ID y resumen.
Para obtener más información sobre este método, consulte este blog de IBM: https://developer.ibm.com/articles/awb-enhancing-llm-performance-document-chunking-with-watsonx/
La fragmentación sintáctica utiliza un enfoque guiado por la estructura para separar el texto en función del formato del documento. Lo más común y natural es que los encabezados de sección se utilicen como separadores. Sin embargo, con formatos de documentos sin información codificada (es decir, PDF), los tamaños de fuente se pueden usar como marcador para separar fragmentos.
Puntos fuertes:
Limitaciones:
La fragmentación sintáctica puede ser beneficiosa en circunstancias en las que la estructura topológica del documento es predecible y tiene un formato limpio para la partición.
En la fragmentación de tamaño fijo, los datos de entrada se dividen en fragmentos del mismo tamaño. Este método a menudo separa el texto en tamaños predefinidos en función del número de tokens. Este método es fácil de implementar y comprender, por lo que resulta adecuado para tareas en las que los datos de entrada tienen un tamaño constante y predecible.
Puntos fuertes:
Limitaciones:
La fragmentación de tamaño fijo se utiliza mejor en los casos en que los datos de entrada son predecibles y no necesitan un contexto completo.
de langchain.text_splitter import CharacterTextSplitter # Example text text = "The quick brown fox jumps over the lazy dog." # Create a splitter for fixed size chunks splitter = CharacterTextSplitter(chunk_size=10, chunk_overlap=0) # Split the text chunks = splitter.split(text) # Print the chunks for chunk in chunks: print(chunk)
La fragmentación semántica separa el texto según el contexto y agrupa los componentes significativos utilizando técnicas algorítmicas. La fragmentación semántica es importante cuando el significado del contenido es vital para dar una respuesta, como la documentación legal.
Puntos fuertes:
Limitaciones:
Ejemplo:
de langchain.text_splitter import RecursiveCharacterTextSplitter # Example text text = "Steve Jobs nació en California. Cofundó Apple en 1976." # Crear un divisor para la fragmentación semántica splitter = RecursiveCharacterTextSplitter(chunk_size=50, chunk_overlap=10) # Dividir los fragmentos de texto = splitter.split(text) # Imprime las partes eel fragmento en fragmentos: imprimir (chunk)
El fragmentado híbrido emplea tanto información contextual como estructural para combinar las fuerzas de tamaño fijo y semántica. Este método se utiliza mejor para situaciones en las que hay un gran corpus de datos en todos los casos de uso, con formatos y materiales variados, como una base de conocimientos empresariales.
Puntos fuertes:
Limitaciones:
Ejemplo:
de langchain.text_splitter importar CharacterTextSplitter, RecursiveCharacterTextSplitter
# Texto de ejemplo
texto = "Steve Jobs nació en California. Cofundó Apple en 1976."
# Fixed-size splitter Fixed_size_splitter = CharacterTextSplitter(chunk_size=50, chunk_overlap=10) Fixed_size_chunks = Fixed_size_splitter.split(text)
# Semantic splitter semantic_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20) semantic_chunks = semantic_splitter.split(text)
# Imprime los fragmentos de tamaño fijo print("Fixed-size chunks:") for chunk in Fixed_size_chunks: print(chunk) #Imprime los fragmentos semánticos
imprime("\nSemantic chunks:") for chunk in semantic_chunks: print(chunk)
Esta estrategia de fragmentación implica el uso de modelos de lenguaje grandes (LLM) para determinar la longitud y el contenido adecuados de los fragmentos de texto en función del contexto en el que se utilizarán. La estrategia se inspira en el concepto de proposiciones, que implica extraer declaraciones independientes de un texto en bruto.
Para implementar este enfoque, la estrategia utiliza una plantilla de recuperación proposicional proporcionada por Langchain para extraer proposiciones del texto. Estas proposiciones se envían a un agente basado en LLM, que determina si cada proposición debe incluirse en un fragmento existente o si se debe crear un nuevo fragmento.
El agente basado en LLM utiliza una variedad de factores para tomar esta determinación, incluyendo la relevancia de la proposición para el fragmento actual, la coherencia general del fragmento y los objetivos e intenciones del modelo. Al utilizar LLM de esta manera, la estrategia tiene como objetivo generar fragmentos de texto que no solo sean coherentes y contextualmente apropiados, sino que también estén alineados con los objetivos e intenciones del modelo.
Puntos fuertes:
Limitaciones:
Ahora, ¿cómo implementamos algunas de estas técnicas para fragmentar la documentación? Existen muchas bibliotecas de código abierto para ejecutar estos algoritmos y técnicas de fragmentación. Un buen lugar para comenzar es usar divisores de texto Langchain; consulte la siguiente documentación sobre divisores de texto específicos disponibles. https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/
Actualizado: 15 de noviembre de 2024