Es nutzt generative KI und große Sprachmodelle (LLMs), um Benutzereingaben in natürlicher Sprache in Oracle SQL umzuwandeln. Dieses Feature ist Teil der Oracle Autonomous Database.
Für den Artikel wurde die Oracle Autonomous Database verwendet, um die Beispiele durchzuführen.
Zunächst wird ein User "abu" angelegt. Dieser Benutzer legt danach eine Beispieltabelle inklusive Daten an.
create table customer (
id integer primary key
, vorname varchar(100)
, nachname varchar(100)
, geburtsdatum date
);
insert into customer (id, vorname, nachname, geburtsdatum)
values (1, 'Max', 'Mustermann', TO_DATE('31.01.2000', 'DD.MM.YYYY'));
insert into customer (id, vorname, nachname, geburtsdatum)
values (2, 'Max', 'Mustermann', TO_DATE('31.01.2000', 'DD.MM.YYYY'));
insert into customer (id, vorname, nachname, geburtsdatum)
values (3, 'Hans', 'Mustermann', TO_DATE('15.11.1997', 'DD.MM.YYYY'));
Dem angelegten Benutzer werden Berechtigungen erteilt, so dass dieser OpenAI (oder alternativ Cohere) als LLM verwenden darf.
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'api.openai.com',
ace => xs$ace_type(privilege_list => xs$name_list('http'),
principal_name => 'abu',
principal_type => xs_acl.ptype_db)
);
END;
grant execute on DBMS_CLOUD_AI to abu;
Der Benutzer muss einen Account bei OpenAI (oder alternativ Cohere) besitzen und einen API-Schlüssel angelegt haben.
Voraussetzungen für die Verprobung von SelectAI mit OpenAI:
- Account/Konto bei OpenAI (https://platform.openai.com/)
- API Key ist angelegt
- Guthaben für die API-Nutzung ist vorhanden
Der API-Schlüssel wird konfiguriert durch:
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OPENAI_CRED',
username => '<aus OpenAI account>',
password => '<aus OpenAI account>' );
END;
Anschließend werden alle Tabellen konfiguriert, die verwendet werden sollen. In diesem Fall ist es die Tabelle abu.customer. Die object_list könnte weitere Tabellen enthalten.
BEGIN
DBMS_CLOUD_AI.create_profile(
profile_name => 'OPENAI',
attributes => '{"provider": "openai",
"credential_name": "OPENAI_CRED",
"object_list": [{"owner": "abu", "name": "customer"}]
}');
END;
Nun muss noch das Profil gesetzt werden.
BEGIN
DBMS_CLOUD_AI.SET_PROFILE(
profile_name => 'OPENAI'
);
END;
In einer ersten Abfrage wird nach Dubletten gesucht und als Ergebnis werden wie erwartet zwei Datensätze angegeben (siehe rechts Abbildung 1: Abfrage von Dubletten – zum Vergrößern klicken).
Neben DBMS_CLOUD_AI.GENERATE(…) kann auch “SELECT AI chat which customers are duplicate” formuliert werden. Die SQL-ähnlich Syntax funktioniert jedoch nicht in zustandlosen Umgebungen wie das SQL Worksheet/Arbeitsblatt.
In der zweiten Abfrage wird das Alter des ältesten Kunden gesucht. Doch hier folgt eine Überraschung (siehe rechts Abbildung 2: Abfrage nach Alter – zum Vergrößern klicken).
Das Alter ist nicht korrekt. Richtig ist 26.
Das zugehörige SQL-Statement kann man sich anzeigen lassen (siehe rechts Abbildung 3: Zugehörige SQL-Abfrage – zum Vergrößern klicken). In der SQL-Abfrage ist der Fehler zu sehen, dass das Jahr extrahiert wird, anstatt das Datum zu nehmen:
SELECT EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM c.GEBURTSDATUM) AS AGE
FROM ABU.CUSTOMER c
ORDER BY AGE DESC
FETCH FIRST ROW ONLY
Ein kritisches Hinterfragen der Ergebnisse ist unbedingt notwendig. Risiken wie Halluzinationen, die man von LLMs kennt, existieren genauso wie bei anderen GenAI-Anwendungen. Insbesondere sollte man sich das SQL-Statement stets anzeigen lassen, um die Abfrage zu validieren.
Bei der Nutzung öffentlicher LLMs ist zudem Vorsicht geboten, da Daten (auch wenn es "nur" die formulierte Abfrage ist) beim Anbieter landen. Unternehmensinterne Daten (-banken) sollten daher nicht genutzt werden.
Andreas Buckenhofer





