RAG z kontrolą jakości dzięki najnowszym funkcjom wyszukiwania wektorowego AlloyDB

1. Omówienie

W różnych branżach wyszukiwanie kontekstowe jest kluczową funkcją, która stanowi sedno aplikacji. Technologia Retrieval Augmented Generation (generowanie rozszerzone przez wyszukiwanie w zapisanych informacjach) od dawna jest kluczowym czynnikiem tej ważnej ewolucji technologii dzięki mechanizmom wyszukiwania opartym na generatywnej AI. Modele generatywne, które mają duże okna kontekstowe i zapewniają imponującą jakość danych wyjściowych, zmieniają oblicze AI. RAG zapewnia systematyczny sposób na wprowadzanie kontekstu do aplikacji i agentów AI, opierając je na uporządkowanych bazach danych lub informacjach z różnych mediów. Te dane kontekstowe są kluczowe dla przejrzystości i dokładności wyników, ale jak bardzo są dokładne? Czy Twoja firma w dużej mierze zależy od dokładności tych dopasowań kontekstowych i ich trafności? Ten projekt przypadnie Ci do gustu.

Tajemnica wyszukiwania wektorów nie polega tylko na ich tworzeniu, ale też na sprawdzaniu, czy dopasowania wektorów są rzeczywiście dobre. Wszyscy znamy to uczucie, gdy wpatrujemy się w listę wyników i zastanawiamy się, czy to w ogóle działa. Przyjrzyjmy się, jak oceniać jakość dopasowań wektorów. „Co się zmieniło w grupie docelowej?” – zapytasz. Wszystko! Przez lata generowanie wspomagane wyszukiwaniem (RAG) wydawało się obiecujące, ale nieosiągalne. W końcu mamy narzędzia do tworzenia aplikacji RAG o wydajności i niezawodności potrzebnych do wykonywania kluczowych zadań.

Mamy już 3 podstawowe informacje:

  1. Co oznacza wyszukiwanie kontekstowe dla Twojego pracownika obsługi klienta i jak to osiągnąć za pomocą wyszukiwarki wektorowej.
  2. Zajęliśmy się też dokładniejszą analizą wyszukiwania wektorowego w zakresie Twoich danych, czyli w samej bazie danych (jeśli nie wiesz, to wszystkie bazy danych Google Cloud obsługują tę funkcję).
  3. Poszerzyliśmy o krok dalej niż reszta świata i pokażemy Ci, jak uzyskać tak lekką funkcję wektorowego wyszukiwania RAG o wysokiej wydajności i jakości dzięki funkcji wektorowego wyszukiwania AlloyDB, która korzysta z indeksu ScaNN.

Jeśli nie znasz eksperymentów podstawowych, średnio zaawansowanych i nieco bardziej zaawansowanych dotyczących RAG, przeczytaj te 3 artykuły tutaj, tutajtutaj w podanej kolejności.

Wyszukiwarka patentów pomaga użytkownikom znaleźć patenty, które są związane kontekstowo z tekstem wyszukiwania. W przeszłości opracowaliśmy już taką wersję. Teraz stworzymy ją z nowymi i zaawansowanymi funkcjami RAG, które umożliwiają kontrolowanie jakości wyszukiwania kontekstowego w ramach tej aplikacji. Zaczynamy.

Ilustracja poniżej przedstawia ogólny przepływ danych w tej aplikacji.~ 1c871099f1fde825.png

Cel

Umożliw użytkownikowi wyszukiwanie patentów na podstawie opisu tekstowego przy użyciu funkcji zapewniających większą wydajność i lepszą jakość oraz możliwość oceny jakości wygenerowanych dopasowań za pomocą najnowszych funkcji RAG w AlloyDB.

Co utworzysz

W ramach tego laboratorium wykonasz te czynności:

  1. Tworzenie instancji AlloyDB i wczytywanie publicznego zbioru danych Patents
  2. Tworzenie indeksu metadanych i indeksu ScaNN
  3. Wdrożenie zaawansowanego wyszukiwania wektorów w AlloyDB za pomocą metody filtrowania wbudowanej w ScaNN
  4. Wdrażanie funkcji Recall eval
  5. Ocenianie odpowiedzi na zapytanie

Wymagania

  • przeglądarka, np. Chrome lub Firefox;
  • projekt Google Cloud z włączonymi płatnościami;

2. Zanim zaczniesz

