Arquitectura

BI generativo sobre una capa semántica gobernada

Un usuario hace una pregunta de negocio y recibe un tablero en segundos. La IA interpreta y elige; las definiciones, los joins y el SQL son determinísticos y auditables.

Usuario de negociopregunta en ES / ENWeb · Next.js (Vercel)respuesta + gráfico + linajetableros como specs JSONAPI · FastAPI (Cloud Run)pipeline por etapastraza por preguntaClaude APIsolo elige y combinanunca escribe SQL ni númerosPIPELINE DE RESPUESTANormalizaridioma · as_ofinyecciónVerificadoconsultas deconfianza · 0 IARouterHaiku 5.5workspacePlannerSonnet 5.5QueryPlanValidadorcatálogo1 reparaciónCompiladorplan → SQLjoins declaradosEjecutorsolo lectura5 s · 5.000 filasChequeosrangosconciliaciónRespuestaconfianza+ linajeCapa semántica (YAML versionado)35 métricas · dimensiones · joins declaradosconsultas verificadas · valores · brechas conocidasMongoDB (raw)Crop Story · geometrías GeoJSONalertas · formulariosELTraw → staging → martstests de calidad de datosPostgres + PostGIS (marts)un mart ancho por procesorol app_reader (solo SELECT)Evaluaciones + trazasset dorado por etapa · CIreplay /trace/{id}SQL compilado
IA (Claude)DeterminísticoConfianza / controlDatos

Principios

01

La IA elige y combina; no calcula

El modelo devuelve un QueryPlan tipado (métricas, dimensiones, filtros). Nunca escribe SQL ni números.

02

La lógica vive en la capa semántica

Cocientes de sumas, hectáreas contadas una vez, estándar obligatorio: reglas en YAML versionado, no en prompts.

03

SQL determinístico

Mismo plan → mismo SQL, byte a byte. Solo joins declarados. Snapshot tests en CI.

04

Mejor un “no sé” que un número malo

Si falta una métrica, rechaza y ofrece lo más cercano. Las brechas conocidas están declaradas.

05

Cada número es trazable

Definición, plan, SQL, tablas de origen, filas de muestra, fecha de corte y versión semántica.

06

Las evaluaciones son producto

Set dorado puntuado por etapa; CI bloquea si baja la precisión. Nunca se usa como few-shot.

Niveles de confianza de cada respuesta

NivelCuándoQué ve el usuario
VerificadoCoincide con una consulta verificada; solo se completan parámetros.Dueño y fecha de verificación. Costo de IA: 0.
GobernadoQueryPlan sobre métricas definidas que pasó todas las validaciones.Linaje completo y advertencias de los chequeos.
ExploratorioSQL libre detrás de un flag (apagado en la demo pública).SQL expandido y aviso de revisar.
Sin respuestaFuera de alcance, ambigua tras una aclaración o validación fallida.Explicación simple y métricas más cercanas.

Stack

CapaDemoProducción
WebNext.js 15 · Recharts · LeafletVercel
APIFastAPI · Pydantic · sqlglotCloud Run (min 0)
Datos analíticosDuckDB (read-only)Postgres + PostGIS (Neon), app_reader
Datos crudosJSONL (Mongo-shaped)MongoDB Atlas
LLMClaude Haiku 5.5 (router) · Sonnet 5.5 (planner)Igual; el modelo se elige por costo con las evals
CIGitHub ActionsLint, tests, linter semántico, evals con gates

Patrones de casos en producción

PatrónFuenteAcá
El LLM descompone en métricas + dimensiones; un motor genera el SQLdbt Labs (2023, 2026)QueryPlan + compilador
La precisión depende de la capa semántica más que del modeloCube (2026)Modelo como config; comparado en evals
Workspaces + agente de intención + poda del catálogoUber QueryGPTRouter por workspace
Activos de confianza: consultas verificadas parametrizadasDatabricks GenieNivel Verificado
Los benchmarks evalúan pero nunca alimentan el contextoDatabricks GenieTest de disjunción en CI