Un poco de contexto
Los chatbots están de moda y su número va en aumento. Estas herramientas pueden simplificarnos la tarea, a nosotros los humanos, en muchos ámbitos. Como desarrollador, utilizo estas herramientas como aceleradores de desarrollo, que me permiten establecer rápidamente las bases del código, que luego tendré la responsabilidad de probar y consolidar.
Recientemente, estas herramientas me han permitido interactuar más eficazmente con una base de datos SQL y es esta experiencia la que deseo compartir. Aunque soy un desarrollador experimentado, estoy lejos de dominar el lenguaje SQL, en el que me he formado puntualmente en línea y que solo practico de vez en cuando cuando surge una necesidad específica en el marco de un desarrollo.
Dicho esto, creo que mi caso no es único y que muchos desarrolladores simplemente tienen bases en SQL, lenguaje que se utiliza más a menudo de manera indirecta, a través de capas de abstracción. Me parece que es precisamente para este tipo de perfiles, de desarrolladores iniciados sin ser verdaderamente expertos, donde el uso de un chatbot puede resultar útil. Es lo que vamos a intentar ver juntos a través de algunos casos concretos.
Es importante precisar qué es el SQL y qué es una base de datos SQL. SQL significa Structured Query Language. Es un lenguaje de programación utilizado para gestionar y manipular bases de datos relacionales. Y una base de datos SQL, de tipo relacional por tanto, corresponde a un conjunto de datos almacenados en un formato particular, en el que estos datos están relacionados entre sí. Lo que puede añadir un poco de complejidad a las consultas, especialmente en caso de numerosas uniones, es decir, operaciones que permiten combinar los registros de dos tablas (o más) en función de una condición especificada.
Las herramientas utilizadas para la investigación
Los agentes conversacionales
En el marco de este trabajo de investigación he utilizado tres chatbots o agentes conversacionales entre los disponibles en la web en acceso libre, es decir, gratuitos:
ChatGPT 3.5 de Open AI
El más conocido y el pionero producido por la empresa Open AI, ubicada en los Estados Unidos. La versión 3.5 es la versión puesta a disposición gratuitamente, la versión de pago, más potente, siendo actualmente la versión 4.
El Chat de Mistral AI
La herramienta impulsada por empresarios franceses que han hecho sus clases en grandes empresas en los Estados Unidos. Mistral AI ha hablado de sí mismo a lo largo de 2023, primero a través de un modelo de lenguaje de código abierto accesible a los desarrolladores. Un agente conversacional similar a ChatGPT se puso en línea en febrero de 2024. Las actuaciones de su modelo de lenguaje, cercanas a GPT-4, fueron especialmente destacadas.
Gemini de Google
Gemini de Google se puso a disposición a principios de 2024 después de haber sido presentado con gran fuerza de comunicación. Se trata de un agente conversacional, al igual que ChatGPT, que tiene la ventaja de estar integrado en el ecosistema de Google y cuyo modelo de lenguaje está destinado a desempeñar un papel creciente en el motor de búsqueda.
El motor de base de datos
Me he basado en una base de datos MySQL 5.7, más antigua que su sustituto MySQL 8 pero todavía muy utilizada. No dude en proponerme comentarios sobre el uso con otros motores de base de datos.
En cuanto al conjunto de datos utilizado para las pruebas, simplemente le pedí a un Chatbot que me sugiriera consultas para crear una TABLA y consultas para insertar unas pocas decenas de entradas, que luego edité a mi gusto a mano. Y debo decir que funcionó bastante bien, en dos o tres solicitudes.
Puesta en práctica
Antes de empezar, una pequeña digresión, en forma de pregunta existencial: ¿realmente necesitamos interactuar directamente en SQL con una base?
De hecho, como desarrollador, es cada vez más raro que tengamos que redactar directamente consultas SQL en nuestro código. Los marcos de trabajo, CMS y bibliotecas puestos a disposición en la mayoría de los lenguajes de programación modernos añaden una capa de lenguaje intermedio que facilita la redacción de consultas y las hace agnósticas, es decir, que les permite conectarse a diferentes tipos de motores de base de datos (SQLite, MySQL/MariaDB, PostgreSQL para citar los más extendidos).
En PHP, por ejemplo, se utilizará a menudo como mínimo la biblioteca PDO, que facilita y securiza la redacción de consultas. Para Java será JDBC y para Python la API integrada DB-API asociada a un módulo específico del tipo de base.
Sin embargo, puede ocurrir que necesitemos un acceso instantáneo a los datos de una base de datos SQL, para obtener rápidamente información sobre los contenidos de nuestra aplicación, sobre todo en la medida en que esta información es muy específica y no está directamente disponible en el sitio.
Tomemos como ejemplo en el marco de este artículo un caso típico bastante sencillo: un sitio de eventos. Una base de datos relacional puede permitir almacenar una lista de eventos, una lista de lugares y una lista de categorías temáticas que deseamos mostrar al usuario. Cada evento puede mantener una referencia a la información del lugar donde se lleva a cabo, así como a una o varias categorías.
Esta estructura de la información permite mostrar en un sitio web, en función de las elecciones del usuario, una lista de eventos para un lugar determinado o bien para una categoría específica.
Veamos ahora concretamente lo que los diferentes chatbots disponibles en libre acceso en la web tienen que ofrecernos para redactar una consulta SQL.
Solicitud n.º 1: una consulta simple resuelta eficazmente
Empecemos por una consulta sencilla. Nos gustaría saber cuántos eventos de la categoría reggae han tenido lugar en París, Francia.
Aquí tienes un ejemplo rápido de un prompt que te permitirá obtener una consulta satisfactoria.
Actúa como un experto en SQL.
Redacta una consulta que me permita recuperar el número de eventos en la categoría reggae que tienen lugar en París, Francia.
La tabla "events" contiene los eventos y tiene las columnas "id", "ciudad" y "país". La tabla "category" contiene las categorías y tiene una columna "id" y una columna "name".
Tómese el tiempo de descomponer las instrucciones.
El primer paso, común en el uso de un chatbot, es asignar un rol a nuestro interlocutor virtual para asegurarnos de la pertinencia de su respuesta.
A continuación, dos elementos esenciales para describir para obtener una consulta que corresponda a la necesidad:
- el resultado esperado de la consulta
- la fuente de datos, es decir, las tablas y columnas que deseamos seleccionar y cómo están relacionadas entre sí.
Por supuesto, cuanto más compleja sea la necesidad, más precisa deberá ser la descripción.
La respuesta de ChatGPT (Open AI)
Aquí tienes una consulta SQL para recuperar el número de eventos en la categoría "reggae" que tienen lugar en París, Francia:
SELECT COUNT(*) AS nombre_evenements
FROM events
JOIN category ON events.category_id = category.id
WHERE category.name = 'reggae'
AND events.ville = 'Paris'
AND events.pays = 'France';Esta consulta utiliza una unión entre las tablas "events" y "category" en la columna "categoría_id" de la tabla "events" y la columna "id" de la tabla "category" para recuperar el número de eventos en la categoría "reggae". A continuación, aplica condiciones para filtrar los eventos que tienen lugar en París, Francia. Finalmente, cuenta el número de eventos correspondientes.
Análisis: la respuesta de ChatGPT es concisa y eficaz. La consulta es correcta. El chatbot de OpenAI parte de la base de que la relación entre un evento y una categoría se encuentra en la tabla "events" y no en una tabla independiente. Hay que decir que no había especificado la naturaleza de esta relación y que la solución propuesta parece la más sencilla. Pero se podría haber esperado un poco más de comentario sobre esta suposición.
La respuesta del Chat (Mistral AI)
Supongo que también existe una tabla de relación entre las tablas "events" y "category", que llamaré "event_category" y que tiene las columnas "event_id" y "category_id". Aquí tienes la consulta SQL:
SELECT COUNT(e.id) as nombre_evenements
FROM events e
JOIN event_category ec ON e.id = ec.event_id
JOIN category c ON ec.category_id = c.id
WHERE c.name = 'reggae' AND e.ville = 'Paris' AND e.pays = 'France';Esta consulta permite recuperar el número de eventos en la categoría "reggae" que tienen lugar en París, Francia.
Análisis: también una respuesta correcta por parte del Chat Mistral. Se observan ligeras diferencias en la sintaxis, no necesariamente significativas para nuestro caso de uso.
Pero lo más destacado es una unión adicional, es decir, la llamada a una tabla adicional que almacena la relación entre un evento y una categoría. Aislar la relación entre dos entidades de una base de datos relacional es una opción arquitectónica bastante clásica.
El Chat de Mistral AI proporciona una descripción un poco más sucinta y menos técnica.
A diferencia de ChatGPT, asume que ha deducido una información que no había proporcionado.
La respuesta de Gemini (Google)
Consulta SQL para contar los eventos reggae en París
SELECT COUNT(*) AS nombre_evenements
FROM events e
INNER JOIN category c ON e.category_id = c.id
WHERE c.name = 'reggae'
AND e.ville = 'Paris'
AND e.pays = 'France';Utilice este código con precaución.
Explicación de la consulta:
- SELECT COUNT(*) AS número_de_eventos: Esta línea selecciona el número de registros de la tabla events y lo asigna al alias número_de_eventos.
- FROM events e: Esta línea indica que la consulta selecciona los datos de la tabla events y le da el alias e.
- INNER JOIN category c ON e.categoría_id = c.id: Esta línea une la tabla events con la tabla category en la columna categoría_id. Esto permite filtrar los eventos por categoría.
- WHERE c.name = 'reggae': Esta línea filtra los eventos cuya categoría es reggae.
- AND e.ciudad = 'París': Esta línea filtra los eventos que tienen lugar en París.
- AND e.país = 'Francia': Esta línea filtra los eventos que tienen lugar en Francia.
Resultado:
El resultado de la consulta será un solo registro con una sola columna número_de_eventos que contiene el número de eventos reggae en París, Francia.
Análisis: una consulta también funcional por parte de Google Gemini. Una sintaxis ligeramente matizada con respecto a las otras dos, pero en la misma línea.
Y la misma suposición que ChatGPT para la relación evento/categoría: la adición de una columna categoría_id en la tabla events.
Además, Gemini es generoso en su descripción y explica línea por línea lo que hace la consulta.
Consulta n.º 2: atención a los duplicados
Aquí tienes otro ejemplo de consulta. Esta vez especificando la naturaleza de la relación entre un evento y una categoría.
Actúa como un experto en SQL.
Redacta una consulta que me permita recuperar los eventos que tienen lugar en Francia cuya categoría no es ni jazz ni clásica y cuyo título contiene la palabra festival.
La tabla "events" contiene los eventos y tiene las columnas "id", "título", "ciudad" y "país".
La tabla "category" contiene las categorías y tiene una columna "id" y una columna "name".
La tabla "event_category" contiene las relaciones entre un evento y una o varias categorías y tiene las columnas "event_id" y "category_id".
La respuesta de ChatGPT (Open AI)
Puedes utilizar una consulta SQL con una unión entre las tablas "events", "event_category" y "category", y utilizar cláusulas WHERE para filtrar los eventos según tus criterios. Aquí tienes cómo hacerlo:
SELECT e.id, e.titre, e.ville, e.pays
FROM events e
INNER JOIN event_category ec ON e.id = ec.event_id
INNER JOIN category c ON ec.category_id = c.id
WHERE e.pays = 'France'
AND c.name NOT IN ('jazz', 'classique')
AND e.titre LIKE '%festival%';Esta consulta selecciona los eventos de la tabla "events" en Francia (e.país = 'Francia'), cuya categoría no es ni jazz ni clásica (c.name NOT IN ('jazz', 'clásica')), y cuyo título contiene la palabra "festival" (e.título LIKE '%festival%').
Análisis: explicación sencilla y eficaz de la consulta. Sin embargo, los resultados devueltos incluyen duplicados, lo cual no es normal dado el contexto de la base de datos, que no contiene entradas duplicadas. Al insistir un poco, ChatGPT propone una solución para evitar los duplicados.
¿Cómo evitar duplicados?
Para evitar duplicados en los resultados de la consulta, puedes utilizar DISTINCT en la cláusula SELECT. Aquí tienes cómo modificar la consulta para incluir DISTINCT:
SELECT DISTINCT e.id, e.titre, e.ville, e.pays
FROM events e
JOIN event_category ec ON e.id = ec.event_id
JOIN category c ON ec.category_id = c.id
WHERE e.pays = 'France'
AND c.name NOT IN ('jazz', 'classique')
AND e.titre LIKE '%festival%';Al añadir DISTINCT, la consulta solo devolverá una instancia de cada combinación única de e.id, e.título, e.ciudad y e.país, evitando así los duplicados en los resultados.
Análisis: la consulta es correcta, aunque habría sido interesante que ChatGPT propusiera también una solución con GROUP BY, que también permite obtener el resultado deseado.
La respuesta del Chat (Mistral AI)
Aquí tienes una consulta SQL que debería responder a tu solicitud:
SELECT e.*
FROM events e
JOIN event_category ec ON e.id = ec.event_id
JOIN category c ON ec.category_id = c.id
WHERE e.pays = 'France'
AND c.name NOT IN ('jazz', 'classique')
AND e.titre LIKE '%festival%';Esta consulta va a seleccionar los eventos en Francia cuya categoría no es ni jazz ni clásica y cuyo título contiene la palabra 'festival'. Une las tablas 'events', 'event_category' y 'category' en las claves adecuadas para obtener la información necesaria.
Análisis: la consulta propuesta por el Chat de Mistral AI es muy similar a la de ChatGPT, y presenta el mismo problema de duplicados en los resultados. Sin embargo, al preguntarle cómo evitar los duplicados, el Chat de Mistral AI propone una solución con GROUP BY en lugar de DISTINCT, lo que demuestra una cierta flexibilidad en su enfoque.
La respuesta de Gemini (Google)
Consulta SQL para recuperar los eventos en Francia
SELECT e.id, e.titre, e.ville, e.pays
FROM events e
INNER JOIN event_category ec ON e.id = ec.event_id
INNER JOIN category c ON ec.category_id = c.id
WHERE e.pays = 'France'
AND c.name NOT IN ('jazz', 'classique')
AND e.titre LIKE '%festival%';Utilice este código con precaución.
Explicación de la consulta:
- SELECT e.id, e.título, e.ciudad, e.país: Se seleccionan las columnas id, título, ciudad y país de la tabla events.
- INNER JOIN event_category ec ON e.id = ec.event_id: Se une la tabla events con la tabla event_category en la columna id.
- INNER JOIN category c ON ec.category_id = c.id: Se une la tabla event_category con la tabla category en la columna category_id.
- WHERE e.país = 'Francia': Se filtran los eventos que tienen lugar en Francia.
- AND c.name NOT IN ('jazz', 'clásica'): Se excluyen los eventos cuya categoría es "jazz" o "clásica".
- AND e.título LIKE '%festival%': Se filtran los eventos cuyo título contiene la palabra "festival".
Resultado:
La consulta devuelve una lista de eventos que tienen lugar en Francia, cuya categoría no es ni jazz ni clásica y cuyo título contiene la palabra "festival". La lista contiene la siguiente información para cada evento:
- ID
- Título
- Ciudad
- País
Análisis: la consulta propuesta por Gemini es muy similar a las de ChatGPT y Mistral AI, y presenta el mismo problema de duplicados en los resultados. Sin embargo, al preguntarle cómo evitar los duplicados, Gemini propone una solución que utiliza tanto DISTINCT como GROUP BY, lo que demuestra una mayor flexibilidad en su enfoque.
Para evitar duplicados en el resultado de su consulta, puede utilizar la cláusula DISTINCT después de la palabra clave SELECT.
Consulta con DISTINCT:
SELECT DISTINCT e.id, e.titre, e.ville, e.pays
FROM events e
INNER JOIN event_category ec ON e.id = ec.event_id
INNER JOIN category c ON c.id = ec.category_id
WHERE e.pays = 'France'
AND c.name NOT IN ('jazz', 'classique')
AND e.titre LIKE '%festival%'Utilice este código con precaución.
Explicación:
- La cláusula DISTINCT permite asegurarse de que cada fila del resultado es única.
- En esta consulta, se utiliza para garantizar que cada evento aparezca solo una vez en el resultado.
Otras opciones para evitar duplicados:
- Puede utilizar la cláusula GROUP BY para agrupar los eventos por una o varias columnas y mostrar una sola fila para cada grupo.
- Puede utilizar la cláusula ORDER BY para ordenar los eventos por una o varias columnas y mostrar los eventos únicos primero.
Elegir la mejor opción:
La mejor opción para evitar duplicados depende de sus necesidades específicas.
- Si desea mostrar solo los eventos únicos, la cláusula DISTINCT es la solución más sencilla.
- Si desea mostrar información agregada sobre los eventos, la cláusula GROUP BY es una mejor opción.
- Si desea mostrar los eventos únicos en un orden específico, la cláusula ORDER BY se puede utilizar en conjunción con DISTINCT o GROUP BY.
Consulta n°3: los chatbots empujados a sus últimas consecuencias
Actúa como experto en SQL. Redacta una consulta que me permita recuperar los eventos que tienen lugar en Lyon o en Saint-Etienne cuya categoría es pop o jazz, cuyo título contiene la palabra "concer" sin "t" y reemplazar estas entradas por la palabra "concert" con una "t". La tabla "events" contiene los eventos y tiene las columnas "id", "titre", "ville", "pays". La tabla "category" contiene las categorías y tiene una columna "id" y una columna "name". La tabla "event_category" contiene los enlaces entre un evento y una o varias categorías y tiene las columnas "event_id" y "category_id".
La respuesta de ChatGPT (Open AI)
Aquí está la consulta SQL que corresponde a sus criterios:
SELECT e.id, REPLACE(e.titre, 'concer', 'concert') AS titre, e.ville, e.pays
FROM events e
JOIN event_category ec ON e.id = ec.event_id
JOIN category c ON ec.category_id = c.id
WHERE (e.ville = 'Lyon' OR e.ville = 'Saint-Etienne')
AND (c.name = 'pop' OR c.name = 'jazz')
AND e.titre LIKE '%concer%'Esta consulta recupera los eventos que tienen lugar en Lyon o en Saint-Etienne, de categoría "pop" o "jazz", cuyo título contiene la palabra "concer". La función REPLACE se utiliza para reemplazar "concer" por "concert".
Análisis: La consulta proporcionada no responde a la necesidad y aquí se ven bien los límites del chatbot. De hecho, este último ha realizado un análisis estrictamente lógico de mi solicitud sin deducir que deseaba corregir una falta de ortografía.
La solución propuesta reemplazará "concer" en la palabra "concert" y no simplemente corregirá la palabra "concer" a la que le falta una "t", sino que también transformará "concert" en "concertt", lo cual no es lo que deseaba.
Además, se trata de una consulta SELECT, lo que significa que las entradas en la base de datos no se modificarán, ya que habría necesitado una consulta de tipo UPDATE para eso.
La respuesta del Chat (Mistral AI)
Aquí hay una consulta SQL que debería responder a su solicitud. Esta actualiza el título de los eventos en la tabla "events" según los criterios especificados. Tenga en cuenta que SQL no distingue entre mayúsculas y minúsculas, a menos que utilice collations específicas.
UPDATE events
SET titre = REPLACE(titre, 'concer', 'concert')
WHERE ville IN ('Lyon', 'Saint-Etienne')
AND id IN (
SELECT event_id
FROM event_category
JOIN category ON event_category.category_id = category.id
WHERE category.name IN ('pop', 'jazz')
)
AND titre LIKE '%concer%';Esta consulta funciona en dos partes. La primera parte es la cláusula UPDATE, que reemplaza 'concer' por 'concert' en el título del evento. La segunda parte es la cláusula WHERE, que filtra los eventos según la ciudad y la categoría. Se utiliza una subconsulta para recuperar los identificadores de los eventos que pertenecen a las categorías 'pop' o 'jazz'.
Análisis: la solución propuesta es un poco más cercana a mis expectativas, ya que esta vez se obtiene una consulta UPDATE de inmediato, que realmente modificará las entradas en la base de datos. Pero el Chat de Mistral sigue cometiendo un error de interpretación al permanecer estrictamente lógico.
La respuesta de Gemini (Google)
Consulta SQL para recuperar los eventos en Lyon o Saint-Etienne con las categorías pop o jazz y la palabra "concer" sin "t".
SELECT e.id,
REPLACE(e.titre, 'concer', 'concert') AS titre,
e.ville,
e.pays
FROM events e
INNER JOIN event_category ec ON e.id = ec.event_id
INNER JOIN categories c ON ec.category_id = c.id
WHERE (e.ville = 'Lyon' OR e.ville = 'Saint-Etienne')
AND (c.name = 'pop' OR c.name = 'jazz')
AND e.titre LIKE '%concer%';Utilice este código con precaución.
Explicación de la consulta:
- SELECT: Se seleccionan las columnas id, titre, ville y pays de la tabla events.
- REPLACE: Se reemplaza la palabra "concer" por "concert" en la columna titre.
- INNER JOIN: Se une la tabla events a la tabla event_category sobre la columna id.
- INNER JOIN: Se une la tabla event_category a la tabla categories sobre la columna category_id.
- WHERE: Se filtran los eventos cuya ciudad es 'Lyon' o 'Saint-Etienne' y cuya categoría es 'pop' o 'jazz'.
- LIKE: Se filtran los eventos cuyo título contiene la palabra "concer".
Resultado:
La consulta devuelve una tabla que contiene los eventos que coinciden con los criterios definidos. La columna titre tendrá la palabra "concert" con una "t".
Análisis: mismo problema de comunicación que con ChatGPT; recibo una consulta SELECT y no una consulta de UPDATE. Además, la primera consulta propuesta contenía errores de sintaxis (la tabla category se llamaba categories) y no era utilizable en su estado. Tuve que hacer un nuevo prompt para llegar al resultado anterior. Me hubiera gustado que el chatbot me propusiera las dos soluciones, en caso de duda, para que pudiera profundizar en la que más me conviene.
Segunda vuelta de mesa para la consulta n°3
Ante el fracaso de la primera tentativa ante los tres agentes conversacionales, me digo que quizás debería haber sido un poco más preciso y lógico en mi enunciado. Después de varios tanteos, llego al siguiente prompt, que delimita más mi necesidad:
Redacta una o varias consultas que me permitan recuperar los eventos que tienen lugar en Lyon o en Saint-Etienne cuya categoría es pop o jazz, cuyo título contiene la palabra "concer" sin "t" y luego reemplazar y actualizar estas entradas por la palabra "concert" con una "t". La tabla "events" contiene los eventos y tiene las columnas "id", "titre", "ville", "pays". La tabla "category" contiene las categorías y tiene una columna "id" y una columna "name". La tabla "event_category" contiene los enlaces entre un evento y una o varias categorías y tiene las columnas "event_id" y "category_id".
En las cadenas de caracteres buscadas, "concer" debe estar precedido y seguido de un espacio. Excepto si está al principio de la cadena: en este caso, no está precedido por ningún carácter. Y excepto si está al final de la cadena: en este caso, no está seguido por ningún carácter. La consulta debe ser obligatoriamente compatible con las diferentes versiones de MySQL (5 y 8) y de PostgreSQL.
La respuesta de ChatGPT (Open AI)
Consulta extraída de la respuesta de ChatGPT:
-- Actualización de los títulos de los eventos
UPDATE events
SET titre = REPLACE(titre, ' concer', ' concert')
WHERE (ville = 'Lyon' OR ville = 'Saint-Etienne')
AND (titre LIKE '% concer%' OR titre LIKE 'concer%');Análisis: ChatGPT me propuso dos consultas: un SELECT y un UPDATE. La consulta UPDATE, que me interesa, reemplaza correctamente las ocurrencias de "concer" por "concert", pero solo cuando la palabra está precedida y seguida de un espacio, no en el caso en que esté al principio o al final de la cadena. No obtendré una solución más convincente de ChatGPT después de haberle comunicado el error.
Dicho esto, esta consulta se puede utilizar varias veces ajustando las cadenas de caracteres a buscar y reemplazar, por lo que sigue siendo un recurso en el que apoyarse si no deseo esforzarme demasiado para encontrar la consulta perfecta que lo haga todo de una sola vez.
La respuesta del Chat (Mistral AI)
Consulta extraída de la respuesta del Chat:
UPDATE events e
JOIN event_category ec ON e.id = ec.event_id
JOIN category c ON ec.category_id = c.id
SET e.titre = REPLACE(e.titre, 'concer', 'concert')
WHERE (e.ville = 'Lyon' OR e.ville = 'Saint-Etienne')
AND c.name IN ('pop', 'jazz')
AND (e.titre LIKE 'concer%' OR e.titre LIKE '% concer%' OR e.titre LIKE '% concer %');Dos consultas también propuestas. La consulta de actualización reemplaza correctamente las ocurrencias de "concer" por "concert", pero también reemplaza "concer" en "concert", por lo que se obtiene "concertt" con dos "t" al final del procesamiento y seguimos atascados en la misma etapa que con el primer prompt que habíamos propuesto.
Pero cuando señalo el error, el chatbot se recupera y me da la consulta correcta:
Ahora entiendo el problema. Para evitar reemplazar 'concer' en 'concert', puede utilizar la función CASE para verificar si 'concer' es una palabra completa o no antes de reemplazarla. Aquí está la consulta actualizada:
UPDATE events e
JOIN event_category ec ON e.id = ec.event_id
JOIN category c ON ec.category_id = c.id
SET e.titre = CASE
WHEN e.titre LIKE 'concer%' AND e.titre NOT LIKE 'concert%' THEN REPLACE(e.titre, 'concer', 'concert')
WHEN e.titre LIKE '% concer%' AND e.titre NOT LIKE '% concert%' THEN REPLACE(e.titre, ' concer', ' concert')
WHEN e.titre LIKE '% concer %' AND e.titre NOT LIKE '% concert %' THEN REPLACE(e.titre, ' concer ', ' concert ')
ELSE e.titre
END
WHERE (e.ville = 'Lyon' OR e.ville = 'Saint-Etienne')
AND c.name IN ('pop', 'jazz')
AND (e.titre LIKE 'concer%' OR e.titre LIKE '% concer%' OR e.titre LIKE '% concer %');Esta consulta ahora debería reemplazar correctamente 'concer' por 'concert' sin afectar las ocurrencias de 'concert'.
¡Bingo! Aunque haya requerido un poco de paciencia.
La respuesta de Gemini (Google)
Extracto de la respuesta de Gemini:
-- MySQL
UPDATE events e
SET e.titre = REPLACE(e.titre, ' concer ', ' concert ')
WHERE e.id IN (
SELECT e.id
FROM events e
JOIN event_category ec ON e.id = ec.event_id
JOIN categories c ON ec.category_id = c.id
WHERE e.ville IN ('Lyon', 'Saint-Etienne')
AND c.name IN ('pop', 'jazz')
AND e.titre LIKE '% concer %'
);
-- PostgreSQL
UPDATE events e
SET e.titre = REPLACE(e.titre, ' concer ', ' concert ')
WHERE e.id IN (
SELECT e.id
FROM events e
JOIN event_category ec ON e.id = ec.event_id
JOIN categories c ON ec.category_id = c.id
WHERE e.ville IN ('Lyon', 'Saint-Etienne')
AND c.name IN ('pop', 'jazz')
AND e.titre LIKE '% concer %'
);Análisis: La consulta UPDATE propuesta para MySQL no es buena y obtengo el siguiente error: You can't specify target table 'e' for update in FROM clause. No se ofrece una mejor solución por parte de Gemini después de haber hecho partícipe del error. Estoy atascado. Por supuesto, con imaginación y encuadre, se debería poder llegar a un buen fin, pero a costa de muchas contorsiones lingüísticas y mucho tiempo dedicado a perfeccionar y iterar.
Conclusión
Los chatbots de acceso libre pueden ayudarnos
Los tres agentes conversacionales utilizados me permitieron redactar muy rápidamente una consulta bastante simple, pero que habría llevado más tiempo redactar debido a que no me acordaba con precisión de la sintaxis básica en SQL, que no practico a diario.
Los chatbots están lejos de ser perfectos
Para consultas más complejas, los resultados son mixtos. Sin un mínimo de precaución y conocimiento en SQL, parece difícil componer una consulta SQL con cierta complejidad. Para tener todas las posibilidades de éxito, lo ideal es:
- Tener al menos nociones de SQL
- Redactar un prompt lógico que deje un mínimo de lugar a la interpretación
- Descomponer al máximo los problemas para obtener una solución dirigida.
En el marco de la última consulta, cuantas más variantes se agreguen a la cadena de caracteres a reemplazar, mayor será el riesgo de que el chatbot se enrede. Descomponer una consulta compleja en varias pequeñas consultas simples puede ser una solución en algunos casos cuando no se tienen restricciones en términos de cantidad de consultas.
La calidad de la respuesta varía de un agente a otro
El Chat de Mistral parece haber entendido mejor el prompt más avanzado en el marco de una consulta más compleja. Pero ChatGPT también proporcionó una respuesta explotable. Por su parte, Gemini falló, pero fue muy pedagógico en el caso de otras consultas un poco más simples.
Se puede concluir que cada uno de los agentes conversacionales tiene ventajas que ofrecer. Sin embargo, si observamos matices con los pocos prompts presentados en este estudio, es difícil hacer un diagnóstico definitivo con una muestra tan pequeña, especialmente porque estas herramientas están en constante evolución.
En cualquier caso, se puede constatar que nada reemplaza un ojo experto, que es tanto más importante cuanto más compleja es la necesidad y más crítica es la parte (especialmente en el caso de una solicitud que editará o eliminará entradas en una base de datos). Esta es una de las conclusiones más generales que se pueden extraer de este estudio (y que ya se han hecho en otros lugares). Al igual que el hecho de que hay varias alternativas en el mundo de los chatbots, que se complementan y permiten iterar y comparar varias soluciones a un problema dado. Estas son algunas de las conclusiones más generales que se pueden extraer de este estudio (y que ya se han hecho en otros lugares). Al igual que el hecho de saber que hay varias alternativas en el mundo de los chatbots, que se complementan, permiten iterar y comparar varias soluciones.