El Portal de las Tecnologías para la Innovación

Construyendo un Sistema Simple de Recuperación de Información Multimodal Basado en VLM con NVIDIA NIM

En el mundo actual basado en datos, la capacidad de recuperar información precisa incluso de cantidades modestas de datos es vital para los desarrolladores que buscan soluciones optimizadas y efectivas para implementaciones rápidas, creación de prototipos o experimentación. 

Uno de los desafíos clave en la recuperación de información es administrar las diversas modalidades en conjuntos de datos no estructurados, incluidos texto, archivos PDF, imágenes, tablas, audio, video, etc. 

Los modelos multimodales de IA abordan este desafío procesando simultáneamente múltiples modalidades de datos, generando una salida cohesiva y completa en diferentes formas. NIM NVIDIA los microservicios simplifican el despliegue seguro y confiable de la IA modelos de fundación para el lenguaje, visión por computadora, habla, biología y más. 

Los microservicios NIM se pueden implementar en la infraestructura acelerada por NVIDIA en cualquier lugar y exponer las API estándar de la industria para una rápida integración con aplicaciones y marcos de desarrollo de IA populares, incluidos LangChain y LlamaIndex.

Esta publicación te ayuda a comenzar a construir un modelo de lenguaje de visión (VLM) basado, multimodal, sistema de recuperación de información capaz de responder a consultas complejas que involucran texto, imágenes y tablas. Lo guiamos a través de la implementación de una aplicación utilizando LangGraph, el estado del arte llama-3.2-90b-visión-instruct VLM, el optimizado mistral-pequeño-24B-instruct modelo de lenguaje grande (LLM) y NVIDIA NIM para implementación.  

GTC 2025 NVIDIA

Este método de construcción de sistemas simples de recuperación de información ofrece varias ventajas sobre los tradicionales. El último microservicio VLM NIM permite una mejor comprensión contextual mediante el procesamiento de documentos visuales largos y complejos sin sacrificar la coherencia. La integración de Llamadas a herramientas de LangChaina permite al sistema crear herramientas, seleccionar y utilizar dinámicamente herramientas externas y mejorar la precisión de la extracción e interpretación de datos de diversas fuentes. 

Este sistema es bueno para aplicaciones empresariales porque genera salidas estructuradas, asegurando consistencia y confiabilidad en las respuestas. Para obtener más información sobre los pasos de implementación de este sistema, consulte el /NVIDIA/GenerativeAIExamples Repo gitHub.

Una simple tubería de recuperación multimodal HTML

El sistema consta de las siguientes tuberías: 

  • Ingestión y preprocesamiento de documentos: Ejecuta un VLM en las imágenes y las traduce en texto.
  • Pregunta-respuesta: Permite al usuario hacer preguntas sobre el sistema. 

Ambas tuberías integran NVIDIA NIM y LangGraph para procesar y comprender texto, imágenes, visualizaciones complejas y tablas de manera efectiva.

Tubería de ingestión y preprocesamiento de datos

Esta etapa analiza documentos para procesar texto, imágenes y tablas por separado. Las tablas se convierten primero en imágenes, y las imágenes son procesadas por el punto final de la API de microservicio NIM alojado en NVIDIA para que el VLM llama-3.2-90b-vision-instruct genere texto descriptivo. 

A continuación, en el paso de reconstrucción del documento, el texto descriptivo se fusiona con el texto original del documento, luego se resume en un LLM con modelado de contexto largo capacidad. En esta implementación, llama-3.2-90b-vision-instruct también se usa como LLM, aunque también se pueden implementar otros LLM como mistral-small-24b-instruct. 

Finalmente, el texto completo, los resúmenes, las imágenes y sus descripciones se almacenan en una base de datos NoSQL, junto con identificadores de documentos únicos.

Un diagrama muestra el microservicio VLM NIM que se utiliza para procesar imágenes y tablas para generar descripciones y un microservicio LLM NIM que se utiliza para el resumen de documentos.
Figura 1. Tubería de ingestión y preprocesamiento de datos

LLM con modelado de contexto largo puede procesar documentos completos sin fragmentación, mejorando la comprensión del documento en una sola pasada y capturando relaciones y matices en tramos más largos de texto, lo que lleva a una recuperación de información más precisa. 

