
Technologia AI Vector Search
Baza danych 23ai, zgodnie z nazwą oraz licznymi zapowiedziami na oficjalnej stronie, zintegrowana została z technologią sztucznej inteligencji – Artificial Intelligence (AI). Jednym z rozwiązań w tym obszarze jest funkcjonalność wyszukiwania wektorowego (Vector Search), która jak za chwilę się przekonasz, po prostu przenosi współczesne przetwarzanie danych na zupełnie nowy poziom. Jest to szczególnie istotne w kontekście nowego trendu w analizie, gdzie tradycyjne metody wyszukiwania oparte na indeksach nie zawsze są wystarczające.
Czym jest Vector Search?
Vector Search to metoda, która bazuje na danych reprezentowanych jako wektory – czyli ciągach liczb opisujących najważniejsze cechy obiektów. Dzięki temu mechanizmowi silnik bazy danych nie ogranicza się do dosłownego porównywania tekstu, ale analizuje jego podobieństwo na podstawie odległości między wektorami w wielowymiarowej przestrzeni. To trochę tak, jakbyśmy porównywali punkty na mapie. Im położone są bliżej siebie, tym prawdopodobieństwo, że są do siebie podobne, jest wyższe. Stosując taką technologię, możemy wyszukiwać dane, które są semantycznie zbliżone, pomimo że nie są literalnie identyczne. Innymi słowy, możemy automatycznie zmierzyć, na ile dwa pozornie różne zdania oznaczają to samo.
Poniższy rysunek ilustruje na ile słowo „klimat” zbliżone jest do słów „pogoda” i „upały”, ale jak bardzo odległe jest od słowa „alergia”.

