Inicio / Artículos

Agentes explicados: herramientas, prompts del sistema y el bucle de pensamiento-acción

Guía para principiantes sobre cómo funcionan los agentes de IA: por qué olvidan los modelos de chat, cómo se describen las herramientas a un LLM, prompts del sistema, ReAct, agentes de código y observaciones.

Editor: REACTAPP.TOP8 min de lectura1803 palabras

Fuentes: AI Agents, Explained: From Thoughts to Actions

Los agentes de IA modernos se basan en una lista reducida de conceptos: herramientas, un prompt del sistema y un ciclo repetitivo de pensamiento, acción y observación. Una vez que estos elementos se combinan, la mayoría de los marcos para agentes parecen variaciones de un mismo tema. Las secciones siguientes construyen esta imagen desde cero, comenzando por lo que realmente es un agente.

Qué es un agente

Un agente es un sistema en el que un modelo de IA trabaja con su entorno para completar una tarea específica. Combina razonamiento, planificación y la ejecución de acciones, generalmente a través de herramientas externas. La mayoría de los agentes son impulsados por un LLM, aunque un modelo de visión y lenguaje también podría desempeñar la misma función.

Tu aplicación de chat olvida todo

Aquí hay un hecho que sorprende a muchas personas: cuando chateas con ChatGPT o un asistente similar, no existe ninguna conversación dentro del modelo. No almacena nada, no registra ningún estado en curso y no conserva nada entre tus mensajes. Cada vez que presionas enviar, todo el intercambio realizado hasta ese momento se convierte en un único bloque largo de texto, y el modelo lee ese bloque desde el principio.

Imagina este intercambio:

conversation = [
    {"role": "user", "content": "I need help with my order"},
    {"role": "assistant", "content": "Could you provide your order number?"},
    {"role": "user", "content": "It's ORDER-123"},
]

Lo que se ve y lo que los desarrolladores manejan en el código es una lista ordenada de turnos con sus respectivos roles. Sin embargo, el modelo nunca recibe una lista; antes de que nada llegue hasta él, los turnos se unen y se convierten en una única secuencia de texto, y su única tarea, como siempre, es predecir el siguiente token basándose en todo lo anterior.

No existe un paso especial de “recordar esto”. Cuando el modelo parece recordar su número de pedido, eso no se debe a la memoria; simplemente ese número sigue estando en el texto que está leyendo en ese momento.

Herramientas

Una herramienta es una función, idealmente con un propósito claro, que se le pasa al LLM. Algunos ejemplos típicos incluyen:

  • buscar en la web
  • generar imágenes
  • recuperar documentos
  • llamar a una API

