Blog JSystems - uwalniamy wiedzę!

Szukaj

Kiedy mówi się „AI w bazie danych", większość ludzi myśli o nowych, wyspecjalizowanych bazach wektorowych (baza wektorowa przechowuje dane jako listy liczb - wektory - które opisują znaczenie tekstu, obrazu czy dokumentu - podobne treści mają podobne wektory, co pozwala wyszukiwać „po sensie", nie po słowach kluczowych). Tymczasem Oracle Database robi uczenie maszynowe w SQL już od ponad dwóch dekad (pakiet DBMS_DATA_MINING zadebiutował w Oracle 9i R2 w 2002 r.), a wydania 23ai (2024) i jego kontynuacja 26ai postawiły AI w samym centrum bazy: wektorowy typ danych, semantyczne wyszukiwanie, wbudowane modele embeddingów i pytania w języku naturalnym. W tym artykule pokazujemy całą historię rozwoju AI w Oracle oraz działające przykłady z prawdziwej bazy Oracle 26ai Free - wszystkie zrzuty ekranu pochodzą z realnej instancji uruchomionej specjalnie na potrzeby tego tekstu.

Z tego artykułu dowiesz się:
  • jak rozwijało się AI w Oracle - od przejęcia narzędzia Darwin w 1999 r. po AI Vector Search,
  • czym jest typ VECTOR i jak działa funkcja VECTOR_DISTANCE,
  • jak zbudować indeks wektorowy HNSW i wyszukiwać semantycznie,
  • jak Oracle Machine Learning buduje model ML w czystym SQL,
  • czym jest Select AI i wbudowane modele ONNX.

Historia AI w Oracle - 25 lat, nie 2 lata

AI w Oracle nie zaczęło się od mody na ChatGPT. Baza danych Oracle ma za sobą długą drogę uczenia maszynowego liczonego bezpośrednio na danych - bez eksportu do osobnych narzędzi.

Oś czasu rozwoju AI w bazie danych Oracle: 1999 Thinking Machines, 2002 Oracle Data Mining, 2008 Oracle Data Miner, 2013 Oracle Advanced Analytics, 2018 Oracle Machine Learning, 2021 OML4SQL, 2024 Oracle 23ai
Rozwój AI w bazie Oracle - od narzędzia Darwin po AI Vector Search i generatywne AI
  • 1999 - Oracle przejmuje zespół data mining firmy Thinking Machines wraz z narzędziem Darwin. To fundament pod uczenie maszynowe w bazie.
  • 2002 (Oracle 9i R2) - debiut Oracle Data Mining i pakietu DBMS_DATA_MINING: klasyfikacja, regresja, klastrowanie - modele budowane w czystym SQL, wewnątrz bazy.
  • 2008 (11g) - graficzny Oracle Data Miner w SQL Developer i więcej algorytmów: drzewa decyzyjne, SVM, sieci Bayesa, reguły asocjacyjne.
  • 2013 - Oracle Advanced Analytics: Data Mining + Oracle R Enterprise, czyli język R liczony bezpośrednio na danych w bazie.
  • 2018 (18c) - marka Oracle Machine Learning, notatniki OML, biblioteki OML4Py i OML4R, AutoML w Autonomous Database.
  • 2021 (21c) - Oracle Data Mining zostaje przemianowane na Oracle Machine Learning for SQL (OML4SQL); nazwa pakietu DBMS_DATA_MINING pozostaje bez zmian. Wbudowany AutoML.
  • 2024 (23ai) - przełom: AI Vector Search, typ VECTOR, Select AI, import modeli ONNX, grounded generative AI (RAG na danych firmy) - i ponad 300 innych nowości. Aktualizacje tej linii Oracle marketingowo oznacza jako „26ai" (wewnętrznie: Release 23.26.x).

Co nowego w najnowszych wydaniach (23ai i 26ai)

Oracle Database 23ai (ogólna dostępność: maj 2024) to pierwsze wydanie long-term z literą „ai" w nazwie. Kolejne aktualizacje tej samej linii Oracle oznacza już jako 26ai - instancja, na której powstały poniższe przykłady, raportuje się jako Oracle AI Database 26ai Free Release 23.26. Najważniejsze funkcje AI:

  • AI Vector Search - typ VECTOR, funkcja VECTOR_DISTANCE, indeksy wektorowe (HNSW, IVF) i nowa składnia wyszukiwania semantycznego.
  • Wbudowane embeddingi - model w formacie ONNX (otwarty, przenośny format zapisu wytrenowanych modeli uczenia maszynowego - model przygotowany w jednym narzędziu, np. w Pythonie, uruchamiasz w innym bez przepisywania) można zaimportować do bazy i liczyć wektory funkcją VECTOR_EMBEDDING, bez wysyłania danych na zewnątrz.
  • Select AI - pytania w języku naturalnym zamieniane na SQL przez duży model językowy (pakiet DBMS_CLOUD_AI).
  • Oracle Machine Learning - pełne uczenie maszynowe w SQL/PL-SQL i Pythonie, działające w całości w bazie.
  • Property Graph i JSON Relational Duality - zapytania grafowe oraz jeden zbiór danych widziany jednocześnie jako tabele i jako dokumenty JSON.

