Wyszukiwanie wektorowe - algorytmy "Sztucznej Inteligencji"

Co to jest wyszukiwanie wektorowe?

Wektory to matematyczne reprezentacje danych w przestrzeni wielowymiarowej. W tej przestrzeni każde dane posiadają swoje koordynaty, a do reprezentowania skomplikowanych danych można użyć dziesiątek tysięcy wymiarów.Słowa, frazy lub całe dokumenty, a także obrazy, pliki audio i inne typy danych można wektoryzować. Np. dla każdego opisu produktu obliczany jest wektor cech - tzw. "osadzenie" (po angielsku "embeddings"). Wyszukując informacji podobnych, używamy algorytmów które dostarczają nam informacje zapisane w podobnych lokalizacji przestrzeni wielowymiarowej co informacja referencyjna. Np. "pies" znajduje się niedaleko "pieska" czy "szczeniaka" (dla uproszczenia, bo jak napisaliśmy wyżej można umieścić tam całe dokumenty, obrazy, dźwięk).

Najpopularniejsze metody obliczania odległości miedzy informacjami umieszczonymi w przestrzenie (podobieństwo między wektorami) to metoda Euclidesa i Cosine. Sam Euclid żył 300 lat przed naszą erą więc dużo to mówi o haslach "nowoczesne algorytmy" i "sztuczna inteligencja".

Wyobraź sobie że wszystkie produkty sklepu internetowego znalazły się w takiej wielowymiarowej przestrzeni a każdy z nich jest opisany wektorami; ma swoje miejsce w tej przestrzeni. Dla uproszczenia tak mogłoby wyglądać miejsce gdzie przechowujemy opis dwóch filtrów (prawa strona obrazka) i dwóch olejów silnikowych (lewa strona obrazka):

Znajdywanie podobieństwa tekstu - Neo4j jako proponowane rozwiązanie

Na rynku istnieje wiele systemów których można użyć do szybkiego znajdowania informacji powiązanych kontekstowo - np. by zbudować, jak w naszym ćwiczeniu, system podpowiadający produkty klientom. Ponieważ Neo4j posiada od 2023 roku wbudowane wektorowe wyszukiwanie podobieństwa, dlaczego by nie wykorzystać właśnie tę bazę danych. Ne4j przechowuje informacje o wektorach i obsługuje przeszukiwanie wektorów. Nie obsługuje jednak niestety tworzenia osadzeń ("embeddings"). Trzeba je obliczyć w innym oprogramowaniu. Poniżej przeczytasz jak obliczyć wektory, jak je umieścić w Neo4j oraz jak je wykorzystać przy wyszukiwaniu informacji.

Tworzenie "embeddings" - Sentence-BERT (SBERT)

SentenceTransformers, SBERT, to framework Pythona umożliwiający tworzenie "embeddings" sentencji, tekstów i obrazów. SBERT jest rozwinięciem Sentence-BERT ('Bidirectional Encoder Representations from Transformers') opracowanym przez Nils Reimers i Iryna Gurevych (program Google).

Możesz użyć tego frameworka do obliczenia osadzania zdań/tekstu dla ponad 100 języków. Te osadzenia można następnie porównać np. z cosinusem podobieństwa, aby znaleźć zdania o podobnym znaczeniu. Może to być przydatne w przypadku semantycznego podobieństwa tekstu, wyszukiwania semantycznego lub eksploracji parafraz.

Framework oparty jest na PyTorch i Transformers i oferuje dużą kolekcję wstępnie wytrenowanych modeli dostosowanych do różnych zadań. Co więcej, łatwo jest dostroić własne modele.

Instalacja SBERT

Instalacja SBERT jest banalnie prosta - wystarczy doinstalowac pakiet 'sentence-transformers' poleceniem pip

pip install -U sentence-transformers

Po zainstalowaniu możemy w sposób jak poniżej utworzyć "embeddings" które posłużą nam jako wartości określonych "properties" w węzłach grafowej bazy danych. Poniżej przykład kodu Python który obliczy wektory dla pięciu opisów produktów wypisanych w tablicy 'sentences'. Biblioteka 'numpy' potrzebna jest nam by odseparować liczby przecinkami. Usuwamy tez z embeddings niepotrzebne znaki nowych linii.

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
import numpy as np

#Our sentences we like to encode
sentences = [
  'Olej silnikowy syntetyczny Mobil Super 3000 X1 1 l 5W-40',
  'Olej mineralny Lotos Turdus SHPD 5 l 15W-40',
  'Olej syntetyczny Motul 8100 X-cess 4 l 5W-40',
  'Olej mineralny Fuchs SILKOLENE V-TWIN 20W-50 1 l 20W-50',
  'Olej Lotos Semisyntetic 10W-40 - 4l'
    ]

#Sentences are encoded by calling model.encode()
sentence_embeddings = model.encode(sentences)

#Open file to save embeddings to
file = open("result.txt", "w")

#Print the embeddings
i = 1
#Print the embeddings 
for sentence, embedding in zip(sentences, sentence_embeddings):
    embedding_string = np.array2string(embedding, separator=',')
    file.write("Sentence: "+str(i)+" "+sentence+", Embedding: "+embedding_string.replace("\n",""))
    file.write("\n")
    i += 1

file.close()

Czas oczekiwania na rezultat po pierwszym uruchomieniu skrypty jest znaczący. Jednak po załadowaniu programu do pamięci obliczenia wykonywane są błyskawicznie. Rezutatem będzie plik z podobną zawartością:

Sentence: 1 Olej silnikowy syntetyczny Mobil Super 3000 X1 1 l 5W-40, Embedding: [-1.08720742e-01, .. 7.43340403e-02]
Sentence: 2 Olej mineralny Lotos Turdus SHPD 5 l 15W-40, Embedding: [-1.02391213e-01, .. 9.84341502e-02]
Sentence: 3 Olej syntetyczny Motul 8100 X-cess 4 l 5W-40, Embedding: [-9.69333425e-02, .. 1.13238908e-01]
Sentence: 4 Olej mineralny Fuchs SILKOLENE V-TWIN 20W-50 1 l 20W-50, Embedding: [-1.02391213e-01, .. 4.21001157e-03]
Sentence: 5 Olej Lotos Semisyntetic 10W-40 - 4l, Embedding: [-1.10051744e-01, .. 1.13238908e-01]

Model all-MiniLM-L6-v2 jest to model transformatorów sentencji: odwzorowuje zdania i akapity na 384-wymiarową, gęstą przestrzeń wektorową i może być używany do zadań takich jak grupowanie lub wyszukiwanie semantyczne. 

Obsługa polskiego języka

Jeśli chcesz obsłużyć polski język, zmodyfikuj odpowiednio kod programu (zmieniamy model który będzie używany dla obliczeń). Masz co najmniej dwa modele do wyboru dla SBERT. Pierwszy to model sbert-base-cased-pl - dedykowany dla języka polskiego. Drugi to paraphrase-multilingual-MiniLM-L12-v2 który obsługuje 50 języków, w tym język polski. Na stronie każdego z modeli możesz wykonać test i sprawdzić jak model radzi sobie z porównywaniem fraz:

Jeśli zatem zdecydujesz się na model sbert-base-cased-pl [choć doskonalszy wydaje się być paraphrase-multilingual-MiniLM-L12-v2] odpowiednio zmodyfikuj kod:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer('Voicelab/sbert-base-cased-pl')
embeddings = model.encode(["Głębokie uczenie maszynowe jest sktukiem wdrażania mądrych algorytmów i ich rozwoju."])
print(embeddings)

Umieszczanie wektorów w grafowej bazie danych Neo4j

Nasze ćwiczenie to wyszukanie podobnych produktów. Stwórzmy zatem model grafu który przypomina bazę danych z produktami. Oto nasze dane do testów [zawierające koordynaty wektorów]:

