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