| Cadena | Agente | |
|---|---|---|
| Orden de los pasos | fijo, lo escribes tú | dinámico, lo elige el modelo |
| Llamadas al LLM | las que pongas | una por vuelta del bucle, más la final |
| Reproducible | sí | no del todo |
| Depurable | fácil | por el log de razonamiento |
La regla práctica: si puedes dibujar el diagrama de flujo antes de conocer la pregunta del usuario, no necesitas un agente. Un agente es más lento y más caro por diseño — cada decisión cuesta una llamada.
ReAct = Reason + Act. El modelo no ejecuta nada: escribe texto diciendo qué quiere ejecutar, y el runtime de LangChain lo ejecuta y le devuelve el resultado como más texto.
Dos consecuencias de que todo esto sea texto. Una: el formato importa. Si el modelo se desvía del
formato esperado, el parseo falla — de ahí handle_parsing_errors=True y
temperature=0. Con creatividad, un agente se rompe. Dos: el bucle puede no terminar solo;
max_iterations es el freno de mano, no un ajuste fino.
Una herramienta son tres cosas: un nombre, una función y una descripción. El modelo nunca ve tu función; solo ve el nombre y la descripción, y con eso decide.
Tool(
name="...",
func=mi_funcion, # una función de Python normal y corriente
description="...", # esto es lo único que el modelo lee para decidir
)
Por eso, cuando un agente ignora una herramienta que debería usar, el sitio donde se arregla no es el código del agente: es la descripción. Una descripción útil dice cuándo usarla y cuándo no, no qué hace por dentro.
| Descripción | Qué pasa |
|---|---|
"Buscar" | El modelo adivina. A veces acierta. |
"Buscador web, útil para hechos posteriores al corte de entrenamiento; no la uses para cálculos" | El modelo tiene un criterio que aplicar. |
initialize_agent y
AgentType.ZERO_SHOT_REACT_DESCRIPTION están deprecados desde hace tiempo y con LangChain v1.0 la
funcionalidad legacy vive en langchain-classic; el constructor estándar hoy es
create_agent (comprobado en la documentación de release de LangChain v1 el 2026-08-30).
Dos: el paquete duckduckgo-search que pide el pip install se renombró a
ddgs, y hay incidencias abiertas en el repositorio de LangChain por errores de ratelimit al
usar DuckDuckGoSearchRun — que tu ejercicio falle no significa necesariamente que tu agente esté
mal montado. (La validación numérica de la guía sí está bien: calculé 8848**3 = 692684296192, es
decir 6,927 × 10¹¹, y la guía anuncia «aprox 6.9 × 10¹¹».)
verbose=True te enseña el Thought del modelo y se lee
como si el agente estuviera razonando. Pero ese texto lo genera el mismo modelo que a continuación puede
equivocarse de herramienta. ¿Qué te demuestra realmente un Thought que suena bien — que el razonamiento fue
correcto, o solo que el modelo sabe escribir razonamientos con buena pinta? ¿Cómo lo comprobarías sin fiarte
del log?
No montes el agente todavía. Escribe primero solo las descripciones de tus tres herramientas, una línea cada una, diciendo cuándo usarla y cuándo no. Luego léelas seguidas y pregúntate si tú, sin ver el código, sabrías elegir entre ellas para «¿cuál es la población de Tokio y cuánto es el 15 %?». Si tú dudas, el modelo también.