Los sistemas agénticos revisten especial importancia en el diseño de los sistemas de IA actuales, gracias a su capacidad para adaptarse con precisión a las solicitudes de los usuarios y utilizar las herramientas adecuadas para resolver un problema. En ILLUIN Technology, estudiamos y diseñamos estos sistemas en particular utilizando nAIxt, nuestra plataforma de IA generativa de bajo código.
Hoy exploramos cómo los métodos de recuperación visual, como ColPali, pueden mejorar significativamente los sistemas de generación aumentada por recuperación (RAG), especialmente cuando se integran en entornos agenticos. Estos avances mejoran la calidad de la recuperación, aunque a costa de un mayor tiempo de cálculo durante las pruebas.
¡Nuestra herramienta está disponible en HuggingFace!
Comprender RAG
La generación aumentada por recuperación (RAG) mejora las capacidades de los modelos de lenguaje grandes (LLM) mediante la recuperación de información externa relevante para respaldar el proceso de generación. Los sistemas RAG tradicionales suelen:
- Recuperar el contexto relevante de un corpus de conocimientos basado en la consulta de un usuario.
- Añade este contexto a la consulta original.
- Reenvíe la consulta enriquecida a un LLM para generar la respuesta. A continuación se muestra una ilustración de un proceso RAG estándar:
El auge del RAG visual
Una interesante ampliación de RAG es Visual RAG, especialmente útil en escenarios de control de calidad de documentos. Los métodos tradicionales de control de calidad de documentos suelen basarse en complejos procesos que incluyen el reconocimiento óptico de caracteres (OCR) y la detección del diseño de documentos. Sin embargo, el reciente artículo ColPali: Efficient Document Retrieval with Vision Language Models ( ColPali: recuperación eficiente de documentos con modelos de lenguaje visual) demuestra cómo los modelos de lenguaje visual (VLM), como ColPali, pueden agilizar este proceso al incorporar directamente capturas de pantalla de las páginas de los documentos, lo que elimina la necesidad de procesos de extracción de texto. Esto conduce a una mayor eficiencia computacional y a un mejor rendimiento general de la recuperación.
Limitaciones de los sistemas RAG actuales
A pesar de estos avances, los sistemas RAG tradicionales (visuales o textuales) siguen enfrentándose a limitaciones notables:
- Sensibilidad de las consultas: los sistemas son demasiado sensibles a la redacción de las consultas, lo que puede hacer que se pierda información relevante si el estilo de la consulta difiere del contenido del corpus.
- Recuperación de un solo salto: los sistemas RAG típicos solo realizan un paso de recuperación, lo que limita su capacidad para gestionar consultas complejas que requieren información de varias secciones de documentos (por ejemplo, referencias a varias tablas o definiciones dispersas). Los intentos anteriores para abordar estos retos solo han proporcionado mejoras marginales.
Entrar en Agentic RAG
Una solución prometedora a estas limitaciones consiste en integrar los recuperadores en marcos agenticos:
En entornos agenticos, los sistemas RAG ganan una flexibilidad significativa:
- Procesamiento interactivo de consultas: los agentes reformulan dinámicamente las consultas en múltiples subconsultas.
- Recuperación iterativa: los agentes realizan múltiples rondas de recuperación, sintetizando progresivamente la información hasta obtener una respuesta completa y satisfactoria.
- Uso de herramientas externas: los agentes pueden utilizar herramientas externas, como búsquedas web, y también pueden generar y ejecutar código, lo que les permite realizar operaciones matemáticas, producir gráficos, etc. Este enfoque iterativo e impulsado por agentes garantiza respuestas más ricas, profundas y contextualmente precisas, lo que mejora significativamente los sistemas Visual RAG como ColPali.
Diseño de un agente RAG visual
Construyamos paso a paso un agente RAG visual sencillo utilizando smolagents.
Los agentes operan de manera eficaz utilizando herramientas especializadas adaptadas a sus objetivos. Para demostrarlo, hemos creado una herramienta Visual RAG específica.
Concretamente, construimos nuestra herramienta creando una clase personalizada que hereda de smolagents.Tool.
Primero definimos la clase y sobrescribimos el setup Método utilizado para preparar la herramienta antes de su uso.
class VisualRAGTool(Tool):
name = "visual_rag"
description = """Performs a RAG query on your internal PDF documents and returns the generated text response."""
inputs = {...}
output_type = "string"
def _init_models(self, model_name: str) -> None:
import torch
from colpali_engine.models import ColQwen2, ColQwen2Processor
self.device = "cuda" if torch.cuda.is_available() else "cpu"
# Init the model and processor
self.model = ColQwen2.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
device_map="auto",
attn_implementation="flash_attention_2"
).eval()
self.processor = ColQwen2Processor.from_pretrained(model_name)
def setup(self):
"""
Overwrite this method here for any operation that is expensive and needs to be executed before you start using your tool. Such as loading a big model.
"""
# Init the models
self._init_models(self.model_name)
# Initialize the DBs
self.embds = []
self.pages = []
self.is_initialized = True
A continuación, definimos nuestro método de indexación creando una función, index, que rellena los atributos self.pages y self.embds.
def index(self, files: list, contextualize: bool = True, api_key: str = None) -> int:
"""Indexes the uploaded files."""
if not self.is_initialized:
self.setup()
# Convert files to images and extract metadata
pgs = self.preprocess(files, contextualize=contextualize, api_key=api_key or self.api_key)
# Embed the images
embds = self.compute_embeddings(pgs)
# Extend the pages
self.pages.extend(pgs)
self.embds.extend(embds)
return len(embds)
Aquí preprocess se encarga de convertir archivos al tipo Page que representan una imagen de página de documento junto con metadatos. A continuación, las páginas se incrustan y almacenan en los atributos.
⚠️ Aquí utilizamos una estrategia muy básica. ¡El indexado mediante una VectorDB en lugar de matrices podría mejorar el rendimiento de la herramienta!
Por último, debemos definir la función principal de la herramienta: forward.
En nuestro caso, forward es la función que ejecuta todo el proceso RAG y devuelve la respuesta LLM.
def forward(self, query: str, k: int = 1, api_key: str = None) -> str:
assert isinstance(query, str), "Your search query must be a string"
# Retrieve the top k documents and generate response. We return the second element of the tuple only (the RAG answer)
return self.search(
query=query,
k=k,
api_key=api_key
)[1]
def search(self, query: str, k: int = 1, api_key: str = None) -> tuple:
"""Searches for the most relevant pages based on the query."""
# Retrieve the top k documents
context = self.retrieve(query, k)
# Generate response from GPT-4o-mini
rag_answer = self.generate_answer(
query=query,
docs=context,
api_key=api_key
)
return context, rag_answer.content
Tenga en cuenta que utilizamos una función intermedia, search, para acceder al contexto recuperado. Sin embargo, la clase Tool solo permite devolver un tipo.
Herramienta Visual RAG en acción
¡Probemos nuestra herramienta!
En primer lugar, indexamos todo nuestro corpus de documentos utilizando ColQwen2. A continuación, cuando el sistema recibe una consulta en tiempo de ejecución, utiliza ColQwen2 para recuperar las k páginas de documentos más relevantes. Estas páginas recuperadas, junto con algún contexto adicional, se envían a GPT-4o-mini, que genera una respuesta textual que responde directamente a la consulta del usuario. Se presta especial atención a garantizar que GPT-4o-mini cite con precisión las páginas y documentos exactos utilizados en la formulación de cada respuesta. Nuestra herramienta está disponible en HuggingFace. Ilustremos esto con un ejemplo práctico utilizando una revista juvenil publicada por la Comisión Europea que describe la ciencia del cambio climático.
Así de fácil es utilizarlo:
from smolagents import load_tool
# Load the visual RAG tool
visual_rag_tool = load_tool(
"vidore/visual-rag-tool",
trust_remote_code=True,
api_key="YOUR_OPENAI_KEY"
)
# Index the PDF document
visual_rag_tool.index(["./report.pdf"])
# Query the tool
visual_rag_tool("What share of the world's water is suitable for human consumption?", k=3)
Y aquí está la respuesta informativa que obtuvimos:
Solo el 2,5 % del agua de la Tierra es agua dulce. De esta agua dulce, más de dos tercios están congelados en glaciares y casquetes polares, lo que la hace en gran medida inaccesible para el consumo. Por lo tanto, la proporción de agua que es fácilmente apta para el consumo humano es mínima [1, p. 11].
Fuentes:
[1] climate_youth_magazine.pdf
Como se ha demostrado, la herramienta Visual RAG ofrece respuestas precisas, citando con exactitud sus fuentes. No dude en seguir experimentando con diferentes números de páginas recuperadas (k) para contextualizar.
Integración de la herramienta en un marco agentivo
DeepSearch es un marco de inteligencia artificial emergente en el que los agentes realizan tareas de investigación complejas y de varios pasos para responder de forma exhaustiva a las consultas de los usuarios. Cuando un agente recibe una consulta, elabora un plan estructurado, desglosando la pregunta y ejecutando estratégicamente búsquedas en diversas fuentes fiables y herramientas externas.
Una dirección particularmente atractiva es la integración de nuestra herramienta Visual RAG en un marco DeepSearch. La principal ventaja de combinar Visual RAG con agentes de orquestación que tienen un mayor grado de agencia es que son capaces de desglosar la consulta del usuario y resolver de forma independiente todos los pasos necesarios para producir respuestas complejas que respeten todas las restricciones necesarias.
Así es como podría verse una configuración de DeepSearch mejorada con Visual RAG:
En esta configuración, el agente de control de calidad actúa como coordinador, gestionando las consultas entrantes y planificando la mejor manera de responder a la consulta mediante la interacción con nuestra herramienta visual RAG y junto con dos agentes especializados:
- Agente verificador web: compara la información obtenida internamente con fuentes web externas y le asigna una puntuación de confianza para garantizar su precisión y fiabilidad.
- Formatter Agent: Mejora las respuestas para que sean más claras y legibles, estructurándolas de manera eficaz para el usuario y visualizando potencialmente información clave sobre los datos.
Creación del agente de control de calidad utilizando smolagents
Implementamos este orquestador utilizando el marco fácil de usar. smolagents. A continuación, te explicamos cómo configurarlo de forma práctica conectando nuestra herramienta Visual RAG Tool, creada anteriormente:
from smolagents import CodeAgent, DuckDuckGoSearchTool
from smolagents import OpenAIServerModel
gpt_4o_mini = OpenAIServerModel(
model_id="gpt-4o-mini",
api_base="https://api.openai.com/v1",
api_key="YOUR_API_KEY",
)
# Define the verifier agent
VERIFIER_AGENT = CodeAgent(
tools=[
DuckDuckGoSearchTool(),
],
model=gpt_4o_mini,
max_steps=6,
verbosity_level=2,
planning_interval=3,
name="verifier",
description=\
"""This agent takes the user query as an input, associated information and context found by the previous agent, and must output a response that confirms the veracity of the previous agent's response using web searches.
The verifier should provide a confidence score (high, medium, low) and a textual explanation of the confidence score.
If the verifier cannot find relevant information, it should state it as 'unverified'."""
)
# Define the formatter agent
FORMATTER_AGENT = CodeAgent(
tools=[
DuckDuckGoSearchTool(),
],
model=gpt_4o_mini,
max_steps=3,
verbosity_level=2,
planning_interval=1,
name="formatter",
description=\
"""This agent takes the agent's response as an input and must output a formatted response that is easy to read and understand.
The response should follow the user's specifications and be as clear as possible.
The agent can ask for additional information if needed."""
)
Con ellos, podemos definir nuestro QA_AGENT donde utilizamos el visual_rag_tool creado anteriormente.
gpt_4o = OpenAIServerModel(
model_id="gpt-4o",
api_base="https://api.openai.com/v1",
api_key="YOUR_API_KEY",,
)
# Define the QA Agent
QA_AGENT = CodeAgent(
name="qa_agent",
description=\
"""The agent takes a user query as input and is tasked with providing a detailed response to the query.
It uses internal documents via the RAG Tool as its first source of informations to answer the questions. It can use external sources (such as web searches) only as a fallback when no relevant information is found within the internal sources.
Once the agent has gathered the information, it will assess the confidence level in the sources found using the `verifier` agent. This confidence score will be included in the final response to give the user an understanding of how reliable the provided information is.
The final response should be detailed and cite the information sources. It should follow the format specified by the user using the `formatter` agent.""",
tools=[
visual_rag_tool,
DuckDuckGoSearchTool(),
],
managed_agents=[
VERIFIER_AGENT,
FORMATTER_AGENT
],
model=gpt_4o,
max_steps=10,
verbosity_level=2,
planning_interval=3,
add_base_tools=True,
additional_authorized_imports=["pandas", "seaborn", "numpy", "matplotlib", "PIL", "io"],
)
Algunos comentarios al respecto:
DuckDuckGoSearchTooles la herramienta para realizar búsquedas en línea. Funciona con el navegador web. DuckDuckGo- El
descriptioncampo de laCodeAgentLa clase es crucial, ya que describe cuál es el propósito del agente en el ecosistema. Ayuda a otros agentes a planificar las llamadas a este último. max_stepslimita el número de pasos de búsqueda para el agente, mientras queplanning_intervaldefine el intervalo en el que el agente ejecutará un paso de planificación. No dude en modificarlos según sus necesidades.- Seleccionamos
gpt-4oygpt-4o-minicomo nuestros LLM principales para los agentes, pero no dude en utilizar cualquier modelo compatible con smolagents.
Ahora veamos cómo funciona el sistema. Utilizamos la misma consulta que le hicimos anteriormente a la herramienta RAG.
Salida:
The answer is much more detailed than with the tool only! - The agent used a step to estimate the percentage of water suitable for consumption (<1%) given that 2.5% is fresh water among which more than 2/3 is trapped in ice. - The verifier provided external sources to validate the findings along with a confidence label. Now let's use the agent memory and capabilities to create plots to ask it to produce a plot based on the answer.Con referencias a fuentes internas y externas, se ha determinado que menos del 1 % del agua total de la Tierra es apta para el consumo humano. Esta fracción se deriva del hecho de que solo el 2,5 % del agua de la Tierra es dulce, y la mayor parte de ella está atrapada en glaciares, casquetes polares o aguas subterráneas inaccesibles [1]. Fuentes externas corroboran este dato, sugiriendo que solo entre el 0,5 % y el 1 % del agua total de la Tierra puede utilizarse para el consumo humano. La conclusión es muy fiable, con un alto índice de confianza, tal y como ha verificado la tarea de verificación.
Fuentes
- Revista Climate Youth. «Disponibilidad de agua: hechos e impactos». Documento PDF, p. 11.
- Oficina de Recuperación de los Estados Unidos. «Datos sobre el agua: suministro mundial de agua». Consultado en octubre de 2023. https://www.usbr.gov/mp/arwec/water-facts-ww-water-sup.html
- World Water Reserve. «¿Cuál es el porcentaje de agua potable en la Tierra?». Consultado en octubre de 2023. https://worldwaterreserve.com/percentage-of-drinkable-water-on-earth/
Conclusión
Se estima que la proporción de agua apta para el consumo humano en el mundo oscila entre el 0,5 % y el 1 %. Dada la solidez de las fuentes citadas y el proceso de verificación aplicado, la respuesta tiene un alto grado de precisión y credibilidad, lo que confirma la proporción relativamente pequeña de agua disponible para el uso humano en comparación con las vastas reservas presentes en la Tierra.
Aquí está el gráfico que generó:
La trama es precisa, según la fuente interna. Sin embargo, podría mejorarse considerablemente con una indicación más detallada y refinada. Por ejemplo, el modelo encontró datos relevantes en línea, pero no los utilizó en su trama para centrarse únicamente en fuentes internas.
Reflexiones finales
La integración de la recuperación visual en un marco DeepSearch impulsado por agentes con verificación de fuentes tiene un potencial significativo. Este enfoque aborda las limitaciones clave del RAG tradicional, como la sensibilidad a las consultas y la recuperación de un solo salto, utilizando un agente como coordinador. El agente puede refinar automáticamente las consultas RAG, verificar las fuentes y presentar los resultados de forma estructurada.
Sin embargo, este enfoque dista mucho de ser perfecto... Los sistemas agenticos tienden a ser más lentos, pueden quedarse atascados en bucles innecesarios y desviarse de la intención original del usuario. El orquestador parece muy sensible a las indicaciones. A medida que los modelos subyacentes se desarrollen y mejoren, esperamos que estos problemas se mitiguen.
Esta entrada del blog muestra nuestro rápido viaje introductorio al RAG visual, ¡pero esto es solo el principio! Te animamos a que pruebes la herramienta por ti mismo y crees agentes personalizados para tus distintos casos de uso. No dudes en compartir tus experimentos con nosotros, ¡estamos deseando ver lo que creas!
Contacto
Si eres un profesional interesado en debates y proyectos más profundos sobre Visual RAG, ColPali o sistemas agenciales, no dudes en ponerte en contacto con contact@illuin.tech y comunicarte con nuestro equipo de expertos de ILLUIN, que pueden ayudarte a acelerar tus iniciativas de IA.