Una buena herramienta amplía las capacidades del modelo. Necesita estas partes:

  • una descripción en texto de lo que hace la función
  • un elemento llamable, es decir, el código que realiza la acción
  • argumentos de tipo definido
  • opcionalmente, un resultado de tipo definido
  • Cómo se llama realmente a una herramienta

    El punto clave es que un LLM no puede operar directamente ninguna herramienta externa. El texto entra y el texto sale, nada más. Decir que un modelo “tiene acceso a herramientas” en realidad significa que ha aprendido a escribir una llamada a herramienta en texto. Si se pregunta por el clima en París, el modelo no obtiene un pronóstico; emite un mensaje estructurado indicando que debe ejecutarse la herramienta del clima.

    Una capa de agente se encuentra entre el usuario y el modelo. Este detecta el mensaje, ejecuta la herramienta, recopila el resultado y lo agrega a la conversación antes de enviarlo todo de vuelta al modelo. Con ese contexto adicional, el modelo escribe una respuesta normal. El usuario tiene la sensación de que el modelo accedió directamente al servicio meteorológico, aunque en realidad fue el agente quien realizó toda la coordinación a espaldas del usuario.

    Un pequeño ejemplo

    Para ilustrar, tomemos una herramienta de calculadora que solo hace una cosa: multiplicar dos números enteros.

    def multiply(a:int, b:int):
      "Multiply two integers"
      return a * b
    

    Convierte una función en una herramienta

    La biblioteca Hugging Face transformers ofrece un decorador @tool que envuelve una función ordinaria de Python para que un agente pueda comprenderla. Primero se realiza la importación:

    from transformers import tool
    

    Luego, la función decorada:

    @tool
    def multiply(a: int, b: int):
        """Multiply two integers."""
        return a * b
    

    Detrás de escena, el decorador recopila metadatos:

    • el nombre de la función
    • su descripción
    • los nombres de los argumentos
    • los tipos de los argumentos
    • el tipo de retorno

    Ese metadato se incluye posteriormente en la instrucción, que indica al modelo cómo utilizar la herramienta correctamente.

    Observando una herramienta

    Después de la decoración, una herramienta puede describirse a sí misma en texto:

    print(multiply.to_string())
    

    La salida impresa contiene detalles de este tipo:

    Tool Name: multiply
    
    Description:
    Multiply two integers.Arguments:
    - a (int)
    - b (int)
    

    Esta descripción estructurada es exactamente lo que el agente muestra al modelo. El LLM la lee como cualquier otro texto y decide si la herramienta ayudaría con la solicitud del usuario.

    El flujo de trabajo del agente

    Un agente funciona en un ciclo repetitivo: piensa (Thought), actúa (Action) y luego observa (Observation).

    1. Pensamiento. La parte del LLM que forma parte del agente decide qué hacer a continuación.
    2. Acción. El agente llama a las herramientas con los argumentos seleccionados.
    3. Observación. El modelo analiza lo que devolvió la herramienta.

    El agente permanece en este ciclo de pensar, actuar y observar hasta que se cumple su objetivo.

    El prompt del sistema

    Un prompt del sistema es un conjunto de instrucciones que se entregan al modelo antes de cualquier mensaje del usuario. Establece el comportamiento, el rol, las restricciones y los objetivos para toda la conversación.

    Cuando un usuario escribe algo, el modelo ve más que solo ese texto. Por lo general, recibe algo con este formato:

    <System Prompt>
    
    You are a helpful programming assistant.
    Always explain concepts before showing code.
    If the user asks for unsafe code, refuse politely.
    
    <User>
    
    Explain binary search.
    

    La instrucción del sistema tiene prioridad sobre la del usuario. Supongamos que indica responder siempre en inglés y el usuario pide en francés. El modelo generalmente seguirá la instrucción del sistema, a menos que la aplicación permita deliberadamente que las solicitudes del usuario la anulen.

    La instrucción de sistema de un agente va aún más allá y describe las herramientas así como el ciclo en sí:

    You are an AI assistant that can answer user questions.
    
    You have access to the following tools:
    
    Tool: search_web
    Description:
    Searches the web for up-to-date information.
    
    Arguments:
    - query (string)
    
    Tool: calculator
    Description:
    Evaluates mathematical expressions.
    
    Arguments:
    - expression (string)
    
    If a user's question requires current information, use search_web.
    If a calculation is required, use calculator.
    Otherwise, answer directly.
    

    En ese mensaje del sistema se definen tres cosas:

    • cómo debe comportarse el agente
    • qué herramientas puede utilizar, descritas como se mostró en la sección anterior
    • el ciclo de Pensamiento, Acción y Observación, integrado en las instrucciones del modelo

    Cada una de estas tres etapas merece una atención más detallada.

    Pensamientos

    Los pensamientos capturan el razonamiento y la planificación interna del agente mientras trabaja en la tarea. Existen dos estilos comunes:

    1. chain-of-thought (CoT)
    2. ReAct (razonamiento más acción)

    Chain-of-thought es un método de estimulación que induce al modelo a abordar un problema paso a paso antes de decidirse por una respuesta final. El razonamiento permanece interno, lo cual es adecuado para problemas de lógica y matemáticas que no requieren herramientas externas.

    ReAct es un método que también exige un razonamiento paso a paso, pero mezcla acciones, como llamadas a herramientas, entre los pasos de razonamiento.

    Ambos permiten que un LLM resuelva problemas de forma gradual. La diferencia es que CoT depende únicamente de lo que el modelo ya sabe, mientras que ReAct combina el razonamiento con acciones. Esto permite al modelo utilizar herramientas externas, recopilar información actualizada y basar su razonamiento en los resultados, lo cual es más adecuado para tareas dinámicas del mundo real que involucran sistemas externos.

    Acciones: del pensamiento a la acción

    Las acciones son los pasos que toma un agente para interactuar con su entorno. Un agente de servicio al cliente podría consultar los datos del cliente, sugerir artículos de soporte o transferir el caso a un humano.

    Un generador de texto logra activar herramientas reales a través de un patrón sencillo conocido como detener y analizar. El modelo nunca realiza nada por sí mismo; produce una solicitud estructurada que describe qué debe suceder, y el agente la ejecuta en nombre del modelo.

    En realidad, este es el mismo ciclo que antes: el modelo razona sobre la tarea, emite una acción como una llamada a una API meteorológica y se detiene. El agente detecta esa acción, ejecuta la herramienta correspondiente y devuelve el resultado como una observación. Con esta información, el modelo continúa razonando, realiza otra acción o da la respuesta final.

    Históricamente, las acciones se expresaban como llamadas a funciones o objetos JSON que indicaban una herramienta y sus argumentos. Eso funciona, pero resulta engorroso cuando un flujo de trabajo necesita muchas llamadas a herramientas. Los agentes de código toman otro enfoque: en lugar de describir las acciones en JSON, el modelo escribe código Python ejecutable. De este modo, bucles, condiciones, variables y varias llamadas a herramientas pueden compartir un mismo bloque de código, lo que resulta más expresivo y eficiente para tareas complejas.

    La forma tradicional en JSON se ve así:

    {
      "tool": "get_weather",
      "arguments": {"location": "Tokyo"}
    }
    

    En su lugar, un agente de código escribe un fragmento ejecutable:

    # The agent writes actual Python code as its action
    cities = ["Tokyo", "Paris", "New York", "London", "Sydney"]
    temps = [get_weather(city) for city in cities]
    avg_temp = sum(temps) / len(temps)
    print(f"Average temperature: {avg_temp}")
    

    Observaciones: retroalimentación de cada acción

    El razonamiento y la acción son solo la mitad de la historia. Después de actuar, un agente debe comprender el resultado, y ese es el papel de una observación: la retroalimentación recibida una vez que se ha ejecutado una acción. Puede tratarse de un resultado de búsqueda en la web, una respuesta de API, la salida de un programa en Python o incluso un mensaje de error. Sea lo que sea, se convierte en nueva información para elegir el siguiente paso.

    El flujo es sencillo. El agente genera una acción, el marco de trabajo la ejecuta y la salida se añade a la conversación como una observación. El LLM lee el contexto actualizado y continúa. Con suficiente información, proporciona la respuesta final. De lo contrario, planifica otra acción.

    Las observaciones no tienen por qué ser éxitos. Cuando una llamada falla, ya sea por un 404 Not Found de un endpoint o por un TypeError en Python en el código generado, esa falla sigue siendo valiosa. El mensaje de error le muestra al agente qué salió mal, de modo que su próxima acción pueda corregir el rumbo en lugar de repetir el error.

    Este ciclo continuo es lo que hace que los agentes sean adaptables. En lugar de depender únicamente de conocimientos preentrenados, recogen nuevos datos, aprenden de los resultados y perfeccionan su enfoque hasta completar la tarea.

    Uniendo las piezas

    Los agentes pueden parecer un paradigma completamente nuevo, pero provienen de la combinación de unas pocas ideas simples. Un modelo de lenguaje razona sobre un problema, un prompt del sistema da forma a su comportamiento, las herramientas lo amplían más allá del texto, las acciones lo conectan con el mundo exterior y las observaciones proporcionan retroalimentación para que pueda adaptarse.

    Comprender estos componentes básicos y darse cuenta de cuán poca “magia” contiene cada uno es el primer paso para crear sus propios agentes. Los asistentes de programación, los copilotos de investigación y los flujos de trabajo autónomos dependen todos del mismo ciclo de Pensamiento, Acción y Observación. A partir de aquí, el siguiente paso lógico es implementar un primer agente con el ecosistema de Hugging Face.