Por el contrario, los modelos tradicionales pueden manejar entradas de hasta unos pocos miles de tokens, lo que requiere que los documentos largos se dividan en trozos más pequeños para que quepan dentro de la ventana de contexto de las modelaciones. Este proceso de procesamiento puede alterar la coherencia y el contexto, lo que dificulta la recuperación precisa y la clasificación de la información relevante. 

Sin embargo, el modelado de contexto largo presenta desafíos relacionados con la escalabilidad y el costo, que deben tenerse en cuenta al negociar con mayor precisión.

tubería QA

Todos los resúmenes de documentos y sus identificadores se compilan en un mensaje grande. Cuando se envía una consulta, a LLM con modelado de contexto largo (mistral-small-24b-instruct en este caso) procesa la pregunta, evalúa la relevancia de cada resumen para la consulta y devuelve los identificadores de los documentos más relevantes.

El diagrama muestra los pasos para pasar de una pregunta de los usuarios a la respuesta, incluida la recuperación de documentos y la generación de respuestas.
Figura 2. Oleoducto de respuesta a preguntas

A continuación, los documentos más relevantes se introducen en un LLM con un contexto largo (mistral-small-24b-instruct). El modelo genera una respuesta a la consulta basada en el contenido textual. Si el modelo identifica que una imagen puede contener información pertinente basada en su texto descriptivo, se activa un paso adicional: la imagen original y la pregunta de los usuarios se envían al VLM (llama-3.2-90b-vision-instruct), que puede proporcionar una respuesta basada en el contenido visual real. 

Finalmente, el sistema combina ideas textuales y visuales para ofrecer una respuesta integral.

Las salidas estructuradas aseguran que los datos devueltos por el modelo se ajusten a un formato predefinido, lo que facilita la extracción de información específica y la realización de operaciones posteriores. Por el contrario, las salidas no estructuradas o variables pueden introducir ambigüedades y dificultades para analizar las respuestas de los modelos, lo que dificulta la automatización y la integración con otros sistemas. 

La generación de datos estructurados a partir de modelos generalmente requiere instrucciones cuidadosamente diseñadas para guiar al modelo a responder en un formato particular, como JSON. Sin embargo, garantizar una adherencia constante a esta estructura puede ser un desafío debido a la tendencia natural de models’ a generar texto de forma libre. 

NVIDIA NIM ahora es compatible de forma nativa capacidades para generar salidas estructuradas. Esto significa que puede confiar en las funcionalidades integradas para asegurarse de que las respuestas de las modelaciones estén formateadas de manera consistente, lo que reduce la necesidad de una ingeniería rápida compleja.

Integración de NVIDIA NIM con LangGraph 

NVIDIA NIM ofrece una compatibilidad perfecta con marcos populares y los últimos modelos de IA para sus aplicaciones. La implementación de la tubería integra NVIDIA NIM con LangGraph, un marco para construir aplicaciones agentic para determinar el flujo de control, que ha sido ampliamente adoptado por la comunidad de desarrolladores. Para orquestar el flujo de trabajo de esta tubería, el gráfico consta principalmente de dos nodos: 

  • Nodo asistente: Sirve como agente responsable de gestionar la lógica y el proceso de toma de decisiones. Interactúa con las entradas de los usuarios e invoca las herramientas necesarias. 
  • Nodo de herramientas: Una colección de herramientas que realizan tareas específicas requeridas por el asistente.
El gráfico muestra el nodo asistente y el nodo de herramientas, que son iterativos entre el proceso _start_ y _end_.
Figura 3. Use LangGraph para construir un agente para la tubería

Nodo asistente 

El nodo asistente es un agente primario que opera de acuerdo con el flujo de trabajo descrito en la Figura 3. El código del agente principal se puede encontrar en el /NVIDIA/GenerativeAIExamples Repo gitHub. 

Aquí están las entradas del agente:

  • Collection_name: El conjunto de documentos en los que buscar.
  • Question: La pregunta de los usuarios. 
  • document_id: (Opcional) Si se proporciona, el agente omite la fase de clasificación del documento.

Este es el proceso del agente:

  • Selección de documentos: Si document_id no se proporciona, el agente invoca el find_best_document_id herramienta, que identifica el documento más relevante para la pregunta de los usuarios dentro de la colección especificada.
  • Pregunta respondiendo: Con document_id, el agente usa el query_document herramienta. Esta herramienta intenta responder a la pregunta utilizando el LLM (mistral-small-24b-instruct) basado en las descripciones de texto e imagen dentro del documento.
  • Análisis de imágenes (si es necesario): Si el query_document la herramienta indica que la respuesta podría estar en una imagen (devolviendo un image_hash valor), el agente invoca el query_image herramienta. Esta herramienta recupera la imagen real y utiliza un VLM para analizar la imagen y encontrar la respuesta.