Utwórz projekt

  1. W konsoli Google Cloud na stronie selektora projektu wybierz lub utwórz projekt Google Cloud.
  2. Sprawdź, czy w projekcie Cloud włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie są włączone płatności .
  3. Użyjesz Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud. Kliknij Aktywuj Cloud Shell u góry konsoli Google Cloud.

Obraz przycisku aktywowania Cloud Shell

  1. Po połączeniu z Cloud Shell sprawdź, czy jesteś już uwierzytelniony i czy projekt jest ustawiony na identyfikator Twojego projektu, używając tego polecenia:
gcloud auth list
  1. Aby sprawdzić, czy polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project
  1. Jeśli projekt nie jest ustawiony, użyj tego polecenia:
gcloud config set project <YOUR_PROJECT_ID>
  1. Włącz wymagane interfejsy API. W terminalu Cloud Shell możesz użyć polecenia gcloud:
gcloud services enable alloydb.googleapis.com compute.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com run.googleapis.com cloudbuild.googleapis.com cloudfunctions.googleapis.com aiplatform.googleapis.com

Alternatywą dla polecenia gcloud jest konsola, w której możesz wyszukać poszczególne usługi lub skorzystać z tego linku.

Informacje o poleceniach i użytkowaniu gcloud znajdziesz w dokumentacji.

3. Konfiguracja bazy danych

W tym module użyjemy bazy danych AlloyDB do przechowywania danych patentowych. Do przechowywania wszystkich zasobów, takich jak bazy danych i logi, używa klastrów. Każdy klaster ma instancję główną, która stanowi punkt dostępu do danych. W tabelach będą się znajdować rzeczywiste dane.

Utwórz klaster, instancję i tabelę AlloyDB, do której zostanie załadowany zbiór danych patentów.

Tworzenie klastra i instancji

  1. Otwórz stronę AlloyDB w konsoli Cloud. Najłatwiej znaleźć większość stron w Cloud Console jest za pomocą paska wyszukiwania w konsoli.
  2. Na tej stronie wybierz UTWÓRZ KLASTER:

f76ff480c8c889aa.png

  1. Zobaczysz ekran podobny do tego poniżej. Utwórz klaster i instancję z tymi wartościami (upewnij się, że wartości są takie same, jeśli klonujesz kod aplikacji z repozytorium):
  • Identyfikator klastra:vector-cluster
  • password: "alloydb"
  • PostgreSQL 15 / najnowsza zalecana wersja
  • Region: "us-central1"
  • Networking: „default

538dba58908162fb.png

  1. Po wybraniu sieci domyślnej zobaczysz ekran podobny do tego poniżej.

Wybierz SKONFIGUROWAĆ POŁĄCZENIE.

7939bbb6802a91bf.png

  1. Następnie wybierz „Użyj automatycznie przydzielonego zakresu adresów IP” i kliknij Dalej. Po sprawdzeniu informacji wybierz UTWÓRZ POŁĄCZENIE. 768ff5210e79676f.png
  2. Po skonfigurowaniu sieci możesz kontynuować tworzenie klastra. Kliknij UTWÓRZ KLASTER, aby zakończyć konfigurowanie klastra, jak pokazano poniżej:

e06623e55195e16e.png

Pamiętaj, aby zmienić identyfikator instancji (który możesz znaleźć w momencie konfigurowania klastra lub instancji) na

vector-instance. Jeśli nie możesz go zmienić, pamiętaj, aby użyć identyfikatora instancji we wszystkich kolejnych odwołaniach.

Pamiętaj, że utworzenie klastra zajmie około 10 minut. Po zakończeniu procesu powinien wyświetlić się ekran z ogólnymi informacjami o kreatorzym utworzonym klastrze.

4. Pozyskiwanie danych

Teraz dodaj tabelę z danymi o sklepie. Przejdź do AlloyDB, wybierz klaster główny, a następnie AlloyDB Studio:

847e35f1bf8a8bd8.png

Możesz musieć poczekać na utworzenie instancji. Gdy to zrobisz, zaloguj się w AlloyDB, używając danych logowania utworzonych podczas tworzenia klastra. Do uwierzytelniania w PostgreSQL użyj tych danych:

  • Nazwa użytkownika: „postgres
  • Baza danych: „postgres
  • Hasło: „alloydb

