Ein bisschen Kontext
Chatbots werden immer beliebter und ihre Zahl nimmt zu. Diese Tools können Aufgaben in vielen Bereichen für uns Menschen vereinfachen. Als Entwickler nutze ich diese Tools als Beschleuniger für die Entwicklung, die es mir ermöglichen, schnell die Grundlagen des Codes zu legen, den ich dann testen und festigen muss.
In letzter Zeit haben mir diese Tools geholfen, effizienter mit einer SQL-Datenbank zu interagieren, und diese Erfahrung möchte ich teilen. Obwohl ich ein erfahrener Entwickler bin, beherrsche ich die SQL-Sprache bei Weitem nicht, an der ich gelegentlich online geschult wurde und die ich nur von Zeit zu Zeit praktiziere, wenn ein spezifischer Bedarf im Rahmen einer Entwicklung entsteht.
Ich glaube, dass mein Fall nicht isoliert ist und dass viele Entwickler nur grundlegende Kenntnisse in SQL haben, eine Sprache, die am häufigsten indirekt verwendet wird, über Abstraktionsebenen. Es scheint mir, dass es gerade für dieses Profil von Entwicklern, die eingeweiht sind, ohne wirklich Experten zu sein, dass die Verwendung eines Chatbots nützlich sein kann. Dies werden wir versuchen, gemeinsam anhand einiger konkreter Fälle zu sehen.
Es ist wichtig, anzugeben, was SQL und eine SQL-Datenbank sind. SQL steht für Structured Query Language. Es ist eine Programmiersprache, die zur Verwaltung und Manipulation relationaler Datenbanken verwendet wird. Und eine SQL-Datenbank, die relational ist, entspricht einer Menge von Daten, die in einem bestimmten Format gespeichert sind, in dem diese Daten miteinander in Beziehung stehen. Dies kann der Abfrage eine gewisse Komplexität verleihen, insbesondere im Falle zahlreicher Verknüpfungen, d. h. Vorgängen, die die Datensätze von zwei Tabellen (oder mehr) auf der Grundlage einer angegebenen Bedingung kombinieren.
Die für die Untersuchung verwendeten Werkzeuge
Konversationsagenten
Im Rahmen dieser Forschungsarbeit habe ich drei Chatbots oder Konversationsagenten unter denen verwendet, die im Web kostenlos, d. h. kostenlos verfügbar sind:
ChatGPT 3.5 von OpenAI
Das bekannteste und bahnbrechende Produkt, das vom US-amerikanischen Unternehmen OpenAI hergestellt wird. Version 3.5 ist die kostenlose Version, wobei die leistungsstärkere kostenpflichtige Version derzeit Version 4 ist.
Le Chat von Mistral AI
Das Tool, das von französischen Unternehmern entwickelt wurde, die ihre Klassen in großen in den USA ansässigen Unternehmen absolviert haben. Mistral AI machte Anfang 2023 Schlagzeilen, zunächst durch ein Open-Source-Sprachmodell, das für Entwickler zugänglich ist. Ein Gesprächsagent, der ChatGPT ähnelt, wurde im Februar 2024 online gestellt. Die Leistung seines Sprachmodells, das GPT-4 nahe kommt, wurde insbesondere hervorgehoben.
Gemini von Google
Google Gemini wurde Anfang 2024 nach einer umfangreichen Kommunikation verfügbar gemacht. Es ist ein Konversationsagent, genau wie ChatGPT, der den Vorteil hat, in das Google-Ökosystem integriert zu sein, und dessen Sprachmodell eine immer größere Rolle in der Suchmaschine spielen soll.
Die Datenbank-Engine
Ich habe mich auf eine MySQL 5.7-Datenbank gestützt, die älter ist als ihr Ersatz MySQL 8, aber immer noch weit verbreitet ist. Zögern Sie nicht, Ihr Feedback zur Verwendung mit anderen Datenbank-Engines zu teilen.
Was den für die Tests verwendeten Datensatz betrifft, habe ich einfach einen Chatbot gebeten, einige Tabellenerstellungsabfragen und einige Abfragen zum Einfügen einiger Dutzend Einträge vorzuschlagen, die ich dann manuell nach meinen Wünschen bearbeitet habe. Und ich muss sagen, dass es ziemlich gut funktioniert hat, in zwei oder drei Aufforderungen.
Praktische Anwendung
Bevor wir beginnen, eine kleine Abschweifung in Form einer existenziellen Frage: Müssen wir wirklich direkt in SQL mit einer Datenbank interagieren?
Tatsächlich wird es als Entwickler immer seltener, dass wir SQL-Abfragen direkt in unserem Code schreiben müssen. Die Frameworks, CMS und Bibliotheken, die in den meisten modernen Programmiersprachen zur Verfügung stehen, fügen eine Zwischensprachenebene hinzu, die das Schreiben von Abfragen erleichtert und sie agnostisch macht, d. h. es ihnen ermöglicht, auf verschiedene Arten von Datenbank-Engines (SQLite, MySQL/MariaDB, PostgreSQL, um die gebräuchlichsten zu nennen) aufgepfropft zu werden.
In PHP verwenden wir beispielsweise in der Regel mindestens die PDO-Bibliothek, die das Schreiben von Abfragen erleichtert und sichert. Für Java wird es JDBC sein und für Python die integrierte DB-API in Verbindung mit einem Modul, das spezifisch für den Typ der Datenbank ist.
Es kann jedoch Situationen geben, in denen wir einen sofortigen Zugriff auf die Daten in einer SQL-Datenbank benötigen, um schnell Informationen über den Inhalt unserer Anwendung zu erhalten, insbesondere da diese Informationen sehr spezifisch sind und nicht direkt auf der Website verfügbar sind.
Nehmen wir ein einfaches und ziemlich typisches Beispiel im Kontext dieses Artikels: eine Veranstaltungs-Website. Eine relationale Datenbank kann verwendet werden, um eine Liste von Veranstaltungen, eine Liste von Orten und eine Liste von thematischen Kategorien zu speichern, die wir dem Benutzer anzeigen möchten. Jede Veranstaltung kann einen Verweis auf die Informationen des Ortes enthalten, an dem sie stattfindet, sowie auf eine oder mehrere Kategorien.
Diese Informationsstruktur ermöglicht es, je nach den Entscheidungen des Benutzers innerhalb einer Website eine Liste von Veranstaltungen für einen bestimmten Ort oder für eine bestimmte Kategorie anzuzeigen.
Sehen wir uns nun konkret an, was die verschiedenen Chatbots, die kostenlos im Web verfügbar sind, uns anbieten, um eine SQL-Abfrage zu schreiben.
Anfrage Nr. 1: Eine einfache Anfrage effizient gelöst
Beginnen wir mit einer einfachen Abfrage. Wir möchten wissen, wie viele Veranstaltungen in der Kategorie Reggae in Paris, Frankreich stattgefunden haben.
Hier ist die Art von schneller Aufforderung, die zu einer zufriedenstellenden Abfrage führt.
Verhalten Sie sich wie ein SQL-Experte.
Schreiben Sie eine Abfrage, die es mir ermöglicht, die Anzahl der Veranstaltungen in der Kategorie Reggae in Paris, Frankreich abzurufen.
Die Tabelle "events" enthält die Veranstaltungen und verfügt über die Spalten id, city und country. Die Tabelle "category" enthält die Kategorien und verfügt über eine id- und eine name-Spalte.
Nehmen wir uns die Zeit, die Anweisungen zu zerlegen.
Der erste Schritt, klassisch bei der Verwendung eines Chatbots, besteht darin, unserem virtuellen Gesprächspartner eine Rolle zu geben, um die Relevanz seiner Antwort sicherzustellen.
Dann zwei wesentliche Elemente, um eine Abfrage zu beschreiben, die dem Bedarf entspricht:
- das erwartete Ergebnis der Abfrage
- die Datenquelle, d.h. die Tabellen und Spalten, die wir ansprechen möchten und wie sie miteinander verbunden sind.
Natürlich muss die Beschreibung umso präziser sein, je komplexer der Bedarf ist.
ChatGPT-Antwort (Open AI)
Hier ist eine SQL-Abfrage, um die Anzahl der Veranstaltungen in der Kategorie "Reggae" in Paris, Frankreich abzurufen:
SELECT COUNT(*) AS event_count
FROM events
JOIN category ON events.category_id = category.id
WHERE category.name = 'reggae'
AND events.city = 'Paris'
AND events.country = 'Frankreich';Diese Abfrage verwendet einen Join zwischen den Tabellen "events" und "category" anhand der Spalte "category_id" der Tabelle "events" und der Spalte "id" der Tabelle "category", um die Anzahl der Veranstaltungen in der Kategorie "Reggae" abzurufen. Dann werden Bedingungen angewendet, um Veranstaltungen in Paris, Frankreich zu filtern. Schließlich wird die Anzahl der entsprechenden Veranstaltungen gezählt.
Analyse: Die Antwort von ChatGPT ist knapp und effektiv. Die Abfrage ist korrekt. Der OpenAI-Chatbot geht davon aus, dass der Link zwischen einer Veranstaltung und einer Kategorie sich in der Tabelle EVENTS befindet und nicht in einer unabhängigen Tabelle. Es muss gesagt werden, dass ich die Art dieses Links nicht spezifiziert hatte und dass die vorgeschlagene Lösung die einfachste zu sein scheint. Man könnte sich jedoch etwas mehr Kommentar zu dieser Annahme gewünscht haben.
Mistral AI Chat-Antwort
Ich gehe davon aus, dass es auch eine Verknüpfungstabelle zwischen den Tabellen "events" und "category" gibt, die ich "event_category" nenne und die die Spalten "event_id" und "category_id" enthält. Hier ist die SQL-Abfrage:
SELECT COUNT(e.id) as event_count
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.city = 'Paris' AND e.country = 'Frankreich';Diese Abfrage ruft die Anzahl der Veranstaltungen in der Kategorie "Reggae" ab, die in Paris, Frankreich stattfinden.
Analyse: Auch eine korrekte Antwort vom Mistral AI Chat. Wir bemerken leichte Nuancen in der Syntax, die nicht unbedingt bedeutsam für unseren Anwendungsfall sind.
Hauptsächlich bemerken wir jedoch einen zusätzlichen Join, d.h. den Aufruf einer zusätzlichen Tabelle, die die Beziehung zwischen einer Veranstaltung und einer Kategorie speichert. Die Isolierung der Beziehung zwischen zwei Entitäten einer relationalen Datenbank ist eine ziemlich klassische architektonische Entscheidung.
Der Mistral AI Chat bietet eine etwas knappere und weniger technische Beschreibung.
Im Gegensatz zu ChatGPT geht es davon aus, dass es Informationen abgeleitet hat, die ich nicht bereitgestellt hatte.
Google Gemini-Antwort
SQL-Abfrage zum Zählen von Reggae-Veranstaltungen in Paris
SELECT COUNT(*) AS event_count
FROM events e
INNER JOIN category c ON e.category_id = c.id
WHERE c.name = 'reggae'
AND e.city = 'Paris'
AND e.country = 'Frankreich';Verwenden Sie diesen Code mit Vorsicht.
Erklärung der Abfrage:
- SELECT COUNT(*) AS number_events: Diese Zeile wählt die Anzahl der Datensätze aus der Tabelle events aus und weist sie dem Alias number_events zu.
- FROM events e: Diese Zeile gibt an, dass die Abfrage Daten aus der Tabelle events auswählt und ihr den Alias e gibt.
- INNER JOIN category c ON e.category_id = c.id: Diese Zeile verknüpft die Tabelle events mit der Tabelle category anhand der Spalte category_id. Dadurch können Veranstaltungen nach Kategorie gefiltert werden.
- WHERE c.name = 'reggae': Diese Zeile filtert Veranstaltungen, deren Kategorie Reggae ist.
- AND e.city = 'Paris': Diese Zeile filtert Veranstaltungen, die in Paris stattfinden.
- AND e.country = 'Frankreich': Diese Zeile filtert Veranstaltungen, die in Frankreich stattfinden.
Ergebnis:
Das Ergebnis der Abfrage wird ein einzelner Datensatz mit einer einzelnen Spalte number_events sein, die die Anzahl der Reggae-Veranstaltungen in Paris, Frankreich enthält.
Analyse: Auch eine funktionale Abfrage von Google Gemini. Eine Syntax, die wieder leicht nuanciert ist im Vergleich zu den anderen beiden, mit marginalen Unterschieden.
Und die gleiche Annahme wie ChatGPT für den Veranstaltungs-/Kategorielink: das Hinzufügen einer category_id-Spalte in der Tabelle EVENTS.
Darüber hinaus ist Gemini großzügig in seiner Beschreibung und erklärt Zeile für Zeile, was die Abfrage tut.
Anfrage Nr. 2: Vorsicht vor Doppelungen
Hier ist ein weiteres Beispiel für eine Anfrage. Dieses Mal wird die Art der Beziehung zwischen einer Veranstaltung und einer Kategorie präzisiert.
Handeln Sie als SQL-Experte.
Formulieren Sie eine Anfrage, mit der ich die Veranstaltungen in Frankreich abrufen kann, deren Kategorie weder Jazz noch Klassik ist und deren title das Wort Festival enthält.
Die Tabelle events enthält die Veranstaltungen und hat die Spalten id, title, Stadt, Land.
Die Tabelle category enthält die Kategorien und verfügt über eine Spalte id und eine Spalte name.
Die Tabelle event_category enthält die Verbindungen zwischen einer Veranstaltung und einer oder mehreren Kategorien und hat die Spalten event_id und category_id
Die Antwort von ChatGPT (Open AI)
Sie können eine SQL-Anfrage mit einer Verknüpfung zwischen den Tabellen events, event_category und category verwenden, wobei Sie die WHERE-Klauseln verwenden, um die Veranstaltungen nach Ihren Kriterien zu filtern. So geht's:
SELECT e.id, e.title, e.city, e.country
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.country = 'Frankreich'
AND c.name NOT IN ('jazz', 'klassische')
AND e.title LIKE '%festival%';Diese Abfrage wählt die Veranstaltungen aus der Tabelle events in Frankreich (e.country = 'Frankreich') aus, deren Kategorie weder Jazz noch Klassik (c.name NOT IN ('jazz', 'klassische')) ist und deren title das Wort "Festival" enthält (e.title LIKE '%festival%').
Analyse: Einfache und effektive Erklärung der Abfrage. Allerdings enthalten die zurückgegebenen Ergebnisse Doppelungen, was bei der zugrunde liegenden Datenbank, die nur eindeutige Einträge enthält, nicht normal ist. Wenn man ChatGPT etwas weiter treibt, kann man sein Ziel erreichen.
Wie kann man Doppelungen vermeiden?
Um Doppelungen in den Ergebnissen der Abfrage zu vermeiden, können Sie DISTINCT in der SELECT-Klausel verwenden. So können Sie die Abfrage ändern, um DISTINCT einzuschließen:
SELECT DISTINCT e.id, e.title, e.city, e.country
FROM events e
JOIN event_category ec ON e.id = ec.event_id
JOIN category c ON ec.category_id = c.id
WHERE e.country = 'Frankreich'
AND c.name NOT IN ('jazz', 'klassische')
AND e.title LIKE '%festival%';Indem Sie DISTINCT hinzufügen, gibt die Abfrage nur eine einzige Vorkommnis jeder eindeutigen Kombination von e.id, e.title, e.city und e.country zurück und vermeidet so Doppelungen in den Ergebnissen.
Analyse: Die Abfrage ist gut, auch wenn mir eine Lösung mit GROUP BY, die ebenfalls zum gewünschten Ergebnis führt, nicht missfallen hätte.
Die Antwort von Chat (Mistral AI)
Hier ist eine SQL-Abfrage, die Ihrer Anfrage entsprechen sollte:
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.country = 'Frankreich'
AND c.name NOT IN ('jazz', 'klassische')
AND e.title LIKE '%festival%';Diese Abfrage wählt die Veranstaltungen in Frankreich aus, deren Kategorie weder Jazz noch Klassik ist und deren title das Wort 'Festival' enthält. Sie verknüpft die Tabellen 'events', 'event_category' und 'category' über die entsprechenden Schlüssel, um die benötigten Informationen zu erhalten.
Analyse: Abfrage sehr ähnlich wie die von ChatGPT. Gleicher knapper Stil wie bei der 1. Abfrage mit diesem Chatbot und gleiches Urteil wie bei ChatGPT bezüglich der Qualität der Abfrage, die Doppelungen zurückgibt. Nach meiner Nachfrage hat auch Le Chat Mistral AI das Ruder herumgerissen und eine sehr ähnliche Antwort wie ChatGPT gegeben.
Die Antwort von Gemini (Google)
SQL-Abfrage zum Abrufen von Veranstaltungen in Frankreich
SELECT e.id, e.title, e.city, e.country
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.country = 'Frankreich'
AND c.name NOT IN ('jazz', 'klassische')
AND e.title LIKE '%festival%';Verwenden Sie diesen Code mit Vorsicht.
Erklärung der Abfrage:
- SELECT e.id, e.title, e.city, e.country: Wir wählen die Spalten id, title, city und country aus der Tabelle events aus.
- INNER JOIN event_category ec ON e.id = ec.event_id: Wir verknüpfen die Tabelle events mit der Tabelle event_category über die Spalte id.
- INNER JOIN category c ON ec.category_id = c.id: Wir verknüpfen die Tabelle event_category mit der Tabelle category über die Spalte category_id.
- WHERE e.country = 'Frankreich': Wir filtern die Veranstaltungen, die in Frankreich stattfinden.
- AND c.name NOT IN ('jazz', 'klassische'): Wir schließen Veranstaltungen aus, deren Kategorie "jazz" oder "klassische" ist.
- AND e.title LIKE '%festival%': Wir filtern die Veranstaltungen, deren title das Wort "festival" enthält.
Ergebnis:
Die Abfrage gibt eine Liste von Veranstaltungen zurück, die in Frankreich stattfinden, deren Kategorie weder Jazz noch Klassik ist und deren title das Wort "Festival" enthält. Die Liste enthält die folgenden Informationen für jede Veranstaltung:
- ID
- title
- Stadt
- Land
Analyse: Abfrage ähnlich wie die der Konkurrenz, mit Doppelungen als Ergebnis. Was den Stil betrifft, so scheint der von Google Gemini deutlich ausführlicher zu sein und führt uns Schritt für Schritt durch die Besonderheiten der Abfrage. Seine Antwort zur Vermeidung von Doppelungen, weiter unten, präsentiert die verschiedenen Lösungen, einschließlich GROUP BY als Alternative, und ist daher vollständiger als die von GPT oder Mistral.
Um Doppelungen im Ergebnis Ihrer Abfrage zu vermeiden, können Sie die Klausel DISTINCT nach dem Schlüsselwort SELECT verwenden.
Abfrage mit DISTINCT:
SELECT DISTINCT e.id, e.title, e.city, e.country
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.country = 'Frankreich'
AND c.name NOT IN ('jazz', 'klassische')
AND e.title LIKE '%festival%'Verwenden Sie diesen Code mit Vorsicht.
Erklärung:
- Die Klausel DISTINCT stellt sicher, dass jede Zeile des Ergebnisses eindeutig ist.
- In dieser Abfrage wird sie verwendet, um sicherzustellen, dass jede Veranstaltung nur einmal im Ergebnis erscheint.
Andere Möglichkeiten, um Doppelungen zu vermeiden:
- Sie können die Klausel GROUP BY verwenden, um die Veranstaltungen nach einer oder mehreren Spalten zu gruppieren und nur eine Zeile für jede Gruppe anzuzeigen.
- Sie können die Klausel ORDER BY verwenden, um die Veranstaltungen nach einer oder mehreren Spalten zu sortieren und die eindeutigen Veranstaltungen zuerst anzuzeigen.
Die beste Option wählen:
Die beste Option, um Doppelungen zu vermeiden, hängt von Ihren spezifischen Anforderungen ab.
- Wenn Sie nur eindeutige Veranstaltungen anzeigen möchten, ist die Klausel DISTINCT die einfachste Lösung.
- Wenn Sie aggregierte Informationen über die Veranstaltungen anzeigen möchten, ist die Klausel GROUP BY eine bessere Option.
- Wenn Sie die eindeutigen Veranstaltungen in einer bestimmten Reihenfolge anzeigen möchten, kann die Klausel ORDER BY in Verbindung mit DISTINCT oder GROUP BY verwendet werden.
Anfrage Nr. 3: Chatbots an ihre Grenzen gebracht
Verhalte dich als SQL-Experte. Formuliere eine Abfrage, die es mir ermöglicht, die Veranstaltungen in Frankfurt oder Darmstadt mit der Kategorie Pop oder Jazz zu ermitteln, deren title das Wort "konzer" ohne "t" enthält und diese Einträge durch das Wort "konzert" mit einem "t" zu ersetzen. Die Tabelle "events" enthält die Veranstaltungen und verfügt über die Spalten id, title, Stadt, Land. Die Tabelle "category" enthält die Kategorien und verfügt über eine Spalte id und eine Spalte name. Die Tabelle "event_category" enthält die Verbindungen zwischen einer Veranstaltung und einer oder mehreren Kategorien und verfügt über die Spalten event_id und category_id
Die Antwort von ChatGPT (Open AI)
Hier ist die SQL-Abfrage, die Ihren Anforderungen entspricht:
SELECT e.id, REPLACE(e.title, 'konzer', 'konzert') AS title, e.city, e.country
FROM events e
JOIN event_category ec ON e.id = ec.event_id
JOIN category c ON ec.category_id = c.id
WHERE (e.city = 'Frankfurt' OR e.city = 'Darmstadt')
AND (c.name = 'pop' OR c.name = 'jazz')
AND e.title LIKE '%konzer%'Diese Abfrage ruft die Veranstaltungen in Frankfurt oder Darmstadt mit der Kategorie "Pop" oder "Jazz" ab, deren title das Wort "konzer" enthält. Die Funktion REPLACE wird verwendet, um "konzer" durch "konzert" zu ersetzen.
Analyse: Die bereitgestellte Abfrage erfüllt nicht die Anforderungen und hier sieht man deutlich die Grenzen des Chatbots. Tatsächlich hat der Chatbot eine streng logische Analyse meiner Aufforderung durchgeführt, ohne zu erschließen, dass ich einen Rechtschreibfehler korrigieren wollte.
Die vorgeschlagene Lösung ersetzt "konzer" in dem Wort "konzert" und wird daher nicht nur das Wort "konzer", dem ein "t" fehlt, korrigieren, sondern auch "konzert" in "konzertt" umwandeln, was nicht das ist, was ich wollte.
Darüber hinaus handelt es sich um eine SELECT-Abfrage, was bedeutet, dass die Datenbankeinträge nicht geändert werden, da für eine solche Änderung eine Abfrage des Typs UPDATE erforderlich wäre.
Die Antwort von Chat (Mistral AI)
Hier ist eine SQL-Abfrage, die Ihrer Anfrage entsprechen sollte. Sie aktualisiert den title der Veranstaltungen in der Tabelle "events" entsprechend den angegebenen Kriterien. Beachten Sie, dass SQL nicht zwischen Groß- und Kleinschreibung unterscheidet, es sei denn, Sie verwenden spezielle Kollationen.
UPDATE events
SET title = REPLACE(title, 'konzer', 'konzert')
WHERE city IN ('Frankfurt', 'Darmstadt')
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 title LIKE '%konzer%';Diese Abfrage funktioniert in zwei Teilen. Der erste Teil ist die UPDATE-Klausel, die 'konzer' durch 'konzert' im Veranstaltungstitle ersetzt. Der zweite Teil ist die WHERE-Klausel, die die Veranstaltungen nach Stadt und Kategorie filtert. Die Unterabfrage wird verwendet, um die IDs der Veranstaltungen zu erhalten, die zu den Kategorien 'pop' oder 'jazz' gehören.
Analyse: Die vorgeschlagene Lösung ist etwas näher an meinen Erwartungen, da wir diesmal sofort eine UPDATE-Abfrage erhalten, die die Datenbankeinträge tatsächlich ändert. Aber Chat Mistral begeht immer noch einen Interpretationsfehler, indem er streng logisch bleibt.
Die Antwort von Gemini (Google)
SQL-Abfrage zum Abrufen von Veranstaltungen in Frankfurt oder Darmstadt mit den Kategorien Pop oder Jazz und dem Wort "konzer" ohne "t"
SELECT e.id,
REPLACE(e.title, 'konzer', 'konzert') AS title,
e.city,
e.country
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.city = 'Frankfurt' OR e.city = 'Darmstadt')
AND (c.name = 'pop' OR c.name = 'jazz')
AND e.title LIKE '%konzer%';Verwenden Sie diesen Code mit Vorsicht.
Erklärung der Abfrage:
- SELECT: Es werden die Spalten id, title, city und country der Tabelle events ausgewählt.
- REPLACE: Das Wort "konzer" wird durch "konzert" in der Spalte title ersetzt.
- INNER JOIN: Die Tabelle events wird mit der Tabelle event_category über die Spalte id verbunden.
- INNER JOIN: Die Tabelle event_category wird mit der Tabelle categories über die Spalte category_id verbunden.
- WHERE: Die Veranstaltungen werden nach Stadt 'Frankfurt' oder 'Darmstadt' und Kategorie 'pop' oder 'jazz' gefiltert.
- LIKE: Die Veranstaltungen werden nach title mit dem Wort "konzer" gefiltert.
Ergebnis:
Die Abfrage gibt eine Tabelle mit den Veranstaltungen zurück, die den angegebenen Kriterien entsprechen. Die Spalte title enthält das Wort "konzert" mit einem "t".
Analyse: Das gleiche Kommunikationsproblem wie mit ChatGPT; ich erhalte eine SELECT-Abfrage und keine UPDATE-Abfrage. Außerdem enthielt die erste vorgeschlagene Abfrage Syntaxfehler (Tabelle category wurde als categories bezeichnet) und war in diesem Zustand nicht verwendbar. Ich musste einen neuen Prompt erstellen, um zum obigen Ergebnis zu gelangen. Ich hätte mir gewünscht, dass der Chatbot mir zumindest die beiden Lösungen vorschlägt, damit ich die für mich passende vertiefen kann.
Zweite Runde für Anfrage Nr. 3
Angesichts des Misserfolgs des ersten Versuchs bei den drei Konversationsagenten denke ich, dass ich vielleicht etwas präziser und logischer in meiner Aussage hätte sein sollen. Nach einigen Versuchen komme ich zu folgendem Prompt, der mein Bedürfnis besser eingrenzt:
Formuliere eine oder mehrere Abfragen, die es mir ermöglichen, die Veranstaltungen in Frankfurt oder Darmstadt mit der Kategorie Pop oder Jazz zu ermitteln, deren title das Wort "konzer" ohne "t" enthält, und diese Einträge durch das Wort "konzert" mit einem "t" zu ersetzen und zu aktualisieren. Die Tabelle "events" enthält die Veranstaltungen und verfügt über die Spalten id, title, Stadt, Land. Die Tabelle "category" enthält die Kategorien und verfügt über eine Spalte id und eine Spalte name. Die Tabelle "event_category" enthält die Verbindungen zwischen einer Veranstaltung und einer oder mehreren Kategorien und verfügt über die Spalten event_id und category_id.
In den gesuchten Zeichenketten muss "konzer" von einem Leerzeichen gefolgt und vorausgegangen sein. Außer, es steht am Anfang der Zeichenkette: In diesem Fall wird es von keinem Zeichen vorausgegangen. Und außer, es steht am Ende der Zeichenkette: In diesem Fall folgt ihm kein Zeichen. Die Abfrage muss zwingend mit den verschiedenen Versionen von MySQL (5 und 8) und PostgreSQL kompatibel sein.
Die Antwort von ChatGPT (Open AI)
Aus der Antwort von ChatGPT extrahierte Abfrage:
-- Aktualisierung der Veranstaltungstitle
UPDATE events
SET title = REPLACE(title, ' konzer', ' konzert')
WHERE (city = 'Frankfurt' OR city = 'Darmstadt')
AND (title LIKE '% konzer%' OR title LIKE 'konzer%');Analyse: ChatGPT hat mir zwei Abfragen vorgeschlagen: eine SELECT und eine UPDATE. Die UPDATE-Abfrage, die mich interessiert, ersetzt die Vorkommen von "konzer" durch "konzert", aber nur wenn das Wort von einem Leerzeichen vorausgegangen und gefolgt wird, nicht wenn es am Anfang oder Ende der Zeichenkette steht. Ich werde von ChatGPT keine überzeugendere Lösung erhalten, nachdem ich den Fehler mitgeteilt habe.
Diese Abfrage kann jedoch mehrmals verwendet werden, indem die zu suchenden und zu ersetzenden Zeichenketten angepasst werden, und bleibt daher eine Ressource, auf die ich mich stützen kann, wenn ich nicht die perfekte Abfrage finden möchte, die alles auf einmal erledigt.
Die Antwort von Chat (Mistral AI)
Aus der Antwort von Chat extrahierte Abfrage
UPDATE events e
JOIN event_category ec ON e.id = ec.event_id
JOIN category c ON ec.category_id = c.id
SET e.title = REPLACE(e.title, 'konzer', 'konzert')
WHERE (e.city = 'Frankfurt' OR e.city = 'Darmstadt')
AND c.name IN ('pop', 'jazz')
AND (e.title LIKE 'konzer%' OR e.title LIKE '% konzer%' OR e.title LIKE '% konzer %');Auch zwei Abfragen vorgeschlagen. Die UPDATE-Abfrage ersetzt die Vorkommen von "konzer" durch "konzert", aber sie ersetzt auch "konzer" in "konzert", so dass am Ende des Vorgangs "konzertt" mit zwei t erhalten wird, und wir bleiben auf derselben Stufe wie mit dem ersten Prompt, den wir vorgeschlagen haben.
Wenn ich jedoch auf den Fehler hinweise, holt der Chatbot auf und gibt mir die richtige Abfrage:
Ich verstehe das Problem jetzt. Um zu vermeiden, dass 'konzer' in 'konzert' ersetzt wird, können Sie die Funktion CASE verwenden, um zu überprüfen, ob 'konzer' ein ganzes Wort ist oder nicht, bevor Sie es ersetzen. Hier ist die aktualisierte Abfrage:
UPDATE events e
JOIN event_category ec ON e.id = ec.event_id
JOIN category c ON ec.category_id = c.id
SET e.title = CASE
WHEN e.title LIKE 'konzer%' AND e.title NOT LIKE 'konzert%' THEN REPLACE(e.title, 'konzer', 'konzert')
WHEN e.title LIKE '% konzer%' AND e.title NOT LIKE '% konzert%' THEN REPLACE(e.title, ' konzer', ' konzert')
WHEN e.title LIKE '% konzer %' AND e.title NOT LIKE '% konzert %' THEN REPLACE(e.title, ' konzer ', ' konzert ')
ELSE e.title
END
WHERE (e.city = 'Frankfurt' OR e.city = 'Darmstadt')
AND c.name IN ('pop', 'jazz')
AND (e.title LIKE 'konzer%' OR e.title LIKE '% konzer%' OR e.title LIKE '% konzer %');Diese Abfrage sollte jetzt 'konzer' korrekt durch 'konzert' ersetzen, ohne die Vorkommen von 'konzert' zu beeinflussen.
Bingo! Auch wenn es ein bisschen Geduld erfordert hat.
Die Antwort von Gemini (Google)
Auszug aus der Antwort von Gemini
-- MySQL
UPDATE events e
SET e.title = REPLACE(e.title, ' konzer ', ' konzert ')
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.city IN ('Frankfurt', 'Darmstadt')
AND c.name IN ('pop', 'jazz')
AND e.title LIKE '% konzer %'
);
-- PostgreSQL
UPDATE events e
SET e.title = REPLACE(e.title, ' konzer ', ' konzert ')
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.city IN ('Frankfurt', 'Darmstadt')
AND c.name IN ('pop', 'jazz')
AND e.title LIKE '% konzer %'
);Analyse: Die für MySQL vorgeschlagene UPDATE-Abfrage ist nicht gut und ich erhalte folgenden Fehler: You can't specify target table 'e' for update in FROM clause. Keine bessere Lösung wurde von Gemini nach Mitteilung des Fehlers vorgeschlagen. Ich bin blockiert. Natürlich sollte man mit etwas Vorstellungskraft und Rahmenbedingungen zum Ziel kommen können, aber es erfordert viele sprachliche Verrenkungen und viel Zeit, um zu feilen und zu iterieren.
Fazit
Chatbots im freien Zugang können uns helfen
Die drei verwendeten Konversationsagenten haben es mir ermöglicht, sehr schnell eine eher einfache Abfrage zu formulieren, die ich ohne ihre Hilfe mehr Zeit gebraucht hätte, da mir die grundlegende SQL-Syntax nicht mehr präsent war, die ich nicht täglich verwende.
Chatbots sind noch lange nicht perfekt
Bei komplexeren Abfragen sind die Ergebnisse gemischt. Ohne ein Minimum an Vorsicht und SQL-Kenntnissen scheint es schwierig zu sein, eine SQL-Abfrage mit einer gewissen Komplexität zu formulieren. Um alle Chancen auf seiner Seite zu haben, ist es ideal:
- zumindest grundlegende SQL-Kenntnisse zu haben
- einen logischen Prompt zu formulieren, der wenig Raum für Interpretation lässt
- die Probleme so weit wie möglich zu zerlegen, um eine gezielte Lösung zu erhalten.
Im Rahmen der letzten Abfrage erhöht sich das Risiko, dass der Chatbot sich verheddert, je mehr Varianten in der zu ersetzenden Zeichenkette hinzugefügt werden. Die Zerlegung einer komplexen Abfrage in mehrere kleine, einfache Abfragen kann manchmal eine Lösung sein, wenn es keine Einschränkungen hinsichtlich der Anzahl der Abfragen gibt.
Die Qualität der Antwort variiert von Agent zu Agent
Chat Mistral scheint die aussagekräftigste Antwort auf den ausgereiftesten Prompt im Rahmen einer komplexeren Abfrage gegeben zu haben. Aber auch ChatGPT hat eine verwertbare Antwort geliefert. Gemini hingegen ist gescheitert, war aber bei den anderen etwas einfacheren Abfragen sehr pädagogisch.
Man kann schließen, dass jeder der Konversationsagenten Vorzüge hat. Wenn man jedoch die Nuancen mit den wenigen Prompts betrachtet, die in dieser Studie vorgestellt werden, ist es schwierig, eine endgültige Diagnose zu stellen, da die Stichprobe sehr klein ist und diese Tools sich ständig weiterentwickeln.
In jedem Fall kann man feststellen, dass nichts ein Expertenauge ersetzen kann, das umso wichtiger wird, je komplexer die Anforderung ist und je höher der kritische Anteil ist (insbesondere im Falle einer Anfrage, die Einträge in einer Datenbank bearbeiten oder löschen wird). Dies ist eine der allgemeineren Schlussfolgerungen, die aus dieser Studie gezogen werden können (und die bereits anderswo gezogen wurden). Genauso wie die Tatsache, dass es mehrere Alternativen in der Welt der Chatbots gibt, die sich ergänzen und die es ermöglichen, mehrere Lösungen für ein gegebenes Problem zu iterieren und zu vergleichen.