Nodo de herramientas

Implementamos tres herramientas clave para que el agente realice sus tareas.

  • Find_best_document_id: Identifique el documento más relevante para la pregunta de los usuarios cuando document_id no se proporciona. Para obtener más información, consulte el /NVIDIA/GenerativeAIExamples Repo gitHub.
  • query_document: Busque una respuesta dentro del documento especificado. Si la respuesta puede estar en una imagen, proporciona detalles para consultar la imagen. Para obtener más información, consulte el /NVIDIA/GenerativeAIExamples Repo gitHub.
  • query_image: Analice la imagen real usando un VLM cuando la respuesta podría estar dentro del contenido de la imagen. Para obtener más información, consulte el /NVIDIA/GenerativeAIExamples.

Encuadernación de herramientas externas con modelos

Llamada de herramienta es una característica que permite a los modelos de lenguaje integrarse e interactuar con herramientas o funciones externas en función de las indicaciones que reciben. Este mecanismo permite a un modelo decidir qué herramientas usar y cómo usarlas para realizar tareas específicas. 

Encuadernación de herramientas permite que los modelos amplíen sus capacidades dinámicamente, seleccionando las herramientas apropiadas durante la ejecución para proporcionar respuestas más precisas y conscientes del contexto.

Las herramientas externas vinculantes son particularmente cruciales en los marcos de agentes, donde los agentes deben elegir las herramientas apropiadas y proporcionar los argumentos necesarios para realizar tareas de manera efectiva. Los beneficios de las herramientas externas vinculantes incluyen lo siguiente:

  • Capacidades extendidas: Los modelos pueden realizar operaciones complejas como cálculos, recuperación de datos o llamadas API, que van más allá de la mera generación de texto.
  • Selección dinámica de herramientas: El modelo puede evaluar en tiempo real qué herramientas son las más adecuadas para la tarea, mejorando la eficiencia y la relevancia.
  • Integración perfecta: NVIDIA NIM apoya la integración de herramientas externas, como LangChain y LangGraph, con modelos de comunidad abierta como Llama 3.3. Puede adoptar estas funciones avanzadas sin realizar cambios significativos en sus sistemas existentes. 

En esta implementación, use LangChainainss @decorador de herramientas para crear tres herramientas, utilice el .bind_herramientas método para enlazar las herramientas con modelos. 

Definición de salidas estructuradas con Pydantic

Definiendo el esquema de salida con Pidántico y guiando un microservicio LLM NIM como la instalación mistral-small-24b a través de indicaciones precisas, se asegura de que las respuestas sean consistentes, confiables y fácilmente consumibles por otros componentes dentro del sistema. Este enfoque es esencial cuando se integra el LLM en flujos de trabajo automatizados y marcos basados en agentes como LangGraph.

Definir la estructura

El proceso comienza definiendo la estructura de la salida que espera del LLM usando Pydantic. Esto garantiza que los datos devueltos por el modelo sean consistentes y se puedan analizar fácilmente procesamiento aguas abajo

fromtyping importList, Optionalfrompydantic importBaseModel, FieldclassDocument(BaseModel):"""Represents a document with an identifier and its summary."""id: str=Field(..., description="Hash identifier of the document")summary: str=Field(..., description="The summary of the document as is")classBestDocuments(BaseModel):"""Contains a list of the best documents to answer the question and their summaries."""documents: List[Document] =Field(..., description="List of best documents")classAnswer(BaseModel):"""Represents the answer to the user's question."""answer: str=Field(..., description="Answer to the question posed by the user")

A continuación, indique al LLM que genere salidas que se alineen con las estructuras Pydantic definidas. Esto se logra incorporando instrucciones específicas dentro del mensaje y utilizando LangChainays with_structured_output método.

Defina el mensaje

El prompt_document_expert contiene instrucciones detalladas para el LLM, especificando el formato de entrada esperado (Markdown con resúmenes de documentos) y el formato de salida requerido (JSON que coincide con el LLM BestDocuments esquema).