Gdy uwierzytelnisz się w AlloyDB Studio, polecenia SQL są wpisywane w Edytorze. Możesz dodać większą liczbę okien Edytora, klikając plus po prawej stronie ostatniego okna.

91a86d9469d499c4.png

Polecenia AlloyDB wpisujesz w oknach edytora, korzystając w razie potrzeby z opcji Uruchom, Formatuj i Wyczyść.

Włączanie rozszerzeń

Do tworzenia tej aplikacji użyjemy rozszerzeń pgvectorgoogle_ml_integration. Rozszerzenie pgvector umożliwia przechowywanie wektorów dystrybucyjnych i wyszukiwanie ich. Rozszerzenie google_ml_integration udostępnia funkcje, których używasz do uzyskiwania dostępu do punktów końcowych prognozowania Vertex AI w celu uzyskiwania prognoz w SQL. Włącz te rozszerzenia, uruchamiając te DDL:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;

Jeśli chcesz sprawdzić rozszerzenia włączone w bazie danych, uruchom to polecenie SQL:

select extname, extversion from pg_extension;

Tworzenie tabeli

W AlloyDB Studio możesz utworzyć tabelę za pomocą poniższego polecenia DDL:

CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT, abstract_embeddings vector(768)) ;

Kolumna abstract_embeddings umożliwi przechowywanie wartości wektorowych tekstu.

Przyznaj uprawnienia

Uruchom poniższe polecenie, aby przyznać uprawnienia do wykonywania funkcji „embedding”:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Przypisz rolę Vertex AI USER do konta usługi AlloyDB

W konsoli Google Cloud uprawnień przyznaj konto usługi AlloyDB (które wygląda tak: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) dostęp do roli „Użytkownik Vertex AI”. Zmienna PROJECT_NUMBER będzie zawierać numer Twojego projektu.

Możesz też uruchomić to polecenie w terminalu Cloud Shell:

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

Wczytywanie danych patentowych do bazy danych

Jako zbioru danych użyjemy publicznych zbiorów danych Patents Google w BigQuery. Do wykonywania zapytań użyjemy AlloyDB Studio. Dane pochodzą z pliku insert_scripts.sql i będą wczytywane do niego, aby załadować dane patentowe.

  1. W konsoli Google Cloud otwórz stronę AlloyDB.
  2. Wybierz nowo utworzony klaster i kliknij instancję.
  3. W menu nawigacyjnym AlloyDB kliknij AlloyDB Studio. Zaloguj się, używając swoich danych logowania.
  4. Otwórz nową kartę, klikając ikonę Nowa karta po prawej stronie.
  5. Skopiuj do edytora zapytanie insert ze wspomnianego wcześniej skryptu insert_scripts.sql. Aby szybko wypróbować ten przypadek użycia, możesz skopiować 10–50 instrukcji insert.
  6. Kliknij Wykonaj. Wyniki zapytania pojawią się w tabeli Wyniki.

Uwaga: skrypt wstawiania może zawierać dużo danych. Dzieje się tak, ponieważ skrypty do wstawiania zawierają elementy osadzone. Jeśli masz problem z wczytaniem pliku na GitHubie, kliknij „Wyświetl nieprzetworzone”. Dzięki temu nie będziesz musiał generować (w następnych krokach) większej liczby wbudowanych obiektów (np. maksymalnie 20–25), jeśli korzystasz z konto rozliczeniowego Google Cloud z dodatkiem środków na okres próbny.

5. Tworzenie wektorów dla danych patentowych

Najpierw przetestuj funkcję umieszczania, wykonując tę przykładową kwerendę:

SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');

Powinien zwrócić wektor zagęszczenia, który wygląda jak tablica liczb zmiennoprzecinkowych, dla przykładowego tekstu w zapytaniu. Wygląda to tak:

25a1d7ef0e49e91e.png

Zaktualizuj pole wektora abstract_embeddings

Uruchom podany niżej skrypt DML, aby zaktualizować streszczenia patentów w tabeli odpowiednimi wektorami zastępczymi, tylko jeśli nie wstawiono danych abstract_embeddings w ramach skryptu insert:

UPDATE patents_data set abstract_embeddings = embedding( 'text-embedding-005', abstract);

