{"id":6517,"date":"2026-09-15T08:36:00","date_gmt":"2026-09-15T06:36:00","guid":{"rendered":"https:\/\/blog-david.moreno-morales.com\/?p=6517"},"modified":"2026-09-13T21:38:12","modified_gmt":"2026-09-13T19:38:12","slug":"sql-con-inteligencia-artificial","status":"publish","type":"post","link":"https:\/\/blog-david.moreno-morales.com\/index.php\/2026\/09\/15\/sql-con-inteligencia-artificial\/","title":{"rendered":"SQL con inteligencia artificial: c\u00f3mo preparar tus datos para consultas fiables en lenguaje natural"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"6517\" class=\"elementor elementor-6517\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1f790ae elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1f790ae\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-858b1f5\" data-id=\"858b1f5\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-61e0e1f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"61e0e1f\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-1cc40bf\" data-id=\"1cc40bf\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-085053d elementor-widget elementor-widget-text-editor\" data-id=\"085053d\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p class=\"isSelectedEnd\">Preguntar a una base de datos en lenguaje natural ya no es una demostraci\u00f3n futurista. Cada vez m\u00e1s herramientas permiten escribir una pregunta como \u201c\u00bfqu\u00e9 productos aumentaron sus ventas durante el \u00faltimo trimestre?\u201d y obtener como respuesta una consulta SQL, una tabla o incluso una visualizaci\u00f3n.<\/p><p class=\"isSelectedEnd\">El problema aparece cuando pasamos de la demo a producci\u00f3n.<\/p><p class=\"isSelectedEnd\">Una consulta puede ser SQL perfectamente v\u00e1lido y, aun as\u00ed, responder mal a la pregunta de negocio. Puede utilizar una fecha incorrecta, unir tablas por una relaci\u00f3n equivocada, duplicar importes, interpretar \u201ccliente activo\u201d de forma distinta a la organizaci\u00f3n o calcular ingresos con una f\u00f3rmula diferente a la que utiliza Finanzas.<\/p><p class=\"isSelectedEnd\">Por eso, construir un buen sistema de lenguaje natural a SQL \u2014NL\u2192SQL o text-to-SQL\u2014 no consiste \u00fanicamente en elegir un modelo potente. Tambi\u00e9n exige preparar los datos para que la IA pueda entenderlos.<\/p><p class=\"isSelectedEnd\">Las plataformas actuales est\u00e1n evolucionando precisamente en esa direcci\u00f3n. Snowflake utiliza vistas sem\u00e1nticas para representar entidades, dimensiones, m\u00e9tricas y relaciones; Databricks permite enriquecer sus agentes Genie con instrucciones, consultas de ejemplo y activos confiables; BigQuery utiliza metadatos de su cat\u00e1logo para localizar los conjuntos adecuados; y Microsoft recomienda esquemas con nombres suficientemente descriptivos para que Copilot pueda interpretar mejor la base de datos.<\/p><p class=\"isSelectedEnd\">La conclusi\u00f3n es importante: la calidad del SQL generado por IA empieza mucho antes del prompt.<\/p><h2>El problema de darle a la IA solamente el esquema<\/h2><p class=\"isSelectedEnd\">Imaginemos una base de datos con estas tablas:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">tb_cli\ntb_mov\ntb_prd<\/code><\/pre><p class=\"isSelectedEnd\">Y columnas como:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">id_cli\nf_mov\nimp_n\nst\ntp<\/code><\/pre><p class=\"isSelectedEnd\">Para una persona que conoce el sistema desde hace a\u00f1os quiz\u00e1 sea suficiente. Para un modelo de IA, la informaci\u00f3n disponible es extremadamente pobre.<\/p><p class=\"isSelectedEnd\">\u00bfQu\u00e9 significa <code dir=\"ltr\">st<\/code>?<\/p><p class=\"isSelectedEnd\">\u00bfEstado de la operaci\u00f3n? \u00bfEstado del cliente? \u00bfProvincia?<\/p><p class=\"isSelectedEnd\">\u00bf<code dir=\"ltr\">imp_n<\/code> representa importe neto, importe nominal o importe sin impuestos?<\/p><p class=\"isSelectedEnd\">\u00bfUna fila de <code dir=\"ltr\">tb_mov<\/code> corresponde a una venta, a una l\u00ednea de factura o a un movimiento de inventario?<\/p><p class=\"isSelectedEnd\">El modelo puede intentar deducirlo. Y precisamente ah\u00ed empieza el riesgo.<\/p><p class=\"isSelectedEnd\">Un sistema NL\u2192SQL fiable debe reducir al m\u00ednimo las situaciones en las que el modelo tenga que adivinar.<\/p><h2>1. Utiliza nombres que expliquen el modelo de datos<\/h2><p class=\"isSelectedEnd\">Una de las mejoras m\u00e1s sencillas es tambi\u00e9n una de las m\u00e1s efectivas: utilizar nombres claros.<\/p><p class=\"isSelectedEnd\">En lugar de:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">tb_cli<\/code><\/pre><p class=\"isSelectedEnd\">preferimos:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">customers<\/code><\/pre><p class=\"isSelectedEnd\">En lugar de:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">f_alta<\/code><\/pre><p class=\"isSelectedEnd\">podemos utilizar:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">customer_registration_date<\/code><\/pre><p class=\"isSelectedEnd\">Y en lugar de:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">imp_n<\/code><\/pre><p class=\"isSelectedEnd\">algo como:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">net_sales_amount<\/code><\/pre><p class=\"isSelectedEnd\">Microsoft se\u00f1ala precisamente que la conversi\u00f3n de lenguaje natural a SQL depende de nombres expresivos en tablas y columnas. Si los nombres no describen suficientemente el dato, el asistente dispone de menos contexto para construir una consulta significativa.<\/p><p class=\"isSelectedEnd\">Esto no significa escribir identificadores interminables. Significa priorizar claridad frente a abreviaturas que solo entiende el equipo que cre\u00f3 originalmente la aplicaci\u00f3n.<\/p><h2>2. Declara las relaciones en lugar de obligar al modelo a deducirlas<\/h2><p class=\"isSelectedEnd\">Las claves primarias y for\u00e1neas no son \u00fanicamente restricciones de integridad.<\/p><p class=\"isSelectedEnd\">Tambi\u00e9n son documentaci\u00f3n estructurada.<\/p><p class=\"isSelectedEnd\">Por ejemplo:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">customers\n---------\ncustomer_id PK\n\norders\n------\norder_id PK\ncustomer_id FK -&gt; customers.customer_id<\/code><\/pre><p class=\"isSelectedEnd\">Para un asistente SQL, esta relaci\u00f3n aporta una se\u00f1al mucho m\u00e1s fiable que intentar inferir el <code dir=\"ltr\">JOIN<\/code> \u00fanicamente comparando nombres de columnas.<\/p><p class=\"isSelectedEnd\">El problema es especialmente importante en modelos grandes.<\/p><p class=\"isSelectedEnd\">Supongamos que existen:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">customers\norders\norder_items\nproducts\npayments\nshipments\nsales_representatives\nterritories<\/code><\/pre><p class=\"isSelectedEnd\">Cuando un usuario pregunta: \u00bfCu\u00e1les fueron las ventas por territorio?<\/p><p class=\"isSelectedEnd\">pueden existir diferentes caminos para relacionar territorio y venta. Si el modelo tiene que elegirlos por intuici\u00f3n, aumenta la probabilidad de obtener una consulta sint\u00e1cticamente correcta pero sem\u00e1nticamente equivocada.<\/p><p class=\"isSelectedEnd\">Las capas sem\u00e1nticas modernas intentan resolver precisamente este problema definiendo de forma expl\u00edcita las relaciones y rutas de uni\u00f3n. Snowflake, por ejemplo, incluye las relaciones entre entidades dentro de sus Semantic Views.<\/p><h2>3. No expongas todo el modelo f\u00edsico<\/h2><p class=\"isSelectedEnd\">Otro error habitual consiste en conectar el asistente directamente a cientos o miles de tablas operacionales. M\u00e1s contexto no significa necesariamente mejor contexto.<\/p><p class=\"isSelectedEnd\">Un ERP puede tener decenas de tablas relacionadas con clientes:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">customers\ncustomer_addresses\ncustomer_contacts\ncustomer_history\ncustomer_status_history\ncustomer_preferences\ncustomer_segments\ncustomer_import\ncustomer_archive<\/code><\/pre><p class=\"isSelectedEnd\">Si la pregunta es \u201c\u00bfcu\u00e1ntos clientes activos tenemos?\u201d, entregar todas esas tablas al modelo puede a\u00f1adir ambig\u00fcedad en lugar de eliminarla.<\/p><p class=\"isSelectedEnd\">Una estrategia m\u00e1s robusta consiste en construir una superficie de datos pensada para an\u00e1lisis.<\/p><p class=\"isSelectedEnd\">Por ejemplo:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">analytics.customers\nanalytics.sales\nanalytics.products\nanalytics.calendar<\/code><\/pre><p class=\"isSelectedEnd\">Estas vistas pueden ocultar complejidad t\u00e9cnica, normalizar nombres y presentar \u00fanicamente las columnas necesarias. Para sistemas de IA, una buena vista no es simplemente una comodidad para el analista, es una interfaz.<\/p><h2>4. Construye una capa sem\u00e1ntica<\/h2><p class=\"isSelectedEnd\">Aqu\u00ed encontramos uno de los cambios m\u00e1s importantes que est\u00e1 produciendo la IA en los sistemas de datos. El esquema f\u00edsico explica c\u00f3mo se almacenan los datos.<\/p><p class=\"isSelectedEnd\">La capa sem\u00e1ntica explica qu\u00e9 significan.<\/p><p class=\"isSelectedEnd\">Una organizaci\u00f3n puede definir, por ejemplo:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">M\u00e9trica: ingresos netos\nDefinici\u00f3n: ventas brutas - descuentos - devoluciones<\/code><\/pre><p class=\"isSelectedEnd\">O:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">Cliente activo:\ncliente que ha realizado al menos una compra\ndurante los \u00faltimos 12 meses.<\/code><\/pre><p class=\"isSelectedEnd\">Sin esta definici\u00f3n, preguntas aparentemente simples pueden producir respuestas diferentes.<\/p><p class=\"isSelectedEnd\">\u00bfQu\u00e9 significa \u201cventas\u201d? \u00bfImporte facturado? \u00bfCobrado? \u00bfPedidos confirmados? \u00bfImporte sin IVA? \u00bfImporte despu\u00e9s de devoluciones?<\/p><p class=\"isSelectedEnd\">La IA no puede resolver correctamente estas ambig\u00fcedades si la organizaci\u00f3n nunca las ha formalizado.<\/p><p class=\"isSelectedEnd\">Snowflake describe sus Semantic Views precisamente como una capa que representa entidades, dimensiones, hechos, m\u00e9tricas y relaciones utilizando conceptos de negocio. Adem\u00e1s, recomienda este enfoque para nuevas implementaciones de an\u00e1lisis conversacional.<\/p><p class=\"isSelectedEnd\">La capa sem\u00e1ntica deja as\u00ed de ser \u00fanicamente una herramienta de BI. Se convierte en infraestructura para IA.<\/p><h2>5. A\u00f1ade descripciones y sin\u00f3nimos<\/h2><p class=\"isSelectedEnd\">Los usuarios no siempre utilizan el mismo vocabulario que la base de datos.<\/p><p class=\"isSelectedEnd\">La tabla puede llamarse: <code dir=\"ltr\">sales_representatives<\/code><\/p><p class=\"isSelectedEnd\">mientras que las personas preguntan por:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">comerciales\nvendedores\nrepresentantes\nequipo de ventas<\/code><\/pre><p class=\"isSelectedEnd\">Una capa orientada a IA deber\u00eda poder relacionar estos conceptos. Lo mismo ocurre con m\u00e9tricas. El usuario puede decir: facturaci\u00f3n<\/p><p class=\"isSelectedEnd\">mientras el modelo de datos habla de: <code dir=\"ltr\">net_revenue<\/code><\/p><p class=\"isSelectedEnd\">A\u00f1adir descripciones, etiquetas y sin\u00f3nimos reduce esa distancia entre lenguaje humano y modelo f\u00edsico.<\/p><p>Este enriquecimiento de metadatos es uno de los motivos por los que las plataformas modernas est\u00e1n trasladando cada vez m\u00e1s informaci\u00f3n sem\u00e1ntica al cat\u00e1logo de datos.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-26a56fa elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"26a56fa\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-bf5ce92\" data-id=\"bf5ce92\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2c79896 elementor-widget elementor-widget-image\" data-id=\"2c79896\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blog-david.moreno-morales.com\/wp-content\/uploads\/2026\/09\/sql002-1024x576.png\" class=\"attachment-large size-large wp-image-6519\" alt=\"Base de datos ambigua vs. preparada para IA\" \/>\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Base de datos ambigua vs. preparada para IA<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-5d576d9\" data-id=\"5d576d9\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d7256b4 elementor-widget elementor-widget-image\" data-id=\"d7256b4\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blog-david.moreno-morales.com\/wp-content\/uploads\/2026\/09\/sql003-1024x576.png\" class=\"attachment-large size-large wp-image-6520\" alt=\"Arquitectura segura de NL\u2192SQL\" \/>\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Arquitectura segura de NL\u2192SQL<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-e8ae2ac elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"e8ae2ac\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-7c91588\" data-id=\"7c91588\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-af8d6c7 elementor-widget elementor-widget-text-editor\" data-id=\"af8d6c7\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h2>6. Proporciona consultas SQL verificadas<\/h2><p class=\"isSelectedEnd\">Uno de los mecanismos m\u00e1s potentes para mejorar un sistema NL\u2192SQL consiste en proporcionar pares de pregunta y SQL que sabemos que son correctos.<\/p><p class=\"isSelectedEnd\">Por ejemplo:<\/p><p class=\"isSelectedEnd\"><strong>Pregunta<\/strong><\/p><pre dir=\"ltr\"><code dir=\"ltr\">\u00bfCu\u00e1les fueron los cinco productos con mayores\ningresos netos durante el \u00faltimo trimestre?<\/code><\/pre><p class=\"isSelectedEnd\"><strong>Consulta verificada<\/strong><\/p><pre dir=\"ltr\"><code dir=\"ltr\">SELECT\n    p.product_name,\n    SUM(s.net_sales_amount) AS net_revenue\nFROM analytics.sales AS s\nJOIN analytics.products AS p\n    ON s.product_id = p.product_id\nWHERE s.sale_date &gt;= DATE_TRUNC('quarter', CURRENT_DATE) - INTERVAL '3 months'\n  AND s.sale_date &lt; DATE_TRUNC('quarter', CURRENT_DATE)\nGROUP BY p.product_name\nORDER BY net_revenue DESC\nLIMIT 5;<\/code><\/pre><p class=\"isSelectedEnd\">Estos ejemplos cumplen dos funciones.<\/p><p class=\"isSelectedEnd\">Primero, muestran al sistema c\u00f3mo se traducen conceptos de negocio a estructuras SQL. Segundo, proporcionan casos conocidos contra los que podemos evaluar nuevas versiones.<\/p><p class=\"isSelectedEnd\">Snowflake incorpora consultas verificadas como mecanismo para mejorar la confianza y tambi\u00e9n las utiliza como base para evaluar la precisi\u00f3n de Cortex Analyst.<\/p><p class=\"isSelectedEnd\">Databricks sigue una filosof\u00eda similar mediante consultas SQL de ejemplo y activos confiables configurados dentro de Genie.<\/p><h2>7. Trata la generaci\u00f3n de SQL como un sistema que necesita pruebas<\/h2><p class=\"isSelectedEnd\">Cambiar el modelo, modificar una descripci\u00f3n o a\u00f1adir una tabla puede alterar las consultas generadas. Por eso necesitamos pruebas de regresi\u00f3n. Podemos construir un conjunto de preguntas como:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">\u00bfCu\u00e1ntos clientes activos tenemos?\n\n\u00bfCu\u00e1l fue el ingreso neto del mes pasado?\n\n\u00bfQu\u00e9 categor\u00eda tiene mayor margen?\n\n\u00bfCu\u00e1les son los diez clientes con m\u00e1s compras?\n\n\u00bfC\u00f3mo evolucionaron las ventas interanuales?<\/code><\/pre><p class=\"isSelectedEnd\">Para cada pregunta almacenamos una consulta o un resultado esperado. Despu\u00e9s evaluamos cada nueva versi\u00f3n del sistema.<\/p><p class=\"isSelectedEnd\">No es necesario exigir que el SQL generado sea id\u00e9ntico car\u00e1cter por car\u00e1cter. Dos consultas diferentes pueden producir correctamente el mismo resultado.<\/p><p class=\"isSelectedEnd\">Lo importante es validar aspectos como:<\/p><ul data-spread=\"false\"><li>tablas utilizadas;<\/li><li>relaciones;<\/li><li>filtros;<\/li><li>m\u00e9tricas;<\/li><li>agregaciones;<\/li><li>periodo temporal;<\/li><li>resultado final.<\/li><\/ul><p class=\"isSelectedEnd\">La evaluaci\u00f3n continua convierte el NL\u2192SQL en ingenier\u00eda y no simplemente en prompting.<\/p><h2>8. Introduce guardrails antes de ejecutar la consulta<\/h2><p class=\"isSelectedEnd\">Generar SQL y ejecutar SQL son dos problemas diferentes, aunque el sistema produzca una consulta v\u00e1lida, no deber\u00edamos asumir autom\u00e1ticamente que es segura.<\/p><p class=\"isSelectedEnd\">Una arquitectura sencilla puede funcionar as\u00ed:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">Pregunta del usuario\n        \u2193\nRecuperaci\u00f3n de contexto\n        \u2193\nGeneraci\u00f3n SQL\n        \u2193\nValidaci\u00f3n\n        \u2193\nEjecuci\u00f3n controlada\n        \u2193\nResultado<\/code><\/pre><p class=\"isSelectedEnd\">Entre generaci\u00f3n y ejecuci\u00f3n podemos introducir controles. Por ejemplo:<\/p><h3>Solo lectura<\/h3><p class=\"isSelectedEnd\">El usuario destinado a an\u00e1lisis puede disponer \u00fanicamente de permisos <code dir=\"ltr\">SELECT<\/code>.<\/p><p class=\"isSelectedEnd\">De esta forma, incluso si el modelo genera accidentalmente:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">DELETE FROM customers;<\/code><\/pre><p class=\"isSelectedEnd\">la base de datos rechazar\u00e1 la operaci\u00f3n.<\/p><h3>Lista de objetos permitidos<\/h3><p class=\"isSelectedEnd\">El asistente puede consultar \u00fanicamente determinadas vistas anal\u00edticas.<\/p><h3>L\u00edmites<\/h3><p class=\"isSelectedEnd\">Podemos imponer l\u00edmites de filas o tiempo de ejecuci\u00f3n.<\/p><h3>An\u00e1lisis previo<\/h3><p class=\"isSelectedEnd\">Antes de ejecutar podemos comprobar:<\/p><ul data-spread=\"false\"><li>presencia de <code dir=\"ltr\">DELETE<\/code>, <code dir=\"ltr\">UPDATE<\/code>, <code dir=\"ltr\">DROP<\/code> o <code dir=\"ltr\">ALTER<\/code>;<\/li><li>joins sin condiciones;<\/li><li>consultas contra tablas prohibidas;<\/li><li>estimaciones de coste excesivas.<\/li><\/ul><p class=\"isSelectedEnd\">Microsoft aplica una separaci\u00f3n similar en sus experiencias Copilot: las respuestas generadas deben revisarse y las operaciones que pueden modificar datos requieren intervenci\u00f3n o aprobaci\u00f3n del usuario. La documentaci\u00f3n tambi\u00e9n advierte expresamente de que las consultas generadas pueden ser inexactas.<\/p><h2>9. Respeta los permisos del usuario<\/h2><p class=\"isSelectedEnd\">Un asistente no deber\u00eda convertirse en una v\u00eda alternativa para saltarse el modelo de seguridad.<\/p><p class=\"isSelectedEnd\">Si una persona no puede consultar salarios mediante SQL convencional, tampoco deber\u00eda poder obtenerlos preguntando: \u00bfCu\u00e1l es el salario medio de cada empleado?<\/p><p class=\"isSelectedEnd\">La ejecuci\u00f3n debe realizarse con permisos equivalentes a los del usuario o mediante una pol\u00edtica perfectamente controlada.<\/p><p class=\"isSelectedEnd\">Databricks, por ejemplo, eval\u00faa el acceso a los datos de Genie utilizando los permisos de Unity Catalog del usuario final.<\/p><p class=\"isSelectedEnd\">El principio general es sencillo: la IA no sustituye el gobierno del dato; debe trabajar dentro de \u00e9l.<\/p><h2>10. Registra pregunta, SQL y resultado<\/h2><p class=\"isSelectedEnd\">Un sistema en producci\u00f3n necesita observabilidad. Como m\u00ednimo conviene registrar:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">pregunta\ncontexto utilizado\nSQL generado\ntiempo de ejecuci\u00f3n\nerror\nusuario\nfeedback<\/code><\/pre><p class=\"isSelectedEnd\">Esto permite descubrir patrones. Quiz\u00e1 muchas consultas fallen cuando aparece la palabra \u201cfacturaci\u00f3n\u201d. Quiz\u00e1 una relaci\u00f3n concreta produzca duplicados.<\/p><p class=\"isSelectedEnd\">Quiz\u00e1 los usuarios utilicen un t\u00e9rmino que todav\u00eda no existe como sin\u00f3nimo en la capa sem\u00e1ntica.<\/p><p class=\"isSelectedEnd\">Los errores dejan entonces de ser casos aislados y pasan a convertirse en informaci\u00f3n para mejorar el sistema.<\/p><h2>Una arquitectura pr\u00e1ctica<\/h2><p class=\"isSelectedEnd\">Una arquitectura razonable para un asistente SQL podr\u00eda dividirse en cinco capas.<\/p><h3>1. Datos f\u00edsicos<\/h3><p class=\"isSelectedEnd\">Las tablas originales:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">ERP\nCRM\ne-commerce\nfacturaci\u00f3n\nsoporte<\/code><\/pre><h3>2. Modelo anal\u00edtico<\/h3><p class=\"isSelectedEnd\">Vistas o tablas curadas:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">customers\nsales\nproducts\ncalendar<\/code><\/pre><h3>3. Capa sem\u00e1ntica<\/h3><p class=\"isSelectedEnd\">Aqu\u00ed viven:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">m\u00e9tricas\ndimensiones\nrelaciones\ndefiniciones\nsin\u00f3nimos\nreglas de negocio<\/code><\/pre><h3>4. Sistema NL\u2192SQL<\/h3><p class=\"isSelectedEnd\">El modelo recibe \u00fanicamente el contexto relevante y genera la consulta.<\/p><h3>5. Validaci\u00f3n y ejecuci\u00f3n<\/h3><p class=\"isSelectedEnd\">Finalmente se aplican permisos, l\u00edmites, comprobaciones y observabilidad.<\/p><p class=\"isSelectedEnd\">La arquitectura ser\u00eda:<\/p><pre dir=\"ltr\"><code dir=\"ltr\">Usuario\n   \u2193\nLenguaje natural\n   \u2193\nContexto + capa sem\u00e1ntica\n   \u2193\nLLM \/ agente SQL\n   \u2193\nSQL generado\n   \u2193\nValidador\n   \u2193\nMotor SQL\n   \u2193\nResultado<\/code><\/pre><p class=\"isSelectedEnd\">La mayor parte de la fiabilidad no procede exclusivamente de la caja \u201cLLM\u201d. Procede de todo lo que la rodea.<\/p><h2>Checklist para preparar SQL para IA<\/h2><p class=\"isSelectedEnd\">Antes de conectar un asistente de lenguaje natural a una base de datos, merece la pena revisar:<\/p><ul data-spread=\"false\"><li>\u00bfLas tablas tienen nombres comprensibles?<\/li><li>\u00bfLas columnas expresan claramente qu\u00e9 representan?<\/li><li>\u00bfLas claves primarias y for\u00e1neas est\u00e1n declaradas?<\/li><li>\u00bfLas relaciones importantes est\u00e1n documentadas?<\/li><li>\u00bfLas m\u00e9tricas de negocio tienen una \u00fanica definici\u00f3n?<\/li><li>\u00bfExisten vistas anal\u00edticas que oculten complejidad innecesaria?<\/li><li>\u00bfSe han definido sin\u00f3nimos del vocabulario utilizado por los usuarios?<\/li><li>\u00bfTenemos preguntas y consultas verificadas?<\/li><li>\u00bfExiste un conjunto de pruebas de regresi\u00f3n?<\/li><li>\u00bfEl usuario de ejecuci\u00f3n tiene permisos m\u00ednimos?<\/li><li>\u00bfLas consultas generadas pasan por un validador?<\/li><li>\u00bfRegistramos errores y feedback?<\/li><\/ul><p class=\"isSelectedEnd\">Cuantas m\u00e1s respuestas sean afirmativas, menos depender\u00e1 el sistema de que el modelo \u201cadivine\u201d.<\/p><h2>Conclusi\u00f3n<\/h2><p class=\"isSelectedEnd\">La llegada de la IA est\u00e1 oblig\u00e1ndonos a mirar las bases de datos desde una perspectiva nueva. Durante a\u00f1os optimizamos esquemas para aplicaciones, desarrolladores y herramientas de BI.<\/p><p class=\"isSelectedEnd\">Ahora tenemos un nuevo consumidor: los modelos de lenguaje. Y estos modelos funcionan mejor cuando el significado est\u00e1 expl\u00edcito.<\/p><p class=\"isSelectedEnd\">Un esquema limpio ayuda, las relaciones ayudan, las vistas ayudan.<\/p><p class=\"isSelectedEnd\">Pero el verdadero salto aparece cuando a\u00f1adimos una capa sem\u00e1ntica con m\u00e9tricas, conceptos, sin\u00f3nimos y ejemplos verificados, y posteriormente rodeamos la generaci\u00f3n SQL de permisos, validaci\u00f3n y evaluaci\u00f3n.<\/p><p class=\"isSelectedEnd\">Por eso, antes de buscar un modelo m\u00e1s grande para mejorar tu sistema NL\u2192SQL, merece la pena hacer una pregunta diferente:<\/p><p class=\"isSelectedEnd\"><strong>\u00bfEntender\u00eda alguien nuevo en tu equipo lo que significa tu modelo de datos sin tener que preguntarte nada?<\/strong><\/p><p>Si la respuesta es no, probablemente la IA tampoco.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-4fa9b73 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4fa9b73\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-eeaff01\" data-id=\"eeaff01\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6abbbf9 elementor-widget elementor-widget-heading\" data-id=\"6abbbf9\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">REFERENCIAS\n<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4439ef8 elementor-widget elementor-widget-text-editor\" data-id=\"4439ef8\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;tc_dark_mode_responsive_hide_in_dark&quot;:&quot;no&quot;,&quot;tc_dark_mode_responsive_hide_in_light&quot;:&quot;no&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<ul><li>Snowflake \u2014 Cortex Analyst y Semantic Views.<\/li><li>Snowflake \u2014 buenas pr\u00e1cticas y evaluaci\u00f3n mediante consultas verificadas.<\/li><li>Snowflake \u2014 instrucciones personalizadas para generaci\u00f3n SQL, incorporadas a Semantic Views durante 2026.<\/li><li>Databricks \u2014 Genie Agents, Unity Catalog, instrucciones, consultas de ejemplo y trusted assets.<\/li><li>Google Cloud \u2014 BigQuery Data Canvas y uso de metadatos de cat\u00e1logo para consultas en lenguaje natural.<\/li><li>Microsoft \u2014 Copilot para SQL Database en Fabric, recomendaciones sobre nombres descriptivos, permisos y validaci\u00f3n humana.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>C\u00f3mo dise\u00f1ar esquemas, vistas, nombres, relaciones y una capa sem\u00e1ntica que permita a asistentes de IA generar consultas SQL m\u00e1s correctas y verificables.<\/p>\n","protected":false},"author":1,"featured_media":6518,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[39],"tags":[67,57,49,52,53,48,68],"class_list":["post-6517","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bbdd","tag-base-de-datos","tag-bi","tag-ia","tag-inteligenciaartificial","tag-modelo-de-lenguaje","tag-software","tag-sql"],"_links":{"self":[{"href":"https:\/\/blog-david.moreno-morales.com\/index.php\/wp-json\/wp\/v2\/posts\/6517","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog-david.moreno-morales.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog-david.moreno-morales.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog-david.moreno-morales.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog-david.moreno-morales.com\/index.php\/wp-json\/wp\/v2\/comments?post=6517"}],"version-history":[{"count":3,"href":"https:\/\/blog-david.moreno-morales.com\/index.php\/wp-json\/wp\/v2\/posts\/6517\/revisions"}],"predecessor-version":[{"id":6523,"href":"https:\/\/blog-david.moreno-morales.com\/index.php\/wp-json\/wp\/v2\/posts\/6517\/revisions\/6523"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog-david.moreno-morales.com\/index.php\/wp-json\/wp\/v2\/media\/6518"}],"wp:attachment":[{"href":"https:\/\/blog-david.moreno-morales.com\/index.php\/wp-json\/wp\/v2\/media?parent=6517"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog-david.moreno-morales.com\/index.php\/wp-json\/wp\/v2\/categories?post=6517"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog-david.moreno-morales.com\/index.php\/wp-json\/wp\/v2\/tags?post=6517"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}