Wybierzmy model
Aby móc skorzystać z technologii Vector Search, musimy pobrać gotowy, wytrenowany model.
Skorzystajmy w tym celu z adresu:
Następnie umieśćmy go w specjalnie do tego celu stworzonym katalogu na serwerze. Jeśli maszyna posiada dostęp do Internetu, możesz wykonać wszystkie te operacje bezpośrednio z konsoli:
$ mkdir -p /u01/app/oracle/models
$ cd /u01/app/oracle/models
$ wget https://adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com/p/VBRD9P8ZFWkKvnfhrWxkpPe8K03-JIoM5h_8EJyJcpE80c108fuUjg7R5L5O7mMZ/n/adwc4pm/b/OML-Resources/o/all_MiniLM_L12_v2_augmented.zip
$ unzip all_MiniLM_L12_v2_augmented.zip
$ rm all_MiniLM_L12_v2_augmented.zip
Czym jest all-MiniLM-L12-v2?
All-MiniLM-L12-v2 firmy Hugging Face to kompaktowy model transformacji tekstu, który na podstawie pobranego zdania lub krótkiego akapitu mapuje je na 384-wymiarowy wektor. Wektory takie są następnie wykorzystywane są do różnego rodzaju zadań na przykład w obszarze przetwarzania języka naturalnego (NLP).
Ładowanie Modelu do bazy danych
Połączmy się teraz z bazą PDB1, utworzymy dedykowanego użytkownika „VSEARCHUSER”, następnie stwórzmy katalog, czyli obiekt DIRECTORY o nazwie „VSEARCH_DIR” i udzielmy uprawnień do odczytu i zapisu nowemu użytkownikowi:
$ sql / as sysdba
SQL> ALTER SESSION SET CONTAINER=PDB1;
SQL> CREATE USER VSEARCHUSER IDENTIFIED BY Password1 QUOTA UNLIMITED ON USERS;
SQL> GRANT CREATE SESSION, DB_DEVELOPER_ROLE, CREATE MINING MODEL TO VSEARCHUSER;
SQL> CREATE OR REPLACE DIRECTORY VSEARCH_DIR AS '/u01/app/oracle/models';
SQL> GRANT READ, WRITE ON DIRECTORY VSEARCH_DIR TO VSEARCHUSER;
Załadujmy model do bazy danych PDB1 korzystając z pakietu DBMS_VECTOR:
$ sql VSEARCHUSER@localhost:1521/pdb1
Password? (**********?) *********
SQL> BEGIN
DBMS_VECTOR.DROP_ONNX_MODEL (
model_name => 'ALL_MINILM_L12_V2',
force => true);
DBMS_VECTOR.LOAD_ONNX_MODEL (
directory => 'vsearch_dir',
file_name => 'all_MiniLM_L12_v2.onnx',
model_name => 'ALL_MINILM_L12_V2');
end;
/
Po załadowaniu, informacje o modelu możemy sprawdzić przeglądając widok USER_MINING_MODELS:
SQL> SELECT MODEL_NAME, ALGORITHM, MINING_FUNCTION FROM USER_MINING_MODELS
WHERE MODEL_NAME = 'ALL_MINILM_L12_V2';
MODEL_NAME ALGORITHM MINING_FUNCTION
____________________ ____________ __________________
ALL_MINILM_L12_V2 ONNX EMBEDDING
Dane do analizy
Kolejnym krokiem jest pozyskanie odpowiednich danych. Aby wykonać ćwiczenie potrzebujemy zbiorów zawierających elementy opisowe. Z racji modelu jaki użyjemy, powinny być przygotowane w języku angielskim. Jeśli dysponujesz danymi spełniającymi takie kryteria, możesz je użyć. W ćwiczeniu zastosujemy plik CSV zawierający wiadomości BBC z kilku ostatnich lat. Nie musisz zamykać się jednak tylko na takie rozwiązanie. W Sieci znaleźć można mnóstwo przydatnych danych, udostępnionych bezpłatnie, zazwyczaj przez organy administracji publicznej a także przez niektóre firmy prywatne.
Dlaczego dane tego typu są tak chętnie udostępniane? W przypadku instytucji państwowych, głównym celem jest nie tylko podniesienie transparentności ich działania, ale dodatkowo umożliwienie społeczeństwu przeprowadzania przeróżnych analiz. Czasami takie działanie doprowadzić może do znalezienia korelacji tam, gdzie nikt by się tego nie spodziewał.
Choć analizy tego typu wykraczają poza ramy niniejszej książki, pozwól, że przytoczę kilka zaskakujących wyników badań przeprowadzonych w segmencie newsowym. Otóż badanie przeprowadzone przez MIT wykazało, że fałszywe wiadomości rozprzestrzeniają się sześć razy szybciej niż prawdziwe informacje. Dzieje się tak zapewne ze względu na emocjonalny charakter takich wiadomości, który jest silniej angażujący, zwłaszcza wśród użytkowników mediów społecznościowych.
Inne badania wykazały, że złe informacje mają średnio 30% więcej kliknięć niż informacje pozytywne. Natomiast badanie opublikowane w „PNAS” w 2020 roku wykazało, że około 60% czytelników formułuje swoje opinie tylko na podstawie przeczytanego nagłówka. Dzieje się tak nawet wtedy, kiedy treść artykułu temu zaprzecza. Jak widzisz, nie wiedzielibyśmy tego, gdyby nie dobrze przeprowadzone badania.
Przystępując do analiz, musimy dysponować dobrymi mechanizmami filtracji danych.
O ile standardowe mechanizmy oparte na wyszukiwaniu fraz w tekście, świetnie sprawdzą się w przypadku danych wysokiej jakości, o tyle w sytuacji w której są one mniej uporządkowane, zawierają opisy czy też inne niejednolite struktury, musimy użyć bardziej zaawansowanych metod takich jak opisywana tu technologia Vector Search. Dzięki niej wyszukamy rekordy na podstawie podobieństwa semantycznego, a nie tylko literalnej zgodności znaków.
Wróćmy do naszego ćwiczenia. Korzystając z adresu:
https://www.kaggle.com/datasets/gpreda/bbc-news
pobierzmy plik „bbc_news.csv„, który zawiera wiadomości BBC z kilku ostatnich lat.

Jeśli zajdzie taka konieczność, załóż w serwisie bezpłatne konto.
Następnie połączmy się z bazą PDB1 za pomocą SQL Developera, wykorzystując poświadczenia użytkownika „VSEARCHUSER” i zaimportujmy pobrany plik CSV do nowej tabeli wykorzystując funkcjonalność „Import Data…” dostępną z menu kontekstowego gałęzi Tables.