fromlangchain.chat_models importChatNVIDIAfromlangchain.prompts importChatPromptTemplate# Initialize the LLM with desired parametersllm =ChatNVIDIA(model="mistralai/mistral-small-24b-instruct", temperature=0, max_tokens=3000)# Define the prompt template for the document expertprompt_document_expert =ChatPromptTemplate.from_messages(                          "system"            f""" # Extract Best Document Identifier from list of summaries, based on a question coming from the user. You are an expert in getting insights of a document, based on its summaries and you are able to figure the best matches to the question in terms of the summary of the document.              Provide no more than 3 of these documents.            ## Format of the Input            - The input is a markdown file containing second level headers (##) with the chapter index in the form ## Document <document_id> where document_id is an integer pointing to the index of the document. After the document heading there is the summary of the document which is relevant to understand the content of the document.            ## Format of the output            - The output is going to be the list of the best documents indices and a few of the corresponding summaries that help to answer the question coming from the user.            ## Content            - Here is the input you can work on:                  {{documents_context}}                  """        ),                      "human"            "Can you tell me what are the most relevant document ids for this question: {question}"        ),          ("human", "Tip: Make sure to answer in the correct format"),      )

Preparar contexto

El get_context la función prepara los datos de entrada recuperando resúmenes de documentos y formateándolos adecuadamente.