Jeśli korzystasz z konta rozliczeniowego Google Cloud z dodatkiem środków na okres próbny, możesz mieć problemy z generowaniem większej liczby wbudowanych obiektów (np. maksymalnie 20–25). Dlatego w skryptach do wstawiania danych uwzględniliśmy już te elementy. Jeśli wykonasz krok „Wczytaj dane patentowe do bazy danych”, powinny one być załadowane w Twojej tabeli.

6. Wykonywanie zaawansowanego RAG za pomocą nowych funkcji AlloyDB

Teraz, gdy tabela, dane i wektory są gotowe, wykonaj wyszukiwanie wektorowe w czasie rzeczywistym dla tekstu wyszukiwanego przez użytkownika. Możesz to sprawdzić, uruchamiając to zapytanie:

SELECT id || ' - ' || title as title FROM patents_data ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

W tym zapytaniu

  1. Użytkownik wyszukiwał tekst: „Analiza nastrojów”.
  2. W metodzie embedding() konwertujemy go na wektory w ramach modelu text-embedding-005.
  3. "<=>" oznacza użycie metody odległości podobieństwa cosinusowego.
  4. Przekształcamy wynik metody osadzania w typ wektora, aby był zgodny z wektorami zapisanymi w bazie danych.
  5. LIMIT 10 oznacza, że wybieramy 10 najbardziej pasujących do tekstu wyszukiwania elementów.

AlloyDB podnosi skuteczność wektorowego modelu uczenia się automatycznego na wyższy poziom:

Wprowadziliśmy sporo zmian. Oto 2 z nich, które są przeznaczone dla deweloperów:

  1. Filtrowanie w tekście
  2. Wycofanie oceny

Filtrowanie w tekście

Wcześniej deweloper musiał wykonać zapytanie wyszukiwania wektorowego i zadbać o odfiltrowanie i przywołanie. Optymalizator zapytań AlloyDB podejmuje decyzje dotyczące sposobu wykonywania zapytań z filtrami. Filtrowanie wbudowane to nowa technika optymalizacji zapytań, która umożliwia optymalizatorowi zapytań AlloyDB jednoczesne sprawdzanie warunków filtrowania metadanych i wyszukiwania wektorów, wykorzystując zarówno indeksy wektorów, jak i indeksy kolumn metadanych. Dzięki temu wzrosła skuteczność przywoływania, co pozwala deweloperom korzystać z domyślnych funkcji AlloyDB.

Filtrowanie w tekście jest najlepsze w przypadku średniej selektywności. Podczas wyszukiwania w indeksie wektorowym AlloyDB oblicza tylko odległości wektorów, które pasują do warunków filtrowania metadanych (filtry funkcyjne w zapytaniu są zwykle obsługiwane w klauzuli WHERE). Dzięki temu znacznie poprawia się wydajność tych zapytań, co uzupełnia zalety odfiltrowywania posortowanych danych lub przed ich sortowaniem.

  1. Zainstaluj lub zaktualizuj rozszerzenie pgvector
CREATE EXTENSION IF NOT EXISTS vector WITH VERSION '0.8.0.google-3';

Jeśli rozszerzenie pgvector jest już zainstalowane, zaktualizuj je do wersji 0.8.0.google-3 lub nowszej, aby uzyskać możliwość korzystania z funkcjonalności weryfikatora przywołania.

ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';

Ten krok musisz wykonać tylko wtedy, gdy Twoje rozszerzenie wektorowe ma wersję <0.8.0.google-3>.

Ważna uwaga: jeśli liczba wierszy jest mniejsza niż 100, nie musisz tworzyć indeksu ScaNN, ponieważ nie będzie on potrzebny w przypadku mniejszej liczby wierszy. W takim przypadku pomiń te czynności.

  1. Aby tworzyć indeksy ScaNN, zainstaluj rozszerzenie alloydb_scann.
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. Najpierw uruchom zapytanie wektorowe bez indeksu i bez włączonego filtra w kodzie:
SELECT id || ' - ' || title as title FROM patents_data 
WHERE num_claims >= 15 
ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

Wynik powinien być podobny do tego:

6989de0fc3f0f753.png

  1. Uruchom na nim narzędzie Explain Analyze (bez indeksu ani filtrowania wbudowanego).

908dcf87c7f00ed4.png

Czas wykonywania to 2,4 ms

  1. Utwórzmy zwykły indeks pola num_claims, aby można było według niego filtrować:
CREATE INDEX idx_patents_data_num_claims ON patents_data (num_claims);
  1. Utwórzmy indeks ScaNN dla naszej aplikacji wyszukiwania patentów. Wykonaj te czynności w AlloyDB Studio:
