Inicio / Artículos / Comprendiendo los agentes de IA a través de la analogía cerebro-dedo

Comprendiendo los agentes de IA a través de la analogía cerebro-dedo

Aprenda cómo interactúan los LLM, las herramientas y sus ejecutores al relacionar la arquitectura de los agentes con una analogía de pedidos de comida, y luego cree una implementación mínima de un agente.

1513 palabras

Resumen general

Probablemente ya hayas escuchado términos como “llamada a herramientas” o la idea de que los agentes son simplemente modelos LLM conectados a herramientas. En lugar de adentrarnos directamente en las definiciones, este texto utiliza un escenario cotidiano familiar para explicar qué ocurre realmente dentro de un agente de IA. A lo largo del texto, verás cómo se combinan el modelo LLM, las herramientas y algo llamado ejecutor de herramientas. Está escrito para desarrolladores que desean comprender realmente la mecánica detrás de un agente en lugar de simplemente repetir la terminología; más adelante, seguirás paso a paso cómo crear un agente mínimo para ver su implementación en la práctica.

Analogía

Imagina que haces un pedido de comida a través de una aplicación de delivery. Al analizar esta acción cotidiana, verás cómo tu cerebro y tus dedos colaboran con la aplicación para realizar el pedido, y posteriormente asociaremos cada paso a la terminología relacionada con los agentes.

Todo comienza cuando su cerebro le indica al dedo que abra la aplicación de pedidos de comida para que pueda buscar restaurantes cercanos. El dedo toca el ícono y aparece una lista de restaurantes en la pantalla.

Luego, su cerebro lee los nombres de los restaurantes que se muestran en la pantalla y dirige al dedo a tocar un restaurante específico para ver su menú. Después, su cerebro examina los platos del menú y le indica al dedo que toque el botón “Añadir” junto a los platos que desea, para agregarlos al carrito.

Una vez hecho esto, su cerebro revisa todo lo que está en el carrito para asegurarse de que no falte nada, y luego le indica al dedo que toque “Hacer pedido”.

Finalmente, su cerebro reconoce que se ha alcanzado el objetivo en cuanto ve la pantalla de confirmación del pedido, y en ese momento cesa el intercambio constante entre el cerebro y el dedo.

Analogía en lenguaje de agentes

Fíjese en algo importante a lo largo de toda esta secuencia: el propio cerebro nunca realizó ninguna acción directamente — solo interpretó la información recibida y le indicó al dedo qué hacer a continuación. Esto se corresponde casi exactamente con el funcionamiento de un agente de IA. El LLM desempeña el papel del cerebro; acciones como buscar restaurantes, abrir un menú, agregar artículos al carrito y realizar el pedido son las herramientas que el cerebro sabe cómo utilizar; y el dedo corresponde al ejecutor de herramientas, el componente que realmente lleva a cabo la acción.

Cuando se crea un agente para un propósito específico, se define un conjunto de herramientas y esa lista se entrega al LLM, que actúa como el cerebro encargado de tomar decisiones. (A partir de ahora, -> se usará para indicar que un paso transfiere el control al siguiente.) Cuando un usuario le asigna una tarea al agente, el flujo es el siguiente: el LLM examina el paso actual o el trabajo aún pendiente y selecciona la herramienta más relevante -> luego transfiere esa herramienta al ejecutor de herramientas, pidiéndole que la ejecute y informe el resultado -> el LLM lee ese resultado y verifica si satisface la solicitud del usuario. Si es así, el proceso se detiene allí; de lo contrario, el LLM elige la siguiente herramienta adecuada según el último resultado y el ciclo se repite, continuando hasta que el LLM determine que la tarea está completamente completada y no se necesitan más llamadas a herramientas.

Implementación

Una vez establecido el concepto, el siguiente paso es crear un agente funcional de pequeño tamaño capaz de realizar pedidos de comida según lo que solicite el usuario. Los fragmentos de código que siguen muestran la ruta de ejecución real que sigue el agente, y al final se incluye un enlace al repositorio completo.

Herramientas

get_restaurants() {
    // In production, replace with an API call such as GET /api/v1/restaurants
  return list of restaurants;
}

get_menu(restaurantName) {
    // In production, replace with an API call such as GET /api/v1/restaurants/${restaurantName or restaurantId}/menu
  return menuItems;
}

add_to_cart(sessionId, menuItemId) {
  // In production, replace with an API call such as POST /api/v1/cart
  return updatedCart;
}

place_order(sessionId) {
  // In production, replace with an API call such as POST /api/v1/order
  return orderDetails;
}

Tenga en cuenta que estas herramientas no son más que funciones ordinarias del tipo que se escribirían en el código de aplicaciones cotidianas; no contienen ningún marco especial para agentes ni lógica específica de LLM. En un entorno de producción real, cada herramienta tendría además un nombre, una descripción y un esquema de entrada definido que describe qué datos espera recibir. Es este nombre y descripción los que utiliza el LLM para determinar qué herramienta se ajusta mejor a lo que pide el usuario.

