Módulo 1 · Parte A de 3

Agente

Un agente es una entidad que interactúa con un entorno determinado a cualquier nivel significativo. Una persona en su día a día es un agente en este sentido, así como también lo son un termostato que mantiene la temperatura de una sala o un coche autónomo que se desplaza por el tránsito.

Todos ellos perciben el entorno por medio de sensores y actúan sobre él por medio de actuadores. Cada acción influye, por tanto, en la siguiente observación del entorno formando un bucle continuo: el bucle de percibir, razonar y actuar, que dura mientras el agente interactúa en dicho entorno. Todos los agentes construidos en el curso siguen este bucle. Lo que cambia es cuánto pueden entender el entorno y hasta dónde llegan sus acciones.

Las tres etapas del bucle de un agente

Cada iteración pasa por tres etapas, con nombres simples y funciones distintas.

El agente percibe el entorno mediante observaciones y actúa sobre él mediante acciones. El paso de decisión entre ambas puede cambiar.

La percepción reúne lo que el agente puede conocer, el razonamiento decide qué hacer y la acción cambia el entorno. La percepción y la acción suelen proceder de un modelo de interacción existente, ya controle una aspiradora, automatización web, una entidad de juego o un humanoide. El razonamiento puede cambiar sin alterar ese límite, lo que separa la capacidad del alcance.

Profundo · Conceptos¿Explorar el ciclo y las arquitecturas clásicas?

Abre esta sección para consultar ejemplos concretos y una taxonomía más completa de arquitecturas.

  • La percepción proporciona todo lo que el agente sabe sobre el entorno. Un termostato solo lee un número: la temperatura actual. Un vehículo autónomo combina cámaras, radar y un mapa en un modelo de la carretera. Un agente solo trabaja con lo que captura la percepción, porque las etapas siguientes no acceden al entorno directamente. Cualquier aspecto no detectado durante la percepción permanece invisible para el resto del agente.
  • El razonamiento transforma una percepción en una decisión. Un termostato compara la temperatura con un objetivo, mientras que un motor de ajedrez evalúa millones de movimientos y un vehículo autónomo ejecuta una política aprendida. Los agentes de este curso razonan mediante un modelo de lenguaje. Las herramientas, la memoria y la planificación se apoyan en este paso.
  • Una acción modifica el entorno para el propio agente y para otros participantes del mismo. Esta puede ser tan pequeña como accionar un relé o tan compleja como conducir un coche. Más adelante en este curso, el modelo de lenguaje realiza llamadas a diferentes funciones de software que han sido expuestas de alguna forma para dicho modelo. Estas funciones reciben el nombre de herramientas (del inglés tool) ya que para el modelo representan acciones disponibles. Llamar a una herramienta significa solicitar que el código de esa función sea ejecutado como acción. El conjunto de acciones también define el alcance máximo del agente: por bueno que sea el razonamiento, el agente solo afecta al mundo mediante las acciones permitidas.
El razonamiento puede ser reemplazado. Percepción y acción son independientes de la función de decisión usada entre ellas. Una regla simple, un árbol de decisión, una rutina de búsqueda o una red neuronal pueden ejecutar el mismo bucle. Construir el bucle de un agente como una plantilla con dichos componentes plantea una pregunta doble: ¿qué capacidad tiene el razonamiento y hasta dónde llegan las acciones?

Las implementaciones clásicas de agentes difieren en la etapa de decisión (que como indicamos anteriormente tiene lugar durante la etapa de razonamiento). El libro Artificial Intelligence: A Modern Approach, de Russell y Norvig, organiza estas implementaciones en un espectro que va del agente basado en reflejo a un agente de aprendizaje capaz de mejorar sus propias reglas. Este curso comienza con lógica rígida y después añade un modelo de lenguaje y contexto proyectado, acercando el bucle al de un agente orientado a objetivos y basado en un modelo. En los módulos siguientes, el bucle continúa sobre un estado cambiante, siguiendo el patrón que sirve de base para los agentes de aprendizaje.

