Preguntarle a la base de datos en lenguaje natural
- Primera versión funcional
- 5 h
Objetivo
Un agente que entiende en lenguaje natural lo que necesitas saber de la base de datos de ventas, elige la función que corresponde, hace la cuenta con código y devuelve la cifra con la consulta que la ha producido.
Cómo funciona
En un primer lugar el usuario pregunta lo que necesita saber, escrito como lo diría en voz alta. El modelo no toca la base de datos: elige dentro de un catálogo cerrado de nueve funciones de Python con la firma tipada, y todas se ejecutan en un terminal. «Qué comercial tiene el mejor ratio de euros por kilómetro» se convierte en una sola llamada: la función de ranking, la dimensión comercial, la métrica euros por kilómetro.
Después se valida cada parámetro, antes de que se ejecute nada. Dimensiones, métricas, filtros y periodos salen de listas cerradas. Si pides las ventas «por vendedor» y esa no es una de las siete dimensiones, la llamada falla y te devuelve las siete que valen. Si filtras por un cliente llamado «restaurante» y encajan tres, se niega y te nombra los tres para que elijas. Si pides kilómetros por producto, te explica que las métricas de ruta solo tienen sentido por comercial. El modelo lee el error, corrige y reintenta una vez.
Las dimensiones son siete (producto, categoría, cliente, comercial, región, canal y tipo de cliente) y las métricas ocho (facturación, unidades, número de pedidos, ticket medio, kilómetros, visitas, euros por kilómetro y euros por visita). Las métricas de ruta solo se aceptan por comercial, porque atribuirle kilómetros a un producto no significa nada, y la función lo dice.
La cuenta la hace el código, no el modelo. La función lanza una consulta parametrizada, y sumar, promediar y dividir ocurre en Python sobre las filas que devuelve la base de datos. La respuesta del chat se arma con ese resultado y con nada más, así que la cifra que se lee es exactamente la que salió del cálculo. El texto libre tampoco llega nunca a la base de datos: no hay parámetro de SQL, ni campo de expresión, ni puerta de atrás. El modelo decide qué preguntar; cómo se consulta no lo decide nunca.
Las escrituras funcionan igual. «Sube el precio del virgen extra de 500 ml a 12,50» pasa por la función de actualizar, que solo acepta una lista blanca de columnas por tabla y devuelve el registro antes y después del cambio, así que la edición se ve en lugar de darse por buena.
Para acabar, la respuesta llega dentro del chat como una tabla con las barras dibujadas en la propia línea, y como informe HTML con su gráfico cuando se pide. Cada llamada queda anotada en un registro con sus argumentos, las filas que devolvió y los milisegundos que tardó, así que a «¿cómo has hecho eso?» se contesta leyendo ese registro y no reconstruyéndolo de memoria.
- Entregable
- La respuesta dentro del chat: una tabla con barras dibujadas en la propia línea, generada por el script y pegada tal cual, para que las cifras no se muevan entre la consulta y la respuesta.
- Un informe HTML autocontenido cuando se pide, con la tabla y un gráfico SVG dibujado en Python puro. El tipo de gráfico lo elige el renderizador por la forma de los datos, nunca el modelo.
- Un registro de todas las llamadas, con sus argumentos, sus filas y sus tiempos, que hace además de rastro de auditoría.
- Stack
- Claude Cowork
- Python 3, biblioteca estándar
- SQLite
- Gráficos SVG en Python
- Registro de llamadas
En vídeo
Por qué importa
Los datos ya los tiene todo el mundo. Lo que no tiene nadie es una manera de hacerles una pregunta sin pasar por alguien que sepa SQL. Y si la analítica conversacional falla una y otra vez no es porque los modelos no sepan escribir consultas: es que, cuando se les deja escribirlas, nadie distingue una respuesta correcta de una respuesta segura de sí misma.
Posibles mejoras
- 01Apuntar el mismo catálogo al almacén de datos o al ERP de verdad. Las funciones son el vocabulario; lo único que cambia son las consultas de debajo.
- 02Añadir un paso de aprobación antes de las escrituras, para que cada edición se proponga con su antes y su después y la confirme una persona.
A tener en cuenta
- dependencia
La versión que funciona corre sobre un conjunto de datos sintético hecho para ella: unas 2.000 ventas repartidas en 18 meses, con una estacionalidad verosímil. Cambiarlo por una base de datos real es cambiar las consultas, no la arquitectura.
- futuro
Lo que no cubren las nueve funciones no se puede contestar, y el sistema lo dice en lugar de improvisar. Eso es la gracia, no un hueco que tapar con una puerta de atrás de SQL genérico.
- dependencia
Las escrituras se limitan a una lista blanca de columnas por tabla, y siempre devuelven el registro antes y después del cambio.
- coste
Una consulta se resuelve en menos de 30 milisegundos. Lo que espera el usuario es a que el modelo elija la función, no a la base de datos.