Poniższe zrzuty pochodzą z prawdziwej, świeżo postawionej bazy Oracle 26ai Free. Zacznijmy od dowodu, że to faktycznie najnowsze wydanie:

SQL*Plus - SELECT banner_full FROM v$version zwraca Oracle AI Database 26ai Free Release 23.26.2.0.0
Wersja bazy - Oracle AI Database 26ai Free, Release 23.26

Wektor jako pełnoprawny typ danych

W 23ai/26ai wektor to zwykła kolumna w tabeli - definiujesz jej wymiar i format liczb. Dzięki temu embeddingi (np. opisów produktów, dokumentów, zdjęć) leżą obok danych biznesowych, a nie w osobnym systemie.

Definicja kolumny ma postać VECTOR(liczba_wymiarów, format). Na przykład VECTOR(384, FLOAT32) to wektor o 384 wymiarach (tyle liczb tworzy jeden embedding). Wymiar nie jest przypadkowy - narzuca go model, którym liczysz embeddingi, a kolumna w tabeli musi mieć dokładnie tyle samo, inaczej zapis się nie powiedzie. Akurat 384 to rozmiar wektora popularnego, lekkiego modelu embeddingów z rodziny all-MiniLM (używanej m.in. w przykładach importu ONNX w Oracle); większe modele zwracają np. 768, 1024 lub 1536 wymiarów - więcej niuansów kosztem rozmiaru i szybkości. Wektor zapisany jest w formacie FLOAT32 (32-bitowa liczba zmiennoprzecinkowa; alternatywy to m.in. FLOAT64 dla większej precyzji oraz INT8 lub BINARY dla mniejszego rozmiaru kosztem dokładności). W podglądzie DESC pojawia się jeszcze trzeci człon - DENSE - czyli format gęsty: przechowywane są wszystkie wymiary (alternatywą jest SPARSE, opłacalny dla wektorów z dużą liczbą zer). Gdy wymiar lub format mają być dowolne, użyjesz gwiazdki, np. VECTOR(*, *).

SQL*Plus - CREATE TABLE z kolumną wektor VECTOR(384, FLOAT32) i DESC tabeli pokazujący typ VECTOR(384, FLOAT32, DENSE)
Kolumna typu VECTOR(384, FLOAT32) - wektor jest first-class citizen w bazie

Wyszukiwanie semantyczne funkcją VECTOR_DISTANCE

Sercem AI Vector Search jest funkcja VECTOR_DISTANCE. Liczy ona odległość między wektorami (np. metryką kosinusową), a najmniejsza odległość oznacza największe podobieństwo. W przykładzie pytamy o produkty najbardziej podobne do roweru górskiego - baza poprawnie układa ranking:

SQL*Plus - tworzenie tabeli produkty z kolumną VECTOR, wstawienie 4 produktów i zapytanie VECTOR_DISTANCE z metryką COSINE; wynik ranking: Rower gorski 0, Rower szosowy 0.0059, Hulajnoga 0.3265
VECTOR_DISTANCE z metryką COSINE - ranking podobieństwa liczony w jednym zapytaniu SQL

Skąd te wartości w wektorach? W tym przykładzie celowo użyliśmy malutkich, 3-wymiarowych wektorów wpisanych ręcznie - tylko po to, żeby ranking dało się policzyć w głowie i odczytać z ekranu. Każda z trzech liczb to umowna „oś cechy" produktu (np. jak bardzo jest sportowy, terenowy, elegancki). W prawdziwym systemie tych liczb nie wpisujesz ręcznie - generuje je model embeddingów (funkcją VECTOR_EMBEDDING na zaimportowanym modelu ONNX), a wektor ma nie trzy, lecz setki wymiarów (np. 384). Sama funkcja VECTOR_DISTANCE działa identycznie niezależnie od tego, czy liczb jest 3 czy 384.

Składnia jest zwięzła i czytelna - to po prostu SQL z nowymi funkcjami:

SELECT nazwa,
       VECTOR_DISTANCE(cechy, VECTOR('[0.90,0.10,0.20]'), COSINE) AS odleglosc
FROM   produkty
ORDER  BY odleglosc
FETCH FIRST 3 ROWS ONLY;

-- wynik (ranking podobieństwa do [0.90, 0.10, 0.20]):
-- NAZWA            ODLEGLOSC
-- ---------------  ---------
-- Rower gorski             0
-- Rower szosowy        .0059
-- Hulajnoga            .3265
-- 3 rows selected.

Jak to czytać: im mniejsza liczba w kolumnie ODLEGLOSC, tym produkt w kolumnie NAZWA jest bardziej podobny znaczeniowo do zapytania. Zero to ten sam kierunek wektora (najlepsze dopasowanie), a im większa wartość, tym dalej znaczeniowo - dlatego ranking sortujemy rosnąco po odległości i bierzemy pierwsze wiersze.

Indeks wektorowy HNSW dla milionów wektorów

Przy dużych zbiorach przeszukiwanie każdego wektora po kolei jest zbyt wolne. Oracle dodaje indeksy wektorowe (HNSW i IVF) oraz dedykowany obszar pamięci Vector Pool. Zapytanie z FETCH APPROX - to przybliżona odmiana zwykłego FETCH FIRST: dopisek APPROX każe bazie skorzystać z indeksu wektorowego i zwrócić wynik przybliżony (z zadaną dokładnością), zamiast porównywać po kolei wszystkie wektory. Dzięki temu odpowiedź przychodzi bardzo szybko, nawet przy milionach rekordów:

SQL*Plus - CREATE VECTOR INDEX ORGANIZATION INMEMORY NEIGHBOR GRAPH DISTANCE COSINE oraz zapytanie z FETCH APPROX FIRST 2 ROWS ONLY
Indeks wektorowy HNSW (graf sąsiedztwa w pamięci) i wyszukiwanie przybliżone FETCH APPROX

Rozłóżmy tę składnię na części:

  • CREATE VECTOR INDEX idx_prod_hnsw ON produkty(cechy) - tworzy indeks wektorowy o nazwie idx_prod_hnsw na kolumnie cechy (typu VECTOR) w tabeli produkty.
  • ORGANIZATION INMEMORY NEIGHBOR GRAPH - typ indeksu: graf sąsiadów trzymany w pamięci, czyli HNSW. Dzięki temu, że siedzi w pamięci (obszar Vector Pool), wyszukiwanie jest błyskawiczne. Alternatywą jest ORGANIZATION NEIGHBOR PARTITIONS - indeks IVF, który może leżeć na dysku (mniej pamięci, nieco wolniej).
  • DISTANCE COSINE - metryka odległości, jaką indeks ma optymalizować. Musi być ta sama, której używasz w zapytaniu (tu COSINE), inaczej indeks nie zostanie użyty. Inne opcje to m.in. EUCLIDEAN, DOT, MANHATTAN.
  • WITH TARGET ACCURACY 95 - docelowa dokładność wyszukiwania przybliżonego (95%). Indeks przyspiesza kosztem drobnej utraty trafności; 95 to zdrowy kompromis - wyższa wartość daje dokładniejsze wyniki, ale wolniej.

W zapytaniu kluczowe jest FETCH APPROX FIRST 2 ROWS ONLY: słowo APPROX mówi bazie, żeby skorzystała z indeksu wektorowego (wyszukiwanie przybliżone) zamiast porównywać po kolei wszystkie wektory. Bez APPROX Oracle policzyłby dokładny wynik, skanując całą tabelę - na milionach wektorów właśnie tego chcemy uniknąć.

Po co to wszystko? RAG na danych firmy

Najczęstsze zastosowanie wyszukiwania wektorowego to RAG (Retrieval-Augmented Generation) - odpowiedzi modelu językowego ugruntowane w dokumentach firmy. W Oracle cały przepływ może żyć w jednej bazie:

Diagram przepływu RAG w Oracle 23ai: Dokumenty --> VECTOR_EMBEDDING (model ONNX w bazie) --> kolumna VECTOR z indeksem HNSW --> VECTOR_DISTANCE --> LLM z kontekstem
Przepływ RAG w Oracle 23ai - embedding, indeks i wyszukiwanie obok danych transakcyjnych

Chcesz pewnie pisać zaawansowane zapytania SQL w Oracle?
Zaawansowany Oracle SQL - funkcje analityczne, hierarchie i optymalizacja zapytań. Ocena 4.9/5, terminy gwarantowane.