CREATE 
 (Product1:Product {id: 10, name:'Olej silnikowy Mobil', description:'Olej silnikowy syntetyczny Mobil Super 3000 X1 1 l 5W-40', embedding:[-1.00518711e-01, 7.83732533e-02,-6.07584417e-02, 2.62948498e-02,  1.02441497e-02,-3.92582305e-02,-1.08559313e-03, 9.70471203e-02, -7.43817911e-02,-5.23323379e-02, 5.75069413e-02, 2.56688055e-02,  3.63609567e-03,-2.13459991e-02, 3.70947202e-03, 1.16154186e-01,  1.09887719e-02,-2.87637673e-02, 4.21673612e-04,-9.46842192e-04,  7.08748028e-02,-6.07425161e-02,-1.54285673e-02,-4.26631272e-02, -9.34705324e-03, 1.86110241e-03, 7.50003234e-02, 2.98095644e-02, -1.55168225e-03,-1.04741625e-01, 1.95945464e-02, 6.20150305e-02,  1.38450377e-02, 3.17219831e-02, 2.80016661e-02,-3.86305414e-02, -3.93328397e-03,-6.59378245e-02, 6.98407963e-02,-6.81411326e-02,  1.81292463e-02,-4.99604158e-02, 2.58553680e-02,-4.56414893e-02, -2.69985832e-02,-3.69359303e-04,-5.80680706e-02, 6.48506209e-02,  5.36201075e-02, 8.22404027e-03,-1.10696536e-02,-6.86668903e-02, -7.17395497e-03,-2.78344116e-04,-3.37900743e-02,-6.74825013e-02,  4.75082360e-02, 3.21692936e-02, 2.74225362e-02,-4.06782366e-02,  8.68829936e-02,-3.55161726e-02,-6.88622966e-02,-2.31930576e-02,  2.74343975e-02,-1.19768623e-02, 2.53448039e-02,-5.01740798e-02, -9.72538367e-02, 3.06281410e-02,-4.03661870e-05,-1.20954074e-01, -2.37466525e-02, 2.04297099e-02,-3.91606763e-02, 3.17582935e-02,  9.24546421e-02,-1.18484110e-01, 4.52026092e-02, 4.90750335e-02, -6.51241094e-02,-2.30733608e-03,-6.85900301e-02,-4.86386307e-02,  3.58958170e-02,-2.71811560e-02,-1.07954966e-03, 7.09251985e-02,  1.93229131e-02,-7.09010065e-02,-5.37561402e-02, 1.26901669e-02, -1.07979275e-01, 1.06934374e-02,-2.75116209e-02, 3.16999368e-02,  2.04264689e-02, 2.70585530e-02,-4.72447053e-02, 6.78713694e-02,  5.00701815e-02,-9.39256418e-03, 1.08528532e-01,-2.59491755e-03, -9.01754722e-02,-5.15592508e-02,-3.76313403e-02, 8.28845277e-02, -1.01833597e-01,-6.66824058e-02,-3.73298824e-02,-2.76605450e-02, -6.59010559e-02,-8.98968279e-02, 3.03246677e-02,-1.21979259e-01, -3.16069424e-02, 1.35569107e-02, 4.47557773e-03,-5.29480390e-02,  2.66085491e-02, 1.10796876e-02,-2.56184470e-02,-4.20997962e-02, -5.42599037e-02, 2.88825165e-02, 8.11985577e-04, 1.06931569e-32, -2.65552313e-03, 2.38188077e-04,-8.63343626e-02,-1.08056432e-02,  3.27130556e-02, 3.24465223e-02, 1.48766898e-02,-7.06952019e-03,  4.79633622e-02, 9.95516479e-02, 1.81447100e-02, 5.99055830e-03,  1.82774588e-02,-2.09930819e-02, 6.93930592e-03,-1.10176578e-01,  4.32247631e-02,-4.35184576e-02, 1.14332661e-02,-1.36019457e-02, -8.06521333e-04,-2.46568657e-02, 2.92118862e-02,-7.95141980e-03,  5.90204410e-02,-1.24745974e-02, 3.22989225e-02,-4.52092513e-02,  1.64414961e-02, 6.83386847e-02, 4.49104384e-02,-7.35606626e-02, -6.81550726e-02,-7.21055940e-02, 1.35354130e-02, 2.37604212e-02, -7.88493268e-03,-4.45663333e-02,-5.82755171e-03,-1.14293359e-01, -1.07521815e-02,-2.02431753e-02,-5.62588945e-02, 2.38986444e-02, -4.62710410e-02, 2.94453092e-02,-2.92435009e-02, 9.49494839e-02,  7.37086385e-02, 2.29697283e-02,-6.81368560e-02,-3.69449444e-02, -5.71315773e-02, 2.61026025e-02, 5.24972156e-02, 6.35152161e-02,  3.87518071e-02, 2.97465604e-02, 5.26424050e-02, 6.18990548e-02, -6.71730787e-02, 6.28802786e-03,-4.24989834e-02,-1.13153365e-02,  4.49828897e-03,-2.00489201e-02, 8.01044106e-02,-4.92000766e-02, -5.57412356e-02,-1.01539236e-03, 3.06134932e-02,-7.08076805e-02,  1.27630055e-01, 4.92820665e-02, 5.36597520e-03, 3.85231711e-02, -2.00370066e-02,-1.70718431e-02,-9.45476964e-02, 2.69267522e-02, -6.46870658e-02, 4.88880649e-03, 5.27881905e-02,-1.88898835e-02, -1.67468016e-03, 1.79642942e-02,-1.17345918e-02,-5.61605319e-02,  2.54156869e-02,-6.88944850e-03, 4.56628716e-03,-3.81290130e-02,  7.67011195e-02, 2.52985582e-03,-1.31467609e-02,-1.03478422e-32, -4.35612211e-03, 2.45062876e-02, 3.26850526e-02,-1.59310345e-02, -4.86846734e-03,-1.35962572e-02, 2.41946280e-02, 4.96712103e-02,  5.21194749e-03, 6.61495849e-02, 6.11368790e-02, 1.74671747e-02, -4.30798717e-03,-3.25816590e-03, 4.05099764e-02, 1.09417457e-02,  3.70609909e-02,-9.58729982e-02, 1.11692520e-02,-4.07754965e-02,  7.50603154e-02, 5.56835942e-02,-1.13292355e-02, 5.94908372e-02, -2.55703833e-02, 8.08861479e-03,-4.46670726e-02, 5.82423024e-02, -3.32446471e-02, 6.57999441e-02,-1.55112185e-02,-4.37874421e-02,  1.04847275e-01, 1.34199470e-01, 2.08563525e-02,-6.43639639e-02,  1.36109978e-01, 6.03271425e-02, 6.50368556e-02, 1.72085613e-02, -3.90220471e-02, 5.55946827e-02,-2.05679592e-02, 2.31779162e-02, -5.82030416e-02,-7.34266043e-02, 1.52496193e-02,-7.60891438e-02,  7.09373429e-02,-9.29794163e-02, 2.58276034e-02,-1.16212741e-02,  4.97062206e-02,-2.80842860e-03, 4.23819199e-02,-4.51282114e-02,  9.83177871e-03,-2.22091321e-02,-2.15515797e-03,-8.03702772e-02,  6.96694553e-02, 3.04597970e-02, 9.30503681e-02, 4.51579504e-02,  5.73338345e-02,-6.12171367e-02, 1.19474092e-02,-8.58638510e-02,  7.64097180e-03, 1.13283452e-02,-7.02494383e-02, 6.96626864e-03,  4.27247547e-02,-4.12918031e-02,-2.75523961e-02,-1.38997613e-02, -3.21643837e-02, 8.00612196e-02, 4.36604656e-02,-1.20884953e-02,  7.21400380e-02, 2.59547755e-02,-5.44045046e-02,-1.51299229e-02,  2.56095342e-02,-7.70138279e-02, 4.80391905e-02, 2.94789113e-02,  4.85609211e-02,-5.47125079e-02,-7.37698451e-02, 3.79036157e-03, -4.36144508e-02, 7.95255005e-02,-2.59220097e-02,-3.58477230e-08, -2.94936467e-02, 2.66024768e-02,-4.01468053e-02,-2.67639589e-02,  5.76679707e-02,-1.10844649e-01,-1.66970305e-02,-5.70386946e-02,  9.90091488e-02, 6.15954101e-02, 6.90439567e-02,-8.22200328e-02, -3.83749530e-02, 5.02539799e-02, 3.59111056e-02,-1.05959684e-01, -7.84494132e-02, 5.30417189e-02,-9.32308671e-04,-1.53483190e-02,  6.27451986e-02,-1.23049747e-02, 8.32332298e-02,-2.65757032e-02,  7.84773603e-02, 1.74071087e-04,-6.97854683e-02,-4.41416241e-02,  5.44260256e-02, 3.15923132e-02,-9.59694758e-02, 7.80474246e-02,  3.24384077e-03,-3.72343212e-02, 7.77954012e-02, 2.59789992e-02,  9.86030232e-03, 3.95188183e-02, 1.19461305e-02, 9.13126245e-02,  6.66557178e-02,-5.36486432e-02,-3.46084801e-03, 8.29435699e-03,  2.12389734e-02,-7.04504997e-02,-6.19121082e-02,-4.51749861e-02, -4.05977443e-02, 1.46520864e-02,-4.31394242e-02, 1.42517081e-03, -1.33252880e-02,-7.80597096e-03,-4.31167856e-02,-5.01176305e-02, -9.73214209e-02, 8.26911256e-02,-5.55724055e-02, 3.43842655e-02,  3.74067053e-02, 8.76974966e-03,-2.53117532e-02,-2.13430752e-03]}),
 (Product2:Product {id: 20, name:'Olej silnikowy Lotos', description:'Olej mineralny Lotos Turdus SHPD 5 l 15W-40', embedding:[-1.02391213e-01, 9.84341502e-02,-2.88294931e-03, 4.22779750e-03,  2.08279472e-02,-2.63115857e-02, 1.51553210e-02, 8.43028501e-02, -6.12514392e-02,-3.86724547e-02, 9.42850765e-03,-5.40196449e-02, -8.03706702e-03,-3.78051698e-02,-2.85571590e-02, 4.20225225e-02,  4.03108597e-02,-1.79727208e-02,-3.69504169e-02,-2.04182062e-02,  3.42946723e-02,-1.74200777e-02,-4.38490417e-03,-3.79343256e-02, -4.24383096e-02, 4.17967029e-02, 3.82666104e-02, 4.36859801e-02, -7.72789419e-02,-1.55763373e-01, 3.32619669e-03, 8.95611197e-02,  5.61536581e-04,-8.41356441e-02,-3.40119819e-03,-2.49499269e-02, -6.29241019e-02,-7.54904076e-02, 4.99086222e-03, 4.82042320e-02, -2.96791792e-02,-9.21030566e-02, 2.08530985e-02,-1.40194176e-02, -7.62129873e-02,-6.00264631e-02,-5.52760661e-02, 6.51877224e-02,  9.56842154e-02, 3.80212930e-03,-1.63417272e-02,-5.03686368e-02, -2.59299614e-02, 1.31166829e-02,-3.21567543e-02,-3.05845328e-02, -2.34303586e-02, 4.08887640e-02,-3.55880009e-04,-5.21604940e-02,  8.31295922e-02,-1.10561028e-02,-9.81503278e-02,-1.34134223e-03, -1.63790747e-03,-3.09937801e-02, 4.41974886e-02,-1.73830967e-02, -6.97925240e-02, 2.40396913e-02, 7.97349438e-02, 1.27711436e-02, -1.18284430e-02, 3.48872010e-04,-3.58680412e-02, 9.42102596e-02,  8.50672573e-02,-6.29440024e-02, 3.57803665e-02,-8.53077509e-03, -9.05601978e-02, 1.89650618e-02,-7.18981326e-02,-2.58532576e-02, -1.25265075e-02, 3.14782038e-02,-2.55972007e-03, 6.56590387e-02,  3.15270573e-02, 1.04775270e-02, 1.48473994e-03,-1.43886926e-02, -8.60508606e-02,-1.03559848e-02, 3.19721573e-03, 2.18387656e-02,  9.41346139e-02, 3.98777565e-03,-7.01023340e-02, 5.84227555e-02,  6.54781014e-02, 3.62223350e-02, 8.84517804e-02,-3.60838324e-02, -7.52384961e-02, 1.72120181e-03, 8.35257769e-03, 7.54651576e-02, -2.71548498e-02, 1.11357216e-03,-1.69781167e-02,-2.78127994e-02, -2.26053856e-02,-7.17296004e-02, 4.64030728e-03,-5.51571585e-02, -4.20658104e-02,-6.70414492e-02,-1.00710727e-01,-2.91315783e-02,  4.92466502e-02,-3.78756411e-02,-7.01150671e-02, 2.80837193e-02, -8.60241503e-02,-4.48659621e-03, 1.63882356e-02, 6.55365504e-33,  7.81439710e-03,-3.44779417e-02,-1.08904857e-02,-1.69665404e-02,  3.70871201e-02, 1.95741877e-02,-6.29974231e-02,-3.86431925e-02, -5.74224778e-02, 6.05899505e-02,-1.34202451e-01, 5.39830737e-02, -8.29793215e-02,-2.39997320e-02, 1.55264148e-02,-6.73433915e-02,  3.01068258e-02, 1.85067020e-02,-2.60859765e-02,-1.49636362e-02, -4.06282730e-02, 5.19109517e-02,-6.52192160e-02, 5.83866686e-02, -5.46137383e-03, 6.12674542e-02, 1.85107440e-02,-9.23264101e-02, -2.79158801e-02, 6.89141005e-02, 1.14976041e-01,-9.37429070e-03, -2.77207419e-02,-1.48252090e-02,-1.73104294e-02,-8.30758587e-02, -1.38607938e-02,-2.46868450e-02, 1.44690955e-02,-1.49900317e-01,  6.79352432e-02, 6.43393248e-02, 2.58999802e-02, 1.23566702e-01, -5.08697294e-02, 3.37683894e-02,-1.68431904e-02, 8.37655067e-02,  7.93431476e-02, 2.05401182e-02,-5.65765500e-02, 3.35199609e-02, -1.57305766e-02, 4.58490215e-02,-2.39499938e-03, 2.66307779e-02,  1.39992256e-02,-7.26479804e-03, 4.04066965e-03, 3.75572294e-02,  5.95862232e-02, 1.47540882e-01, 6.46287203e-02,-1.59117114e-02, -6.09734133e-02,-2.89948424e-03,-1.28113087e-02,-6.58504218e-02,  3.16136703e-02,-2.12557800e-02,-7.13332789e-04, 3.43581382e-03,  1.20869339e-01, 6.53625205e-02, 5.09060957e-02,-1.82599239e-02,  8.45983475e-02,-4.67039272e-02,-7.19470158e-02, 3.39677860e-03, -3.23453508e-02,-4.99319583e-02,-3.65237519e-02,-5.34863137e-02,  3.91712599e-02, 2.88606659e-02,-1.05549973e-02,-9.36401263e-03,  6.26532659e-02, 5.01923375e-02,-3.59753217e-03,-5.43884784e-02, -4.53752093e-03,-4.64048088e-02,-5.01494445e-02,-6.97165422e-33,  3.46322618e-02,-4.23818082e-02, 7.18804002e-02, 6.12171330e-02,  4.05678488e-02, 2.53465436e-02,-5.66492863e-02, 3.04063410e-02,  1.00444118e-02, 5.78830242e-02, 9.25105885e-02, 7.01678917e-03,  4.68255132e-02,-7.39197955e-02, 6.90847039e-02, 5.69393188e-02,  3.85834165e-02,-1.86099876e-02,-4.59524319e-02,-3.11062951e-02, -9.34493393e-02, 4.33663465e-02,-4.46114037e-03, 3.68894376e-02, -1.55881392e-02, 4.64448612e-03,-2.48763580e-02,-6.86390176e-02, -1.19487807e-01, 8.60023797e-02, 4.47356626e-02, 2.10246886e-03, -1.99878998e-02, 1.23409465e-01,-6.83388039e-02,-4.35136147e-02,  1.35992348e-01, 7.97283463e-03,-1.25974789e-02, 6.17226064e-02,  2.04726891e-03,-2.41351370e-02, 3.11128721e-02, 4.33912836e-02, -1.30430907e-01,-7.03678131e-02,-4.63993400e-02,-6.52344078e-02,  2.55415011e-02,-1.42186051e-02, 1.19977124e-01, 5.87988794e-02,  1.83726232e-02, 2.71603167e-02, 6.13589883e-02, 1.07057467e-02, -5.32461442e-02,-1.32795991e-02,-1.13175794e-01, 2.02570893e-02,  5.64556830e-02, 3.21475044e-02,-1.38411939e-03, 1.99929774e-02,  7.81544372e-02, 4.57439423e-02,-6.53867349e-02, 1.70875434e-02, -1.00570610e-02, 7.57877482e-04,-4.23427187e-02,-4.43182066e-02,  3.77317332e-02, 4.43243496e-02, 6.09585233e-02,-3.73206101e-02, -2.90622227e-02, 2.22811475e-02,-6.29349053e-03, 2.77296342e-02,  1.91277359e-02,-6.01377673e-02,-9.84775834e-05, 3.62249278e-03,  3.72692454e-03,-5.37763610e-02, 3.66687290e-02, 2.45691296e-02,  5.44482879e-02, 5.97306304e-02,-1.69992112e-02, 3.61412689e-02, -4.12109420e-02, 8.24962780e-02, 4.33343761e-02,-2.70146625e-08, -1.32180024e-02, 1.98870022e-02, 2.89547220e-02, 3.35580413e-03,  1.65044386e-02,-1.08514622e-01, 6.09160028e-02, 4.04461473e-02,  1.51200555e-02, 7.98048526e-02, 3.48482467e-02, 1.79595742e-02,  1.21775074e-02,-3.80075313e-02, 4.89348508e-02,-3.94750834e-02,  3.85574927e-03, 8.05296749e-02,-1.89576787e-03,-6.85441270e-02,  8.18487704e-02,-4.42759469e-02, 6.80390596e-02, 1.15739582e-02,  8.53161514e-03, 1.08393300e-02, 8.21596105e-03, 8.08778033e-03,  6.75877407e-02, 3.24690677e-02,-1.70076452e-03, 2.77309623e-02, -5.94147071e-02,-3.18521224e-02, 2.48327130e-03, 1.97028387e-02, -8.38168412e-02,-7.06472341e-03,-7.07878768e-02, 1.01972289e-01, -4.12608832e-02,-3.06944847e-02,-1.92790721e-02, 2.48094629e-02, -1.89838633e-02,-6.77408231e-03,-1.79244000e-02, 4.67508985e-03, -1.81803536e-02,-3.75888683e-02,-8.91088471e-02, 3.26763466e-02,  4.46646325e-02, 3.45785241e-03,-3.92086059e-02,-2.19848994e-02, -2.44255718e-02, 7.34364763e-02,-6.43792078e-02, 1.27954083e-03,  3.60487625e-02, 1.65839996e-02, 2.14110166e-02,-1.41998492e-02]}),
 (Product3:Product {id: 30, name:'Olej syntetyczny Motul', description:'Olej syntetyczny Motul 8100 X-cess 4 l 5W-40', embedding: [-9.69333425e-02, 1.13238908e-01,-5.41882552e-02,-1.47148594e-02, -1.78210248e-05,-1.06981527e-02, 3.93207446e-02, 1.10014975e-01, -2.35344674e-02,-7.79179558e-02, 3.11603155e-02,-1.03884544e-02,  5.89110404e-02, 1.56545732e-02,-3.66219431e-02, 4.36666757e-02, -5.78569770e-02,-4.02624048e-02,-1.22177843e-02,-1.78918596e-02,  2.83161066e-02,-3.81127298e-02, 1.76038332e-02,-8.03873986e-02, -8.69495794e-03, 1.69784073e-02, 3.44315991e-02, 5.48449717e-02,  7.77034322e-04,-1.47648126e-01, 4.77618650e-02, 6.90097883e-02,  1.89423915e-02,-2.73573231e-02, 3.35739786e-03,-5.38767576e-02,  2.66261883e-02,-8.81034434e-02, 2.14634035e-02, 3.87222543e-02, -3.34023982e-02,-8.48310739e-02, 3.36083211e-02,-1.36371329e-02,  6.62444145e-05,-7.57879205e-03,-4.72302921e-02, 2.84873378e-02,  7.62733817e-03, 2.40481067e-02,-1.78791713e-02,-7.86508434e-03, -4.00334522e-02, 1.71710700e-02,-3.86569984e-02,-1.06052965e-01,  2.38974728e-02, 6.64225444e-02,-1.51468990e-02,-3.07629425e-02,  5.59586957e-02, 2.51328908e-02,-6.89193979e-02, 1.69127490e-02, -4.13787775e-02,-3.61208022e-02,-1.81749463e-02,-4.29152846e-02, -9.53135118e-02, 2.52914950e-02,-5.56929689e-03,-6.50806949e-02, -1.09108686e-02, 9.13750939e-03,-2.93394085e-02, 1.79926101e-02,  1.12366162e-01,-5.98663986e-02, 3.65429558e-02,-2.54362971e-02,  5.62878186e-03,-4.71574283e-04,-1.11156091e-01, 4.29653237e-03,  2.00911257e-02,-4.56251390e-03,-4.61769365e-02, 5.09354286e-02,  6.62080199e-02,-4.58758995e-02,-5.94903156e-02,-3.66868973e-02, -1.24533407e-01, 8.39148124e-04,-6.09103497e-03, 4.81294692e-02,  1.27459794e-01,-6.39458150e-02,-4.75202985e-02, 9.21408087e-02,  1.23241749e-02,-2.35283375e-02, 7.16611519e-02, 4.15647402e-02, -1.09116353e-01,-5.06440178e-02, 3.88717987e-02, 1.12366751e-01, -1.26759484e-01,-9.35820192e-02,-1.90949887e-02,-1.15993042e-02, -7.11901113e-02,-8.48485157e-02, 4.17712666e-02,-1.16709717e-01, -3.18061970e-02, 5.81344217e-03,-6.13498082e-03,-5.07751070e-02, -2.12269723e-02,-1.93342846e-02,-4.55569401e-02, 7.58565438e-05, -6.44260198e-02, 4.24618423e-02, 4.36077751e-02, 8.02726064e-33, -3.26133030e-03, 3.75687219e-02,-5.16163297e-02,-3.26508805e-02,  1.37820896e-02, 2.45278841e-03, 1.77199654e-02, 8.25802982e-03,  1.00581232e-03, 8.07838663e-02,-3.73447165e-02, 1.49511090e-02, -1.61087606e-02,-3.85394990e-02, 4.07524779e-02,-8.43066052e-02,  2.26234049e-02, 6.40961993e-03,-6.50758073e-02, 2.80843191e-02,  2.50102803e-02, 1.20375631e-03, 2.67286524e-02, 1.78726986e-02,  9.59845260e-02, 6.08501919e-02, 5.81061095e-02,-5.70271537e-02, -2.10445374e-02, 5.08406349e-02, 6.28937781e-02, 2.09454112e-02, -9.18247774e-02,-5.57393432e-02,-8.73102061e-03,-9.39702522e-03, -5.20476289e-02,-4.67833504e-02, 2.66121700e-02,-8.70517865e-02,  2.28641406e-02, 5.83555130e-03,-7.14685256e-03, 2.07965951e-02, -7.85540137e-03, 4.47837338e-02,-3.24996300e-02, 6.25001788e-02,  1.27158433e-01, 1.80550944e-02,-4.28837389e-02, 2.58856243e-03, -1.41491681e-01, 3.43155935e-02, 2.31699869e-02, 1.07882656e-02, -1.95998531e-02, 3.79714556e-02,-5.55598969e-03, 5.24858572e-02, -4.37391400e-02, 4.70260754e-02,-5.32480590e-02,-1.19728722e-01,  3.48682888e-03,-4.46605608e-02, 2.05824096e-02,-1.17879592e-01, -3.16297971e-02, 3.25309532e-03,-2.68241335e-02,-1.12476379e-01,  1.32702798e-01, 4.49316390e-02, 6.87115863e-02, 3.03897858e-02,  9.63298138e-03, 2.93111317e-02, 1.44854207e-02, 3.97813432e-02, -2.93500051e-02,-7.91706704e-03, 1.07528958e-02,-7.04617351e-02,  7.65103102e-02, 2.31938437e-02,-2.33478677e-02,-1.63057297e-02,  1.29143577e-02, 5.02234921e-02, 6.13730820e-03,-7.10604899e-03,  7.18071125e-03,-3.12391873e-02,-6.43989071e-02,-8.22604702e-33, -2.45185681e-02, 8.00163113e-03, 6.81499392e-02, 6.70708045e-02,  1.09249046e-02,-2.59674285e-02,-1.14434566e-02, 2.31220368e-02, -2.64846068e-02, 8.65681320e-02, 8.36501345e-02,-3.64328511e-02,  2.96878889e-02, 6.43704785e-03, 2.06467174e-02, 6.11821748e-03,  2.68185548e-02,-6.00313656e-02,-6.77884696e-03,-1.91268567e-02,  4.49338406e-02, 7.69823566e-02, 2.97449343e-02,-1.87796708e-02, -1.46460917e-03,-1.90175492e-02,-1.95683669e-02, 8.74421373e-03, -5.17029501e-02, 2.06947196e-02,-4.03391682e-02,-4.83278409e-02,  2.10831258e-02, 1.36770740e-01, 1.49577465e-02,-8.85958821e-02,  1.31250411e-01, 1.06275797e-01,-9.95165552e-04, 3.85817252e-02,  1.46935983e-02, 4.17078808e-02, 3.50231654e-03, 7.79358819e-02, -1.54514576e-03,-6.49777800e-02,-4.97244298e-02,-5.98573200e-02,  5.99939488e-02,-1.80478971e-02, 8.84095877e-02,-2.50976812e-03,  3.31995822e-02,-7.05066789e-03, 1.04785562e-02,-8.92468076e-03, -4.28540446e-02,-2.67509017e-02,-1.14703821e-02, 1.18907141e-02,  7.19893277e-02, 4.63901162e-02, 6.35153204e-02, 7.57773221e-02,  8.95853415e-02,-5.63003570e-02,-1.56179341e-02,-1.39099117e-02,  1.01326481e-02,-4.78641242e-02,-6.63177222e-02,-8.51104036e-02,  6.88934401e-02, 1.33936005e-02, 1.15549499e-02,-2.50666831e-02, -5.05545512e-02, 2.32792255e-02, 7.73756113e-03,-3.12857633e-03,  4.65683825e-02, 2.62322780e-02, 2.23238319e-02,-1.30486768e-02,  1.17981946e-03,-9.99913458e-03, 2.06301399e-02,-6.29478414e-03,  8.64571109e-02,-6.27003144e-03,-3.00276205e-02, 8.74128491e-02, -1.72015950e-02, 6.09363019e-02, 4.36091237e-02,-3.09615338e-08, -6.03825115e-02, 5.09301387e-02,-5.18247001e-02, 3.26746074e-03,  6.91564381e-02,-7.13615417e-02,-5.21249473e-02,-9.42561775e-02,  1.14320755e-01, 4.76157181e-02, 8.73218104e-02,-3.71086933e-02, -3.55132371e-02, 1.86200701e-02, 2.43439525e-02,-4.99101728e-02, -3.28618363e-02, 3.94826867e-02, 1.51289050e-02,-1.43545691e-03,  8.35818723e-02,-1.56329777e-02, 7.74404258e-02, 2.94351857e-02,  4.96946648e-02,-3.37397084e-02,-3.64160389e-02, 3.87935750e-02,  7.08572790e-02, 6.32290402e-03,-6.43904582e-02, 8.94414335e-02, -3.78687540e-03,-4.06005196e-02, 3.16464491e-02,-1.59410276e-02, -4.24551107e-02, 2.68138889e-02,-1.25100007e-02, 1.05145089e-01,  3.86958644e-02,-1.32686719e-02, 9.10285488e-03, 5.76683320e-02,  4.09592912e-02,-3.12513337e-02,-5.36993183e-02,-6.92406371e-02, -5.42279817e-02,-3.31730023e-02,-3.94728296e-02,-9.74219479e-03, -4.84568952e-03,-1.47533379e-02,-8.12096372e-02,-2.24111453e-02, -6.77678660e-02, 8.51081312e-02,-7.10792542e-02, 7.71074044e-03, -1.85519699e-02,-9.94707923e-03,-1.13678705e-02, 1.79306627e-03]}),
 (Product4:Product {id: 40, name:'Olej mineralny Fuchs', description:'Olej mineralny Fuchs SILKOLENE V-TWIN 20W-50 1 l 20W-50', embedding: [-1.21412769e-01, 6.91079199e-02, 1.97982583e-02, 5.29839545e-02,  4.15662192e-02, 8.30342714e-03, 2.32998710e-02, 5.86347617e-02, -8.11378807e-02,-5.49916103e-02, 5.31343855e-02,-5.45542128e-03, -3.20015848e-02, 4.58601154e-02, 5.46512939e-03, 9.49926898e-02,  1.03927252e-03, 1.53958173e-02,-5.53421788e-02, 4.04540710e-02,  2.80933212e-02,-7.29751736e-02, 2.45682616e-02,-4.44973819e-02, -1.81921187e-03, 1.28639312e-02, 1.12921663e-03, 6.92821294e-02,  2.14927830e-02,-7.77543038e-02, 3.79120409e-02, 2.35965382e-02, -7.38046542e-02, 5.17689027e-02,-3.91267687e-02,-9.77831185e-02, -2.57324744e-02,-7.45202377e-02, 2.62815069e-04, 4.76399399e-02, -5.60128987e-02,-7.67687261e-02, 1.87152496e-03,-3.13783810e-02, -4.74752970e-02,-5.29118441e-02, 6.92046387e-03, 5.33883460e-02,  6.29608929e-02, 6.16525374e-02, 1.46426978e-02,-5.06797880e-02,  3.98873445e-03, 4.41377610e-02, 1.85276067e-03, 1.72712884e-04,  6.55775145e-03, 5.59366792e-02,-3.54060754e-02,-2.05535721e-02,  9.06132013e-02,-5.87822590e-03,-6.69047236e-02,-6.05129600e-02, -3.46115604e-02, 6.56413194e-03, 1.11490227e-02,-2.92292628e-02, -4.03410494e-02,-3.82191576e-02,-4.19501308e-03,-5.49297072e-02,  8.78628995e-03, 4.39091921e-02, 8.93929391e-04, 6.87494799e-02,  9.05781835e-02,-4.06394415e-02, 5.37576936e-02, 6.11709729e-02, -8.74608681e-02,-8.07882696e-02,-1.09607382e-02, 5.19410670e-02,  3.73528413e-02,-1.00102182e-03, 3.23091820e-02, 6.66232780e-02,  2.02444177e-02,-5.20867854e-03,-3.84213179e-02, 1.34425079e-02, -1.09778620e-01, 3.02899629e-03, 2.34577507e-02, 5.49065769e-02,  2.74504349e-02, 9.84180048e-02,-2.11022645e-02, 5.48197068e-02, -2.46721786e-03,-2.09576208e-02, 5.91436885e-02,-8.51389989e-02, -1.20271854e-01,-1.79016907e-02,-2.92973071e-02, 1.08949952e-01, -8.36666115e-03,-9.23239514e-02,-3.07897348e-02, 4.89417277e-03,  3.46206203e-02,-1.76618751e-02,-3.91570963e-02,-7.96370730e-02,  1.86261837e-03, 2.12700870e-02, 6.53775856e-02, 5.29312808e-03,  5.97054064e-02, 2.84832474e-02,-1.94220729e-02, 5.48526570e-02, -1.55340448e-01,-7.39267915e-02,-2.87736813e-03, 5.78180157e-33, -1.49224503e-02, 6.58959597e-02, 2.83579025e-02, 2.36198585e-02, -2.63656974e-02, 2.32852250e-02,-6.84307814e-02,-6.92081824e-02, -7.62845799e-02, 5.73079288e-03,-2.61227544e-02, 5.65985590e-02, -5.66516295e-02, 3.14729959e-02,-6.00257814e-02,-1.14300117e-01,  9.14539695e-02,-2.08525988e-03, 2.81627700e-02,-3.40876020e-02, -9.25671682e-03, 2.47234683e-02, 7.07867695e-03, 3.95416655e-02, -1.18997293e-02, 1.95843093e-02, 2.26196889e-02,-1.58555303e-02, -4.18812223e-02, 5.08013666e-02, 8.06700885e-02,-2.93811969e-02,  2.63162935e-03, 2.52585243e-02,-5.93284667e-02,-1.57551765e-02, -9.11508203e-02,-6.17131814e-02, 1.83213525e-03,-1.13091148e-01,  3.03960349e-02, 7.46527016e-02, 4.94980104e-02, 1.13799490e-01, -5.75116910e-02, 1.92744900e-02,-4.17181104e-02, 9.07363370e-02,  9.44680870e-02,-3.33910100e-02,-4.92592230e-02, 2.60352716e-02, -3.95091958e-02, 7.29255006e-02,-2.15646289e-02,-5.80778765e-03,  3.51159344e-03,-4.72442955e-02,-3.72797996e-02, 1.64993331e-02,  2.83153523e-02, 6.90086633e-02,-3.19133699e-02,-3.06641012e-02,  3.60896178e-02, 1.46706682e-02,-1.58463998e-04,-2.24927329e-02, -5.74015863e-02,-1.33424588e-02,-2.86464877e-02, 3.34504247e-02,  1.03740610e-01, 3.45044695e-02, 6.52016923e-02, 2.01499742e-02,  5.08830734e-02,-7.22524822e-02,-3.77085805e-02,-3.73063944e-02, -8.97398368e-02,-2.69615352e-02, 7.68678961e-03,-5.87136038e-02, -8.80296230e-02,-4.65976931e-02,-6.20941259e-02, 2.03895271e-02,  6.88279495e-02, 1.32055497e-02,-1.09673925e-02,-1.21668383e-01,  2.45930199e-02, 1.48009183e-03,-5.04300967e-02,-5.63161160e-33, -4.68702391e-02,-7.89979659e-03,-3.60698719e-03, 7.86466599e-02,  1.03190400e-01, 3.84667665e-02, 1.57614816e-02, 3.14077996e-02,  3.17498017e-03, 6.11181259e-02, 1.52214751e-01,-5.32775819e-02, -4.23474703e-03,-1.41765457e-03, 5.20010618e-03, 1.36032268e-01,  5.62401228e-02,-9.87703353e-02, 4.49427031e-02,-2.86608171e-02, -1.77344661e-02, 8.15683454e-02, 2.19459157e-03, 4.47555706e-02, -3.24964672e-02, 5.47584370e-02,-9.40615963e-03,-7.25904405e-02, -7.64585882e-02, 1.34721622e-01, 2.98266876e-02, 2.24859286e-02,  8.99490491e-02, 9.36020985e-02,-8.97975452e-03,-2.42387187e-02,  1.03838272e-01,-1.58163365e-02, 2.27144025e-02, 4.16008709e-03,  1.30698187e-02,-5.08249365e-02, 5.70762251e-03, 1.94951557e-02, -8.12816173e-02,-2.98125669e-02,-5.26443198e-02,-4.01224568e-02,  3.79788987e-02,-1.09235477e-02, 5.49702086e-02, 5.67352735e-02,  4.02390677e-03,-4.68863957e-02,-2.52087861e-02,-3.60320718e-03, -5.61090633e-02, 1.58303306e-02,-4.03841734e-02, 4.34810575e-03,  4.13003862e-02, 2.94058062e-02, 2.99268458e-02, 1.60025898e-02, -1.33722397e-02, 5.23741320e-02,-5.12324981e-02,-6.59095682e-03,  4.10279147e-02,-3.54135260e-02, 1.35507574e-02, 7.54622966e-02,  6.47796541e-02, 1.39116670e-03, 1.21376542e-02,-7.58301914e-02,  5.47475442e-02, 2.40817275e-02,-1.89265124e-02, 7.99458753e-03,  4.05043736e-02,-2.61504408e-02,-1.31623633e-02, 2.96520256e-03,  4.24525030e-02,-1.60750318e-02,-2.30905842e-02, 2.53492352e-02,  2.68567652e-02,-6.89415261e-03,-4.78148758e-02, 3.89654972e-02, -9.69664603e-02, 6.83121160e-02,-9.11109801e-03,-3.04781409e-08, -2.00688336e-02, 4.40093204e-02,-4.19790633e-02,-5.88866621e-02, -2.48747854e-03,-4.05119583e-02, 2.46356986e-02,-2.57533081e-02, -1.85885280e-02, 4.73718420e-02,-8.15574639e-03,-4.60552843e-03,  4.41373549e-02,-2.85908002e-02, 1.16876420e-02,-8.68869722e-02, -3.32423300e-02, 9.64967087e-02,-2.87963240e-03,-8.26648474e-02,  3.56345363e-02, 6.33361703e-03, 7.19798133e-02,-8.18124879e-03, -1.57681722e-02,-1.97877325e-02,-3.73822078e-02, 4.70324187e-03,  8.22147005e-04, 1.96201485e-02,-2.59069614e-02, 4.65940423e-02, -7.07834885e-02, 1.70223396e-02,-1.30944084e-02, 1.79069471e-02, -9.63962004e-02,-4.69693877e-02,-7.77598917e-02, 1.07852906e-01,  4.45314460e-02, 1.90809346e-03, 1.20763006e-02, 4.34108227e-02,  6.53020516e-02,-8.73219743e-02, 2.27691233e-02,-3.64814177e-02, -4.64827679e-02, 1.07353544e-02, 4.44691405e-02, 4.43716440e-03,  2.47538816e-02,-8.52020085e-03,-9.77847502e-02, 1.07299015e-02, -7.62660801e-02, 7.07893968e-02,-7.85076022e-02,-4.39588726e-02, -1.31247900e-02,-8.28090981e-02, 7.89999962e-02,-3.47475782e-02]}),
 (Product5:Product {id: 50, name:'Olej półsyntetyczny Lotos', description:'Olej Lotos Semisyntetic 10W-40 - 4l', embedding: [-1.04741909e-01, 1.50006443e-01,-4.57439423e-02,-5.21379197e-03,  4.21001157e-03,-1.36229233e-03,-2.37911958e-02, 1.06428057e-01, -6.14437982e-02,-9.81839970e-02, 1.39270080e-02, 1.92863755e-02, -1.46815665e-02, 2.76558734e-02, 4.38106917e-02, 7.32963756e-02,  1.74757000e-02,-2.17236336e-02,-7.95548484e-02, 1.56752951e-02,  3.76433358e-02,-2.95702647e-02, 9.62190423e-03,-3.16885822e-02, -1.41035719e-03, 4.13832255e-03, 1.05824441e-01, 4.95308265e-02,  3.37875844e-03,-1.06440976e-01,-3.75934206e-02, 4.90235612e-02, -4.30239327e-02, 2.56448966e-02,-3.85451429e-02,-8.93163085e-02, -5.19212475e-03,-5.41510023e-02, 3.28205302e-02,-1.03858886e-02,  2.34138835e-02,-8.51683989e-02, 6.19678050e-02,-2.66223978e-02, -5.01122437e-02,-3.28846350e-02,-5.38991652e-02, 3.67337540e-02,  8.17060769e-02,-4.66484353e-02, 3.63009125e-02,-1.87982824e-02, -4.38198820e-03, 3.45643871e-02,-1.16740419e-02,-1.49816414e-02, -1.92276129e-04, 5.80202453e-02,-3.17137502e-02,-1.66104510e-02,  6.49509281e-02,-2.22852826e-02,-8.41237754e-02, 1.49603281e-03, -4.93484847e-02, 2.16647927e-02,-9.31147393e-03,-7.90107157e-03, -6.70358017e-02,-4.62571569e-02, 4.53925766e-02,-7.11700916e-02,  7.05384789e-03,-4.24975716e-03, 8.66047980e-04, 1.22162197e-02,  8.05753022e-02,-5.76863103e-02, 6.80637136e-02,-6.02401048e-02, -1.48980431e-02,-4.44653146e-02,-9.11806747e-02,-1.64886471e-02, -1.53928082e-02,-8.53825593e-04, 4.75078709e-02, 1.99103970e-02,  4.71686833e-02, 3.36178695e-03,-3.79902273e-02,-1.74620822e-02, -7.24885911e-02,-3.23199257e-02, 1.42892720e-02, 7.02607259e-02,  1.00541063e-01,-7.61900470e-03,-7.44319931e-02, 6.11090362e-02,  4.57909331e-02,-1.21087534e-03, 6.43911660e-02,-5.37767112e-02, -4.31688093e-02, 1.36231526e-03,-9.97638609e-03, 1.11215301e-01, -8.81313160e-02,-8.20093602e-02, 5.75802289e-03, 1.04475226e-02, -2.70205494e-02,-1.46025922e-02,-4.35437495e-03,-1.26694679e-01, -4.54345457e-02,-5.77466637e-02,-5.84395044e-02,-2.75655482e-02, -3.44924293e-02,-3.16681750e-02,-4.19555530e-02, 1.51521517e-02, -5.18783964e-02, 8.36994033e-03,-3.01116891e-03, 2.16286865e-33,  3.07440441e-02,-2.09503341e-02,-2.85062008e-02,-4.19178866e-02, -1.80082966e-03, 2.66598277e-02,-4.34304178e-02,-1.88559722e-02, -3.86553071e-02, 1.26202768e-02,-2.95579061e-02, 2.96282931e-03, -8.90901759e-02,-3.78535897e-03, 4.59232479e-02,-1.27383694e-01,  2.13388745e-02, 1.35699045e-02,-2.45330017e-02,-3.26824225e-02, -1.49309738e-02, 7.29412772e-03,-3.67584266e-02, 2.81754695e-02,  2.17320565e-02, 4.68607731e-02, 7.39691332e-02,-4.98235486e-02,  1.62514765e-02, 6.55020699e-02, 5.89006580e-02, 3.67081985e-02, -8.32042769e-02,-3.05589922e-02, 2.64879670e-02,-4.39348295e-02, -4.71735932e-02,-1.47625366e-02, 5.01497798e-02,-1.20943323e-01,  9.63698700e-03, 7.35084116e-02,-4.10403088e-02, 4.19753455e-02, -2.35111546e-02, 5.78841474e-03, 1.49406968e-02, 1.12347484e-01,  7.45432377e-02, 5.90948351e-02,-8.92046466e-02,-1.20330718e-03,  1.95043569e-03, 1.23390943e-01, 1.63656399e-02,-2.85343081e-03,  2.56498363e-02, 3.79357114e-03, 4.21761610e-02, 3.75725403e-02, -1.42904874e-02, 1.27282247e-01,-3.13240550e-02,-1.34913269e-02, -2.68616527e-02, 3.44563462e-02, 1.05116628e-02,-1.02867611e-01, -5.65426126e-02,-4.93315198e-02, 5.14351763e-02,-4.69884463e-02,  1.28012031e-01, 3.20498385e-02, 8.31501111e-02, 2.90600173e-02,  6.45222813e-02,-1.02498940e-04,-1.91723164e-02,-1.95246246e-02,  1.47387031e-02, 3.75930779e-03, 2.44989935e-02,-4.60026786e-02,  5.07142581e-03, 2.16807332e-02,-3.91294062e-02,-1.75521728e-02, -4.82276827e-02, 4.44148779e-02, 8.60818326e-02,-2.89866682e-02,  2.17188764e-02,-1.42779462e-02,-2.71504354e-02,-3.01207883e-33,  2.73498073e-02,-5.36137912e-03, 5.85175976e-02, 3.46002690e-02,  3.88216749e-02,-4.62224055e-03,-3.87631059e-02, 4.29339260e-02,  5.45844585e-02, 1.00352570e-01, 1.16605625e-01, 2.89448467e-03,  5.63779958e-02,-4.59482558e-02, 4.19750959e-02,-3.28544527e-02, -8.47548805e-03,-5.73022626e-02,-4.44855914e-03,-3.43466294e-03,  7.22772405e-02, 6.23161271e-02,-3.41822533e-03,-1.98878888e-02, -1.92203687e-03,-4.11320329e-02,-6.29749522e-02, 4.40101661e-02, -9.98628512e-02, 7.27491826e-02, 4.46995683e-02,-3.42045128e-02,  1.96322296e-02, 1.24717772e-01,-1.80637930e-02,-1.18780784e-01,  1.61273822e-01, 3.62868458e-02,-9.52563249e-04,-4.05949503e-02, -4.02969122e-02,-1.73092224e-02,-2.19033994e-02,-1.86951729e-04, -7.63458610e-02,-8.81489739e-03,-5.48960492e-02,-8.25509802e-02,  8.14047307e-02,-6.72642961e-02, 5.88634349e-02, 5.97557472e-03,  3.07193175e-02, 3.42583433e-02, 3.00683677e-02,-3.95319015e-02, -2.78939847e-02, 4.71014045e-02,-1.07890137e-01,-1.68329347e-02,  1.21721979e-02,-1.52550647e-02, 1.19127102e-01,-3.12140919e-02,  5.07538058e-02,-2.64606010e-02,-5.04930615e-02,-1.30784437e-02,  8.98968894e-03,-5.09475693e-02,-3.32865156e-02,-4.58662286e-02,  5.77810891e-02,-2.12479453e-03, 5.47879115e-02,-3.18538435e-02, -2.77819373e-02,-1.06247831e-02, 9.61670373e-03, 2.97410972e-02, -1.39411353e-02,-5.85334264e-02,-3.86346765e-02,-2.23112945e-02, -5.84275322e-03,-8.19579512e-02, 1.49052441e-02,-1.27641996e-02,  1.28989648e-02, 3.63070779e-02,-2.26875711e-02, 5.32389283e-02, -2.51222961e-03, 8.46713856e-02,-2.51667388e-03,-2.23364562e-08, -2.52981577e-02, 2.37767063e-02, 1.07160667e-02,-1.19441263e-02,  1.93306524e-02,-9.89647806e-02, 6.39432669e-02, 2.36527249e-02,  8.82955268e-02, 4.40173671e-02, 7.35379830e-02,-4.56686392e-02, -6.06620349e-02,-4.10624705e-02, 5.16193993e-02,-1.11762047e-01, -5.37841320e-02, 1.58284940e-02, 4.31458047e-03,-8.30706302e-03,  5.54586276e-02,-5.54111227e-02, 1.01726957e-01, 3.65853263e-03,  9.51547101e-02, 3.19588929e-02, 2.43270975e-02, 2.51252372e-02,  3.55115831e-02, 3.07781212e-02,-9.24641266e-03, 4.27618101e-02, -4.97926362e-02, 5.03900554e-03, 9.29908454e-03, 8.50938819e-03, -8.99468958e-02, 6.09362014e-02, 6.65243855e-03, 1.04824699e-01,  5.65971509e-02,-1.37022026e-02,-2.44181938e-02, 8.34960267e-02,  4.61355634e-02,-6.55191997e-03, 8.10179580e-03, 3.33424541e-03, -4.03118730e-02,-4.93939929e-02,-4.68061231e-02, 4.14556563e-02, -1.52240647e-02,-2.90322695e-02,-1.21728122e-01,-3.02309766e-02, -4.77562621e-02, 6.91248626e-02,-4.05166559e-02, 5.97947016e-02,  5.76052032e-02, 3.98122072e-02,-9.57746245e-03, 6.52599633e-02]}),

 (Category1:Category {id: 1010, name:'Oleje syntetyczne'}),
 (Category2:Category {id: 1020, name:'Oleje mineralne'}),
 (Category3:Category {id: 1020, name:'Oleje półsyntetyczne'}),
 
 (Brand1:Brand {id: 3010, name:'Mobil'}),
 (Brand2:Brand {id: 3020, name:'Lotos'}),
 (Brand3:Brand {id: 3030, name:'Motul'}),
 (Brand4:Brand {id: 3040, name:'Fuchs'}),
 
 (Product1)-[:OF_TYPE]->(Category1),
 (Product2)-[:OF_TYPE]->(Category2),
 (Product3)-[:OF_TYPE]->(Category1),
 (Product4)-[:OF_TYPE]->(Category1),
 (Product5)-[:OF_TYPE]->(Category3),
 
 (Product1)-[:BRAND]->(Brand1),
 (Product2)-[:BRAND]->(Brand2),
 (Product3)-[:BRAND]->(Brand3),
 (Product4)-[:BRAND]->(Brand4),