W poszczególnych oknach należy wprowadzić parametry widoczne na poniższych ekranach.
W etapie pierwszym wskażmy plik, oraz jako separatora danych (delimitera) użyjmy znaku przecinka.

W etapie drugim, opcjonalnie możemy wprowadzić limit rekordów danych które zostaną zaimportowane. Przyspieszy to nieco proces generowania wektorów jakiego dokonywać będziemy dalszej części ćwiczenia. Jako nazwę tabeli podajmy „BBC_NEWS”:

W etapie trzecim, pozostawmy wartości domyślne, czyli zaimportujmy wszystkie dostępne kolumny:


Następnie po zapoznaniu się z podsumowaniem, jesteśmy gotowi do importu:

Jako, że niektóre z rekordów mogą stwarzać problemy, możemy je pominąć, oraz zignorować błędy klikając przycisk „Yes”:

Po zakończeniu całego procesu, dane zostały zaimportowane do tabeli:

Która posiada ponad 34 000 rekordów.

Przeglądając strukturę tabeli widać, że zawiera ona pięć kolumn, przy czym najbardziej interesującą nas jest kolumna „TITLE”:
SQL> DESC VSEARCHUSER.BBC_NEWS;
Name Null? Type
______________ ________ ________________
TITLE VARCHAR2(128)
PUBDATE VARCHAR2(128)
GUID VARCHAR2(128)
LINK VARCHAR2(128)
DESCRIPTION VARCHAR2(256)
Dodajmy teraz nową i nazwijmy ją „TITLE_VECTOR”, w której przechowywać będziemy wektorową interpretację pola zawierającego tytuł. Skorzystamy z nowego typu danych „VECTOR”:
SQL> ALTER TABLE VSEARCHUSER.BBC_NEWS ADD (
TITLE_VECTOR VECTOR
);
SQL> DESC VSEARCHUSER.BBC_NEWS;
Name Null? Type
_______________ ________ ________________
TITLE VARCHAR2(128)
PUBDATE VARCHAR2(128)
GUID VARCHAR2(128)
LINK VARCHAR2(128)
DESCRIPTION VARCHAR2(256)
TITLE_VECTOR VECTOR
Nową kolumnę wypełnijmy danymi wektorowymi za pomocą instrukcji:
SQL> UPDATE VSEARCHUSER.BBC_NEWS
SET TITLE_VECTOR = VECTOR_EMBEDDING(ALL_MINILM_L12_V2 USING TITLE AS DATA);
SQL> COMMIT;
W zależności od liczby rekordów, operacja ta może potrwać od kilku, do nawet kilkudziesięciu minut. Po wszystkim, nasza tabela powiększy się o dodatkową kolumnę:

