Módulo 2: Tools y Tool Calling
Introducción: Por qué los modelos necesitan herramientas
Descripción
Los LLMs son impresionantes generando texto, pero eso es exactamente lo que son — generadores de texto. No pueden buscar en la web, no pueden hacer cálculos matemáticos confiables, no pueden consultar tu base de datos, no pueden llamar una API externa. Están atrapados dentro de su ventana de entrenamiento.
Las tools (herramientas) resuelven esta limitación. Con tool calling, un modelo puede decidir "necesito buscar el clima actual en Madrid" y tú ejecutas esa búsqueda por él. El modelo decide qué herramienta usar y con qué argumentos, tú ejecutas la herramienta, y el modelo integra el resultado en su respuesta final.
En este módulo aprenderás a crear tools, conectarlas a modelos, y ejecutar el flujo completo de tool calling. Al terminar, tus modelos podrán hacer cosas que el texto plano nunca permitiría.
¿Dónde estamos en la guía?
Este es el Módulo 2 de la guía LangChain & LangGraph: From Chains to Agents. Construye directamente sobre el Módulo 1 — ya sabes inicializar modelos, ejecutarlos con invoke/stream/batch, y obtener structured output. Ahora vas a darles manos para actuar en el mundo real.
La guía tiene 4 bloques progresivos:
Bloque 1: LangChain Core (Módulos 1-4) ← ESTÁS AQUÍ (Módulo 2)
Bloque 2: LangGraph Fundamentals (Módulos 5-7)
Bloque 3: LangGraph Avanzado (Módulos 8-10)
Bloque 4: Producción (Módulos 11-12)
Tu progreso en el Bloque 1:
Módulo 1: Modelos y Proveedores ✅ Completado
│
▼
Módulo 2: Tools y Tool Calling ← ESTÁS AQUÍ
│
▼
Módulo 3: Agents (create_agent) 🔒 Siguiente
│
▼
Módulo 4: Middleware y Customización 🔒 Después
En el Módulo 1 aprendiste a conectar con modelos y obtener respuestas. Pero esas respuestas están limitadas a lo que el modelo ya sabe. Con tools, el modelo puede acceder a información en tiempo real, ejecutar cálculos exactos, y interactuar con sistemas externos.
Por qué los modelos necesitan herramientas
El problema fundamental
Un LLM solo puede hacer una cosa: predecir el siguiente token basándose en su entrenamiento. Esto significa que tiene limitaciones fundamentales:
| Limitación | Ejemplo | Por qué falla |
|---|---|---|
| Sin datos en tiempo real | "¿Cuál es el clima ahora en CDMX?" | Su conocimiento tiene una fecha de corte |
| Matemáticas poco confiables | "¿Cuánto es 847 × 293?" | Calcula "aproximadamente" en vez de exactamente |
| Sin acceso a tus datos | "¿Cuántos usuarios tengo en mi DB?" | No tiene conexión a tu base de datos |
| Sin acciones externas | "Envía un email a soporte" | Solo puede generar el texto del email |
| Sin contexto actualizado | "¿Cuál es el precio actual de Bitcoin?" | Responde con datos de su entrenamiento |
El modelo es un cerebro poderoso sin manos. Puede razonar, planificar, y decidir qué hacer — pero no puede ejecutar nada por sí mismo.
Las herramientas desbloquean capacidades
Con tools, las mismas preguntas tienen respuestas reales:
| Pregunta | Sin tools | Con tools |
|---|---|---|
| "¿Clima en CDMX?" | "Generalmente templado..." (genérico) | "18°C, nublado, 65% humedad" (en tiempo real) |
| "¿847 × 293?" | "Aproximadamente 248,000" (incorrecto) | "248,171" (exacto, vía calculadora) |
| "¿Cuántos usuarios activos?" | "No tengo acceso a tu DB" | "1,247 usuarios activos" (vía query SQL) |
| "Busca noticias de LangChain" | Info de su entrenamiento | Resultados actualizados de búsqueda |
| "Envía un email a soporte" | Genera el texto pero no envía | Envía el email vía API de email |
La diferencia es clara: sin tools, el modelo inventa o admite ignorancia. Con tools, obtiene datos reales y responde con información precisa.
Tipos de herramientas que puedes crear
Las tools se dividen en categorías según lo que hacen:
| Categoría | Ejemplos | Qué resuelve |
|---|---|---|
| Datos en tiempo real | Clima, precios, noticias | El modelo accede a información actual |
| Cálculos exactos | Calculadora, conversiones, estadísticas | Resultados matemáticos sin error |
| Consultas a datos | SQL, APIs internas, búsquedas | El modelo accede a tus sistemas |
| Acciones | Enviar emails, crear tickets, publicar | El modelo ejecuta tareas reales |
| Procesamiento | Traducción, formateo, extracción | Operaciones que requieren lógica específica |
En este módulo cubrirás las primeras 3 categorías. Las acciones con side effects requieren más cuidado (validación, confirmación del usuario) y se profundizan en módulos posteriores con Human-in-the-Loop (Módulo 9).
El flujo de tool calling
El tool calling sigue un flujo de 5 pasos claro:
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 1. User │────▶│ 2. Model │────▶│ 3. Tool │────▶│ 4. Model │────▶│ 5. User │
│ pregunta │ │ decide │ │ ejecuta │ │ integra │ │ recibe │
│ │ │ qué tool │ │ la tool │ │ resultado│ │ respuesta│
└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘
Paso a paso:
- El usuario envía una pregunta — "¿Qué clima hace en Madrid?"
- El modelo analiza y decide — "Necesito la tool
get_weatherconcity='Madrid'" - Tú ejecutas la tool — Llamas la función
get_weather("Madrid")y obtienes el resultado - El modelo integra — Recibe el resultado y genera una respuesta natural
- El usuario recibe la respuesta — "En Madrid hace 22°C, soleado"
Ejemplo concreto del flujo
Usuario: "¿Cuánto es 847 × 293 y cuál es la raíz cuadrada del resultado?"
Paso 2 — El modelo decide:
→ tool_call: multiply(a=847, b=293)
Paso 3 — Tú ejecutas:
→ multiply(847, 293) = 248171
Paso 4 — El modelo recibe 248171 y decide:
→ tool_call: square_root(n=248171)
Paso 3 (otra vez) — Tú ejecutas:
→ square_root(248171) = 498.17
Paso 4 — El modelo integra todo:
Paso 5 — Respuesta al usuario:
"847 × 293 = 248,171. La raíz cuadrada de 248,171 es aproximadamente 498.17"
El modelo puede encadenar múltiples tool calls si necesita resultados intermedios. Este loop se repite hasta que el modelo tiene toda la información para responder.
Detalle importante: el modelo NO ejecuta tools
El modelo genera un JSON con el nombre de la tool y los argumentos. Es tu código el que ejecuta la función real. Esto te da control total:
- ✅ Puedes validar los argumentos antes de ejecutar
- ✅ Puedes decidir si una tool es segura de ejecutar
- ✅ Puedes agregar logging, rate limiting, o timeout
- ✅ Puedes manejar errores y darle feedback al modelo
- ❌ El modelo nunca tiene acceso directo a tus sistemas
Lo que el modelo produce internamente es algo como:
{
"tool_calls": [
{
"name": "get_weather",
"args": {"city": "Madrid", "units": "celsius"},
"id": "call_abc123"
}
]
}
Tu código lee ese JSON, ejecuta get_weather(city="Madrid", units="celsius"), y le devuelve el resultado al modelo como un ToolMessage.
Analogía: el cerebro y las manos
Piensa en el modelo como un cerebro experto que puede analizar situaciones, razonar sobre qué hacer, y dar instrucciones precisas. Las tools son las manos que ejecutan esas instrucciones.
Un cirujano (cerebro) le dice a su equipo (manos): "necesito el bisturí #3, corte de 5cm en la incisión". El cirujano no agarra nada directamente — da instrucciones y el equipo ejecuta. Si algo no se puede hacer, el equipo reporta y el cirujano ajusta su plan.
Así funciona tool calling: el modelo da instrucciones, tu código ejecuta, y el modelo ajusta según los resultados.
¿Qué pasa si el modelo no necesita tools?
Si la pregunta no requiere herramientas, el modelo simplemente responde con texto normal. Tool calling es opcional por pregunta — el modelo decide si necesita una tool o no.
"¿Qué es Python?" → El modelo responde directamente (no necesita tools)
"¿Cuánto es 2+2?" → El modelo puede responder directamente o usar calculadora
"¿Clima en Madrid?" → El modelo necesita la tool get_weather
El modelo evalúa cada pregunta y decide si alguna de las tools disponibles le ayudaría a dar una mejor respuesta.
Tool calling es un estándar de la industria
Tool calling no es exclusivo de LangChain. Los principales proveedores lo soportan nativamente:
- ✅ OpenAI — Lo llaman "function calling" (desde GPT-3.5, mejorado en GPT-4.1)
- ✅ Anthropic — Lo llaman "tool use" (desde Claude 3)
- ✅ Google — Lo soportan en Gemini como "function calling"
- ✅ Modelos locales — Llama 3.1+ y Mistral lo soportan
LangChain unifica todas estas implementaciones en una sola interfaz. Creas la tool una vez y funciona con cualquier proveedor que soporte tool calling — exactamente como init_chat_model unifica la inicialización de modelos.
Qué dominarás en este módulo
Al completar las 8 cápsulas de este módulo, serás capaz de:
- ✅ Crear herramientas con el decorador
@tooly schemas Pydantic - ✅ Conectar tools a modelos con
bind_tools()y controlartool_choice - ✅ Implementar el tool execution loop completo (model → tool → model)
- ✅ Manejar parallel tool calls (múltiples tools en una sola invocación)
- ✅ Hacer streaming de tool call chunks
- ✅ Usar tool calling como mecanismo de structured extraction
- ✅ Implementar error handling robusto cuando una tool falla
Mapa del módulo
| Cápsula | Tema | Qué aprenderás |
|---|---|---|
| 02 | Crear tools con @tool | Decorador @tool, names y descriptions, argument schemas con Pydantic, tools async |
| 03 | bind_tools y el flujo de tool calling | model.bind_tools(), tool_choice, forzar tool calls, inspeccionar tool_calls en AIMessage |
| 04 | Tool execution loop | Ejecutar tools manualmente, ToolMessage, loop completo, cuándo usar loop manual vs agent |
| 05 | Parallel tool calls y streaming | Múltiples tool calls simultáneos, streaming de chunks, acumular chunks |
| 06 | Structured output con tools | Tool calling como mecanismo de structured extraction, combinar tools + structured output |
| 07 | Error handling y troubleshooting | Errores comunes, retry logic, debugging, validación de schemas |
| 08 | Proyecto: Asistente con herramientas | Asistente con tools de weather, web search y calculator |
Flujo de aprendizaje: Primero aprenderás a crear tools (02). Luego a conectarlas a modelos (03). Después a ejecutar el loop completo donde el modelo llama tools y usa sus resultados (04). Con eso dominado, avanzarás a parallel calls y streaming (05), structured extraction con tools (06), y error handling robusto (07). Al final, integrarás todo en un asistente funcional (08).
Conexión con el proyecto
Mini-Proyecto de este módulo: Asistente con Herramientas Externas
En la Cápsula 08 construirás un asistente conversacional que:
- Tiene 3 tools conectadas: clima (weather API), búsqueda web y calculadora
- El modelo decide autónomamente qué tool usar según la pregunta del usuario
- Maneja parallel tool calls — si el usuario pregunta "¿clima en Madrid y en Buenos Aires?", el modelo llama la tool dos veces simultáneamente
- Implementa error handling — si una tool falla, el modelo recibe el error y se recupera
Cada concepto que aprendes en las cápsulas 02-07 se aplica directamente en este proyecto.
Conexión con la guía completa
Las tools que creas aquí son la base de todo lo que viene:
- Módulo 3:
create_agentautomatiza el tool execution loop — en vez de escribir el loop manualmente, el agent lo hace por ti. Es la diferencia entre conducir manual y automático. - Módulo 4: El middleware system te permite interceptar tool calls antes de que se ejecuten (logging, validación, rate limiting).
- Módulos 5-7: En LangGraph, las tools se ejecutan como nodos en un grafo, lo que te da control granular sobre el flujo.
- Módulos 8-10: En sistemas multi-agente, diferentes agentes tienen diferentes tools — un agente de datos tiene tools SQL, uno de comunicación tiene tools de email.
Límites: qué NO cubre este módulo
- ❌ Agents (create_agent) — Se cubre en Módulo 3. Aquí aprendes el loop manual para entender qué pasa internamente.
- ❌ Middleware y customización — Se cubre en Módulo 4. Interceptar y modificar tool calls antes/después de ejecutarlas.
- ❌ LangGraph workflows — Se cubre en Módulos 5-7. Orquestar tools como nodos de un grafo.
- ❌ MCP (Model Context Protocol) — Es un estándar para tools interoperables; se menciona brevemente pero no se profundiza.
- ❌ Tools de terceros avanzadas — Cubrimos built-in tools como ejemplo, pero el foco es crear tus propias tools.
Setup técnico
Prerequisitos
Antes de continuar, verifica que tienes:
- ✅ Módulo 1 completado — sabes usar
init_chat_model,invoke, y structured output - ✅ Python 3.11+ instalado
- ✅ Al menos una API key de un proveedor que soporte tool calling (OpenAI o Anthropic recomendado)
- ✅ Familiaridad básica con Pydantic (modelos de datos Python)
Instalación
No necesitas paquetes nuevos más allá de los que instalaste en el Módulo 1:
# Si ya tienes el Módulo 1 instalado, no necesitas nada más
pip install langchain langchain-openai python-dotenv pydantic
# Opcional: para usar tools built-in de búsqueda
pip install duckduckgo-search
Verificar que todo funciona
from dotenv import load_dotenv
load_dotenv()
from langchain.chat_models import init_chat_model
from langchain_core.tools import tool
@tool
def greet(name: str) -> str:
"""Saluda a una persona por su nombre."""
return f"¡Hola, {name}!"
print(greet.name)
# Output esperado: greet
print(greet.description)
# Output esperado: Saluda a una persona por su nombre.
model = init_chat_model("openai:gpt-4.1-mini")
model_with_tools = model.bind_tools([greet])
response = model_with_tools.invoke("Saluda a María")
print(response.tool_calls)
# Output esperado: [{'name': 'greet', 'args': {'name': 'María'}, 'id': '...'}]
Si ves la tool call en la respuesta, tu setup está listo para este módulo.
Si algo falla, los errores más comunes son:
| Error | Causa | Solución |
|---|---|---|
ImportError: cannot import name 'tool' | Versión de langchain-core antigua | pip install --upgrade langchain-core |
NotImplementedError: ... does not support tool calling | El modelo no soporta tool calling | Usa un modelo que lo soporte (GPT-4.1, Claude Sonnet) |
ValidationError en args_schema | Type hints inconsistentes | Verifica que los tipos del schema coinciden con los de la función |
Evidencia de éxito
Al terminar este módulo, sabrás que tuviste éxito si:
- ✅ Puedes crear una tool con
@tooly que el modelo la llame correctamente - ✅ Entiendes el flujo completo: user → model → tool → model → user
- ✅ Sabes la diferencia entre que el modelo proponga una tool call y ejecutar la tool
- ✅ Manejas parallel tool calls y errores de tools sin que el sistema se caiga
- ✅ Tu asistente del proyecto final responde preguntas usando 3 tools diferentes
Vista previa: de tools manuales a agents automáticos
En este módulo vas a escribir el tool execution loop manualmente. Esto es intencional — necesitas entender qué pasa internamente antes de automatizarlo.
En el Módulo 3, aprenderás create_agent, que automatiza todo el loop:
# Módulo 2: loop manual (lo que aprenderás aquí)
response = model_with_tools.invoke(messages)
# → Verificar si hay tool_calls
# → Ejecutar cada tool
# → Agregar ToolMessage
# → Volver a llamar al modelo
# → Repetir hasta que no haya más tool_calls
# Módulo 3: loop automático con create_agent
from langchain.chat_models import init_chat_model
from langchain.agents import create_agent
model = init_chat_model("openai:gpt-4.1-mini")
agent = create_agent(model, tools=[greet, search, calculator])
response = agent.invoke({"messages": [{"role": "user", "content": "Saluda a María"}]})
# → El agent ejecuta todo el loop internamente
Aprender el loop manual primero te da superpoderes: cuando algo falla en un agent, sabes exactamente dónde buscar porque entiendes cada paso del flujo.
La relación es como aprender a conducir con transmisión manual antes de pasar a automática — entiendes lo que pasa debajo del capó, y eso te hace un mejor conductor incluso cuando usas automático.
¿Cuándo usar loop manual vs agent?
| Situación | Recomendación |
|---|---|
| Aprendiendo tool calling | Loop manual (este módulo) |
| Prototipo rápido en producción | create_agent (Módulo 3) |
| Necesitas control total del flujo | Loop manual o LangGraph (Módulos 5-7) |
| Debugging de un agent | Entender el loop manual te ayuda a diagnosticar |
Resumen
- Los LLMs solo generan texto — no pueden buscar, calcular, ni interactuar con sistemas externos
- Las tools extienden las capacidades del modelo: son funciones Python que el modelo puede solicitar ejecutar
- El modelo nunca ejecuta tools directamente — decide qué tool llamar y con qué args, y tu código las ejecuta
- El flujo es: user → model → tool → model → user (el modelo propone, tú ejecutas, el modelo integra)
- El modelo puede encadenar múltiples tool calls cuando necesita resultados intermedios
- Tool calling es opcional por pregunta — el modelo decide si necesita una tool o responde directo
- Tool calling es un estándar de la industria soportado por OpenAI, Anthropic, Google y modelos locales
- Las tools se dividen en categorías: datos en tiempo real, cálculos exactos, consultas a datos, acciones y procesamiento
- Este módulo cubre el loop manual; el Módulo 3 (
create_agent) lo automatiza - No necesitas paquetes nuevos —
langchainylangchain-coreincluyen todo lo necesario para tools - El proyecto integrador es un asistente con tools de clima, búsqueda y calculadora
Recursos adicionales
- LangChain Tools Documentation — Conceptos y guía oficial de tools
- How to create tools — Guía paso a paso para crear tools custom
- Tool Calling Conceptual Guide — Cómo funciona el tool calling internamente
- OpenAI Function Calling Guide — La especificación original de tool calling
- Anthropic Tool Use — Tool calling en Anthropic
- LangChain Built-in Tools — Catálogo de tools pre-construidas
Módulo 2 — LangChain & LangGraph: From Chains to Agents
Siguiente cápsula: Crear Tools con @tool — aprenderás a convertir cualquier función Python en una herramienta que los modelos pueden invocar.