Ejecutor de herramientas

toolExecutor(toolCall) {
  const tool = toolNameMap[toolCall.name];

  return tool.execute(toolCall.arguments);
}

El propio ejecutor de herramientas es simplemente otra función común. Su argumento toolCall contiene información sobre la herramienta que se está invocando: su nombre y sus argumentos, los cuales varían según la herramienta utilizada, ya sea el nombre de un restaurante, un ID de elemento del menú o algo completamente distinto. Lo importante es que cuando el LLM indica al ejecutor qué herramienta debe ejecutarse, este recibe detalles precisos y estructurados, como el nombre de la herramienta get_menu con el argumento {restaurantName: "Spicy Pizza"}. No hay necesidad de extraer o analizar manualmente esta información a partir de la salida de texto en bruto del LLM.

Agente

// Give all the tools to the LLM
llm = OpenAILLM.bindTools([get_restaurants, get_menu, add_to_cart, place_order])

// Take the user query to run the agent loop
reactAgent(userInput) {
  while (true) {
    response = llm(userInput);

    if (response.isFinalAnswer) {
      return response.answer;
    }

    result = toolExecutor(response.toolCall);

    userInput = response + result;
  }
}

Aspectos a observar en el pseudocódigo

  1. El nombre reactAgent se refiere al patrón de instrucciones ReAct (Reason and Act), en el cual el LLM decide qué herramienta utilizar, observa el resultado de esa llamada y luego determina si es necesario ejecutar otra herramienta o si la tarea está completada y el bucle puede detenerse.
  2. Preste atención al bucle while(true). Es precisamente aquí donde los agentes difieren de la lógica condicional que normalmente se escribe en lenguajes como Java o Python. En lugar de codificar directamente las llamadas a funciones dentro de ramas if-else o bucles for, se expone un conjunto de herramientas al LLM —cada una con un nombre y descripción— y se deja que el propio LLM decida, en tiempo de ejecución, qué herramienta invocar a continuación, qué argumentos pasar y cuándo el trabajo está terminado y el bucle debe finalizar.
  • Dicho esto, los sistemas de producción en realidad no dependen de un bucle bruto while(true); se utiliza aquí únicamente para ilustrar el comportamiento basado en agentes mediante código sencillo. En la práctica, se recurriría a un marco de orquestación como LangGraph. Incluso con un marco de este tipo, es práctica habitual limitar la profundidad de recursión para que el LLM no pueda ser llamado indefinidamente, ya que un bucle ilimitado conlleva riesgo de errores, uso inútil de tokens y costos innecesarios.
  • response.isFinalAnswer en el pseudocódigo indica que el agente ha llegado a una respuesta completa y no se necesitan más llamadas a herramientas. Una vez que esto ocurre, el agente devuelve una respuesta resumida al usuario en lugar de activar otra herramienta.
  • También es posible que hayas notado la línea userInput = response + result, donde la salida combinada se vuelve a introducir en el LLM como response = llm(userInput) en la iteración siguiente. Esto ocurre porque cada llamada al LLM es sin estado: no conserva memoria de turnos anteriores, ni siquiera dentro de la misma sesión o interacción con el usuario. Por lo tanto, cada vez que una herramienta termina de ejecutarse, es necesario volver a enviar todo el historial de la conversación: el prompt del sistema que describe cómo debe comportarse el agente, la consulta original del usuario, la respuesta previa de la IA que sugiere una llamada a herramienta y el resultado generado por dicha herramienta. El LLM procesa entonces toda esta secuencia para determinar si se ha cumplido el objetivo o si se requieren más llamadas a herramientas.
  • Diagrama de secuencia de ejecución del LLM y las herramientas

    El diagrama a continuación explica cómo el LLM elige la herramienta siguiente, cómo el ejecutor de herramientas la ejecuta y cómo este ciclo se repite hasta que el LLM concluye que la tarea está terminada y no es necesaria ninguna ejecución adicional de herramientas.

    El flujo descrito muestra claramente el intercambio de acciones: el LLM propone una llamada, el ejecutor la realiza, el resultado vuelve al LLM, y este ya sea propone otra llamada o finaliza el bucle con una respuesta definitiva.

    Código de GitHub

    Existe un repositorio con código de inicio disponible si desea ejecutar este ejemplo por su cuenta y observar cómo funciona el agente en acción.

    Lecturas relacionadas

  • Descubrimiento Progresivo de Herramientas para Agentes de IA a Gran Escala — Explica por qué los grandes catálogos de herramientas deterioran el rendimiento de los agentes de IA y cómo el descubrimiento progresivo con manifiestos y esquemas just-in-time lo soluciona.
  • Llamadas a Claude, GPT y Gemini a través de puntos finales compatibles con OpenAI — Conozca qué funciones soportan las capas compatibles con OpenAI de Anthropic y Gemini, dónde descartan silenciosamente ciertas características, y cuándo tiene sentido enrutar a los tres a través de una misma pasarela.