№ 13 · Productos con IA

Bacardi Insights

Chatbot analítico para C-level: pregunta en lenguaje natural sobre P&L y share de mercado; respuesta con SQL ejecutado, gráficos y resumen ejecutivo.

En producción2026BacardiLangGraphMLflowFastAPIReact/TS

Resumen

Plataforma de analítica multi-agente para C-suite de Bacardi. Las preguntas en lenguaje natural sobre rendimiento financiero y share de mercado se resuelven a través de un supervisor LangGraph, un caché de tres tiers y un rendering determinístico de gráficos — y se entregan con el SQL, la traza y el rationale de routing visibles. Construida para ganar a los copilotos black-box en transparencia y velocidad.

Detalles

Mi rol
AI product engineer
Período
2026
Estado
En producción
Stack
LangGraphMLflowFastAPIReact/TSDatabricksGenie SpacesVector SearchLakebaseRechartsChatDatabricks

Contexto

Los usuarios C-suite de un grupo global de spirits necesitaban respuestas — rendimiento financiero y share de mercado — sin el ciclo analista de 24-72 horas. El contendiente interno era un despliegue de la herramienta copilot interna optimizado para amplitud y familiaridad de marca; lo que no podía ofrecer era legibilidad. Los ejecutivos aceptan IA en el flujo solo cuando pueden ver por qué un número es lo que es. Una respuesta black-box en una revisión trimestral no es una respuesta, es una contingencia. El chatbot de primera generación demostró el apetito pero expuso el coste arquitectónico: un agente monolítico, un frontend que orquestaba planes multi-paso, veintiséis fases de workarounds acumulados y tres rutas de código muertas. La latencia era impredecible, la capa de rendering era frágil y añadir un dominio nuevo significaba editar cuatro archivos en dos repos. v2 tenía que conservar las victorias — golden cache, capa de fallback, rendering Recharts — y descartar el patrón de orquestación entero. El brief: una plataforma de analítica con cinco módulos, una espina LangGraph limpia y la transparencia como feature de producto de primera clase, no como herramienta de debug.

Arquitectura

Una sola Databricks App que envía backend y frontend en un único deploy. El backend es un StateGraph LangGraph con cinco nodos especialistas; el frontend renderiza Recharts de forma determinística y exhibe traza, SQL y decisión de routing al lado de cada respuesta.

  1. Supervisor partido en tres nodos trazables — rewrite, intent y routing — en lugar de un solo paso opaco.
  2. Tier 1 — caché golden de SQL respaldado por Vector Search con coseno y arbitraje LLM en zona gris.
  3. Tier 2 — text-to-SQL con validador de cinco pasos que enforcea CTE y FULL OUTER JOIN sobre el mart financiero.
  4. Tier 3 — fallback a Genie Spaces para la cola larga que no cabe en cache ni en el validador.
  5. Capa LLM con `ChatDatabricks.with_fallbacks([Sonnet → Haiku → modelos de respaldo])` — resiliencia a nivel de librería.
  6. Estado persistido en Lakebase Postgres vía LangGraph checkpointer; sobrevive timeout de proxy y refresh del navegador.
  7. Trazado MLflow `langchain.autolog()` que instrumenta cada span de nodo para auditoría LLM.
  8. Frontend React/TypeScript que renderiza Recharts con misma data → mismo gráfico, siempre.

Decisiones

Multi-agente sobre monolito.
Nodos especialistas por dominio en lugar de un solo agente. La orquestación pertenece al servidor, no a un componente React: la migración elimina los planes multi-paso del frontend y deja que cada nodo asuma una responsabilidad acotada y testeable.
Caché de tres tiers con arbitraje en zona gris.
Coseno ≥0.90 ejecuta directo; banda 0.80-0.90 dispara un arbitrador LLM; <0.80 cae a text-to-SQL. La mayoría de preguntas nunca llegan a Genie y la zona gris no clasifica paráfrasis silenciosamente como miss.
`ChatDatabricks` + `.with_fallbacks()` + autolog.
Sustituye unas trescientas líneas de retry, logging y parsing custom. La resiliencia vive en la capa de librería, no esparcida por nodos: una sola swap absorbe la preocupación entera y reduce el área de mantenimiento.
Patrón SQL impuesto por validador.
El crítico enforcea CTE-aggregation seguido de FULL OUTER JOIN sobre el mart financiero. Es un guardrail en código, no en prompt: bloquea filas multiplicadas en silencio antes de que un número erróneo llegue a una pantalla ejecutiva.
Ejecución como job más checkpointer en Lakebase.
Sobrevive el timeout de proxy de noventa segundos y el refresh de navegador, y habilita HITL vía `interrupt_before` cuando el flujo lo necesite. La persistencia de estado deja de ser un workaround del frontend para ser una primitiva del backend.
Selección de gráfico determinística en dos lugares.
Backend en `chart_spec.py` y frontend en `chart-selector.ts`, con paridad enforced por tests. Misma data, mismo gráfico, siempre — sin sorpresas visuales en una revisión ejecutiva por una decisión cliente-side.

Aprendizajes

  • Sustituir un helper `call_llm()` custom por `ChatDatabricks` con `.with_fallbacks()` y autolog borró unas trescientas líneas de retry, logging y parsing — una sola swap, preocupación entera absorbida.
  • La fase 26 fue la lección. El frontend v1 orquestaba bucles plan→step→synthesise porque el backend no podía. LangGraph elimina la necesidad: la reescritura limpia salió más barata que el retrofit porque la orquestación v1 era deuda técnica load-bearing.
  • La transparencia como diferenciador. Mostrar el SQL, la decisión de routing y la traza por nodo es lo que gana frente a un copiloto interno de capacidad bruta comparable. Los ejecutivos aceptan «el modelo» cuando pueden ver el trabajo y lo rechazan cuando no.
  • Disciplina de Empirical Gap. Hay piezas lógicamente completas que no se pueden validar sin acceso productivo; marcarlas explícitamente evita que el trabajo embarcado parezca inacabado.
  • Conflicto de paquete atrapado a tiempo. `databricks_langchain` (no `langchain_databricks`) es el namespace compatible con el pin de Vector Search — codificado como decisión permanente para que no recurra.

Estado y rumbo

Estado actual
Backend y frontend feature-complete sobre el alcance de cinco dominios; espina multi-agente LangGraph operando, caché de tres tiers en vivo y cadena de fallback de ChatDatabricks en producción cubriendo Sonnet, Haiku y modelos de respaldo.
Próximos pasos
Activación del HITL vía checkpoint `interrupt_before` para confirmar pasos de alto impacto, despliegue productivo del smoke test del endpoint de cuatro LLMs y promoción del Experiment de MLflow al workspace productivo con observabilidad alineada al equipo de plataforma.