Oracle Vector Search
Oracle pl

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:

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

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