CREATE INDEX patent_index ON patents_data 
USING scann (abstract_embeddings cosine)
WITH (num_leaves=32);

Ważna uwaga: (num_leaves=32) dotyczy naszego całego zbioru danych zawierającego ponad 1000 wierszy. Jeśli liczba wierszy jest mniejsza niż 100, nie musisz tworzyć indeksu, ponieważ nie będzie on potrzebny w przypadku tak małej liczby wierszy.

  1. Ustaw filtrowanie wbudowane na indeksie ScaNN:
SET scann.enable_inline_filtering = on
  1. Teraz uruchom to samo zapytanie z filtrem i wyszukiwaniem wektorowym:
SELECT id || ' - ' || title as title FROM patents_data 
WHERE num_claims >= 15 
ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

aa54cba2b2ada2cb.png

Jak widać, czas wykonania tej samej wyszukiwarki wektorów został znacznie skrócony. Umożliwiło to filtrowanie wbudowane w indeks ScaNN w wyszukiwarce wektorowej.

Teraz sprawdźmy odzyskiwanie danych w przypadku wyszukiwania wektorowego z włączonym ScaNN.

Wycofanie oceny

W przypadku wyszukiwania zbliżonego odwzorowania odwzorowanie to odsetek trafnych instancji wyodrębnionych z wyników wyszukiwania, czyli liczba wyników prawdziwie pozytywnych. Jest to najczęstszy sposób pomiaru jakości wyszukiwania. Jednym ze źródeł utraty przyrostu skuteczności jest różnica między przybliżonym wyszukiwaniem najbliższych sąsiadów (aNN) a wyszukiwaniem najbliższych sąsiadów (kNN). Indeksy wektorowe, takie jak ScaNN firmy AlloyDB, implementują algorytmy sieci neuronowych, co pozwala przyspieszyć wyszukiwanie wektorów w przypadku dużych zbiorów danych, ale w odwrocie wiąże się z niewielkim spadkiem czułości. Teraz AlloyDB umożliwia pomiar tego kompromisu bezpośrednio w bazie danych w przypadku poszczególnych zapytań i zapewnienie jego stabilności w czasie. Aby uzyskać lepsze wyniki i większą wydajność, możesz zaktualizować parametry zapytania i indeksów zgodnie z tymi informacjami.

Jaka jest logika przywołania wyników wyszukiwania?

W kontekście wyszukiwania wektorowego odsyłanie do siebie odnosi się do odsetka wektorów zwracanych przez indeks, które są prawdziwymi najbliższymi sąsiadami. Jeśli na przykład zapytanie o najbliższych sąsiadów zwraca 20 najbliższych sąsiadów, z których 19 to prawdziwi sąsiedzi, to odzyw jest równa 19/20 x 100 = 95%. Przyrost to dane służące do oceny jakości wyszukiwania. Są one definiowane jako odsetek zwróconych wyników, które są obiektywnie najbliższe wektorom zapytań.

Za pomocą funkcji evaluate_query_recall możesz znaleźć odzyskiwanie zapytania wektorowego w indeksie wektorowym dla danej konfiguracji. Ta funkcja umożliwia dostosowanie parametrów w celu uzyskania pożądanych wyników przywołania zapytania wektorowego.

Ważna uwaga:

Jeśli podczas wykonywania tych czynności pojawi się błąd odmowy uprawnień w przypadku indeksu HNSW, pomiń na razie całą sekcję oceny przywołań. Może to być związane z ograniczeniami dostępu, ponieważ w momencie tworzenia tego dokumentu funkcja ta została dopiero wydana.

  1. Ustaw flagę Włącz skanowanie indeksu na indeksie ScaNN i HNSW:
SET scann.enable_indexscan = on
SET hnsw.enable_index_scan = on
  1. Wykonaj to zapytanie w AlloyDB Studio:
SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <=> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 25 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

Funkcja evaluate_query_recall przyjmuje zapytanie jako parametr i zwraca jego wartość przywołania. Jako zapytanie wejściowe funkcji używam tego samego zapytania, którego użyłem do sprawdzenia wydajności. Dodano SCaNN jako metodę indeksowania. Więcej opcji parametrów znajdziesz w dokumentacji.

Współczynnik przyrostowy dla tego zapytania wyszukiwania wektorowego, którego używaliśmy:

