Los modelos de lenguaje de gran tamaño (LLM) y sus variantes mejoradas, los modelos de lenguaje aumentado (ALM), se han convertido en la columna vertebral de los sistemas de IA modernos. Al combinar una potente generación de lenguaje con técnicas externas de recuperación de conocimiento, como la generación aumentada por recuperación (RAG), permiten el razonamiento avanzado, la respuesta a preguntas y la automatización de tareas en diversos dominios. Sin embargo, a pesar de sus notables capacidades, estos modelos a menudo se enfrentan a desafíos como la robustez inconsistente en todos los sistemas, el alto uso de token, los tiempos de respuesta lentos y las ineficiencias causadas por las indicaciones repetitivas y el contexto redundante, al abordar tareas complejas. Estas limitaciones aumentan los costes operativos y dificultan la escalabilidad y el rendimiento en tiempo real.
Para superar estos problemas, el marco ReWOO (razonamiento sin observación) ofrece un enfoque que se centra en desacoplar el razonamiento de la recuperación de conocimiento externo. En lugar de que un único LLM intente razonar, actuar y observar de forma intercalada, ReWOO separa estas preocupaciones en módulos distintos, cada uno potencialmente impulsado por un LLM pero con una función específica. Al modular el proceso en distintas etapas de planificación, recopilación de pruebas y síntesis, ReWOO mejora la eficiencia y precisión de los tokens. También facilita la depuración del sistema y permite flujos de trabajo de IA más ágiles y eficaces.
El flujo de trabajo de ReWOO gira en torno a tres componentes clave: razonamiento paso a paso, llamadas a herramientas y resumen. Estos componentes se implementan en una estructura modular que consta de tres partes: el planificador, el trabajador y el solucionador.
El planificador divide la tarea principal en una secuencia de subpreguntas específicas, creando un plan claro. En lugar de pedir al LLM que responda a una pregunta compleja de una vez que puede conducir a un uso abrumador de tokens y respuestas confusas, el planificador crea un plan o una hoja de ruta. Este desglose por pasos guía el flujo de trabajo y mantiene estructurado el proceso de razonamiento.
El trabajador llama a herramientas externas, como motores de búsqueda o bases de datos, para recuperar información relevante y pruebas necesarias para responder a las subpreguntas. Utiliza el LLM para formular respuestas claras y concisas basadas únicamente en esta información recuperada. Esta fase de observación externa se mantiene separada del proceso de razonamiento para evitar la repetición innecesaria de instrucciones y reducir el consumo de tokens.
El solucionador sintetiza todos los conocimientos recopilados para generar una respuesta final fresca y bien estructurada. Esta separación modular ayuda a garantizar un razonamiento eficiente, preciso y escalable con grandes modelos de lenguaje.
Los marcos como LangChain y LangGraph proporcionan herramientas potentes para implementar la arquitectura ReWOO mediante el uso de modelos de OpenAI, IBM Granite o herramientas especializadas como Serper y Tavily para la búsqueda.
En este tutorial, explorará cómo crear un agente ReWOO que realice la tarea de resumen de contenido. Este agente puede:
Esta arquitectura es útil para:
Este tutorial paso a paso aprovecha las tecnologías de IA de vanguardia, que incluyen:
Este tutorial le guía a través de la configuración de su entorno de desarrollo local para ejecutar una canalización de razonamiento al estilo ReWOO mediante Jupyter Notebook. Utilizará el modelo de lenguaje IBM Granite y Serper.dev para la recuperación de búsquedas web en vivo.
Nota: No se requiere GPU, pero la ejecución puede ser más lenta en sistemas basados en CPU. Este paso abre un entorno de Notebook donde puede copiar el código de este tutorial. Este tutorial también está disponible en GitHub.
Estas bibliotecas son necesarias para ejecutar la canalización ReWOO e interactuar con herramientas externas:
transformers: carga y ejecuta el modelo de lenguaje de gran tamaño IBM Granite.
torch: un marco de deep learning necesario para ejecutar el modelo de manera eficiente.
accelerate: optimiza el rendimiento del modelo en todo el hardware (opcional).
requests: Envía solicitudes HTTP POST a API externas (como Serper).
En este paso, importe las bibliotecas de Python necesarias para crear los componentes principales de la canalización de ReWOO.
transformers.AutoTokenizer: carga el tokenizador que convierte el texto en tokens compatibles con el modelo de lenguaje.
transformers.AutoModelForCausalLM: carga el modelo de lenguaje previamente entrenado IBM Granite para generar respuestas.
transformers.pipeline: proporciona una interfaz de alto nivel para crear rápidamente un pipeline de generación de texto utilizando el tokenizador y el modelo.
En este paso, cargamos el modelo de lenguaje IBM Granite e inicializamos un pipeline de generación de texto utilizando la biblioteca de transformadores de Hugging Face. Explore el modelo Granite 3.2 2B Instruct en Hugging Face aquí.
model_id = "ibm-granite/granite-3.2-2b-instruct": especifica el nombre del punto de control del modelo IBM Granite alojado en Hugging Face. Este modelo está optimizado para tareas de seguimiento de instrucciones.
AutoTokenizer.from_pretrained(model_id): carga el tokenizador asociado al modelo especificado. Es responsable de convertir el texto de entrada en tokens y decodificar los tokens de salida en texto.
AutoModelForCausalLM.from_pretrained(model_id): carga el modelo de lenguaje (Granite 3.2 2B instruct) para tareas de generación de texto como responder preguntas o resumir.
pipeline("text-generation", model=model, tokenizer=tokenizer): crea un pipeline de generación de texto de alto nivel que combina el modelo y el tokenizador, lo que facilita la generación de respuestas a partir de instrucciones.
En este paso, definimos una función que actúa como Worker en la arquitectura ReWOO. Este trabajador utiliza una herramienta de búsqueda web, Serper.dev, para recuperar información relevante y actualizada de Internet para apoyar el razonamiento y la generación de respuestas. Serper.dev es una API rápida y ligera que proporciona resultados de búsqueda de Google en un formato estructurado, lo que la hace ideal para la recuperación de información en tiempo real en flujos de trabajo de IA.
Esta configuración permite al sistema ReWOO "observar" el mundo real consultando fuentes de conocimiento externas antes de que el LLM tome decisiones finales.
Para utilizar Serper en el pipeline de ReWOO:
SERPER_API_KEY = "<YOUR_API_KEY>" # Reemplace esto con su clave actual
Nota: Nunca cargue su clave de API en repositorios públicos. Para la configuración de producción o equipo, utilice .env o variables de entorno para mantenerlo seguro.
def query_serper(question, num_results=3): define una función que toma una pregunta de búsqueda y devuelve fragmentos relevantes de los principales resultados de búsqueda.
payload = {"q": question, "num": num_results}: prepara la carga útil de la consulta con el término de búsqueda y el número de resultados a devolver.
response = request.post(...): envía una solicitud POST a la API de Serper con su consulta y encabezados.
response.raise_for_status(): genera un error si la respuesta de la API no es válida o falla.
snippets = [...]: extrae fragmentos de texto de los resultados de búsqueda orgánicos.
return "\n".join(snippets): une y devuelve los fragmentos como una sola cadena, que sirve como contexto para el modelo de lenguaje.
Nota: Esta función constituye la columna vertebral del paso de "observación" de ReWOO, en el que se recopilan pruebas externas para seguir razonando. Asegúrese de que su clave de API sea válida y no esté limitada por la velocidad al realizar las pruebas.
En este paso, definimos la función expert(), que sirve como solucionador en la arquitectura ReWOO. El solucionador sintetiza la evidencia externa recuperada y genera una respuesta final utilizando el modelo de lenguaje.
def expert(question: str) -> str: la función expert() toma una pregunta (cadena) y devuelve una respuesta (cadena) generada por el modelo Granite. Funciona buscando en la web con Serper.dev, recopilar información relevante y utilizarla para generar una respuesta clara y completa.
context = query_serper(question): utiliza la herramienta de búsqueda web Serper para recuperar información relevante (worker).
prompt = f"""...""": crea una instrucción que indica al modelo que responda utilizando solo el contexto recuperado.
generator(...): llama al modelo Granite para generar una respuesta basada en la instrucción de entrada.
for _ in range(5): este bucle permite al modelo generar una respuesta en fragmentos, hasta cinco veces. Ayuda si la respuesta es larga y no se puede completar de una sola vez.
generated_text += new_text: añade cada nuevo fragmento de texto para formar la respuesta completa.
if new_text.endswith(...): si la respuesta parece completa (termina con un punto, un signo de interrogación o un signo de exclamación) y tiene suficientes palabras (más de 50), detiene el bucle.
return generated_text.strip(): devuelve la respuesta final y limpia.
Nota: La instrucción es importante, ya que garantiza que el modelo no "alucine" ni se salga del tema. Debe ajustarse a lo que hay en el contexto. Limitamos cada fragmento de generación a 120 tokens para controlar la longitud de salida y gestionar el uso de recursos de manera eficiente al tiempo que evitamos el uso excesivo de tokens.
En este paso, definimos la función Planner, que desglosa una tarea de entrada amplia en subpreguntas más pequeñas y bien definidas, un principio básico del razonamiento paso a paso de ReWOO.
def planner(task: str): define una función llamada planner que acepta un único argumento task (una cadena que describe la tarea a realizar).
topic = task.replace("Summarize", "").replace("the novella", "").strip(): Extraiga el asunto principal (por ejemplo, el título o el tema) de la tarea. Limpia la entrada eliminando frases de instrucciones comunes como "Resumir" y "la novela", y luego recorta los espacios en blanco iniciales y finales para aislar el tema central.
return [ ... ]: devuelve una lista de preguntas específicas que guían el módulo Worker.
Nota: Puede ampliar esta lista con subpreguntas más específicas en función de la profundidad y la naturaleza del tema de entrada.
En este paso, definimos la función final_summarizer, que actúa como solucionador en la canalización de ReWOO. Esta función toma las subrespuestas (evidencia) proporcionadas por el trabajador y genera un resumen coherente recién escrito utilizando el modelo de lenguaje.
def final_summarizer(task: str, sub_answers: dict) -> str: define la función que recibe la tarea original y las subrespuestas, y devuelve un resumen conciso.
insights = "\n".join(sub_answers.values()): combina todas las respuestas en una sola cadena separadas por saltos de línea para incluirlas en la instrucción.
base_prompt = f"""...""": construye la instrucción base que indica al modelo que resuma el conocimiento proporcionado. Guía al modelo para generar un nuevo resumen basado solo en subrespuestas.
max_total_tokens = 400: establece un límite superior para el recuento de tokens generados para evitar resultados excesivamente largos.
max_loops = 5: permite hasta cinco iteraciones de generación para construir progresivamente el resumen.
for in range(maxloops): bucles para generar fragmentos de texto utilizando el modelo de lenguaje.
response = generator(..., max_new_tokens=100, ...): utiliza el generador (objeto de pipeline) para generar hasta 100 nuevos tokens en cada bucle. El modo de muestreo (do_sample=True) permite la variación y la creatividad en la respuesta.
if summary.endswith(...) or total_tokens_used >= max_total_tokens: finaliza el bucle si el resumen concluye con la puntuación adecuada o alcanza el límite del token.
return summary.strip(): devuelve el resumen final y pulido sin espacios finales.
En este paso, definimos la función solver, que representa la etapa final en la canalización de ReWOO. Orquesta todo el proceso utilizando el planificador, llamando al experto y generando un resumen utilizando el final_summarizer (solver). La arquitectura ReWOO permite el razonamiento de varios pasos al dividir la tarea principal en subpreguntas mediante el uso de un planificador. Cada subpregunta se aborda de forma independiente por un módulo experto, y el resumen final sintetiza todas las respuestas en una respuesta coherente. Este enfoque modular permite al sistema abordar tareas complejas de forma más eficaz.
def solver(task: str): define la función del controlador principal para ejecutar el flujo de trabajo completo de ReWOO.
subquestions = planner(task): utiliza el planificador para dividir la tarea de entrada en subpreguntas específicas.
ans = expert(q): para cada subpregunta, llama a la función experto para obtener pruebas basadas en la web y generar una respuesta relevante. Cada subpregunta generada por el planificador se pasa al experto como entrada de herramienta. El módulo experto procesa la entrada utilizando un modelo de lenguaje. Esto puede verse como la ejecución de una herramienta para una subtarea específica.
answers[q] = ans: almacena cada respuesta codificada por su pregunta correspondiente para su posterior resumen.
final_summary = final_summarizer(task, answers): introduce todas las respuestas recopiladas en final_summarizer para generar un resumen limpio y coherente.
print(final_summary) and return final_summary: muestra y devuelve el resumen completado de la tarea original.
Nota: El tiempo total que tarda la función solver() puede variar de un sistema a otro debido a las diferencias en la velocidad de la CPU, la RAM disponible y la eficiencia del modelo en diferentes configuraciones de hardware. Dado que el código utiliza una estrategia de generación en bucle con un modelo de lenguaje, los sistemas con menor potencia de procesamiento o memoria pueden tardar mucho más. La recuperación basada en la red y los tamaños de instrucción grandes también pueden contribuir a los retrasos. Para mejorar el rendimiento, considere reducir max_loops utilizando un modelo más pequeño o cuantificado, optimizando el tokenizador y el pipeline del generador o ejecutando el código en un entorno habilitado para GPU como Google Colab o Kaggle Notebooks.
En este paso final, ejecutamos la canalización completa de ReWOO llamando a la función del solucionador con una tarea específica.
solver("Summarize the novella The Metamorphosis"): activa todo el proceso ReWOO; planificación, recuperación de pruebas y generación de un resumen para la tarea de entrada: resume el conjunto de datos La metamorfosis.
Este paso produce el resultado final y demuestra cómo los componentes de ReWOO funcionan juntos de principio a fin para un caso de uso real.
Nota: Para mejorar el rendimiento y la fiabilidad del pipeline de ReWOO, es importante mejorar las métricas de evaluación, como la calidad del resumen, la coherencia y la latencia de generación. Estas métricas ayudan a evaluar el rendimiento del sistema en diferentes tareas y configuraciones de hardware. La arquitectura se puede ampliar integrando algoritmos inteligentes para dividir las grandes preguntas en otras más pequeñas y clasificar las respuestas más útiles. Estas mejoras permitirían un razonamiento más preciso y eficiente, reducirían el tiempo de generación y mejorarían la calidad general de los resultados.
Cree, implemente y gestione potentes asistentes y agentes de IA que automaticen flujos de trabajo y procesos con IA generativa.
Construya el futuro de su empresa con soluciones de IA en las que puede confiar.
Los servicios de IA de IBM Consulting ayudan a reinventar la forma de trabajar de las empresas usando IA para la transformación.