Los modelos de lenguaje grandes (LLM) y sus variantes mejoradas, los modelos de lenguaje aumentados (ALM), se han convertido en la columna vertebral de los sistemas modernos de IA. 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 enfrentan desafíos, como una robustez inconsistente en todos los sistemas, un alto uso de tokens, tiempos de respuesta lentos e ineficiencias causadas por instrucciones repetitivas y contexto redundante, al abordar tareas complejas. Tales limitaciones aumentan los costos operativos y dificultan la escalabilidad y el rendimiento en tiempo real.
Para superar estos problemas, la infraestructura ReWOO (razonamiento sin observación) ofrece un enfoque novedoso que se centra en desacoplar el razonamiento de la recuperación de conocimiento externo. En lugar de tener un único LLM que intente razonar, actuar y observar de manera intercalada, ReWOO separa estas preocupaciones en módulos distintos, cada uno potencialmente impulsado por un LLM pero con una función específica. Al modularizar el proceso en distintas etapas de planificación, recopilación de pruebas y síntesis, ReWOO mejora la eficiencia y precisión de los token. 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 desglosa la tarea principal en una secuencia de subpreguntas enfocadas, creando un proyecto técnico. En lugar de pedirle al LLM que responda una pregunta compleja de una vez que puede llevar a un uso abrumador de tokens y respuestas confusas, el planificador crea un proyecto técnico 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 las instrucciones y reducir el consumo de tokens.
El solucionador sintetiza todos los insights recopilados para generar una respuesta final fresca y bien estructurada. Esta separación modular ayuda a garantizar un razonamiento eficiente, preciso y escalable con modelos de lenguaje de gran tamaño.
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 lo 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 tiempo real.
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 el pipeline de ReWOO e interactuar con herramientas externas:
Transformadores: cargan y ejecutan el modelo de lenguaje grande IBM Granite.
Torch: un marco de aprendizaje profundo necesario para ejecutar el modelo de manera eficiente.
Aceleradores: optimizan el rendimiento del modelo en todo el hardware (opcional).
Solicitudes: envían solicitudes HTTP POST a API externas (como Serper).
En este paso, importe las bibliotecas de Python necesarias para crear los componentes principales del pipeline de ReWOO.
transformers.AutoTokenizer: cargan el tokenizador que convierte el texto en tokens compatibles con el modelo de lenguaje.
transformers.AutoModelForCausalLM: cargan el modelo de lenguaje previamente entrenado IBM Granite para generar respuestas.
transformers.pipeline: proporciona una interfaz de alto nivel para crear rápidamente una canalización de generación de texto mediante el tokenizador y el modelo.
En este paso, cargamos el modelo de lenguaje IBM Granite e inicializamos una canalización de generación de texto mediante 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 la entrada en tokens y decodificar los resultados nuevamente en texto.
AutoModelForCausalLM.from_pretrained(model_id): carga el modelo de lenguaje (instrucciones Granite 3.2 2B) 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 el trabajador 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 que el sistema ReWOO "observe" el mundo real consultando fuentes de conocimiento externas antes de que el LLM tome las decisiones finales.
Para usar Serper en el pipeline de ReWOO:
SERPER_API_KEY = "<YOUR_API_KEY>" # Reemplace esto con su clave real
Nota: nunca cargue su clave API en repositorios públicos. Para configuraciones de producción o equipo, use archivos .env o variables de entorno para mantenerla 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 = tequests.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 forma la columna vertebral del paso de "observación" de ReWOO, donde se recopila evidencia externa para un mayor razonamiento. Asegúrese de que su clave de API sea válida y no tenga limitaciones de velocidad al realizar las pruebas.
En este paso, definimos la función experto() , 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, recopilando información relevante y utilizándola para generar una respuesta clara y completa.
context = query_serper(question): utiliza la herramienta de búsqueda web Serper para recuperar información relevante (trabajador).
instrucción = 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 que el modelo genere una respuesta en fragmentos, hasta 5 veces. Ayuda si la respuesta es larga y no se puede completar de una sola vez.
generated_text += new_text: agrega 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 ciclo.
return generated_text.strip(): entrega la respuesta final y limpia.
Nota: el formato de las instrucciones es importante, ya que garantiza que el modelo no "alucine" ni se salga del tema. Debe ceñirse a lo que hay en el contexto. Limitamos cada fragmento de generación a 120 tokens para controlar la longitud de los resultados 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 de planificar, 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 planificador que acepta una tarea de argumento único (una cadena que describe la tarea a realizar).
topic = task.replace("Summarize", "").replace("the novella", "").strip(): Extrae el asunto principal (por ejemplo, el título o el tema) de la tarea. Limpia la entrada eliminando frases comunes como "Resumir" y "la novela", 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 según la profundidad y la naturaleza del tema de entrada.
En este paso, definimos la función final_summarizer, que actúa como solucionador en el pipeline de ReWOO. Esta función toma las subrespuestas (evidencia) proporcionadas por el trabajador y genera un resumen coherente y 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 entrega un resumen conciso.
insights = "\n".join(sub_answers.values()): combina todas las respuestas en una sola cadena separadas por líneas nuevas para incluirlas en la instrucción.
base_prompt = f"""...""": construye la instrucción base que indica al modelo que resuma los insights proporcionados. Guía al modelo para generar un nuevo resumen basado solo en las 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 5 iteraciones de generación para construir progresivamente el resumen.
for in range(maxloops): bucles para generar fragmentos de texto mediante el modelo de lenguaje.
response = generator(..., max_new_tokens=100, ...): utiliza el generador (objeto de canalización) 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 ciclo si el resumen concluye con la puntuación adecuada o alcanza el límite del token.
return summary.strip(): entrega el resumen final, pulido y sin espacios finales.
En este paso, definimos la función solucionador, que representa la etapa final en el pipeline de ReWOO. Orquesta todo el proceso utilizando el planificador, llamando al experto (trabajador) y generando un resumen utilizando el final_summarizer (solucionador). 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 que el sistema aborde tareas complejas de manera 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 enfocadas.
ans = expert(q): para cada subpregunta, llama a la función del experto para obtener evidencia basada en la web y generar una respuesta relevante. Cada subpregunta generada por el planificador se pasa al experto como una entrada de herramienta. El módulo experto procesa la entrada mediante el uso de 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 entrega el resumen completo de la tarea original.
Nota: el tiempo total que tarda la función solver() puede variar entre sistemas 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 o memoria pueden tardar mucho más. La recuperación basada en la red y los tamaños de instrucciones 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 la canalización 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: resumir el conjunto de datos La metamorfosis.
Este paso produce los resultados finales y demuestra cómo los componentes funcionan juntos de extremo a extremo para un caso de uso real.
Nota: para mejorar el rendimiento y la confiabilidad 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 qué tan bien funciona el 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 finales.
Cree, implemente y gestione poderosos 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 pueda confiar.
Los servicios de IA de IBM Consulting ayudan a reinventar la forma en que las empresas trabajan con IA para la transformación.