¿Te imaginas un agente de inteligencia artificial que pueda analizar PDFs complejos, extraer tablas anidadas y visualizar datos en gráficos con la misma facilidad que leer un archivo de texto? Con NVIDIA Nemotron RAG, es posible crear una pipeline de procesamiento de documentos que maneje grandes volúmenes de trabajo con precisión.
Este artículo te guiará a través de los componentes esenciales de una pipeline de recuperación multimodal. Primero, aprenderás a utilizar la biblioteca NeMo Retriever para descomponer documentos complejos en datos estructurados mediante microservicios acelerados por GPU. Luego, integraremos estos datos en los modelos de Nemotron RAG para asegurar que tu asistente proporcione respuestas precisas y con trazabilidad.
Comencemos.
Enlaces rápidos a modelos y código
Accede a los siguientes recursos del tutorial:
Modelos en Hugging Face:
Endpoints en la nube:
Código y documentación:
Requisitos previos
Para seguir este tutorial, necesitarás lo siguiente:
Requisitos del sistema:
- Python 3.10 a 3.12 (probado en 3.12)
- GPU NVIDIA con al menos 24 GB de VRAM para implementación local del modelo
- 250 GB de espacio en disco (para modelos, conjuntos de datos y base de datos vectorial)
Acceso a la API:
Entorno de Python:
[project] name = "idp-pipeline" version = "0.1.0" description = "IDP Nemotron RAG Pipeline Demo" requires-python = "==3.12" dependencies = [ "ninja", "packaging", "wheel", "requests", "python-dotenv", "ipywidgets", # Utils "markitdown", "nv-ingest==26.1.1", "nv-ingest-api==26.1.1", "nv-ingest-client==26.1.1", # Ingest "milvus-lite==2.4.12", "pymilvus", "openai>=1.51.0", # Base de datos & API "transformers", "accelerate", "pillow", "torch", "torchvision", "timm" # Núcleo de ML ]
Tiempo requerido:
Una a dos horas para la implementación completa (más tiempo si compilas dependencias optimizadas para GPU como flash-attn)
Lo que obtendrás: Una pipeline multimodal RAG lista para producción
El tutorial está disponible como un Notebook Jupyter lanzable en GitHub para experimentación práctica. A continuación, se presenta un resumen del proceso de construcción.
- Desbloqueo de datos atrapados: El proceso comienza utilizando la biblioteca NeMo Retriever para extraer información de documentos complejos.
- Orquestación consciente del contexto: Usando una arquitectura de microservicios, la pipeline descompone documentos y optimiza los datos para modelos Nemotron RAG, creando un sistema de alta velocidad y consciente del contexto.
- Transformación de alto rendimiento: Al escalar la carga de trabajo con computación acelerada por GPU y microservicios NIM, se transforman grandes conjuntos de datos en inteligencia buscable en paralelo.
- Alta precisión en la recuperación: Los datos refinados se alimentan a Nemotron RAG, permitiendo que el agente de IA localice tablas o párrafos exactos para responder consultas complejas con alta fiabilidad.
- Fiabilidad fundamentada en la fuente: La integración final conecta la salida de recuperación en un asistente que proporciona respuestas “fundamentadas en la fuente”, ofreciendo citas transparentes de vuelta a la página o gráfico específico.
Por qué el OCR tradicional y el procesamiento solo de texto fallan en documentos complejos
Antes de construir tu pipeline, es fundamental entender los desafíos que la extracción de texto estándar no logra resolver:
- Complejidad estructural: Los documentos contienen matrices y tablas donde las relaciones entre datos son críticas. Los analizadores PDF estándar fusionan columnas y filas, destruyendo la estructura.
- Contenido multimodal: La información crítica se encuentra en gráficos y diagramas que los analizadores solo de texto no capturan. Las tendencias de rendimiento y los resultados diagnósticos requieren comprensión visual.
- Requerimientos de citación: Las industrias reguladas exigen citas precisas para auditorías. Las respuestas necesitan referencias trazables, no solo hechos sin procedencia.
- Lógica condicional: Las reglas “si-entonces” a menudo abarcan múltiples secciones. Comprender estas lógicas requiere preservar la jerarquía del documento.
Estos desafíos explican por qué Nemotron RAG utiliza modelos de extracción especializados.
Consideraciones clave para implementaciones de procesamiento de documentos inteligentes
Al construir tu pipeline, estos factores determinan la viabilidad en producción:
- Compensaciones del tamaño de fragmentos: Fragmentos más pequeños permiten recuperaciones precisas, pero pueden perder contexto. Fragmentos más grandes preservan contexto, pero reducen la precisión.
- Profundidad de extracción: Decide si segmentar el contenido por página o mantener documentos completos. La segmentación por página permite citas precisas, mientras que la segmentación por documento mantiene el flujo narrativo.
- Formato de salida de tablas: Convertir tablas a markdown preserva relaciones de filas/columnas, reduciendo las alucinaciones numéricas.
- Modo de biblioteca vs. modo contenedor: El modo de biblioteca es adecuado para desarrollo y documentos pequeños. Las implementaciones en producción requieren modo contenedor para escalar horizontalmente.
Estas elecciones de configuración impactan directamente en la precisión de recuperación.
Componentes de una pipeline multimodal RAG
Tu pipeline de procesamiento de documentos inteligentes consta de tres etapas principales antes de generar respuestas citadas a tus preguntas.
Etapa 1: Extracción (Extracción de elementos de página, tablas y gráficos)
- Entrada: Archivos PDF
- Salida: JSON con elementos estructurados: fragmentos de texto, tablas en markdown, imágenes de gráficos
- Funciona: En biblioteca, autoalojado (Docker) y/o cliente remoto
Etapa 2: Embedding (llama-nemotron-embed-vl-1b-v2)
- Entrada: Elementos extraídos (texto, tablas, imágenes)
- Salida: Vectores de 2048 dimensiones por elemento y contenido original
- Capacidad clave: Multimodal—codifica texto, imágenes o ambos
- Funciona: Localmente en tu GPU o remotamente en NIM (pronto)
Etapa 3: Re-ranking (llama-nemotron-rerank-vl-1b-v2)
- Entrada: Candidatos de mayor puntuación de la búsqueda de embedding
- Salida: Lista ordenada (mayor relevancia primero)
- Capacidad clave: Cross-encoder; analiza (consulta, documento, imagen opcional) juntos
- Funciona: Localmente en tu GPU o remotamente en NIM (pronto)
- Importancia: Filtra resultados que parecen similares pero son incorrectos.
Generación de respuestas una vez configurada la pipeline:
Generación (Llama-3.3-Nemotron-Super-49B)
- Entrada: Documentos de mayor puntuación + pregunta del usuario
- Salida: Respuesta fundamentada y citada
- Capacidad clave: Sigue un prompt estricto para citar fuentes y admitir incertidumbre
- Funciona: Localmente o NIM en build.nvidia.com

Código para construir cada componente de la pipeline
Prueba el código inicial para cada parte de la pipeline de procesamiento de documentos.
La extracción convierte un PDF de “pixeles y diseño” en unidades estructuradas, ya que los modelos de recuperación y razonamiento posteriores no pueden operar de forma fiable en coordenadas de página en bruto y texto aplanado. La biblioteca NeMo Retriever preserva la estructura del documento (las tablas permanecen como tablas) usando capacidades de extracción especializadas.
# Iniciar nv-ingest (Modo Biblioteca) y conectar un cliente local (SimpleClient en el puerto 7671). print("[INFO] Iniciando Pipeline de Ingesta (Modo Biblioteca)...") run_pipeline(block=False, disable_dynamic_scaling=True, run_in_subprocess=True, quiet=True) time.sleep(15) # warmup client = NvIngestClient( message_client_allocator=SimpleClient, message_client_port=7671, # Puerto predeterminado de LibMode message_client_hostname="localhost" ) # Enviar un trabajo de extracción: mantener tablas como Markdown + recortar gráficos (para RAG multimodal). ingestor = (Ingestor(client=client) .files([PDF_PATH]) .extract( extract_text=True, extract_tables=True, extract_charts=True, # recortes de gráficos extract_images=False, # centrarse en gráficos/tablas extract_method="pdfium", table_output_format="markdown" ) ) job_results = ingestor.ingest() extracted_data = job_results[0]
Embedding
Embedding convierte cada elemento extraído en un vector de tamaño fijo para búsquedas de similitud en grandes colecciones de documentos. Usar un embebedor multimodal es clave para desbloquear PDFs visuales. Cada elemento se indexa en Milvus como un vector de 2,048 dimensiones.
# Contrato de DB vectorial: vectores de 2048 dimensiones + carga/metadata original almacenada en Milvus. HF_EMBED_MODEL_ID = "nvidia/llama-nemotron-embed-vl-1b-v2" COLLECTION_NAME = "worldbank_peru_2017" MILVUS_URI = "milvus_wb_demo.db" milvus_client = MilvusClient(MILVUS_URI) if milvus_client.has_collection(COLLECTION_NAME): milvus_client.drop_collection(COLLECTION_NAME) milvus_client.create_collection(collecti, dimension=2048, auto_id=True) # Codificación multimodal: texto, imagen o ambos. with torch.inference_mode(): if modality == "image_text": emb = embed_model.encode_documents(images=[image_obj], texts=[content_text]) elif modality == "image": emb = embed_model.encode_documents(images=[image_obj]) else: emb = embed_model.encode_documents(texts=[content_text]) # (Notebook luego L2-normaliza emb[0] e inserta {vector, texto, página, tipo, tiene_imagen, image_b64, ...} en Milvus.)
Re-ranking
Re-ranking es la capa de precisión aplicada después de la recuperación de embedding. Un reranker multimodal es especialmente valioso para PDFs empresariales porque puede juzgar relevancia utilizando tablas y figuras. En el notebook, el re-ranking comienza desde los resultados de Milvus y continúa a través de un bucle de puntuación.
# Etapa 1: embed query -> recuperar de Milvus (alta recuperación). with torch.no_grad(): q_emb = embed_model.encode_queries([query])[0].float().cpu().numpy().tolist() hits = milvus_client.search( collecti, data=[q_emb], limit=retrieve_k, output_fields=["text", "page", "source", "type", "has_image", "image_b64"] )[0] # Etapa 2: VLM cross-encoder rerank (query + doc_text + optional doc_image) (alta precisión). batch = rerank_inputs[i:i+batch_size] # lista de {"question","doc_text","doc_image"} dicts (construido a partir de hits) inputs = rerank_processor.process_queries_documents_crossencoder(batch) inputs = {k: v.to("cuda") if isinstance(v, torch.Tensor) else v for k, v in inputs.items()} with torch.no_grad(): logits = rerank_model(**inputs).logits.squeeze(-1).float().cpu().numpy() # (Notebook luego adjunta logits como scores y ordena valid_hits descendente.)
Próximos pasos para optimizar la recuperación
Con tu pipeline de procesamiento de documentos inteligente en funcionamiento, el camino hacia la producción está abierto. Esta arquitectura es escalable y flexible, permitiéndote conectar nuevas fuentes de datos a la biblioteca NeMo Retriever.
Conforme tu biblioteca de documentos crezca, esta arquitectura servirá como base para construir sistemas multi-agente que comprendan las sutilezas de tu conocimiento empresarial. Puedes encontrar más información sobre cómo Justt aprovechó Nemotron.
Mantente al tanto de NVIDIA Nemotron suscribiéndote a noticias de NVIDIA y siguiendo a NVIDIA AI en LinkedIn, X, Discord, y YouTube.