Oracle Machine Learning - model ML w czystym SQL

To najstarszy filar AI w Oracle - i wciąż w pełni żywy w 26ai. Pakiet DBMS_DATA_MINING jest w bazie od Oracle 10g (2004), dziś pod nazwą Oracle Machine Learning for SQL (OML4SQL) - to nie nowość 23ai/26ai. Pozwala zbudować model uczenia maszynowego bez ani jednej linijki Pythona i bez eksportu danych. W przykładzie uczymy klasyfikator Naive Bayes przewidywać, czy klient dokona zakupu, a następnie wołamy PREDICTION wprost w zapytaniu:

SQL*Plus - DBMS_DATA_MINING.CREATE_MODEL budujący model klasyfikacji Naive Bayes na tabeli klienci_ml oraz zapytanie z funkcjami PREDICTION i PREDICTION_PROBABILITY zwracające trafne predykcje TAK/NIE dla 8 klientów
Oracle Machine Learning - budowa modelu i predykcja w SQL (DBMS_DATA_MINING, PREDICTION)

Czym jest model i po co go tworzymy? Model uczenia maszynowego to wytrenowany wzorzec - Oracle przegląda dane historyczne (np. którzy klienci kupili, a którzy nie, i jakie mieli cechy) i zapamiętuje wykryte zależności jako gotowy obiekt w bazie. Model budujesz raz, a potem dowolnie wiele razy „pytasz" go o nowe, nieznane przypadki funkcją PREDICTION (np. „czy ten klient kupi?") - bez ponownego uczenia. To właśnie różnica między ręcznie pisaną regułą (sztywne warunki IF) a modelem, który sam wyłapuje wzorce z danych i potrafi je uogólnić na nowe wiersze.

A co, gdy dane się zmienią? Model odzwierciedla dane z chwili treningu, więc kiedy rzeczywistość się zmienia (nowe zachowania klientów, sezonowość, nowe produkty), z czasem traci celność - to tzw. dryf modelu. Dlatego model co jakiś czas przetrenowujesz na świeższych danych: usuwasz stary (DROP_MODEL) i budujesz nowy (CREATE_MODEL) na aktualnej tabeli - zwykle cyklicznie, np. zaplanowanym zadaniem w DBMS_SCHEDULER raz na tydzień czy miesiąc. „Raz" znaczy więc „raz na cykl", a nie „raz na zawsze".

Co krok po kroku robi ten kod:

  1. Tabela z danymi treningowymi (klienci_ml) - osiem rekordów z wiekiem, dochodem i liczbą kliknięć. Kolumna kupil (TAK/NIE) to zmienna docelowa, której model będzie się uczyć. W realnym projekcie to tysiące lub miliony wierszy z Twojego hurtowni danych - tutaj 8 rekordów wystarczy, żeby zademonstrować mechanizm.
  2. Tabela ustawień (ust_ml) - prosty słownik parametrów. Wpisujemy tu ALGO_NAME = ALGO_NAIVE_BAYES, co mówi pakietowi: użyj algorytmu Naiwnego Bayesa. Można tu podać dziesiątki innych parametrów (głębokość drzewa, liczba drzew w lesie losowym, próg prawdopodobieństwa itd.) - gdy tabela ustawień jest pusta, Oracle dobiera parametry automatycznie. Nazwę tej tabeli przekazujesz procedurze DBMS_DATA_MINING.CREATE_MODEL w parametrze settings_table_name - stamtąd model czyta swoją konfigurację.
  3. Budowa modelu (DBMS_DATA_MINING.CREATE_MODEL) - jedno wywołanie PL/SQL i model jest gotowy. Podajesz: nazwę modelu (MODEL_KUPNA), typ zadania (CLASSIFICATION - klasyfikacja binarna), tabelę z danymi, kolumnę z unikalnym ID każdego przypadku i kolumnę docelową. Oracle trenuje model w bazie - żadne dane nie opuszczają serwera, żadne połączenie z zewnętrznym API nie jest potrzebne.
  4. Predykcja w SELECT (PREDICTION i PREDICTION_PROBABILITY) - model działa jak zwykła funkcja SQL. PREDICTION(MODEL_KUPNA USING wiek, dochod, klikniecia) zwraca prognozowaną etykietę (TAK lub NIE), a PREDICTION_PROBABILITY - stopień pewności tej prognozy w przedziale 0-1. Możesz łączyć je z WHERE, JOIN, ORDER BY - to zwykłe wyrażenie SQL.