Cuatro arquitecturas con estructura creciente: desde un agente de reflejo que asigna acciones directamente a las entradas hasta un agente de aprendizaje que modifica sus propias reglas. Adaptado de Artificial Intelligence: A Modern Approach, de Russell y Norvig (capítulo 1).
Aplicado · Reflejo¿Ejecutar el ciclo de agente basado en reglas más pequeño?

Un agente sin modelo de lenguaje

La función de decisión más simple es la instrucción if. En el siguiente ejemplo, dicha instrucción guía una pista unidimensional limitada por paredes entre las posiciones 0 y 9. Pulsa Ejecutar y observa cómo la posición de la pista rebota entre las paredes mientras el bucle se ejecuta.

Dos aspectos del código anterior merecen especial atención:

  • El entorno (las paredes y la posición actual) vive en state.env, mientras que el estado interno del agente (su dirección) vive en state.agent. Mantenerlos separados permite que otros agentes operen en el mismo entorno con un estado interno distinto.
  • El paso de razonamiento es una sola instrucción if. Sustituirla por un árbol de decisión, una red neuronal o un modelo de lenguaje solo cambiará lo que ocurre entre percepción y acción. La estructura del bucle, el estado y la acción permanecerían iguales.

Lo que cambia cuando el razonamiento llama a un LLM

La interfaz de Chat Completions se invoca como cualquier otra función: recibe una lista de mensajes y el nombre de un modelo, y devuelve el mensaje generado por el modelo junto con metadatos.

Acerca de chat(). Es la función auxiliar del curso que se ejecutará más adelante en esta página. El fragmento siguiente muestra el formato de la llamada y los campos devueltos.
const reply = await chat({
  model:    "nvidia/nemotron-3-nano-30b-a3b",
  messages: [{ role: "user", content: "Hi" }],
});
// reply.choices[0].message  → { content, reasoning_content }
// reply.choices[0].finish_reason → "stop" | "tool_calls" | "length"

Tres aspectos de esta función determinan cómo deben funcionar los agentes construidos sobre ella:

Profundo · Construcción¿Comparar dónde conservan las API el estado de la conversación?

Este curso usa la Chat Completions API que mantiene la conversación como un array messages[] en el código y reenvía el array completo en cada llamada. La API más reciente, Respuestas API puede, en cambio, mantener la conversación en el servidor: se envían solo la nueva entrada y una referencia a la llamada anterior. En ambos casos, el modelo sigue sin estado. La conversación vive fuera de él, en un estado que se conserva en el código o el servidor.

Las dos interfaces realizan la misma llamada sin estado. Solo cambia quién conserva la conversación entre llamadas.

Un ejemplo real en el navegador

La celda siguiente envía una solicitud de Chat Completions al modelo. Para ello, necesita una clave API de NVIDIA. El nivel gratuito es suficiente para cubrir todos los ejercicios de este curso. Sólo tienes que añadir la clave una vez y el curso la mantendrá en el navegador, reutilizandola en todas las páginas.

Pulsa Ejecutar para enviar una única solicitud. No hay un bucle alrededor ni se conserva nada de una llamada anterior.

Profundo · Protocolo¿Inspeccionar la solicitud y la respuesta HTTP sin procesar?

Lo que chat() realmente envía

chat() es una función auxiliar que envuelve un único POST HTTP común en un formato compatible con OpenAI. Esta solicitud añade tres cosas:

  • el endpoint donde el modelo acepta peticiones,
  • un encabezado Authorization que carga la clave de usuario,
  • y como contenido un JSON con model y messages.

La celda siguiente realiza esta llamada manualmente y muestra el contenido enviado y la respuesta obtenida. Abre request para ver qué sale del navegador con la clave omitida y raw response para inspeccionar el objeto completo devuelto por chat().

Todos los endpoints de este curso entienden este mismo formato, incluyendo el runtime del agente OpenClaw en el Módulo 3.