(Product5)-[:BRAND]->(Brand2);

Jeśli teraz wykonamy polecenie call db.schema.visualization zobaczymy model:

Wizualizacja naszych danych testowych:

Indeksy wektorowe w Neo4j

Neo4j używa biblioteki Apache Lucene do tworzenia indeksów i obsługi przeszukiwania wektórów. 

Tworzenie indeksu wektorów

Za pomocą polecenia CREATE VECTOR INDEX można tworzyć indeksy wektorowe . Indeksowi można nadać unikalną nazwę podczas tworzenia (lub uzyskać wygenerowaną), która służy do odwoływania się do konkretnego indeksu podczas wykonywania zapytania lub usuwania indeksu.

Nazwa indeksu musi być unikalna zarówno wśród indeksów, jak i ograniczeń ("constrains") bazy Neo4j.

Indeks wektorowy to indeks o pojedynczej etykiecie i jednej właściwości dla węzłów. Indeks wektorowy musi być skonfigurowany zarówno z wymiarem wektora ( INTEGER między 1 i 2048 włącznie ), jak i metodą podobieństwa między dwoma wektorami (STRING - wielkość liter nie jest uwzględniana). Jeśli chcesz dowiedzieć się więcej na temat tworzenia indeksów wektorowych, wejdź na stronę Neo4j .