Cały model powstał i działa wewnątrz bazy - obliczenia AI jadą do danych, nie odwrotnie. Ta sama filozofia co Vector Search, tyle że dostępna już od Oracle 9i R2.

Select AI - pytaj bazę po polsku

Wyobraź sobie sytuację: analityk biznesowy chce wiedzieć, ilu klientów złożyło zamówienie w ostatnim kwartale wartości powyżej 10 000 zł. Nie zna SQL, nie wie jak nazywa się tabela, nie wie w której kolumnie jest data. Normalnie idzie do programisty, który pisze zapytanie. Select AI odwraca ten schemat: analityk pyta bazę bezpośrednio, po polsku, zwykłym zdaniem.

Select AI (pakiet DBMS_CLOUD_AI, dostępny od Oracle Database 23ai) to mechanizm zamieniający pytanie w języku naturalnym na pełne zapytanie SQL - na Twoim konkretnym schemacie, z właściwymi nazwami tabel i kolumn - i od razu zwracający wynik. Pod spodem działa duży model językowy (LLM), ale Ty piszesz tylko zdanie po polsku, resztę robi baza.

Jak to działa - przepływ krok po kroku

Zrozumienie mechanizmu jest kluczowe, żeby świadomie go używać (i żeby wiedzieć, gdzie są granice). Oto co się dzieje, gdy piszesz SELECT AI 'pokaż dziesięciu największych klientów':

  1. Baza czyta profil AI. Profil (stworzony przez administratora raz, poleceniem DBMS_CLOUD_AI.CREATE_PROFILE) zawiera: adres i klucz API dostawcy LLM, nazwę modelu językowego, listę tabel i kolumn, które model „widzi".
  2. Baza buduje tzw. prompt systemowy. Automatycznie pobiera z danych słownikowych (ALL_TABLES, ALL_COLUMNS) definicje tabel i kolumn z profilu, a następnie wysyła do LLM instrukcję: „Masz do dyspozycji ten schemat, napisz SQL odpowiadający na to pytanie."
  3. LLM generuje SQL. Model widzi schemat i pytanie użytkownika, odpowiada czystym zapytaniem SQL (bez żadnych dodatkowych słów).
  4. Baza wykonuje wygenerowany SQL i zwraca wyniki. Wygenerowane zapytanie jest uruchamiane na bazie tak samo jak każde inne - z uprawnieniami bieżącego użytkownika.
Dane do LLM - co tak naprawdę wysyłasz?
Do zewnętrznego modelu trafia wyłącznie schemat (nazwy tabel i kolumn oraz ewentualne komentarze) i treść Twojego pytania. Dane z tabel nie są wysyłane do LLM. Mimo to, jeśli nazwy kolumn zdradzają wrażliwe informacje (np. nr_pesel, kwota_wynagrodzenia), warto przemyśleć, które tabele umieszczasz w profilu.

Krok 1 - Poświadczenia (credential)

Zanim stworzysz profil, musisz zapisać w bazie klucz API dostawcy LLM. Oracle przechowuje go bezpiecznie w zaszyfrowanym obiekcie CREDENTIAL. Poniżej przykład dla OpenAI:

-- Zapisanie klucza API OpenAI w zaszyfrowanym obiekcie credential.
-- Klucz jest przechowywany jak hasło w Oracle Wallet - nie widać go po stworzeniu.
BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'OPENAI_CRED',        -- dowolna nazwa obiektu w bazie
    username        => 'OPENAI',             -- etykieta dostawcy; OpenAI nie ma loginu, liczy się tylko klucz w password
    password        => 'sk-...'              -- Twój klucz API z platform.openai.com
  );
END;
/

Skąd tu username? DBMS_CLOUD.CREATE_CREDENTIAL to uniwersalny mechanizm na pary login + hasło (Oracle używa go też np. do chmury czy zewnętrznych baz danych). OpenAI uwierzytelnia się jednak samym kluczem API - dlatego klucz wpisujesz w password, a username jest tu tylko etykietą; w przykładach Oracle wstawia się nazwę dostawcy ('OPENAI'). To nie jest Twój login do OpenAI ani żadna wartość, którą OpenAI sprawdza.

Jeżeli używasz OCI Generative AI (usługa Oracle Cloud - dane nie opuszczają infrastruktury OCI), zamiast klucza API podajesz poświadczenia OCI (user OCID, tenancy OCID, fingerprint klucza prywatnego) - procedura jest analogiczna, zmienia się tylko format parametrów.

Krok 2 - Profil AI

