El problema
Los agentes conversacionales que gestionan pedidos en tiempo real traen un tipo de fallo nuevo: el bug lógico silencioso. El modelo responde con un lenguaje impecable y cordial, pero por dentro confirma ingredientes agotados o aplica mal la regla del pedido mínimo. El cliente se frustra y el servidor no lanza ninguna excepción.
La solución
1. Build · Construcción
Diagnóstico forense
2. Test · Evaluación offline
3. Deploy · Despliegue
4. Monitor · Evaluación online
Detección del Bug 2 ($25 de entrega mínima) y mitigación de falsos positivos en clientes insatisfechos.
Desarrollé y desplegué el agente de pedidos LangSlice con LangChain v0.3 (create_agent) y LangGraph. Seguí un flujo de diagnóstico, corrección, despliegue y monitorización continua:
- Instrumentación y análisis forense de trazas:
- Bug 1, toppings sin stock: inspeccioné la jerarquía de spans con
@traceablesobre las llamadas a herramientas secundarias (get_ingredient) y vi por qué el agente confirmaba ingredientes agotados sin avisar al cliente. - Reproduje el fallo de forma determinista con datasets de trazas pregrabadas (
upload_traces.py --input traces-1.json).
- Bug 1, toppings sin stock: inspeccioné la jerarquía de spans con
- Evaluación offline con datasets cerrados (
eval.py):- Escribí un evaluador heurístico (
ingredient_stock_evaluator) que audita las llamadas a herramientas y comprueba que no se admite en el pedido ningún ingrediente con stock menor o igual a cero. - Refactoricé la herramienta para que use
db.list_toppings()y filtre solo las existencias disponibles.
- Escribí un evaluador heurístico (
- Despliegue local y en la nube:
- Configuré el manifiesto
langgraph.json. - Levanté el entorno en local con LangGraph Studio y el servidor integrado en el puerto 2024, para depurar de forma visual, bifurcar estados y separar el tráfico de desarrollo del de producción.
- Lo conecté a una interfaz web para usuarios finales (
agent_client.py,app.py).
- Configuré el manifiesto
- Monitorización en producción y Bug 2:
- Con tráfico real apareció el Bug 2: la regla de pedido mínimo de entrega ($25) calculaba solo el subtotal de las guarniciones e ignoraba las pizzas.
- Configuré un evaluador online continuo a nivel de conversación (thread), con una rúbrica semántica de varios factores (tono y resolución efectiva del pedido).
- Detecté un sesgo de falso positivo con usuarios educados pero insatisfechos usando la variable
{{{human_ai_pairs}}}, y pasé esos casos a colas de anotación humana.
Stack desglosado
- Ecosistema: LangChain v0.3 (
create_agent), LangGraph y LangGraph Studio. - Entorno de ejecución: Python y empaquetado rápido con
uv. - Servidor y API: LangGraph Server, FastAPI y cliente web integrado.
- Observabilidad y calidad: LangSmith (trazas jerárquicas, datasets reproducibles y evaluación online a nivel de hilo).
Resultados y aprendizajes
Lo que funcionó fue depurar de forma visual en LangGraph Studio y apoyarme en datasets de regresión. Pude bifurcar el estado de una conversación justo antes de la llamada a la herramienta, arreglar la lógica del pedido en minutos y probar la corrección sobre cientos de variantes sintéticas.
Lo que aprendí: en producción los peores errores no son los que revientan con un error 500, sino los que se ejecutan limpios y devuelven un resultado de negocio equivocado.