Wyszukiwanie z użyciem metod sztucznej inteligencji
Przeprowadzamy teraz wyszukiwanie przy użyciu funkcji VECTOR_DISTANCE. Akceptuje ona dwa wektory i zwraca odległość między nimi. W poniższych przykładach tworzymy wektor z tekstu wyszukiwania, następnie sortujemy wynik zapytania według odległości pomiędzy tym wektorem a wektorem zapisanym w tabeli.
Zapytajmy bazę o „Wiadomości klimatyczne z Europy”:
SQL> VARIABLE SEARCH_TEXT VARCHAR2(100);
SQL> EXEC :SEARCH_TEXT := 'Climate news from Europe';
SQL> SELECT vector_distance(TITLE_VECTOR, (vector_embedding(all_minilm_l12_v2 using :search_text as data))) as distance,
TITLE
FROM VSEARCHUSER.BBC_NEWS
order by 1
fetch approximate first 40 rows only;
DISTANCE TITLE
_____________________ __________________________________________________________________
0.35682225227355957 European weather: Winter heat records smashed all over continent
0.3730506896972656 Europe weather: How heatwaves could forever change summer holidays abroad
0.39855557680130005 The weather report which changed the course of history
0.41042137145996094 Climate change: Last year's UK heatwave 'a sign of things to come'
0.412065327167511 Europe and US heatwaves near 'impossible' without climate change
0.4154854416847229 Europe heatwave: Nearly all major Italian cities on red heat alert
0.41764819622039795 Europe heatwave: Outdoor events banned in parts of France
0.4258374571800232 Europe heatwave: Temperatures to soar in Greece as fires still burn
0.4332166314125061 Will European heatwaves make us change our summer holiday plans?
0.43449318408966064 Europe wildfires: Are they linked to climate change?
0.43486589193344116 Watch: How hot will it get in southern Europe heatwave?
Czyli tłumacząc:
„Pogoda w Europie: zimowe rekordy upałów pobite na całym kontynencie.”
„Pogoda w Europie: jak fale upałów mogą na zawsze zmienić letnie wakacje za granicą.”
„Raport pogodowy, który zmienił bieg historii.”
„Zmiany klimatu: ubiegłoroczna fala upałów w Wielkiej Brytanii „jest znakiem tego, co nadejdzie.”
„Fale upałów w Europie i USA są prawie „niemożliwe” bez zmian klimatycznych.”
„Fala upałów w Europie: prawie wszystkie duże włoskie miasta objęte czerwonym alertem.”
To naprawdę działa!
Wyszukajmy teraz frazę: „Jak spędzić letnie miesiące?”:
SQL> EXEC :SEARCH_TEXT := 'How to spend the summer months?';
SQL> SELECT vector_distance(TITLE_VECTOR, (vector_embedding(all_minilm_l12_v2 using :search_text as data))) as distance,
TITLE
FROM VSEARCHUSER.BBC_NEWS
order by 1
fetch approximate first 40 rows only;
DISTANCE TITLE
______________________________________________________________________________
0.3601928949356079 Where has summer gone?
0.43250101804733276 Cost of living: Saving money on our summer holiday
0.4412391185760498 Where has the UK's summer gone?
0.46068572998046875 Where is summer and why is it so cold?
0.48274606466293335 How to manage your holiday in a heatwave
0.4867743253707886 Is summer finally about to turn up?
0.49696075916290283 Ways to save money even when the budget is tight
0.4971854090690613 Coolest UK summer since 2015
0.4978260397911072 Summer holiday getaway: How to beat the queues
0.4981515407562256 Today's the summer solstice - here's what you need to know
0.5029231905937195 Winter tips: Staying warm and coping with the cold weather
0.5042414665222168 Your pictures on the theme of 'summer walks'
0.5048672556877136 How to save money even when the budget is tight
0.5061560273170471 How to stay warm and cope with the cold weather
0.5071080923080444 Energy saving tips: Five ways to cut costs this winter
0.5082815289497375 Will the UK's warm spring lead to a hot summer?
0.5093449354171753 Tips for staying warm and coping with the cold weather
0.5280313491821289 What are airports doing to avoid summer holiday chaos?
0.532344400882721 Summer holiday: 'We spent 15 hours on a flight to nowhere'
Czyli tłumacząc:
„Gdzie podziało się lato?”
„Koszty życia: Oszczędzanie pieniędzy na wakacjach.”
„Gdzie podziało się lato w Wielkiej Brytanii?”
„Gdzie jest lato i dlaczego jest tak zimno?”
„Jak radzić sobie z wakacjami podczas fali upałów.”
„Czy lato w końcu nadchodzi?”
„Sposoby oszczędzania pieniędzy, nawet gdy budżet jest napięty.”
„Najfajniejsze lato w Wielkiej Brytanii od 2015 r.”
„Letni wypad na wakacje: Jak ominąć kolejki”
Tu również wynik wygląda dobrze!
Wydawać by się mogło, że nowa wersja bazy danych a już zwłaszcza sposób wyszukiwania w niej informacji, nie zdołają już nas niczym szczególnym zaskoczyć.
A tu proszę!
______________________________________________________
Powyższy artykuł stanowi fragment mojej książki, która już wkrótce ukaże się nakładem wydawnictwa Helion: https://helion.pl/ksiazki/administrowanie-baza-danych-oracle-23ai-od-podstaw-karol-wieliczko