Profil to konfiguracja, która spina razem: dostawcę LLM, model, credential i listę tabel, które model może „widzieć". Tworzysz go raz (zazwyczaj robi to DBA lub właściciel schematu) - użytkownicy z nadanym profilem mogą potem pytać bazę bez konfiguracji:

-- Stworzenie profilu AI łączącego: dostawcę LLM, model, credential i widoczne tabele.
-- JSON-owa konfiguracja jest przesyłana do DBMS_CLOUD_AI.CREATE_PROFILE.
BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name => 'SPRZEDAZ_AI',           -- nazwa profilu używana w SELECT AI
    attributes   => '{
      "provider"   : "openai",               -- dostawca: openai | oci | azure | google
      "credential_name": "OPENAI_CRED",      -- credential stworzony w kroku 1
      "model"      : "gpt-4o",               -- konkretna wersja modelu LLM
      "object_list": [                        -- lista tabel, które LLM "widzi" (schemat)
        {"owner": "SKLEP", "name": "ZAMOWIENIA"},
        {"owner": "SKLEP", "name": "KLIENCI"},
        {"owner": "SKLEP", "name": "PRODUKTY"}
      ]
    }'
  );
END;
/

-- Nadanie innemu użytkownikowi prawa korzystania z Select AI (EXECUTE na pakiecie):
GRANT EXECUTE ON DBMS_CLOUD_AI TO ANNA;

-- Ustawienie profilu jako domyślnego dla bieżącej sesji:
EXEC DBMS_CLOUD_AI.SET_PROFILE('SPRZEDAZ_AI');

Krok 3 - Cztery tryby zapytania

Składnia SELECT AI obsługuje wiele trybów (tzw. akcji), wybierasz je słowem kluczowym za AI. Sześć najczęściej używanych:

Tryb (akcja)SkładniaCo zwraca
runsql (domyślny) SELECT AI 'pytanie' Wynik zapytania SQL wygenerowanego przez LLM - wiersze i kolumny jak w zwykłym SELECT. Obsługuje też RAG (wyszukiwanie wektorowe jako kontekst)
showsql SELECT AI showsql 'pytanie' Wygenerowany kod SQL jako tekst - nie wykonuje go. Przydatne do nauki i weryfikacji poprawności
explainsql SELECT AI explainsql 'pytanie' Generuje SQL, a następnie prosi LLM o wyjaśnienie po ludzku, co ten SQL robi. Para do showsql - zamiast czytać SQL samemu, dostajesz opis słowami
showprompt SELECT AI showprompt 'pytanie' Wyświetla pełny prompt, który Oracle buduje i wysyła do LLM - widać tu schemat tabel, instrukcje systemowe i Twoje pytanie. Niezastąpione przy debugowaniu i audycie bezpieczeństwa
narrate SELECT AI narrate 'pytanie' LLM wykonuje SQL, dostaje wyniki i opisuje je zdaniami po polsku. Zamiast tabeli z liczbami dostajesz zdanie: „Najlepszy miesiąc to marzec z 4 820 zł średniej wartości zamówienia"
chat SELECT AI chat 'pytanie' Przekazuje pytanie bezpośrednio do LLM bez uruchamiania SQL. Rozmowa ogólna - wyjaśnienia, kontekst, pytania niezwiązane z danymi w bazie
summarize SELECT AI summarize 'pytanie' Streszcza tekst i duże pliki (do 1 GB) przy pomocy LLM. Przydatne do podsumowywania dokumentów, raportów lub długich treści przechowywanych w bazie
feedback SELECT AI feedback 'korekta' Pozwala powiedzieć modelowi, że poprzedni SQL był błędny i jak powinien wyglądać poprawny. LLM uczy się na tej podstawie i generuje dokładniejsze zapytania w przyszłości. Dostępne od Oracle AI Database 26ai
agent SELECT AI agent 'zadanie' Uruchamia autonomicznego agenta z planowaniem wieloetapowym, użyciem narzędzi i refleksją - agent samodzielnie rozkłada złożone zadanie na kroki i je wykonuje. Dostępne od Oracle AI Database 26ai

Przykłady w akcji

Przyjmijmy, że w schemacie SKLEP mamy tabele ZAMOWIENIA (z kolumnami: id_klienta, data_zamowienia, wartosc) i KLIENCI (id_klienta, imie, nazwisko). Oto jak wygląda rozmowa z bazą:

-- runsql (domyślny): wykonuje SQL i zwraca wiersze jak w zwykłym SELECT
SELECT AI 'pokaż dziesięciu klientów z największą łączną wartością zamówień w tym roku';

