Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
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.
VECTOR i jak działa funkcja VECTOR_DISTANCE,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.
DBMS_DATA_MINING: klasyfikacja, regresja, klastrowanie - modele budowane w czystym SQL, wewnątrz bazy.OML4Py i OML4R, AutoML w Autonomous Database.DBMS_DATA_MINING pozostaje bez zmian. Wbudowany AutoML.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:
VECTOR, funkcja VECTOR_DISTANCE, indeksy wektorowe (HNSW, IVF) i nowa składnia wyszukiwania semantycznego.VECTOR_EMBEDDING, bez wysyłania danych na zewnątrz.DBMS_CLOUD_AI).Poniższe zrzuty pochodzą z prawdziwej, świeżo postawionej bazy Oracle 26ai Free. Zacznijmy od dowodu, że to faktycznie najnowsze wydanie:
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.
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:
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;
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 korzysta z indeksu i zwraca wynik przybliżony z zadaną dokładnością - bardzo szybko, nawet przy milionach rekordów:
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:
Chcesz pewnie pisać takie zapytania SQL w Oracle?
Zaawansowany Oracle SQL - funkcje analityczne, hierarchie i optymalizacja zapytań. Ocena 4.9/5, terminy gwarantowane.
To najstarszy filar AI w Oracle - i wciąż w pełni żywy w 26ai. Pakiet DBMS_DATA_MINING 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:
Co krok po kroku robi ten kod:
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.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.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.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.
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.
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':
DBMS_CLOUD_AI.CREATE_PROFILE) zawiera: adres i klucz API dostawcy LLM, nazwę modelu językowego, listę tabel i kolumn, które model „widzi".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."nr_pesel, kwota_wynagrodzenia), warto przemyśleć, które tabele umieszczasz w profilu.
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', -- wymagana wartość literalna dla OpenAI
password => 'sk-...' -- Twój klucz API z platform.openai.com
);
END;
/
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.
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"}
],
"language" : "polish" -- podpowiada modelowi język pytań
}'
);
END;
/
-- Nadanie uprawnień do korzystania z profilu innemu użytkownikowi:
EXEC DBMS_CLOUD_AI.GRANT_PROFILE('SPRZEDAZ_AI', 'ANNA');
-- Ustawienie profilu jako domyślnego dla bieżącej sesji:
EXEC DBMS_CLOUD_AI.SET_PROFILE('SPRZEDAZ_AI');
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ładnia | Co 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 |
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 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ę.
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:
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:
| Aspekt | Osobna baza wektorowa | AI Vector Search w Oracle |
|---|---|---|
| Lokalizacja danych | Kopia danych w drugim systemie | Wektory obok danych biznesowych |
| Spójność i transakcje | Synchronizacja, ryzyko rozjazdu | Pełne ACID, jedna transakcja |
| Bezpieczeństwo | Drugi model uprawnień | Te same role i uprawnienia Oracle |
| Backup i odtwarzanie | Osobny proces | Wspólny RMAN / Data Guard |
| Złączenia z danymi firmy | Trudne (dwa systemy) | Zwykły JOIN w SQL |
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.
Nie. W 23ai wektor to typ danych VECTOR w zwykłej tabeli - z tymi samymi transakcjami, backupem i uprawnieniami co reszta bazy.
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).
Vector Search, OML i Select AI to nadal SQL. Naucz się pisać zaawansowane zapytania, funkcje analityczne i optymalizować wydajność u praktyków 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)
Brak komentarzy...