Dos cosas que esa llamada hace discretamente, y por qué. Ninguna es magia, y vale la pena entender ambas antes de confiar en ellas.
  • Una llamada o solicitud puede ser enviada a través de un proxy. Si seleccionaste la opción LMS/iframe al añadir la clave, la solicitud no alcanza directamente build.nvidia.com. A veces se necesitan encabezados especiales que algunos endpoints no añaden. Por ejemplo, los encabezados de origen cruzado (CORS) requeridos por fetch en el navegador. Para solucionar este problema, se enruta la llamada por un proxy que los añade. El proxy usado en este curso también añade una cabecera de asignación para identificar el tráfico del curso. La llamada también envía la clave sin almacenarla ni reemplazarla.
  • La opción de streaming está encapsulada en una función auxiliar. chatStream() envía la misma solicitud de chat con streaming activado y interpreta el flujo de eventos como texto de respuesta, texto de razonamiento, metadatos de uso y señal de término. La función auxiliar conecta estos elementos al panel de esta lección y al botón Stop, dejando la celda concentrada en el concepto. El código fuente de la función auxiliar se puede abrir usando el menú de la celda.
Aplicado · Ciclo¿Comparar formas de razonar sobre el laberinto dentro de un ciclo fijo?

Cambiar la función de decisión sin cambiar el bucle

Por ahora tenemos las dos mitades de un agente. La función sin estado chat() se puede combinar con el bucle de percibir, razonar y actuar del agente de reflejo anterior. Antes de conectar un modelo al bucle, observa la etapa de decisión con rutinas normales (es decir, que no son modelos de lenguaje).

Ejecuta los nodos en orden. Cada uno aplica una regla de decisión diferente al mismo bucle que resuelve el laberinto:

  • La regla constante "siempre este" alcanza el objetivo en un pasillo recto, después se bloquea en la primera pared del laberinto, ya que un rumbo fijo no puede girar.
  • La búsqueda en profundidad (DFS) sigue una rama hasta el final antes de retroceder.
  • búsqueda en anchura (BFS) explora la frontera por niveles y encuentra el camino más corto en una rejilla sin pesos en sus celdas.
  • El A* utiliza una heurística de distancia para priorizar caminos prometedores sin perder la garantía de encontrar el camino más corto.
Solamente la etapa de decisión varía. DFS, BFS y A* leen el estado actual del laberinto y devuelven un movimiento. Una línea en el último nodo elige la función, mientras el bucle permanece igual para cada opción. La llamada chat() puede hacer esta función también. En este caso, hay dos cambios que considerar: el código representa la percepción como texto y el modelo devuelve una llamada a herramienta que el código aplica.

Cómo usar un modelo de lenguaje para elegir movimientos

El bucle todavía lee el entorno y aplica un movimiento validado. Solamente la etapa de decisión cambia. En lugar de DFS, BFS o A*, el modelo lee la representación del laberinto y solicita al código una llamada choose_direction.

Ejecuta las celdas en este orden y luego cambia un control cada vez:

  1. Comienza por el nodo motor. Este exporta las utilidades y un resolutor compartido state.runMaze, que recorre los pasillos del laberinto automáticamente y que llama al modelo solamente en las bifurcaciones.
  2. Ejecuta el nodo laberinto editable del agente. DIRECTIVE es la instrucción principal del sistema; con las opciones puedes controlar el modelo, el tamaño, el mapa textual, la imagen, el historial de movimientos, la ruta de coordenadas y la repetición del esquema de la herramienta.
  3. Utiliza las opciones por defecto. Después, activa includeImage, cambia model para comparar modelos o utiliza advanced para ampliar el laberinto una vez que funcione para el caso más simple.