--  IMIE        NAZWISKO    SUMA_ZAMOWIEN
--  ----------  ----------  -------------
--  Anna        Kowalska       128 540,00
--  Marek       Nowak          114 220,00
--  ...         ...                   ...

-- showsql: wyświetla wygenerowany SQL bez wykonywania go
SELECT AI showsql 'pokaż dziesięciu klientów z największą łączną wartością zamówień w tym roku';

--  SELECT k.imie, k.nazwisko, SUM(z.wartosc) AS suma_zamowien
--  FROM   sklep.klienci k
--  JOIN   sklep.zamowienia z ON z.id_klienta = k.id_klienta
--  WHERE  EXTRACT(YEAR FROM z.data_zamowienia) = EXTRACT(YEAR FROM SYSDATE)
--  GROUP  BY k.imie, k.nazwisko
--  ORDER  BY suma_zamowien DESC
--  FETCH FIRST 10 ROWS ONLY

-- explainsql: generuje SQL, a potem prosi LLM o wytłumaczenie go po ludzku
SELECT AI explainsql 'pokaż dziesięciu klientów z największą łączną wartością zamówień w tym roku';

--  "Zapytanie łączy tabele KLIENCI i ZAMOWIENIA po kolumnie id_klienta,
--   filtruje zamówienia z bieżącego roku, sumuje wartości dla każdego klienta
--   i sortuje malejąco, zwracając pierwszą dziesiątkę."

-- showprompt: pokazuje pełny prompt wysyłany do LLM (schemat + instrukcje + pytanie)
SELECT AI showprompt 'pokaż dziesięciu klientów z największą łączną wartością zamówień w tym roku';

--  "You are an Oracle SQL expert. The following tables are available:
--   SKLEP.ZAMOWIENIA (id_klienta NUMBER, data_zamowienia DATE, wartosc NUMBER)
--   SKLEP.KLIENCI (id_klienta NUMBER, imie VARCHAR2, nazwisko VARCHAR2)
--   Generate a SQL query for: pokaż dziesięciu klientów..."

-- narrate: wykonuje SQL i każe LLM opisać wynik zdaniami po polsku
SELECT AI narrate 'jaka była średnia wartość zamówienia w każdym miesiącu tego roku?';

--  "W 2025 roku najwyższa średnia wartość zamówienia przypadła na marzec
--   (4 820 zł), najniższa zaś na sierpień (2 110 zł). Ogólna średnia
--   roczna wyniosła 3 460 zł."

-- chat: przekazuje pytanie wprost do LLM, bez SQL i bez danych z tabel
SELECT AI chat 'co to jest indeks HNSW i kiedy go użyć?';

--  "HNSW (Hierarchical Navigable Small World) to graf przybliżonego wyszukiwania
--   najbliższych sąsiadów. Buduje wielowarstwową strukturę węzłów połączonych
--   krawędziami - górne warstwy to długie skoki, dolne to precyzyjne dopasowanie...
--   Użyj go, gdy masz powyżej kilkudziesięciu tysięcy wektorów i zależy Ci na
--   czasie odpowiedzi poniżej 10 ms."

-- summarize: streszcza tekst lub plik przechowywany w bazie (do 1 GB)
SELECT AI summarize 'streść raport kwartalny z tabeli RAPORTY gdzie id = 42';

--  "Raport za Q1 2025 odnotowuje wzrost sprzedaży o 18% rok do roku,
--   głównie w segmencie B2B. Marża brutto spadła o 2 pp do poziomu 34%
--   z powodu wzrostu kosztów logistyki..."

-- feedback (Oracle 26ai): powiedz modelowi, że poprzedni SQL był błędny
SELECT AI feedback 'poprzednie zapytanie o klientów pominęło zamówienia anulowane - kolumna status = ''ANULOWANE'' powinna być wykluczona';

--  "Dziękuję za korektę. Zapamiętałem, że przy zapytaniach o klientów
--   i zamówienia należy zawsze dodać warunek status != ''ANULOWANE''."

-- agent (Oracle 26ai): autonomiczny agent rozkłada złożone zadanie na kroki
SELECT AI agent 'znajdź klientów, którzy kupili produkt X, ale nie kupili Y, i wyślij im ofertę rabatową';

--  Agent planuje: (1) znajdź klientów X, (2) odejmij zbiór klientów Y,
--  (3) pobierz adresy e-mail, (4) wywołaj narzędzie do wysyłki oferty.
--  Każdy krok jest wykonywany osobno z refleksją nad wynikiem.

Tryb showsql - narzędzie do nauki i weryfikacji