Tworzymy zatem indeks dla właściwości 'embedding' węzła 'Product'. Weź pod uwagę że nazwę indeksu indentyfikatory nie otaczają cudzysłowy pojedyńcze ale backtick (`). Nasze embeddings będą mieścić się w 384 wymiarowej przestrzeni zatem konfigurujemy vector.dimensions jako 384:

CREATE VECTOR INDEX `product-embeddings`
FOR (n: Product) ON (n.embedding)
OPTIONS {indexConfig: {
 `vector.dimensions`: 384,
 `vector.similarity_function`: 'cosine'
}}

Indeks możesz utworzyć przed załadowaniem danych jak i po tym kroku.

Sprawdzanie utworzonych indeksów dla wektorów

SHOW VECTOR INDEXES YIELD name, type, labelsOrTypes, properties, options

Kasowanie indeksu

DROP INDEX `product-embeddings`

Szukanie podobieństwa między opisami produktów

Mamy dane w bazie, mamy indeks. Jak zatem wyszukać podobne produkty? Ponieważ wyszukiwanie wektorowe polega na znalezieniu podobnych wektorów jakie ma nasza informacja referencyjna, potrzebujemy wektor dla frazy która służy jako parametr wyszukiwania. Jeśli szukamy wśród naszych węzłów 'olej syntetyczny 5W' - musimy zakodować ten tekst (przekształcić na format numeryczny, obliczyć wektor). "Embedding" tej frazy, podajemy jako parametr wyszukiwania:

CALL db.index.vector.queryNodes('product-embeddings', 10, [-1.10051744e-01, .. 4.63797748e-02]
)
YIELD node AS similarAbstract, score
MATCH(similarAbstract)-->(c:Category)
RETURN similarAbstract.name As product, similarAbstract.description AS description, c.name AS category, score 

Cały, prawdziwy "embedding" zawiera mnóstwo liczb dlatego nie został on umieszczony w kodzie powyżej. Możesz użyć tego samego skryptu Python co powyżej by go uzyskać.

Rezultat naszego wyszukiwania:

"Score" (liczba dziesiętna): reprezentuje wynik podobieństwa między wektorem zapytania a wektorem powiązanym ze zwróconym węzłem. Wynik określa ilościowo stopień podobieństwa zapytania do zwróconych węzłów, często w skali od 0 do 1.

Dalsze informacje o tworzeniu embeddings i ich wykorzystywaniu

Informacje które znalazły się powyżej szybko pozwolą Ci zapoznać się z użyciem wektórów do odnajdywania powiązanej informacji. Przeczytaj jednak akapity poniżej by dowiedzieć się więcej na ten temat.

Długość fraz do porównania

Modele transformatorów, takie jak BERT / RoBERTa / DistilBERT itp., ich czas działania i wymagania dotyczące pamięci rosną kwadratowo wraz z długością wejściową. Ogranicza to transformatory do obsługi tekstów o określonej długości. Wspólną wartością BERT & Co. jest 512 fragmentów słów [tokenów], co odpowiada około 300-400 słowom (w języku angielskim). Dłuższe teksty są obcinane do pierwszych x fragmentów słów. Domyślnie podane metody wykorzystują limit 128 fragmentów słów, dłuższe dane wejściowe zostaną obcięte. Możesz uzyskać informacje na temat maksymalnej długości sekwencji obsługiwanej przez dany model i ustawić maksymalną długość sekwencji dla modelu wykonując polecenia:

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')

print("Max Sequence Length:", model.max_seq_length)

#Change the length to 200
model.max_seq_length = 200

print("Max Sequence Length:", model.max_seq_length)

Jeśli z ciekawości chcesz sprawdzić jak np. Open AI dzieli zdania i słowa na tokeny, wejdź na tę stronę i wpisz słowo lub zdanie.

Porównywanie i wyszukiwanie [symetryczne i asymetryczne]

Wector search jest najczęściej używany do porównywania fraz; do znajdywania fraz podobnych względem wzorcowej wśród większego zbioru. Np klient ogląda właśnie produkt, wiemy jaki jest opis produktu i używamy go by znaleźć podobne opisy produktów i wyświetlić niżej jako rekomendowane produkty. Nazywa się to symetrycznym wyszukiwaniem semantycznym; zapytanie i wpisy w przeszukiwanym zbiorze mają mniej więcej tę samą długość i tę samą ilość treści. Mamy tutaj 'similarity embeddings '

W przypadku asymetrycznego wyszukiwania semantycznego zwykle masz krótkie zapytanie (np. pytanie lub kilka słów kluczowych) i chcesz znaleźć dłuższy akapit odpowiadający na zapytanie. Przykładem może być zapytanie takie jak „Co to jest Python”, a następnie znajdujesz akapit „Python to interpretowany język programowania wysokiego poziomu i ogólnego przeznaczenia. Filozofia projektowania Pythona…” Mamy tutaj 'search embeddings '

Bardzo ważne jest, aby wybrać odpowiedni model do rodzaju zadania.

Odpowiednie modele do symetrycznego wyszukiwania semantycznego: wstępnie wytrenowane modele osadzania zdań

Odpowiednie modele do asymetrycznego wyszukiwania semantycznego: wstępnie wytrenowane modele MS MARCO

Przykładowy skrypt Python ze strony SBERT demonstrujący semantic search:

"""
This is a simple application for sentence embeddings: semantic search

We have a corpus with various sentences. Then, for a given query sentence,
we want to find the most similar sentence in this corpus.

This script outputs for various queries the top 5 most similar sentences in the corpus.
"""
from sentence_transformers import SentenceTransformer, util
import torch

embedder = SentenceTransformer('all-MiniLM-L6-v2')

# Corpus with example sentences
corpus = ['A man is eating food.',
          'A man is eating a piece of bread.',
          'The girl is carrying a baby.',
          'A man is riding a horse.',
          'A woman is playing violin.',
          'Two men pushed carts through the woods.',
          'A man is riding a white horse on an enclosed ground.',
          'A monkey is playing drums.',
          'A cheetah is running behind its prey.'
          ]
corpus_embeddings = embedder.encode(corpus, convert_to_tensor=True)

# Query sentences:
queries = ['A man is eating pasta.', 'Someone in a gorilla costume is playing a set of drums.', 'A cheetah chases prey on across a field.']


# Find the closest 5 sentences of the corpus for each query sentence based on cosine similarity
top_k = min(5, len(corpus))
for query in queries:
    query_embedding = embedder.encode(query, convert_to_tensor=True)

    # We use cosine-similarity and torch.topk to find the highest 5 scores
    cos_scores = util.cos_sim(query_embedding, corpus_embeddings)[0]
    top_results = torch.topk(cos_scores, k=top_k)

    print("\n\n======================\n\n")
    print("Query:", query)
    print("\nTop 5 most similar sentences in corpus:")

    for score, idx in zip(top_results[0], top_results[1]):
        print(corpus[idx], "(Score: {:.4f})".format(score))

    """
    # Alternatively, we can also use util.semantic_search to perform cosine similarty + topk
    hits = util.semantic_search(query_embedding, corpus_embeddings, top_k=5)
    hits = hits[0]      #Get the hits for the first query
    for hit in hits:
        print(corpus[hit['corpus_id']], "(Score: {:.4f})".format(hit['score']))
    """