Construyendo consultas SQL con IA | Original, traducido por IA
Esquema de Base de Datos (PostgreSQL):
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
first_name VARCHAR(100),
last_name VARCHAR(100),
date_of_birth DATE,
gender VARCHAR(10),
phone_number VARCHAR(20),
address TEXT,
city VARCHAR(100),
state VARCHAR(100),
country VARCHAR(100),
zip_code VARCHAR(20),
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE,
last_login TIMESTAMP WITH TIME ZONE,
is_active BOOLEAN DEFAULT TRUE,
role VARCHAR(50),
profile_picture_url VARCHAR(255),
bio TEXT,
failed_login_attempts INTEGER DEFAULT 0,
account_balance NUMERIC(10, 2) DEFAULT 0.00
);
arriba es la base de datos de postgre, abajo es la definición de la tabla. aquí están las instrucciones de consulta en lenguaje natural.
quiero obtener algunos usuarios cuyo nombre de pila es andy, creados_ en torno al día del mes pasado, y que tengan 20 años en 2025, y cuyo último_inicio de sesión sea similar a la semana reciente, dame el sql para consultar tales usuarios
Consulta SQL Generada:
SELECT *
FROM users
WHERE first_name ILIKE 'andy'
AND CAST(created_at AS DATE) BETWEEN
(CURRENT_DATE - INTERVAL '1 MONTH' - INTERVAL '1 DAY')
AND
(CURRENT_DATE - INTERVAL '1 MONTH' + INTERVAL '1 DAY')
AND EXTRACT(YEAR FROM AGE(date_of_birth)) = 20
AND last_login >= CURRENT_TIMESTAMP - INTERVAL '7 DAYS';
A continuación se presenta una definición de tabla PostgreSQL para una tabla conversations
que podría usarse para almacenar interacciones de usuarios con un sistema de IA como Grok. La tabla está diseñada para rastrear conversaciones, incluyendo al usuario involucrado, el contenido de la conversación, marcas de tiempo y metadatos relevantes.
CREATE TABLE conversations (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL,
title VARCHAR(255),
conversation_type VARCHAR(50) DEFAULT 'chat',
started_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
ended_at TIMESTAMP WITH TIME ZONE,
status VARCHAR(50) DEFAULT 'active',
message_count INTEGER DEFAULT 0,
last_message_at TIMESTAMP WITH TIME ZONE,
is_archived BOOLEAN DEFAULT FALSE,
ai_model_version VARCHAR(100),
total_tokens_used INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
Explicación:
- id: Identificador único para cada conversación.
- user_id: Hace referencia a la tabla
users
para vincular la conversación a un usuario específico. - title: Título opcional para la conversación (por ejemplo, definido por el usuario o resumen generado automáticamente).
- conversation_type: Indica el tipo de conversación (por ejemplo, ‘chat’, ‘query’, ‘voice’).
- started_at: Marca de tiempo cuando comenzó la conversación.
- ended_at: Marca de tiempo cuando se cerró la conversación (nulo si está en curso).
- status: Rastreo del estado de la conversación (por ejemplo, ‘active’, ‘completed’, ‘paused’).
- message_count: Rastreo del número de mensajes intercambiados en la conversación.
- last_message_at: Marca de tiempo del mensaje más reciente.
- is_archived: Booleano para indicar si la conversación está archivada.
- ai_model_version: Almacena la versión del modelo de IA utilizado (por ejemplo, ‘Grok 3’).
- total_tokens_used: Rastreo del uso de tokens para la conversación (útil para facturación de API o análisis).
- created_at y updated_at: Marcas de tiempo para cuando se creó y actualizó el registro de la conversación.
- FOREIGN KEY: Asegura la integridad referencial con la tabla
users
, conON DELETE CASCADE
para eliminar conversaciones si el usuario asociado se elimina.
Esta tabla está diseñada para ser flexible y puede extenderse según necesidades específicas, como almacenar mensajes individuales en una tabla separada messages
o agregar campos para análisis de sentimientos o etiquetas de conversación. ¡Hazme saber si necesitas una tabla relacionada (por ejemplo, para mensajes) o una consulta para interactuar con esta tabla!
Para habilitar un frontend donde los usuarios puedan consultar sus propias conversaciones usando lenguaje natural (por ejemplo, “dame mis últimas 5 conversaciones” o “conversaciones cuyo título tiene la palabra java”), debes asegurarte de que la consulta SQL restrinja los resultados a las conversaciones del usuario autenticado. Esto implica incorporar la identidad del usuario (por ejemplo, user_id
) en la consulta y traducir la entrada de lenguaje natural a condiciones SQL. A continuación se presentan prompts y consultas SQL correspondientes para la tabla conversations
, asegurando que los usuarios solo puedan acceder a sus propios datos.
Consideraciones Clave
- Autenticación de Usuario: El frontend debe pasar el
user_id
autenticado al backend para filtrar conversaciones. - Procesamiento de Lenguaje Natural: La entrada de lenguaje natural se analiza para identificar condiciones clave (por ejemplo, “últimas 5” o “título tiene palabra java”).
- Seguridad: Siempre filtrar por
user_id
para evitar que los usuarios accedan a conversaciones de otros. - Referencia de Tabla: Usando la tabla
conversations
definida anteriormente.
Prompts de Lenguaje Natural y Consultas SQL
Prompt 1: “Dame mis últimas 5 conversaciones”
Requisitos Analizados:
- Filtrar conversaciones por el
user_id
del usuario autenticado. - Ordenar por
started_at
(olast_message_at
para recencia) en orden descendente. - Limitar a 5 resultados.
Consulta SQL:
SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
ORDER BY started_at DESC
LIMIT 5;
:authenticated_user_id
es un marcador de posición para el ID del usuario conectado, enviado de manera segura desde el frontend/backend.started_at DESC
asegura que se devuelvan las conversaciones más recientes.LIMIT 5
restringe la salida a 5 conversaciones.
Prompt 2: “Conversaciones cuyo título tiene la palabra java”
Requisitos Analizados:
- Filtrar conversaciones por el
user_id
del usuario autenticado. - Buscar conversaciones donde el
title
contenga “java” (insensible a mayúsculas y minúsculas). - Usar
ILIKE
para coincidencia parcial e insensible a mayúsculas y minúsculas en PostgreSQL.
Consulta SQL:
SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
AND title ILIKE '%java%';
:authenticated_user_id
asegura que solo se consulten las conversaciones del usuario.ILIKE '%java%'
coincide con títulos que contengan “java” (por ejemplo, “Java Tips”, “About Java Programming”).
Notas de Implementación para el Frontend
- Autenticación de Usuario:
- El frontend debe enviar el ID del usuario autenticado (por ejemplo, desde un token JWT o sesión) a la API del backend.
- El backend debe validar el
user_id
y usarlo en la cláusulaWHERE
para filtrar resultados.
- Procesamiento de Lenguaje Natural:
- Usar un analizador basado en reglas simple o un modelo de IA (como Grok) para interpretar la consulta de lenguaje natural y extraer:
- Intención: Listar conversaciones.
- Filtros: Palabras clave (por ejemplo, “java”), ordenación (por ejemplo, “últimas”) o límites (por ejemplo, “5”).
- Por ejemplo, mapear “últimas 5” a
ORDER BY started_at DESC LIMIT 5
y “título tiene palabra java” atitle ILIKE '%java%'
.
- Usar un analizador basado en reglas simple o un modelo de IA (como Grok) para interpretar la consulta de lenguaje natural y extraer:
- Diseño de API:
- Crear un endpoint (por ejemplo,
/api/conversations
) que acepte:user_id
: De la sesión autenticada.query
: La entrada de lenguaje natural o parámetros estructurados (por ejemplo,{ filter: "title contains java" }
).
- El backend traduce la consulta a SQL, asegurando que
user_id
siempre se incluya en la cláusulaWHERE
.
- Crear un endpoint (por ejemplo,
- Seguridad:
- Nunca permitir que los usuarios ingresen SQL directamente o modifiquen el filtro
user_id
. - Usar consultas parametrizadas (por ejemplo,
:authenticated_user_id
) para evitar inyección SQL. - Validar las entradas para evitar patrones maliciosos en búsquedas
ILIKE
.
- Nunca permitir que los usuarios ingresen SQL directamente o modifiquen el filtro
- Visualización en el Frontend:
- Devolver campos como
id
,title
,started_at
,last_message_at
ystatus
para mostrar una lista de conversaciones. - Permitir opciones de ordenación o filtrado en la interfaz de usuario (por ejemplo, menús desplegables para “últimas” o entrada de texto para búsqueda de título).
- Devolver campos como
Flujo de Trabajo de Ejemplo
- El usuario inicia sesión y el frontend recupera su
user_id
(por ejemplo,123
). - El usuario escribe “dame mis últimas 5 conversaciones” en una barra de búsqueda.
- El frontend envía una solicitud al backend:
/api/conversations?user_id=123&query=últimas 5
. - El backend analiza la consulta, genera el SQL:
SELECT * FROM conversations WHERE user_id = 123 ORDER BY started_at DESC LIMIT 5;
- El backend devuelve los resultados como JSON y el frontend muestra las conversaciones.
Notas Adicionales
- Si
title
es nulo, agregarAND title IS NOT NULL
a la segunda consulta para evitar coincidir con títulos nulos. - Para consultas más complejas (por ejemplo, “conversaciones sobre java de la semana pasada”), combinar condiciones:
SELECT * FROM conversations WHERE user_id = :authenticated_user_id AND title ILIKE '%java%' AND started_at >= CURRENT_TIMESTAMP - INTERVAL '7 DAYS';
- Si necesitas un analizador de lenguaje natural más avanzado, considera integrar un modelo de IA (por ejemplo, Grok a través de la API de xAI) para mapear consultas complejas a SQL. Para detalles de la API, visita xAI API.
¡Hazme saber si necesitas ayuda con el código del frontend, la configuración de la API del backend o ejemplos de consultas adicionales!