Tryb showsql jest szczególnie wartościowy z dwóch powodów. Po pierwsze, pozwala sprawdzić, czy model dobrze zrozumiał pytanie - zanim zobaczysz wyniki, możesz ocenić poprawność SQL. Po drugie, to świetne narzędzie do nauki: piszesz pytanie po polsku, dostajesz gotowy, poprawny SQL i możesz analizować, jak Oracle przekłada intencję na zapytanie. W środowisku produkcyjnym warto uruchamiać showsql przy pierwszym użyciu każdego nowego pytania, żeby upewnić się, że model trafia w intencję.

Obsługiwani dostawcy LLM

Select AI współpracuje z kilkoma dostawcami dużych modeli językowych. Wybór zależy głównie od wymagań bezpieczeństwa i polityki firmy:

  • OCI Generative AI - usługa Oracle Cloud; dane pozostają w infrastrukturze OCI, naturalny wybór dla klientów chmury Oracle.
  • OpenAI - modele z rodziny GPT; schemat tabel trafia do serwerów OpenAI (poza UE).
  • Azure OpenAI - modele OpenAI hostowane przez Microsoft na Azure; dostępne opcje regionów UE.
  • Google Vertex AI - modele Gemini; integracja przez klucz API Google Cloud.
  • Cohere - alternatywny dostawca, modele Command R.
Select AI vs Vector Search vs Oracle ML - kluczowa różnica
Oracle Machine Learning i AI Vector Search działają w całości wewnątrz bazy - żadne dane nie opuszczają serwera. Select AI jest inaczej skonstruowany: schemat i pytanie trafiają do zewnętrznego LLM przez HTTPS. To często decyduje o wyborze: w regulowanych branżach (banki, ochrona zdrowia) może wymagać dodatkowej zgody na przetwarzanie metadanych poza organizacją.

Kiedy Select AI naprawdę się przydaje

Select AI nie zastąpi analityka, który musi pisać skomplikowane zapytania z wieloma JOINami, funkcjami okna czy hierarchiami. Sprawdza się natomiast doskonale w scenariuszach, gdzie wartość leży w demokratyzacji dostępu do danych:

  • Self-service BI dla menedżerów - kierownik sprzedaży sam sprawdza wyniki bez angażowania działu IT.
  • Rapid prototyping zapytań - programista pisze pytanie, dostaje bazowy SQL, który potem doprecyzowuje ręcznie.
  • Onboarding do nieznanej bazy - nowy pracownik szybko eksploruje nieznany schemat pytaniami w języku naturalnym.
  • Dashboardy z dynamicznymi pytaniami - aplikacje, gdzie użytkownik wpisuje pytanie i dostaje wynik bez własnego SQL.

Dlaczego AI w bazie ma sens?

AspektOsobna baza wektorowaAI Vector Search w Oracle
Lokalizacja danychKopia danych w drugim systemieWektory obok danych biznesowych
Spójność i transakcjeSynchronizacja, ryzyko rozjazduPełne ACID, jedna transakcja
BezpieczeństwoDrugi model uprawnieńTe same role i uprawnienia Oracle
Backup i odtwarzanieOsobny procesWspólny RMAN / Data Guard
Złączenia z danymi firmyTrudne (dwa systemy)Zwykły JOIN w SQL

Najczęstsze pytania

Od której wersji Oracle ma wyszukiwanie wektorowe?

Od Oracle Database 23ai (maj 2024) i w kolejnych wydaniach linii 23 (oznaczanych jako 26ai). Funkcja jest też w darmowej edycji Oracle Database Free - na niej powstały przykłady w tym artykule.

Czy potrzebuję osobnej bazy wektorowej?

Nie. W 23ai wektor to typ danych VECTOR w zwykłej tabeli - z tymi samymi transakcjami, backupem i uprawnieniami co reszta bazy.

Czy AI w Oracle wymaga wysyłania danych na zewnątrz?

Vector Search i Oracle Machine Learning działają w całości w bazie - embeddingi możesz liczyć lokalnie z modelu ONNX. Zewnętrzny LLM jest potrzebny tylko dla funkcji generatywnych (Select AI, generowanie odpowiedzi w RAG).

Zaawansowany Oracle SQL - fundament pod AI w bazie

Vector Search, OML i Select AI to nadal SQL. Naucz się pisać zaawansowane zapytania, funkcje analityczne i optymalizować wydajność u praktyka JSystems.

Zaawansowany Oracle SQL - terminy gwarantowane -->

Interesuje Cię strona AI/ML? Zobacz też Uczenie maszynowe w Pythonie oraz Tworzenie systemu RAG z LangChain.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...