DOAG Datenbank Kolumne: SelectAI – natürliche Sprache in der Datenbank

  • Erstellt von Andreas Buckenhofer
  • Datenbank Kolumne, Oracle, PL/SQL, Datenbank

SelectAI von Oracle ermöglicht es Benutzern, SQL-Abfragen mithilfe von natürlicher Sprache zu generieren, analog zu GitHub Copilot und ähnlichen Werkzeugen.

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:

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

 

 

© Pixabay
Abbildung 1: Abfrage von Dubletten
Abbildung 2: Abfrage nach Alter
Abbildung 3: Zugehörige SQL-Abfrage