Introducción
Unstructured.io es un marco de código abierto para el procesamiento estructurado de documentos no estructurados como PDFs, archivos de Word, páginas HTML o correos electrónicos. Su objetivo es extraer contenidos semánticamente útiles de estos formatos heterogéneos, como encabezados, párrafos, tablas o listas, y convertirlos a un formato unificado y legible por máquina. El caso de uso principal es la preparación de datos de texto para su posterior procesamiento por sistemas de IA, especialmente para aquellos con generación aumentada por recuperación (RAG).
El uso típico se da en el análisis de documentos, la gestión del conocimiento o la preparación de entradas para modelos de incrustación (embeddings). En este proceso se aplican varios pasos de procesamiento. Estos cuatro pasos constituyen el núcleo de la canalización de Unstructured.io y se ejecutan en cada uso normal de la biblioteca.
Partitioning
Desglose del documento en elementos lógicos de contenido, como párrafos, encabezados o tablas.Cleaning
Eliminación de componentes irrelevantes como encabezados, pies de página o marcas de agua.Extracting
Extracción del contenido de texto puro y de los metadatos asociados.Staging
Preparación de esta información en un formato estructurado y consistente (por ejemplo, JSON o Markdown).
Además, existen extensiones opcionales:
Chunking: Los contenidos más largos se dividen en unidades de texto más pequeñas, mejor adecuadas para modelos de incrustaciones. Este paso no forma parte obligatoria de la biblioteca principal, pero es necesario para muchas aplicaciones de IA.
Embedding: Los fragmentos de texto resultantes se envían a modelos externos (p. ej. OpenAI, HuggingFace, SentenceTransformers) para generar representaciones vectoriales. Este paso se realiza fuera de Unstructured y debe ser implementado por el usuario o complementado mediante canalizaciones de ejemplo existentes.
Así pues, Unstructured.io gestiona el preprocesamiento de documentos hasta la salida de texto estructurado. Para una canalización RAG completa—que incluya incrustaciones, base de datos de vectores, lógica de recuperación y modelo de lenguaje—se necesitan herramientas adicionales. Por tanto, Unstructured representa la fase inicial y preparatoria de dicha arquitectura.
Ejemplos de documentos PDF para practicar
https://github.com/Unstructured-IO/unstructured/tree/main/example-docs/pdf
Tipos de datos compatibles
| Categoría | Tipos de archivo |
|---|---|
| Apple | .cwk, .mcw |
| CSV | .csv |
| Intercambio de datos | .dif* |
| dBase | .dbf |
| Correo electrónico | .eml, .msg, .p7s |
| EPUB | .epub |
| HTML | .htm, .html |
| Imagen | .bmp, .heic, .jpeg, .jpg, .png, .prn, .tiff |
| Markdown | .md |
| OpenOffice | .odt |
| Org Mode | .org |
| Otros | .eth, .pbd, .sdp |
| Texto plano | .txt |
| PowerPoint | .pot, .ppt, .pptm, .pptx |
| reStructured Text | .rst |
| Rich Text | .rtf |
| Hoja de cálculo | .et, .fods, .mw, .xls, .xlsx |
| StarOffice | .sxg |
| TSV | .tsv |
| Procesamiento de texto | .abw, .doc, .docm, .docx, .dot, .dotm, .hwp, .zabw |
| XML | .xml |
Bibliotecas externas necesarias
| Biblioteca | Descripción |
|---|---|
| ibmagic-dev | Detecta el tipo exacto de un archivo (por ejemplo, si es un PDF, un JPG, etc.). |
| poppler-utils und tesseract-ocr | Se utilizan para el procesamiento de imágenes y PDFs, especialmente para el reconocimiento de texto (OCR). |
| tesseract-lang | Proporciona los paquetes de idiomas necesarios para el reconocimiento de texto en idiomas adicionales. |
| libreoffice | Sirve para procesar e importar documentos en formato Microsoft Office (Word, PowerPoint, etc.). |
| pandoc | Convierte varios formatos de documentos y se utiliza aquí para archivos .epub, .odt y .rtf. |
Canalización de datos (Data Pipeline)
El flujo de trabajo de unstructured.io es una canalización de datos de varias etapas que transforma sistemáticamente documentos en crudo en información lista para IA. El proceso comienza con el Partitioning, donde un documento se divide en sus elementos lógicos como títulos, párrafos y tablas. En el siguiente paso, Cleaning, estos elementos se limpian de contenidos no deseados como encabezados o pies de página. A continuación se realiza el Extracting, donde se extraen los contenidos de texto puro y metadatos importantes de los elementos. La fase de Staging sirve para estructurar estos datos extraídos y prepararlos para las fases posteriores. En Chunking se dividen textos largos y coherentes en secciones más pequeñas optimizadas para modelos. El paso final, el Embedding, convierte estos fragmentos de texto en vectores numéricos que los sistemas de IA, como las aplicaciones RAG, pueden procesar y buscar.
[ Partitioning ] > [ Cleaning ] > [ Extracting ] > [ Staging ] > [ Chunking ] > [ Embedding ]
Pasos fundamentales de la canalización (pasos obligatorios)
[ Partitioning ] > [ Cleaning ] > [ Extracting ] > [ Staging ]
Partitioning
La biblioteca unstructured ofrece funciones de partición para descomponer documentos crudos en bloques estructurados como títulos, texto continuo o elementos de lista. Esto permite a los usuarios seleccionar únicamente los contenidos que necesitan para su tarea específica, por ejemplo, solo el texto continuo para entrenar un modelo de resumen.
| Tipo de documento | Función de partición | Estrategias | Soporte de tablas | Opciones |
|---|---|---|---|---|
| Archivos CSV (.csv) | partition_csv | N/A | Sí | Ninguna |
| Correos electrónicos (.eml) | partition_email | N/A | No | Encoding; Include Headers; Max Partition; Process Attachments |
| Correos electrónicos (.msg) | partition_msg | N/A | No | Encoding; Max Partition; Process Attachments |
| Archivos EPUB (.epub) | partition_epub | N/A | Sí | Include Page Breaks |
| Documentos de Excel (.xlsx/.xls) | partition_xlsx | N/A | Sí | Ninguna |
| Páginas HTML (.html/.htm) | partition_html | N/A | No | Encoding; Include Page Breaks |
| Imágenes (.png/.jpg/.jpeg/.tiff/.bmp/.heic) | partition_image | “auto”, “hi_res”, “ocr_only” | Sí | Encoding; Include Page Breaks; Infer Table Structure; OCR Languages, Strategy |
| Markdown (.md) | partition_md | N/A | Sí | Include Page Breaks |
| Org Mode (.org) | partition_org | N/A | Sí | Include Page Breaks |
| Documentos de OpenOffice (.odt) | partition_odt | N/A | Sí | Ninguna |
| PDFs (.pdf) | partition_pdf | “auto”, “fast”, “hi_res”, “ocr_only” | Sí | Encoding; Include Page Breaks; Infer Table Structure; Max Partition; OCR Languages, Strategy |
| Texto plano (.txt/.text/.log) | partition_text | N/A | No | Encoding; Max Partition; Paragraph Grouper |
| Presentaciones PowerPoint (.ppt) | partition_ppt | N/A | Sí | Include Page Breaks |
| Presentaciones PowerPoint (.pptx) | partition_pptx | N/A | Sí | Include Page Breaks |
| ReStructured Text (.rst) | partition_rst | N/A | Sí | Include Page Breaks |
| Archivos Rich Text (.rtf) | partition_rtf | N/A | Sí | Include Page Breaks |
| Archivos TSV (.tsv) | partition_tsv | N/A | Sí | Ninguna |
| Documentos de Word (.doc) | partition_doc | N/A | Sí | Include Page Breaks |
| Documentos de Word (.docx) | partition_docx | N/A | Sí | Include Page Breaks |
| Documentos XML (.xml) | partition_xml | N/A | No | Encoding; Max Partition; XML Keep Tags |
| Archivos de código (.js/.py/.java/etc.) | partition_text | N/A | No | Encoding; Max Partition; Paragraph Grouper |
Ejemplo de archivo *.PDF para probar la biblioteca unstructured.io:
pm-partnerschaft-stackitDescargar
La función partition ha analizado el documento PDF anterior. En lugar de tratar el documento como una larga secuencia de texto sin formato, ha interpretado la estructura visual y el diseño de la página para identificar bloques lógicos individuales (Document Elements), por ejemplo, “Title” y “NarrativeText”.
Explicación de los distintos tipos de elementos del PDF, por ejemplo, Title:
| Etiqueta (clave) | Valor de ejemplo en JSON | Explicación |
|---|---|---|
| type | “Title” | Indica el tipo clasificado del elemento. Unstructured identifica varios tipos como Title (título), NarrativeText (texto narrativo), ListItem (elemento de lista), etc., basándose en el diseño del documento. |
| element_id | “42a9c358d559f0be7034cffd155ae0b4” | Un identificador único generado automáticamente para cada elemento individual. Esto es útil para referenciar elementos. |
| text | “OPITZ CONSULTING UND STACKIT…” | El contenido de texto puro extraído del elemento detectado. |
| metadata | {…} | Un objeto que sirve como contenedor para todos los datos adicionales (metadatos) que describen el elemento. Todas las etiquetas siguientes forman parte de este objeto metadata. |
| metadata.detection_class_prob | 0.6857117414474487 | El “detection class probability” es un valor de confianza entre 0 y 1. Indica cuán seguro está el modelo de que la clasificación bajo type (aquí: “Title”) sea correcta. Un valor de 1 significa la máxima confianza. El modelo está 100 % seguro de que la asignación del tipo (por ejemplo, como “Title”) sea correcta. Como usuario, se puede aumentar este valor al elegir la estrategia, p. ej. “hi_res”. ** Estrategias** - “fast”: Rápida, pero menos precisa. A menudo conlleva valores de confianza más bajos. - “hi_res”: Utiliza modelos complejos para el análisis visual del documento. Es más lento, pero detecta diseños, títulos y párrafos de forma mucho más fiable y suele generar valores de confianza más altos. - “ocr_only”: Fuerza OCR en todas las páginas, incluso si existe texto digital. Útil para PDFs “dañados”, pero para el reconocimiento de diseño es superior “hi_res”. |
| metadata.coordinates | {…} | Un objeto que contiene toda la información sobre la ubicación del elemento en la página. |
| metadata.coordinates.points | [[197.0, 771.66], [197.0, 903.39], …] | Una lista de pares de coordenadas [X, Y] que definen un cuadro delimitador (bounding box) alrededor del elemento. Esto describe la posición y el tamaño exactos del elemento en la página. |
| metadata.coordinates.system | “PixelSpace” | Indica el sistema de coordenadas utilizado. “PixelSpace” significa que los valores en points, layout_width y layout_height se miden en píxeles. |
| metadata.coordinates.layout_width | 1654 | El ancho total de la página del documento en la unidad del sistema indicado (aquí: píxeles). |
| metadata.coordinates.layout_height | 2339 | La altura total de la página del documento en la unidad del sistema indicado (aquí: píxeles). |
| metadata.last_modified | “2025-05-31T08:21:16” | La marca de tiempo de la última modificación del archivo fuente, si esta información está disponible. |
| metadata.filetype | “application/pdf” | El tipo MIME del archivo fuente. Indica de qué tipo de archivo se trata (p.ej., PDF, DOCX, HTML). |
| metadata.languages | [“deu”, “eng”] | Una lista de los idiomas detectados en el texto del elemento, expresados como códigos ISO 639-2 de tres letras (p.ej., “deu” para alemán, “eng” para inglés). |
| metadata.page_number | 1 | El número de página en el documento original donde se encontró este elemento. |
| metadata.filename | “test_oc.pdf” | El nombre de archivo del archivo fuente procesado. |
| metadata.parent_id | (no presente en este ejemplo, pero relevante) | Esta clave aparecería aquí si el elemento fuera subordinado. Su valor sería el element_id del elemento padre (por ejemplo, la ID del título para un párrafo posterior). |
Esta es la lista de los elementos de documento más importantes como Text, Header, Image, etc. La lista completa de elementos se encuentra aquí: Link
| Tipo de elemento | Descripción |
|---|---|
| Address | Un elemento de texto para capturar direcciones físicas. |
| CodeSnippet | Un elemento de texto para capturar fragmentos de código. |
| EmailAddress | Un elemento de texto para capturar direcciones de correo electrónico. |
| FigureCaption | Un elemento para capturar texto de subtítulos de imágenes. |
| Footer | Un elemento para capturar pies de página de documentos. |
| FormKeysValues | Un elemento para capturar pares clave-valor en un formulario. |
| Formula | Un elemento que contiene fórmulas en un archivo. |
| Header | Un elemento para capturar encabezados de documentos. |
| Image | Un elemento de texto para capturar metadatos de imágenes. |
| ListItem | ListItem es un elemento NarrativeText que forma parte de una lista. |
| NarrativeText | NarrativeText es un elemento compuesto por varias oraciones bien formadas. Esto excluye elementos como títulos, encabezados, pies de página y subtítulos de imágenes. |
| PageBreak | Un elemento para capturar saltos de página. |
| PageNumber | Un elemento para capturar números de página. |
| Table | Un elemento para capturar tablas. |
| Title | Un elemento de texto para capturar títulos. |
| UncategorizedText | Elemento base para capturar texto libre de archivos. Aplica al texto extraído que no está asignado a cuadros delimitadores. |
Cleaning
La función cleaning sirve para eliminar contenidos no deseados de documentos, con el fin de preparar los datos para tareas posteriores, como el procesamiento por modelos de lenguaje (LLMs). El objetivo es obtener datos “limpios” y más relevantes.
La siguiente tabla ofrece una visión general de las distintas funciones de cleaning. Fuente: Link
| Nombre | Explicación |
|---|---|
| bytes_string_to_string | Convierte una cadena de bytes en una cadena normal. Se puede imaginar así: un ordenador almacena un emoji como 😊 no como imagen, sino como una secuencia de bytes, denominada “Byte-String”. Para 😊, el código es por ejemplo b’\xf0\x9f\x98\x8a’. Cuando unstructured procesa un archivo HTML, puede ocurrir que el analizador se tope con un carácter especial de este tipo. En lugar de leer correctamente el carácter e insertar el 😊 en el texto, a veces se produce por error una especie de “descripción del código de bytes” como texto normal. El resultado es una cadena que se ve así: “b’\xf0\x9f\x98\x8a’”. Esto ya no es un verdadero Byte-String, sino solo texto que parece un Byte-String. La función bytes_string_to_string actúa como herramienta de reparación para este problema. Reconoce el patrón b’…’ en un texto y lo convierte de nuevo en el carácter original y correcto. |
| clean | La función clean depura un fragmento de texto combinando varias acciones específicas de limpieza en una sola llamada. Se puede controlar qué limpiezas realizar mediante simples indicadores (True o False). Las opciones disponibles son: - bullets=True: Elimina viñetas (p. ej. ● o *) al inicio del texto. - extra_whitespace=True: Elimina espacios redundantes, p. ej. varios espacios entre palabras. - dashes=True: Limpia diversos tipos de guiones y rayas. - trailing_punctuation=True: Elimina signos de puntuación al final del texto. - lowercase=True: Convierte todo el texto a minúsculas. Ejemplo: clean("● An excellent point!", bullets=True, lowercase=True) |
| clean_bullets | Elimina guiones o marcas de viñeta del inicio de un texto. |
| clean_dashes | Reemplaza varios tipos de guiones (p. ej. guión largo, guión corto) por un guión estándar. |
| clean_non_ascii_chars | Elimina todos los caracteres no ASCII de un texto. ASCII incluye: - Las letras del alfabeto inglés (A-Z, a-z) - Los números (0-9) - Signos y caracteres especiales básicos como ! ? @ $ & Todos los demás caracteres se consideran no ASCII. Esto incluye, por ejemplo: - Umlaute alemanes (ä, ö, ü, ß) - Símbolos como €, ®, ©, ● - Emojis como 👍 o 😊 Para textos en alemán no se debería activar clean_non_ascii_chars. |
| clean_ordered_bullets | Elimina viñetas ordenadas como “1.”, “a.)” o “i)” al inicio de un texto. |
| clean_postfix | La función verifica el final de una cadena de texto. Si termina con un patrón definido (generalmente una expresión regular), se elimina esa parte. - pattern: El patrón (p. ej. r"(END|STOP)") que se busca al final del texto y se elimina. - ignore_case=True: Permite ignorar mayúsculas y minúsculas al comparar. END coincide también con end. (Por defecto False) - strip=True: Elimina espacios sobrantes al final tras borrar el patrón. (Por defecto True) |
| clean_prefix | Elimina un prefijo específico de un texto si está presente. |
| clean_trailing_punctuation | Elimina los signos de puntuación al final de un texto, pero mantiene los signos dentro del texto intactos. |
| group_broken_paragraphs | Une líneas de texto que están separadas por saltos de línea pero que en realidad pertenecen al mismo párrafo. Muy útil para textos extraídos de PDFs. En otras palabras: esta función “repara” párrafos que han sido interrumpidos únicamente por razones visuales o de formato mediante saltos de línea (\n). |
| remove_punctuation | Elimina todos los signos de puntuación, p. ej. , . ; ! ? de un texto. |
| replace_unicode_quotes | Reemplaza códigos Unicode obsoletos o problemáticos para comillas por sus equivalentes tipográficamente correctos. A veces los textos copiados de sistemas antiguos o programas como Microsoft Word no contienen comillas estándar, sino códigos especiales (como \x91, \x93, etc.) que en sistemas modernos pueden provocar errores de visualización o interferir en el procesamiento automatizado. La función replace_unicode_quotes actúa como herramienta de reparación para estos códigos específicos, convirtiéndolos en comillas “inteligentes” estándar (smart quotes). |
| translate_text | La función translate_text utiliza modelos profesionales de traducción (Helsinki NLP) para traducir textos entre múltiples idiomas como ruso, chino, alemán y otros. Parámetros: - text: El texto a traducir. - source_lang (idioma origen): El código de idioma (p. ej. de para alemán) del texto original. Si no se especifica, la función intenta detectar el idioma automáticamente. - target_lang (idioma destino): El código del idioma de destino. Si no se establece, el destino predeterminado es inglés (en). |
Extraction
El paso Extracting aisla información específica de los elementos de texto ya limpiados.
Por ejemplo, si un texto contiene la frase: Para más información, contacte a support@example.com. En lugar de procesar toda la frase, una función de extracción como extract_email_address extraería únicamente el dato deseado, es decir, support@example.com.
| Nombre | Explicación |
|---|---|
| extract_datetimetz | Extrae la fecha, la hora y la zona horaria de los campos “Received” de un archivo .eml (correo electrónico). |
| extract_email_address | Encuentra y extrae una o varias direcciones de correo electrónico de un texto. |
| extract_ip_address | Extrae direcciones IP de un texto. |
| extract_ip_address_name | Extrae los nombres asociados a las direcciones IP en los campos “Received” de un archivo .eml. |
| extract_mapi_id | Extrae la “MAPI ID” de los campos “Received” de un archivo .eml. |
| extract_ordered_bullets | Extrae texto de viñetas ordenadas (p. ej. “1.”, “a.)”). Bsp.: extract_ordered_bullets(“1.1 This is a very important point”) Ausgabe: (“1”, “1”, None) extract_ordered_bullets(“a.1 This is a very important point”) Ausgabe: (“a”, “1”, None) |
| extract_text_after | Extrae el texto que aparece después de un patrón o palabra específica. Bsp.: text = “SPEAKER 1: Look at me, I’m flying!” extract_text_after(text, r"SPEAKER \d{1}:") Ausgabe: “Look at me, I’m flying!” |
| extract_text_before | Extrae el texto que aparece antes de un patrón o palabra específica. |
| extract_us_phone_number | Extrae un número de teléfono en formato de EE.UU. de un fragmento de texto. |
| group_broken_paragraphs | Une líneas de texto separadas por saltos de línea que en realidad pertenecen al mismo párrafo. Muy útil para textos de PDFs. En otras palabras: esta función “repara” párrafos interrumpidos por saltos de línea (\n). Esta función proviene de Cleaning. La única diferencia es el contexto o la intención con la que se invoca. |
| remove_punctuation | Elimina todos los signos de puntuación, p. ej. , . ; ! ? de un texto. Esta función proviene de Cleaning. La única diferencia es el contexto o la intención con la que se invoca. |
| replace_unicode_quotes | Reemplaza códigos Unicode obsoletos o problemáticos para comillas por comillas tipográficamente correctas. Esta función proviene de Cleaning. La única diferencia es el contexto o la intención con la que se invoca. |
| translate_text | La función translate_text utiliza modelos profesionales de traducción (Helsinki NLP) para traducir textos entre múltiples idiomas como ruso, chino, alemán y otros. Parámetros: - text: El texto a traducir. - source_lang (idioma origen): El código de idioma (p. ej. de para alemán) del texto original. Si no se especifica, la función intenta detectar el idioma automáticamente. - target_lang (idioma destino): El código del idioma de destino. Si no se establece, el destino predeterminado es inglés (en). Esta función proviene de Cleaning. La única diferencia es el contexto o la intención con la que se invoca. |
Staging
Las funciones de staging en el paquete unstructured sirven para preparar los elementos de documento extraídos para pasos posteriores de procesamiento. Como entrada, esperan una lista de elementos estructurados, por ejemplo Title o NarrativeText. La salida es un diccionario formateado, es decir, una colección estructurada de datos en forma de pares clave-valor. Cada información, como un fragmento de texto o un metadato, se asigna a un identificador único. Estos identificadores, o claves, pueden ser “text”, “metadata” o “type”. El objetivo es preparar los datos de manera que el sistema de destino los procese directamente.
Inicialmente estaban disponibles funciones de conversión especializadas:
- Una conversión básica como convert_to_csv para transformación a formatos tabulares
- Una conversión para plataformas de aprendizaje automático y NLP como stage_for_transformers para preparar datos de entrenamiento
- Una conversión para bases de datos vectoriales como stage_for_weaviate para indexación semántica
Estas funciones están ahora obsoletas. El desarrollo se centra en el concepto de Destination Connectors, p. ej. para Kafka, Weaviate o MongoDB. Con ellos, los datos se pueden enviar automáticamente a plataformas externas tras la extracción.
| Conector | Descripción |
|---|---|
| Astra DB | Una base de datos NoSQL nativa de la nube como servicio (DBaaS) basada en Apache Cassandra. Está optimizada para gran escalabilidad y rendimiento e incluye funciones de búsqueda vectorial, lo que la hace útil para aplicaciones de IA. |
| Azure | Se refiere a Azure Blob Storage, un servicio de almacenamiento de objetos de Microsoft para guardar grandes cantidades de datos no estructurados en la nube. |
| Azure AI Search | Un servicio de búsqueda en la nube de Microsoft que ofrece a los desarrolladores APIs y herramientas para integrar funciones de búsqueda avanzadas (incluida búsqueda vectorial y semántica) en sus aplicaciones. |
| Box | Una plataforma en la nube para la gestión y almacenamiento de contenido y colaboración. Como destino, permite transferir datos y documentos a un entorno seguro de Box. |
| Chroma | Una base de datos vectorial de código abierto diseñada específicamente para el desarrollo de aplicaciones de IA y LLM para almacenar y buscar incrustaciones vectoriales. |
| Couchbase | Una base de datos NoSQL distribuida optimizada para aplicaciones interactivas. Combina un store key-value rápido con un modelo de documentos JSON flexible y consultas similares a SQL. |
| Databricks Volumes | Una función dentro de Databricks que permite acceder, almacenar y gestionar datos no tabulares (como imágenes, PDFs, archivos de texto) en el almacenamiento en la nube como si fuera un sistema de archivos local. |
| Delta Tables in Amazon S3 | Permite almacenar datos en formato Delta Lake directamente en Amazon S3. Delta Lake es un framework de almacenamiento de código abierto que ofrece transacciones ACID, versionado de datos y escalabilidad para Data Lakes. |
| Delta Tables in Databricks | Almacena datos en formato Delta Lake optimizado dentro de la plataforma Databricks. Es la forma nativa y más eficiente de usar Delta Tables en Databricks. |
| Dropbox | Un servicio de almacenamiento en la nube que permite guardar y compartir archivos en línea. Como conector de destino sirve para escribir archivos y datos en la estructura de carpetas de Dropbox. |
| DuckDB | Un sistema de gestión de bases de datos analítico (OLAP) en memoria orientado a columnas. Es extremadamente rápido y está diseñado para ejecutarse directamente dentro de una aplicación sin servidor independiente. |
| Elasticsearch | Un motor de búsqueda y análisis de código abierto altamente escalable. Se utiliza frecuentemente para búsqueda de texto completo, análisis de logs, información de seguridad y análisis empresarial. |
| Google Cloud Storage | El servicio de almacenamiento de objetos de Google (similar a Amazon S3). Sirve para almacenar y recuperar cualquier cantidad de datos en Google Cloud. |
| IBM watsonx.data | Un servicio abierto de Data Lakehouse de IBM que permite gestionar y analizar datos de Data Warehouses y Data Lakes con un único motor de consulta y para cargas de trabajo de IA. |
| Kafka | Apache Kafka es una plataforma de streaming de eventos distribuida de código abierto. Como destino, permite escribir flujos de datos (eventos) en topics de Kafka, desde donde otras aplicaciones pueden consumirlos en tiempo real. |
| KDB.AI | Una base de datos vectorial de alto rendimiento diseñada para aplicaciones de IA en tiempo real como búsqueda de similitud, personalización y generación aumentada por recuperación (RAG). |
| LanceDB | Una base de datos vectorial embebible para aplicaciones de IA que funciona sin servidor y está optimizada para datos multimodales (texto, imágenes, etc.) y búsqueda vectorial rápida y eficiente. |
| Local | Se refiere a almacenar datos en el sistema de archivos local de la máquina donde se ejecuta el proceso. |
| Milvus | Una base de datos vectorial de código abierto diseñada para gestionar y buscar grandes cantidades de incrustaciones vectoriales con alto rendimiento en búsquedas de similitud. |
| MongoDB | Una base de datos NoSQL orientada a documentos líder. Almacena datos en documentos flexibles similares a JSON, lo que la hace popular entre desarrolladores de aplicaciones modernas. |
| MotherDuck | Un servicio de análisis en la nube serverless construido sobre DuckDB. Combina la velocidad de DuckDB en local con la escalabilidad y las capacidades de compartición de la nube. |
| Neo4j | Una de las bases de datos de grafos líderes. En lugar de almacenar datos en tablas, guarda datos como nodos y relaciones, lo cual es ideal para analizar conexiones complejas. |
| OneDrive | El servicio de almacenamiento en la nube de Microsoft. Como conector de destino permite escribir archivos y datos directamente en OneDrive de un usuario u organización. |
| OpenSearch | Un framework de búsqueda y análisis de código abierto fork de Amazon Web Services (AWS) basado en Elasticsearch. Se utiliza para casos de uso similares como análisis de logs y búsqueda de texto completo. |
| Pinecone | Una base de datos vectorial en la nube y gestionada que facilita a los desarrolladores integrar búsquedas vectoriales de alto rendimiento en aplicaciones de IA sin preocuparse de la infraestructura. |
| PostgreSQL | Un potente sistema de gestión de bases de datos objeto-relacional de código abierto. Es conocido por su fiabilidad, robustez y amplia compatibilidad con el estándar SQL. |
| Qdrant | Una base de datos vectorial y motor de búsqueda de código abierto diseñada para entornos de producción a gran escala, que ofrece una API sencilla para almacenar y buscar vectores. |
| Redis | Una base de datos en memoria extremadamente rápida que funciona como un store key-value. Se utiliza a menudo como caché, broker de mensajes o en aplicaciones en tiempo real. |
| S3 | Amazon Simple Storage Service (S3) es un servicio de almacenamiento de objetos altamente escalable de AWS. Es el estándar de facto para almacenar datos en la nube. |
| SFTP | SSH File Transfer Protocol es un protocolo seguro para la transferencia de archivos. Como conector de destino permite subir datos de forma segura a un servidor remoto. |
| SingleStore | Un sistema de bases de datos SQL distribuido relacional conocido por su alta velocidad en ingestión, transacciones y consultas, soportando cargas de trabajo tanto transaccionales como analíticas. |
| Snowflake | Una plataforma de datos en la nube provista como Data Warehouse-as-a-Service. Es conocida por su capacidad de escalar almacenamiento y cómputo de forma independiente. |
| SQLite | Un motor de base de datos SQL transaccional, sin servidor y autocontenido que se incrusta directamente en una aplicación. Es la base de datos más utilizada en el mundo, sobre todo en apps móviles y navegadores. |
| Vectara | Una plataforma de extremo a extremo para desarrolladores que crea aplicaciones GenAI enfocadas en generación aumentada por recuperación (RAG) y minimiza alucinaciones mediante una búsqueda híbrida precisa. |
| Weaviate | Una base de datos vectorial de código abierto que almacena tanto objetos de datos como sus representaciones vectoriales. Esto permite combinar búsqueda vectorial con filtros estructurados. |
Pasos avanzados de la canalización (Opcional)
[ Chunking ] > [ Embedding ]
Chunking
Unstructured usa metadatos y elementos de documento reconocidos por las funciones de partición para convertirlos en “chunks” más útiles.
Estrategia de Chunking
Actualmente Unstructured ofrece dos estrategias de chunking: “basic” y “by_title”. Los componentes esenciales de la estrategia basic son:
basic
La estrategia “basic” es la más simple y una de las más utilizadas en la biblioteca unstructured. Su función principal es combinar elementos secuenciales de un documento para crear chunks lo más grandes posible sin sobrepasar un número máximo especificado de caracteres:
- max_characters: un límite estricto que no se debe superar
- new_after_n_chars: un límite suave. Al excederse se inicia un nuevo chunk, incluso si el límite estricto no se ha alcanzado. Si se supera este umbral, preferiblemente se comienza un nuevo chunk cuando sea semánticamente razonable o técnicamente posible. Puede ignorarse si el modelo detecta que es mejor combinar, siempre que se respete el límite estricto.
- overlap: si un elemento individual es demasiado grande y debe dividirse, este parámetro indica cuántos caracteres se solapan al final de un chunk y al principio del siguiente. Esto ayuda a mantener el contexto a través de las fronteras de los chunks.
- overlap_all: si se establece en True, el solapamiento no solo se aplica a elementos grandes divididos, sino a todos los chunks consecutivos.
Caso especial: tablas: las tablas (Table-elementos) siempre se tratan como chunks independientes y nunca se combinan con otros elementos. Si una tabla es demasiado grande, también se dividirá.
by_title
La estrategia by_title hereda todos los comportamientos básicos de la estrategia basic (como respetar max_characters) y añade tres reglas nuevas y decisivas:
La estrategia identifica elementos Title (encabezados) como inicio de una nueva sección. Cuando el algoritmo encuentra un encabezado, realiza la siguiente acción:
- El chunk actual se cierra inmediatamente.
- Se inicia un nuevo chunk comenzando con este elemento Title. Esto ocurre aunque el encabezado pudiera caber perfectamente en el chunk anterior.
Por defecto la estrategia no considera los saltos de página como una división estricta. Esto significa que una sección puede extenderse varias páginas sin dividirse en un nuevo chunk. Este comportamiento lo controla el parámetro multipage_sections=True (valor predeterminado).
A veces en los documentos textos muy cortos, como un único elemento de lista, se identifican erróneamente como elementos Title. Esto puede generar muchos chunks pequeños e indeseados. Para resolver este problema existe el parámetro combine_text_under_n_chars:
- Este parámetro permite combinar varias secciones pequeñas consecutivas en un solo chunk para rellenar mejor la ventana de chunking (max_characters).
- Por defecto el valor de combine_text_under_n_chars es el mismo que max_characters. Esto asegura que las secciones pequeñas se agreguen de manera eficiente.
- Con valor 0, cada sección, por pequeña que sea, identificada como Title se define como un nuevo chunk.
La estrategia by_title es la mejor opción para todos los documentos con una estructura clara y jerárquica, como informes, artículos de investigación, manuales o contratos.
Embedding
Tras extraer contenidos de documentos con la biblioteca de código abierto unstructured, un paso común posterior es convertir los elementos de texto extraídos en embeddings vectoriales. Estos vectores son la base para funciones de búsqueda semántica y generación aumentada por recuperación (RAG).
La biblioteca principal de unstructured no incluye funciones nativas para llamar a proveedores de embeddings. En su lugar existen dos métodos principales para generar embeddings a partir de las salidas de unstructured.
Método 1: El ecosistema Unstructured ofrece funcionalidad extendida mediante la línea de comandos Unstructured Ingest (CLI) y la biblioteca Python asociada. Estos componentes están diseñados para crear canalizaciones de procesamiento de extremo a extremo y ofrecen soporte integrado para la conexión con proveedores de embeddings.
En este enfoque, la generación de embeddings se integra perfectamente en el proceso de ingestión de datos (“Ingest Pipeline”). Esto permite la automatización completa del flujo de trabajo desde el documento en crudo hasta el embedding vectorial final. La información sobre la configuración está disponible en la documentación oficial.
Método 2: Un método alternativo es enriquecer manualmente los archivos JSON generados por unstructured. Este enfoque ofrece un alto grado de flexibilidad, especialmente en la elección del modelo de embeddings, y es adecuado para escenarios donde no se utiliza una canalización de ingestión completa.
El proceso sigue típicamente este esquema:
- Input: Un archivo JSON generado por la biblioteca unstructured sirve como fuente de entrada.
- Lectura: El contenido del archivo JSON se carga en memoria como un objeto estructurado.
- Generación de embeddings: Se utiliza una biblioteca de terceros, como sentence-transformers, para crear un embedding para el valor del campo text de cada elemento en el archivo JSON. Un ejemplo común es el modelo sentence-transformers/all-MiniLM-L6-v2 de Hugging Face.
- Enriquecimiento de datos: El embedding generado se inserta como un nuevo campo junto al campo text correspondiente en el objeto JSON.
- Almacenamiento: El objeto JSON modificado, con los embeddings añadidos, se escribe de nuevo en el archivo original o en uno nuevo.
Este enfoque ofrece control total sobre el proceso y puede integrarse en flujos de trabajo existentes basados en intercambio de archivos JSON.