defget_context(input_data: dict) -> dict      collection_name =input_data.get("collection_name"    question =input_data.get("question"      documents_context =get_document_summaries_markdown(collection_name)        # print(context)      return{"documents_context": documents_context,              "collection_name": collection_name,              "question": question}

Vincular la salida estructurada

El llm.with_structured_output(BestDocuments) el método instruye al LLM para producir una salida conforme a la BestDocuments Modelo pydantic. Este método maneja internamente el análisis y la validación de la respuesta LLMm, asegurando que la salida coincida con la estructura esperada.

LangChainin with_structured_output el método simplifica el proceso de unión del modelo para producir salidas estructuradas. Abstrae la complejidad de analizar y validar las respuestas LLMm, lo que le permite centrarse en definir la estructura de salida deseada y las instrucciones rápidas.

Finalmente, cree una cadena para procesar la entrada y generar la salida estructurada:

chain_document_expert =    RunnableLambda(get_context) | prompt_document_expert | llm.with_structured_output(BestDocuments) | (lambdax: x.dict())  )

Herramienta de extremo a extremo en acción

Para comenzar con el sistema de recuperación multimodal, clone el /NVIDIA/GenerativeAIExamples Repo de GitHub y siga la guía de Inicio rápido para configurar el servicio. Cuando esté en funcionamiento, abra su navegador web y navegue hasta http://localhost:7860 para acceder al sistema a través de la interfaz de usuario de Gradio.

Por ejemplo, explore cómo el sistema procesa las consultas en el Blog Técnico de NVIDIA. Haga una pregunta sobre un gráfico de barras que muestra el rendimiento de la GPU NVIDIA H100 de una de las publicaciones. El Seleccione Pregunta el campo es para fines de evaluación, con el Respuesta de la Verdad Fundamental valor de campo proporcionado por un ser humano.

Una captura de pantalla de la interfaz del agente muestra la pregunta, “¿Qué es la aceleración de inferencia H100 v3.0 en RetinaNet?” La respuesta de verdad fundamental es “54%” y la URL de verdad fundamental es una publicación de NVIDIA Technical Blog.
Figura 4. Evaluación de documentos múltiples del agente

Este sistema genera una respuesta precisa basada en el gráfico de barras y también muestra la imagen relevante como referencia, como el gráfico que muestra RetinaNet alcanzando el 54%. Esto garantiza respuestas precisas al tiempo que permite a los usuarios verificar visualmente los datos referenciados.

La captura de pantalla muestra el texto, "La aceleración de inferencia H100 v3.0 en RetinaNet es del 54%. Aquí está la imagen relevante que muestra las aceleraciones de inferencia para varios modelos:" y el gráfico de la publicación de origen.
Figura 5. Resultado del agente con gráfico de origen para verificación

https://www.youtube-nocookie.com/embed/z4g-juAaxRY?feature=oembed&iv_load_policy=3&modestbranding=1&rel=0&autohide=1&playsinline=0&autoplay=0Vídeo 1. Cómo Insertar Documentos HTML en una Colección Multimodal de Retriever Usando NVIDIA NIM

https://www.youtube-nocookie.com/embed/3tZVGJX9GMw?feature=oembed&iv_load_policy=3&modestbranding=1&rel=0&autohide=1&playsinline=0&autoplay=0Vídeo 2. Cómo Buscar Texto e Imágenes Dentro de una Colección Multimodal de Retriever Usando NVIDIA NIM

Desafíos y soluciones

A medida que aumentan los volúmenes de datos, también lo hace la complejidad de procesar y recuperar información relevante. Manejar grandes conjuntos de datos de manera eficiente es esencial para mantener el rendimiento y garantizar la satisfacción del usuario. En este sistema de recuperación de información, la gran cantidad de resúmenes de documentos puede exceder la ventana de contexto de incluso los modelos de contexto largo, lo que dificulta el procesamiento de todos los resúmenes en un solo mensaje.

El procesamiento de grandes volúmenes de datos también exige recursos computacionales considerables, lo que puede resultar en mayores costos y una mayor latencia. Optimizar la utilización de los recursos es crucial para ofrecer respuestas rápidas y precisas al tiempo que se minimizan los gastos innecesarios.

Solución de reordenamiento de documentos jerárquicos

Para abordar los desafíos de escalabilidad, implementamos un enfoque jerárquico en la fase inicial de clasificación del documento. En lugar de procesar todos los resúmenes de documentos simultáneamente, los dividimos en lotes manejables que se ajustan a la ventana de contexto de modelaciones. El proceso implica múltiples etapas:

  • Procesamiento por lotes: Los resúmenes se agrupan en lotes que el modelo puede manejar sin exceder las limitaciones de tamaño rápido.
  • Reclasificación intermedia: El modelo evalúa cada lote por separado, clasificando los documentos dentro de cada grupo.
  • Selección de los mejores candidatos: Los documentos más relevantes de cada lote se seleccionan para pasar a la siguiente etapa.
  • Reclasificación final: Los principales candidatos de todos los lotes se combinan y reevaluan para identificar el documento más relevante.

Teniendo en cuenta tanto la escalabilidad como las preocupaciones de costos, este enfoque jerárquico garantiza que todos los documentos se consideren sin exceder la capacidad de los modelos. No solo mejora la escalabilidad, sino que también aumenta la eficiencia al reducir sistemáticamente los documentos candidatos hasta que se identifique el más relevante.

Perspectivas futuras con modelos más pequeños

El uso de modelos de lenguaje, especialmente aquellos con capacidades de contexto largo, implica el procesamiento de una gran cantidad de tokens, lo que puede incurrir en costos significativos. Cada token procesado se suma al gasto general, lo que hace que la administración de costos sea una consideración crítica al implementar estos sistemas a escala.

La preocupación por el costo es realmente válida. Sin embargo, el panorama de los modelos de lenguaje está evolucionando rápidamente, con modelos más pequeños cada vez más capaces y eficientes. A medida que estos avances continúan, estos modelos más pequeños pueden ofrecer un rendimiento similar a una fracción del costo.

Conclusión

Esta publicación discutió la implementación de una tubería simple de recuperación de información multimodal que utiliza NVIDIA NIM y LangGraph. La tubería ofrece varias ventajas sobre los métodos de recuperación de información existentes: 

  • Comprensión mejorada de los documentos
  • Un modelo multimodal para extraer información de imágenes, tablas y texto
  • Integración perfecta de herramientas externas
  • Generación de resultados consistentes y estructurados

Usando NVIDIA NIM y LangGraph, puede construir sobre este trabajo y personalizarlo para satisfacer necesidades específicas. Para comenzar, puede encontrar el código fuente en el /NVIDIA/GenerativeAIExamples Repo gitHub. 

NIM NVIDIA también ofrece acceso a más modelos optimizados para GPU NVIDIA. Puedes explorar NeMo NVIDIA, un escalable IA generativa marco diseñado para investigadores y desarrolladores de PyTorch que trabajan en LLM, modelos multimodales y más.

Si está trabajando con grandes cuerpos de datos empresariales y está buscando desarrollar datos en tiempo real listos para la empresa sistemas de recuperación de información multilingüe e interlingüística para generar respuestas conscientes del contexto, aprenda más sobre NeMo Retriever NVIDIA.

Recursos relacionados

NVIDIA Blog. F. C., Z. M., D. G. e I. S. Traducido al español

Artículos relacionados

Scroll al inicio