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íaTipos 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
PDF.pdf
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

BibliotecaDescripción
ibmagic-devDetecta el tipo exacto de un archivo (por ejemplo, si es un PDF, un JPG, etc.).
poppler-utils und tesseract-ocrSe utilizan para el procesamiento de imágenes y PDFs, especialmente para el reconocimiento de texto (OCR).
tesseract-langProporciona los paquetes de idiomas necesarios para el reconocimiento de texto en idiomas adicionales.
libreofficeSirve para procesar e importar documentos en formato Microsoft Office (Word, PowerPoint, etc.).
pandocConvierte 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 documentoFunción de particiónEstrategiasSoporte de tablasOpciones
Archivos CSV (.csv)partition_csvN/ANinguna
Correos electrónicos (.eml)partition_emailN/ANoEncoding; Include Headers; Max Partition; Process Attachments
Correos electrónicos (.msg)partition_msgN/ANoEncoding; Max Partition; Process Attachments
Archivos EPUB (.epub)partition_epubN/AInclude Page Breaks
Documentos de Excel (.xlsx/.xls)partition_xlsxN/ANinguna
Páginas HTML (.html/.htm)partition_htmlN/ANoEncoding; Include Page Breaks
Imágenes (.png/.jpg/.jpeg/.tiff/.bmp/.heic)partition_image“auto”, “hi_res”, “ocr_only”Encoding; Include Page Breaks; Infer Table Structure; OCR Languages, Strategy
Markdown (.md)partition_mdN/AInclude Page Breaks
Org Mode (.org)partition_orgN/AInclude Page Breaks
Documentos de OpenOffice (.odt)partition_odtN/ANinguna
PDFs (.pdf)partition_pdf“auto”, “fast”, “hi_res”, “ocr_only”Encoding; Include Page Breaks; Infer Table Structure; Max Partition; OCR Languages, Strategy
Texto plano (.txt/.text/.log)partition_textN/ANoEncoding; Max Partition; Paragraph Grouper
Presentaciones PowerPoint (.ppt)partition_pptN/AInclude Page Breaks
Presentaciones PowerPoint (.pptx)partition_pptxN/AInclude Page Breaks
ReStructured Text (.rst)partition_rstN/AInclude Page Breaks
Archivos Rich Text (.rtf)partition_rtfN/AInclude Page Breaks
Archivos TSV (.tsv)partition_tsvN/ANinguna
Documentos de Word (.doc)partition_docN/AInclude Page Breaks
Documentos de Word (.docx)partition_docxN/AInclude Page Breaks
Documentos XML (.xml)partition_xmlN/ANoEncoding; Max Partition; XML Keep Tags
Archivos de código (.js/.py/.java/etc.)partition_textN/ANoEncoding; 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 JSONExplicació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_prob0.6857117414474487El “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_width1654El ancho total de la página del documento en la unidad del sistema indicado (aquí: píxeles).
metadata.coordinates.layout_height2339La 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_number1El 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 elementoDescripción
AddressUn elemento de texto para capturar direcciones físicas.
CodeSnippetUn elemento de texto para capturar fragmentos de código.
EmailAddressUn elemento de texto para capturar direcciones de correo electrónico.
FigureCaptionUn elemento para capturar texto de subtítulos de imágenes.
FooterUn elemento para capturar pies de página de documentos.
FormKeysValuesUn elemento para capturar pares clave-valor en un formulario.
FormulaUn elemento que contiene fórmulas en un archivo.
HeaderUn elemento para capturar encabezados de documentos.
ImageUn elemento de texto para capturar metadatos de imágenes.
ListItemListItem es un elemento NarrativeText que forma parte de una lista.
NarrativeTextNarrativeText 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.
PageBreakUn elemento para capturar saltos de página.
PageNumberUn elemento para capturar números de página.
TableUn elemento para capturar tablas.
TitleUn elemento de texto para capturar títulos.
UncategorizedTextElemento 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

NombreExplicación
bytes_string_to_stringConvierte 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.
cleanLa 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_bulletsElimina guiones o marcas de viñeta del inicio de un texto.
clean_dashesReemplaza varios tipos de guiones (p. ej. guión largo, guión corto) por un guión estándar.
clean_non_ascii_charsElimina 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_bulletsElimina viñetas ordenadas como “1.”, “a.)” o “i)” al inicio de un texto.
clean_postfixLa 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_prefixElimina un prefijo específico de un texto si está presente.
clean_trailing_punctuationElimina los signos de puntuación al final de un texto, pero mantiene los signos dentro del texto intactos.
group_broken_paragraphsUne 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_punctuationElimina todos los signos de puntuación, p. ej. , . ; ! ? de un texto.
replace_unicode_quotesReemplaza 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_textLa 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.

NombreExplicación
extract_datetimetzExtrae la fecha, la hora y la zona horaria de los campos “Received” de un archivo .eml (correo electrónico).
extract_email_addressEncuentra y extrae una o varias direcciones de correo electrónico de un texto.
extract_ip_addressExtrae direcciones IP de un texto.
extract_ip_address_nameExtrae los nombres asociados a las direcciones IP en los campos “Received” de un archivo .eml.
extract_mapi_idExtrae la “MAPI ID” de los campos “Received” de un archivo .eml.
extract_ordered_bulletsExtrae 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_afterExtrae 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_beforeExtrae el texto que aparece antes de un patrón o palabra específica.
extract_us_phone_numberExtrae un número de teléfono en formato de EE.UU. de un fragmento de texto.
group_broken_paragraphsUne 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_punctuationElimina 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_quotesReemplaza 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_textLa 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.

ConectorDescripción
Astra DBUna 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.
AzureSe 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 SearchUn 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.
BoxUna 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.
ChromaUna 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.
CouchbaseUna 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 VolumesUna 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 S3Permite 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 DatabricksAlmacena 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.
DropboxUn 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.
DuckDBUn 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.
ElasticsearchUn 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 StorageEl 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.dataUn 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.
KafkaApache 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.AIUna 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).
LanceDBUna 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.
LocalSe refiere a almacenar datos en el sistema de archivos local de la máquina donde se ejecuta el proceso.
MilvusUna 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.
MongoDBUna 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.
MotherDuckUn 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.
Neo4jUna 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.
OneDriveEl 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.
OpenSearchUn 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.
PineconeUna 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.
PostgreSQLUn 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.
QdrantUna 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.
RedisUna 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.
S3Amazon 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.
SFTPSSH 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.
SingleStoreUn 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.
SnowflakeUna 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.
SQLiteUn 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.
VectaraUna 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.
WeaviateUna 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.