c98f38fbe6a0b6c5.png

Widzę, że odsetek przywołań to 70%. Teraz mogę użyć tych informacji, aby zmienić parametry indeksu, metody i parametry zapytania oraz poprawić odwzorowanie w wyszukiwarce wektorów.

7. Testowanie z modyfikowanymi parametrami zapytania i indeksu

Teraz przetestuj zapytanie, modyfikując jego parametry na podstawie otrzymanego odwołania.

  1. Zmieniliśmy liczbę wierszy w zbiorze wyników na 7 (wcześniej było 25), co spowodowało wzrost wartości RECALL do 86%.

c12f7b92b8481ceb.png

Oznacza to, że w czasie rzeczywistym mogę zmieniać liczbę dopasowań, które widzą użytkownicy, aby zwiększyć trafność dopasowań zgodnie z kontekstem wyszukiwania użytkowników.

  1. Spróbujmy jeszcze raz, zmieniając parametry indeksu:

W tym teście użyję funkcji odległości podobieństwa „L2 Distance” zamiast funkcji odległości podobieństwa „Cosine”. Zmienię też limit zapytania na 10, aby sprawdzić, czy jakość wyników wyszukiwania poprawi się nawet przy zwiększeniu liczby zestawów wyników wyszukiwania.

[ZANIM] Zapytanie, które używa funkcji odległości podobieństwa cosinusa:

SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <=> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 10 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

Ważna uwaga: „Skąd wiemy, że to zapytanie używa podobieństwa cosinusowego?” Funkcję odległości można rozpoznać po użyciu operatora <=>, który reprezentuje odległość kosinusową.

Link do Dokumentów z funkcjami wektorowymi wyszukiwania odległości.

Wynik powyższego zapytania:

c62ef8922d6bf0b2.png

Jak widać, odsetek przywołań wynosi 70% bez żadnych zmian w logice indeksu. Pamiętasz indeks ScaNN utworzony w kroku 6 w sekcji „Filtrowanie wbudowane” (patent_index)? Ten sam indeks jest nadal skuteczny w momencie wykonywania powyższego zapytania.

Teraz utwórz indeks za pomocą innego zapytania o funkcję odległości: Odległość L2: <->

drop index patent_index;

CREATE INDEX patent_index_L2 ON patents_data 
USING scann (abstract_embeddings L2)
WITH (num_leaves=32);

W tym celu należy użyć instrukcji drop index.

Teraz mogę wykonać to zapytanie, aby ocenić wskaźnik przywołań po zmianie funkcji wektorowego wyszukiwania.

[PO] Zapytanie, które używa funkcji odległości podobieństwa cosinusa:

SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <-> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 10 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

Wynik powyższego zapytania:

6c163dd08cf4d693.png

Co za zmiana wartości przypomnienia – aż 90%!!!

W indeksie możesz też zmienić inne parametry, np. num_leaves, na podstawie żądanej wartości przywołania i zbioru danych używanego przez aplikację.

8. Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby wykorzystane w tym poście, wykonaj te czynności:

  1. W konsoli Google Cloud otwórz stronę Menedżer zasobów.
  2. Na liście projektów wybierz projekt do usunięcia, a potem kliknij Usuń.
  3. W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.
  4. Możesz też po prostu usunąć klaster AlloyDB (jeśli w momencie konfiguracji nie wybierzesz regionu us-central1, zmień lokalizację w tym hiperlinku), który właśnie utworzyliśmy dla tego projektu. Aby to zrobić, kliknij przycisk USUNĘĆ KLASTR.

9. Gratulacje

Gratulacje! Udało Ci się utworzyć kontekstowe zapytanie do wyszukiwania patentów za pomocą zaawansowanego wyszukiwania wektorowego AlloyDB, aby uzyskać wysoką skuteczność i zapewnienie prawdziwie znaczących wyników. Stworzyłem wielofunkcyjną aplikację agenta z kontrolą jakości, która korzysta z ADK i wszystkich funkcji AlloyDB, o których rozmawialiśmy, aby stworzyć wydajnego i jakościowego agenta do wyszukiwania i analizowania wektorów patentowych. Możesz go zobaczyć tutaj: https://youtu.be/Y9fvVY0yZTY

Jeśli chcesz dowiedzieć się, jak tworzyć tego typu agentów, zapoznaj się z tym codelab.

Zacznij już dziś!