Un esquema transforma la respuesta en una acción tipada. La regla constante devuelve una cadena; BFS, una lista. choose_direction ofrece el mismo contrato al modelo y lo aplica por medio de un esquema JSON. Así, el bucle lee un valor tipado en lugar de interpretar texto libre, y el modelo de lenguaje se encarga de la etapa de decisión antes ejecutada por BFS y A*.

El bucle en detalle

Al colocar chat() dentro del bucle que reenvía el historial, cada llamada adopta el mismo formato de cuatro etapas. Conviene nombrarlas ahora porque las cuestiones posteriores de seguridad y fiabilidad se remiten a ellas.

  • Muestra local. El código lee una parte del entorno, que puede ser la celda del laberinto y sus movimientos válidos, o el último mensaje del usuario, o el contenido de un archivo. Nunca intenta abarcar el entorno entero de una vez, porque todo lo que el turno exige es el pedazo de estado que el modelo necesita para actuar esta vez.
  • Percepción local. Esta parte se convierte en un contexto completo y preparado: el prompt de sistema, el historial messages[], resultados de herramientas anteriores y la parte que acabas de muestrear. Todo esto es texto puro. Para un agente LLM, la percepción es ingeniería de contexto.
  • Actuación local. El modelo transforma este texto en otro texto: una señal de intención, idealmente una llamada a herramienta tipada como { "move": "east" } en vez de prosa libre. La intención solo solicita una acción, y nunca ejecuta una. El código leará y aplicará una actualización en el entorno (doMove(...)), validándolo primero.
  • Impacto local. La actualización cambia el entorno. Nada permanece dentro del modelo. El estado permanente está en el entorno y en el contexto que el código reconstruirá. En la siguiente iteración, el muestreo local leerá el nuevo entorno y el bucle comienza de nuevo.

Observa el centro de la lista. El paso de percibir a actuar es una única transformación de texto a texto sin estado: entra un contexto completo y sale una señal de intención. El modelo solo transforma texto; percibir el mundo y convertir la intención en un cambio real siguen siendo tareas del código.

Esto deja el cuadrado verde como la única parte que el usuario no escribe. Al diseñar un agente, hay que prestar atención a dos cosas: el contexto que entrega al modelo y lo que hace con la intención devuelta.

Mostrar → entender → (texto → texto) → actuar → impactar
Cada iteración del bucle actúa localmente. El modelo lee una parte pequeña del mundo, como una sola celda del laberinto, y devuelve una acción limitada. Después, esa transformación de texto sin estado olvida lo que acaba de ver. Un agente repite este sencillo bucle muchas veces; el entorno conserva el estado que alimentará el paso siguiente. El módulo 1b implementa este bucle y permite observar cómo crece el contexto en cada iteración.

Antes de continuar

Puedes responder cada pregunta ajustando el control en la celda anterior del laberinto con LLM y ejecutándola de nuevo.

  1. Elimina el texto como entrada del modelo multimodal Define includeText:false y includeImage:true y ejecuta de nuevo. Ahora el modelo ve solo la imagen del laberinto. ¿Todavía se alcanza el objetivo? ¿Se necesitan más decisiones que en la ejecución con texto y imagen?
  2. Retira la recomendación de estrategia de DIRECTIVE. Elimina la línea que recomienda ramas aún no visitadas y ejecuta la misma celda. Compara la cantidad de decisiones con la ejecución que contenía el consejo. ¿Qué parte de la competitividad del modelo se derivaba de esa recomendación?
  3. Cambia el modelo de decisión. Cambia model:"vision" a model:"super" y ejecuta de nuevo. El bucle, el laberinto, la percepción y la acción permanecen iguales; solamente el modelo cambia. ¿Alcanza el nuevo modelo el objetivo con menos decisiones?

Prueba · el modelo como una función pura

El menor artefacto del curso es una única llamada chat() sin herramientas y sin memoria alrededor. Cada mensaje se envía directamente a la función, que se ejecuta de forma pura, sin historial y, por tanto, sin el estado que el bucle devolvería. Escribe algo y observa la respuesta recibida.

Preferencias