Plataforma para cliente

Plataforma de Consulta Geoespacial en Lenguaje Natural

Un producto donde los usuarios preguntan sobre datos geográficos en lenguaje natural y reciben respuestas, gráficos y mapas, generados por un LLM sobre PostGIS.

Trabajo protegido por NDA; el producto, el cliente y los datasets no se nombran intencionadamente.

Arquitectura

  1. Pregunta
    lenguaje natural, vía app web o SDK
  2. LLM
    generación de SQL consciente del esquema
  3. Validación
    esquemas permitidos · consulta restringida
  4. PostGIS
    ejecución espacial
  5. Respuesta
    texto · gráfico · mapa · análisis

Trabajo para un cliente bajo NDA, así que nombres y datasets quedan fuera: un motor de consulta texto-a-SQL sobre datos públicos multijurisdiccionales, la plataforma de producto a su alrededor (API, aplicación web, SDKs, facturación) y la infraestructura en la que corre. Lideré su concepción e ingeniería con el equipo de Territorial.

En resumen

  • Motor de consulta: lenguaje natural → SQL consciente del esquema → validación → PostGIS → respuesta en lenguaje natural, en una sola llamada
  • Dos backends de LLM intercambiables tras una interfaz REST idéntica; restricción por esquema para que una conversación solo toque las fuentes de datos que le fueron concedidas
  • Sandbox analítico: un bucle de herramientas acotado para análisis posteriores (razones, rankings, comparaciones), gráficos, mapas y un intérprete de código opcional
  • Plataforma de producto con organizaciones, claves de API, medición de uso, rate limits, webhooks, facturación por suscripción, SDKs en TypeScript y Python y sitio de documentación

El motor de consulta

El motor es un servicio FastAPI sobre PostgreSQL/PostGIS con datasets públicos a nivel federal, estatal y municipal: financiación de campañas, demografía censal, registros y licencias de empresas, permisos, criminalidad, impuestos. La parte difícil de texto-a-SQL sobre datos así no es el modelo; es darle al modelo un esquema sobre el que pueda razonar. Diseñé la capa de datos: cómo se relacionan jurisdicciones de distintos niveles, cómo se exponen y simplifican las geometrías, qué columnas tienen significado y cómo se describe todo eso para que el SQL generado sea correcto a la primera con más frecuencia. La coincidencia aproximada de nombres usa similitud por trigramas en la base de datos, así que lugares y candidatos mal escritos siguen resolviéndose.

Una pregunta se convierte en un candidato SQL, se valida y restringe (los esquemas se permiten por conversación, los esquemas internos nunca pueden consultarse), se ejecuta y se resume de vuelta en lenguaje. El backend de LLM es intercambiable: una implementación con modelos de OpenAI vía LangChain, otra con el framework de agentes de Google y Gemini, ambas tras el mismo contrato REST con historial de conversación, de modo que comparar proveedores fue configuración y no una reescritura. Un modo analítico añade un bucle de agente acotado sobre datos recién obtenidos, con timeouts por consulta, límites de reintentos y un plazo de extremo a extremo, produciendo porcentajes, rankings, gráficos y mapas.

El producto alrededor

Un motor de consulta no es un producto. También lideré la plataforma que lo convierte en uno: una API Express con PostgreSQL/PostGIS en capas de controllers, services y repositories, una aplicación web React para chat y gestión de conversaciones, SDKs en TypeScript y Python para acceso programático, organizaciones y equipos, claves de API, medición de uso y rate limiting, un sistema de webhooks para notificaciones de eventos, facturación por suscripción vía Stripe y un sitio de documentación.

Infraestructura

Todo corre como stacks de Docker Compose tras Traefik, con entornos separados de desarrollo, beta y producción, actualización automática de imágenes, una capa de métricas y BI y Sentinel vigilando el conjunto. Los secretos están acotados por servicio y se cargan desde un único archivo de entorno para que la configuración siga siendo legible a medida que crece el stack. Las llamadas que llevan datos de clientes a endpoints externos de modelos resuelven sus destinos en modo fail-closed: producción se niega a correr sin un endpoint explícito y nunca recurre a uno público.

Más proyectos

Todos los proyectos