Inicio / Artículos

Construcción de un agente ReAct en LangChain: ejecutores, pizarras de bocetos y sus limitaciones.

Crea un agente ReAct que utilice herramientas, observa cómo el agente y AgentExecutor dividen el trabajo, y entiende por qué LangGraph maneja mejor el flujo de control, los ciclos y el estado.

Editor: REACTAPP.TOP12 min de lectura2719 palabras

Fuentes: Langchain Part 17 — End to End Agent Building

Qué es un agente

Un agente de IA es un sistema que toma un objetivo de alto nivel establecido por una persona y luego planifica, toma decisiones y actúa por sí mismo. Ejecuta una secuencia de pasos utilizando herramientas externas, APIs o fuentes de conocimiento, mantiene el contexto a lo largo del proceso, razona a través de varios pasos, se ajusta cuando llega nueva información y trabaja hacia el resultado deseado.

En resumen, un agente es un LLM sumado a algunas herramientas. El LLM se encarga del razonamiento y la toma de decisiones, mientras que las herramientas se ocupan de la acción.

Características de un agente

  • Dirigido por objetivos. Usted indica qué desea lograr y no cómo hacerlo.
  • Planifica por sí mismo. El agente divide el problema y organiza las tareas sin ayuda externa.
  • Utiliza herramientas. Llama a APIs, calculadoras, buscadores y recursos similares. El LLM sabe qué herramientas existen y cuándo aplicar cada una.
  • Con conciencia de contexto. Mantiene la memoria a lo largo de las distintas etapas para que los resultados anteriores influyan en las acciones posteriores.
  • Adaptativo. Cuando algo cambia, como que una API falle o falten datos, modifica el plan correspondiente.
  • Un agente funcional en código

    El script a continuación crea un pequeño agente con dos herramientas: búsqueda en la web mediante DuckDuckGo y consulta de clima, y le plantea una pregunta dividida en dos partes. La consulta del clima requiere su propia clave API del proveedor meteorológico, mostrada aquí como un marcador de posición.

    from langchain_openai import ChatOpenAI
    from langchain_core.tools import tool
    import requests
    
    from langchain_community.tools import DuckDuckGoSearchRun
    
    from langchain.agents import create_react_agent, AgentExecutor
    from langchain import hub # It is a place from where we can get many type of prompts, so if we want any predefined prompt, we can get it from here
    
    # Step 1: Creating tool definitions
    search_tool = DuckDuckGoSearchRun()
    
    @tool
    def get_weather_data(city: str) -> str:
      """
      This function fetches the current weather data for a given city
      """
      url = f'https://api.weatherstack.com/current?access_key=4d1d8ae207a8c845a52df8a67bf3623e&query={city}'
      response = requests.get(url)
      return response.json()
    
    llm = ChatOpenAI()
    
    # Step 2: Pull the ReAct prompt from LangChain Hub
    prompt = hub.pull("hwchase17/react")  # pulls the standard ReAct agent prompt
    # The agent which we are gonna make is a ReAct agent (reasoning + action = ReAct)
    # ReAct is a design pattern
    
    # Step 3: Create the ReAct agent manually with the pulled prompt
    agent = create_react_agent(
        llm=llm,
        tools=[search_tool, get_weather_data],
        prompt=prompt
    )
    
    # Step 4: Wrap it with AgentExecutor
    agent_executor = AgentExecutor(
        agent=agent,
        tools=[search_tool, get_weather_data],
        verbose=True # whatever the agent thinks, it will be visible to us
    )
    
    # Step 5: Invoke
    response = agent_executor.invoke({"input": "Find the capital of Madhya Pradesh, then find it's current weather condition"})
    print(response)
    
    '''
    Entering new AgentExecutor chain...
    I should first find out the capital of Madhya Pradesh and then check the current weather condition for that city.
    Action: duckduckgo_search
    Action Input: "capital of Madhya Pradesh" Madhya Pradesh, state of India that is situated in the heart of the country. It has no coastline and no international frontier. Its physiography is characterized by low hills, extensive plateaus, and river valleys. The capital is Bhopal, in the west-central part of the state. Bhopal, city, capital of Madhya Pradesh state, central India. Situated in the fertile plain of the Malwa Plateau, the city lies just north of the Vindhya Range, along the slopes of a sandstone ridge. It is a major rail junction and has an airport. Pop. (2001) 1,437,354; (2011) 1,798,218. Bhopal was Indore (/ ɪ n ˈ d ɔːr / ⓘ; ISO: Indaura, Hindi: [ɪn̪d̪ɔːr]) is the largest and most populous city in the Indian state of Madhya Pradesh. [15] It is the commercial hub of Madhya Pradesh. It is consistently ranked as the cleanest city in India. [16] It serves as the headquarters of both the Indore District and the Indore Division.It is also considered the state education hub and ... In 1956, Bhopal became part of the state of Madhya Pradesh. Bhopal district was carved out on October 2, 1972, and is one of the 45 districts in the state. 4. Why is Bhopal famous? Bhopal is the capital city of the Indian state of Madhya Pradesh. It is known as the City of Lakes due to the presence of various natural and artificial lakes. In 1948, Madhya Bharat was created, with Indore designated as its summer capital and Gwalior as its winter capital. This arrangement highlights Indore's significance even then. However, Madhya Bharat was a temporary entity, and the map of central India was soon to be redrawn. The Creation of Madhya PradeshNow that I know the capital of Madhya Pradesh is Bhopal, I can use the get_weather_data function to check its current weather condition.
    Action: get_weather_data
    Action Input: Bhopal {'request': {'type': 'City', 'query': 'Bhopal, India', 'language': 'en', 'unit': 'm'}, 'location': {'name': 'Bhopal', 'country': 'India', 'region': 'Madhya Pradesh', 'lat': '23.267', 'lon': '77.400', 'timezone_id': 'Asia/Kolkata', 'localtime': '2025-05-01 17:52', 'localtime_epoch': 1746121920, 'utc_offset': '5.50'}, 'current': {'observation_time': '12:22 PM', 'temperature': 40, 'weather_code': 116, 'weather_icons': ['https://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png'], 'weather_descriptions': ['Partly Cloudy '], 'astro': {'sunrise': '05:47 AM', 'sunset': '06:48 PM', 'moonrise': '08:38 AM', 'moonset': '11:01 PM', 'moon_phase': 'Waxing Crescent', 'moon_illumination': 15}, 'air_quality': {'co': '510.6', 'no2': '1.665', 'o3': '180', 'so2': '10.175', 'pm2_5': '29.045', 'pm10': '68.635', 'us-epa-index': '2', 'gb-defra-index': '2'}, 'wind_speed': 12, 'wind_degree': 302, 'wind_dir': 'WNW', 'pressure': 1005, 'precip': 0, 'humidity': 7, 'cloudcover': 25, 'feelslike': 40, 'uv_index': 1, 'visibility': 6, 'is_day': 'yes'}}The current weather condition in Bhopal, Madhya Pradesh is partly cloudy with a temperature of 40°C.
    Final Answer: The capital of Madhya Pradesh is Bhopal, and the current weather condition in Bhopal is partly cloudy with a temperature of 40°C.
    
    > Finished chain.
    {'input': "Find the capital of Madhya Pradesh, then find it's current weather condition", 'output': 'The capital of Madhya Pradesh is Bhopal, and the current weather condition in Bhopal is partly cloudy with a temperature of 40°C.'}
    '''
    
    response['output']
    # The capital of Madhya Pradesh is Bhopal, and the current weather condition in Bhopal is partly cloudy with a temperature of 40°C.
    

    Los cinco pasos numerados en el script abarcan las definiciones de herramientas, la obtención del prompt estándar ReAct desde el hub de LangChain, la creación del agente, su envoltura en un ejecutor y su invocación. La traza impresa al final muestra que el agente decide buscar primero la capital y luego verificar el clima.

    ReAct

    LangChain admite varios enfoques de diseño para agentes. El que se explica aquí es ReAct, abreviatura de Reasoning plus Acting. Permite que un modelo alterne entre el razonamiento interno, que corresponde al pensamiento, y las acciones externas como la llamada a herramientas, en un bucle estructurado que abarca varios pasos.

    El modelo no genera su respuesta de una sola vez. Piensa paso a paso, decide qué hacer a continuación y puede recurrir a herramientas como APIs, calculadoras o búsquedas en la web para obtener ayuda.

    Este patrón es adecuado para:

    • problemas que requieren varios pasos;
    • tareas que necesitan herramientas;
    • casos en los que se desea que el razonamiento sea visible y verificable.

    Por ejemplo, pida al modelo la población de la capital de Francia. Primero razona que debe identificar la capital, la busca, ve que la respuesta es París, luego razona que necesita la población de París, busca nuevamente y finalmente da la respuesta.

    ReAct tiene cinco componentes:

    • Pensamiento. El razonamiento privado del agente, en el que evalúa el estado actual y planifica el siguiente paso. Explica por qué se elige una herramienta en particular o qué sigue sin saberse.
    • Acción. La decisión de utilizar una herramienta del conjunto de herramientas disponible, identificada por la función o API a llamar.
    • Entrada de la acción. Los argumentos que se pasan a esa herramienta. Si la acción es search, la entrada es el texto exacto de la consulta, algo como el clima en Delhi.
  • Observación. Los datos brutos que la herramienta devuelve una vez que el ejecutor la ha ejecutado. El agente los lee para determinar si la tarea está completada o si se necesitan más pasos.
  • Respuesta final. La respuesta final, que se genera cuando el agente concluye que cuenta con suficiente información, y que combina todas las observaciones en lenguaje sencillo.
  • El modelo de prompt que impulsa este bucle se ve así:

    Answer the following questions as best you can. You have access to the following tools:
    
    {tools}
    
    Use the following format:
    
    Question: the input question you must answer
    Thought: you should always think about what to do
    Action: the action to take, should be one of [{tool_names}]
    Action Input: the input to the action
    Observation: the result of the action …
    (this Thought/Action/Action Input/Observation can repeat N times)
    Thought: I now know the final answer
    Final Answer: the final answer to the original input question
    
    Begin!
    
    Question: {input}
    Thought:{agent_scratchpad} —
    

    En ese template, una Observación es simplemente lo que se obtiene después de que se ejecuta una herramienta.

    El bloc de notas del agente

    El bloc de notas funciona como la memoria a corto plazo o cuaderno de trabajo del agente. Registra el historial de la tarea actual: los Pensamientos anteriores, las Acciones realizadas, como las llamadas a herramientas, y las Observaciones que se obtuvieron.

    Al leer el cuaderno, el agente recuerda que ya ha determinado la capital de Francia y ahora debe encontrar la población de París. Es un almacenamiento temporal que se actualiza cada vez que el ejecutor proporciona nueva información. Una vez que la respuesta final se envía al usuario, el bloc de notas se elimina o se archiva, ya que su función para esa tarea ha finalizado.

    El nombre tiene sentido una vez que recuerdas que un LLM no tiene estado. No recuerda naturalmente lo que sucedió hace unos segundos en un bucle de código. Por lo tanto, LangChain toma toda la historia del bucle actual y la vuelve a insertar en la solicitud cada vez que le pregunta al agente qué hacer a continuación.

    Agente versus AgentExecutor

    Las dos partes tienen tareas separadas.

    El agente es el pensador, algo similar a un gerente de proyectos. Lee la solicitud, la divide en pasos más pequeños y decide qué herramientas se necesitan. Su entrada contiene tanto la pregunta del usuario como todo lo que se ha hecho hasta ahora.

    El AgentExecutor es el ejecutor, más parecido a un asistente. Escucha las instrucciones del agente, ejecuta realmente el código de cada herramienta y devuelve los resultados.

    Otra forma de verlo: el agente es el arquitecto que dibuja el plano, y el ejecutor es el equipo de construcción que lleva a cabo la edificación. Sin el agente no hay plan, y sin el ejecutor el plan nunca sale del papel.

    El ejecutor coordina todo el proceso:

    1. Envía las entradas y los mensajes anteriores al agente para que este conozca la pregunta y lo que ha ocurrido.
    2. Recibe la siguiente acción del agente.
    3. Ejecuta la herramienta con las entradas proporcionadas.
    4. Añade la observación de la herramienta al historial.
    5. Envía el historial actualizado junto con la pregunta del usuario de vuelta al agente, y esto se repite hasta que el agente indica “Respuesta final”.

    Tome una solicitud para obtener la temperatura en Delhi y multiplíquela por 10. El agente decide que necesita la herramienta meteorológica, el ejecutor la llama, se obtiene la observación, el agente decide que es necesario realizar una multiplicación, el ejecutor la realiza y finalmente el agente da la respuesta. El ejecutor lleva a cabo todo lo que el agente considere necesario.

    Límites de este enfoque

    El ejecutor preconstruido funciona en casos simples, pero presenta verdaderas debilidades cuando los agentes se vuelven más complejos. La comparación a continuación es con LangGraph, la biblioteca basada en grafos de LangChain. Tenga también en cuenta que las versiones más recientes de LangChain orientan a las personas hacia LangGraph para los agentes, por lo que consulte la documentación actual antes de utilizar las clases de ejecutor antiguas.

    1. La caja negra

    El AgentExecutor estándar ya está preconstruido. Basta darle herramientas y una instrucción, y un bucle while invisible continúa funcionando hasta que termina su tarea. Es difícil intervenir en su funcionamiento. Si se desea que el agente siempre consulte a un humano antes de gastar dinero, o que siga un orden fijo como paso A y luego paso B, el ejecutor se resiste, ya que está diseñado para ser completamente autónomo.

    Imaginemos un agente con las herramientas search_flights y book_flight. Dentro del ejecutor de LangChain, el modelo LLM decide qué sucede a continuación en un bucle oculto. Al pedirle que reserve un vuelo, podría buscar y reservarlo de inmediato sin preguntar, quizás con una tarifa de diez mil dólares, cuando el usuario quería aprobar primero cualquier compra. Los pasos intermedios como la aprobación obligatoria no pueden aplicarse estrictamente, ya que el flujo de control es implícito y está controlado por el modelo.

    En LangGraph, el flujo de trabajo se define como pasos explícitos o nodos, como buscar vuelos, solicitar aprobación y realizar la reserva. Estos están conectados de tal manera que el sistema debe pasar por la aprobación antes de poder hacer la reserva. Esto permite un control total y facilita la aplicación de reglas, la inclusión de puntos de control humanos, las reintentos o las ramificaciones condicionales.

    2. Ciclos y bucles

    Los flujos de trabajo reales rara vez son lineales. Incluyen la posibilidad de retroceder, corregir errores y repetir procesos sobre conjuntos de documentos.

    • Las cadenas de LangChain están diseñadas principalmente como grafos acíclicos dirigidos, por lo que los datos fluyen en una sola dirección.
    • LangGraph está creado para manejar ciclos. Modela el flujo como un mapa en el que los nodos son funciones y los bordes son las rutas entre ellos.

    En una tarea de respuesta a preguntas sobre documentos, un pipeline de LangChain podría recuperar documentos, escribir una respuesta y devolverla. Si la respuesta es incorrecta o incompleta, no vuelve automáticamente a intentar recuperar los documentos o a refinar la consulta sin necesidad de lógica escrita adicional. Una vez que avanza, no puede regresar fácilmente para mejorarla.

    LangGraph permite crear bucles de forma explícita: recuperar datos, responder, verificar la calidad y, si el resultado es deficiente, refinar la consulta y recuperarla nuevamente, repitiendo el proceso hasta obtener un resultado satisfactorio. El sistema puede alternar entre nodos hasta que se cumpla una condición, lo cual es adecuado para tareas que requieren iteración, corrección y retroalimentación.

    3. Estado y persistencia

    Esto es de suma importancia para la escalabilidad.

    La memoria de LangChain se refiere principalmente al contexto de la conversación, como recordar mensajes anteriores para que el modelo dé respuestas mejores. No está estrechamente vinculada al flujo de trabajo ni sigue el progreso de una tarea. A menos que se almacene explícitamente, generalmente se pierde cuando se reinicia el sistema, por lo que las tareas de larga duración no son fiables.

    LangGraph considera la memoria como el estado completo del flujo de trabajo y no solo como el historial de chat. En cada paso, guarda lo que se ha hecho, qué resultados se han generado y qué viene a continuación. Si el proceso se detiene a mitad de camino, puede reanudarse exactamente desde donde se interrumpió. También permite pausar, inspeccionar y editar el estado con la intervención humana, e incluso volver a un paso anterior, lo que hace que los trabajos complejos de múltiples pasos sean mucho más robustos.

    Imagínese una tarea larga, como procesar diez documentos uno por uno, que falla en el paso 7. Al no haber persistencia integrada, todo se pierde y hay que empezar desde cero, sin registro alguno del progreso por defecto. Con el estado guardado después de cada nodo, se puede reiniciar en el paso 7. También es posible hacer una pausa, permitir que alguien revise o edite el estado y luego continuar, o volver a un paso anterior, como una especie de viaje en el tiempo. Los flujos de trabajo extensos se vuelven fiables, reanudables y más fáciles de depurar o auditar.

    La conclusión es que el ejecutor básico dificulta la creación de agentes escalables y de nivel profesional, por lo que existen herramientas basadas en grafos para esa tarea.

    Leer más

  • Kubernetes autoreparable en acción: tres fallos, señales de SigNoz y soluciones aprobadas — Exploramos un bucle de caídas, una eliminación por falta de memoria y un aumento repentino de tokens en un clúster Kind, vemos qué muestra SigNoz para cada caso y qué medidas tomar antes de utilizar un agente de remediación basado en IA.
  • RAG con LangChain desde cero: cargadores, fragmentos, embeddings y evaluación — Construimos un sistema de preguntas y respuestas con documentos paso a paso: carga de archivos, fragmentación, embeddings, las fases de indexación y recuperación, y cómo calificar las respuestas obtenidas.
  • Construyendo tu primer agente LangChain con LangGraph en 2026 — Crea un agente LangChain paso a paso con LangGraph, herramientas, memoria y seguimiento de operaciones, evita cuatro errores comunes y descubre cómo lo utilizó un servicio de soporte de un bootcamp.
  • Por qué el frontend es difícil después de React: estado, efectos, límites y herramientas de IA — React facilitó la creación de interfaces, pero no su diseño. Donde realmente reside el trabajo en el frontend son el estado, los efectos complejos, los límites del sistema y el código generado por IA.
  • Notas prácticas: Su agente AI choca con un límite en el paso 12. Deep Agents de LangChain — Guía paso a paso de las Notas prácticas: Su agente AI choca con un límite en el paso 12. Deep Agents de LangChain: contratos, verificaciones y espacios para código listo para usar para los equipos que implementan este patrón.