Utwórz aplikację do wyszukiwania patentów za pomocą AlloyDB, wyszukiwania wektorowego i Vertex AI

1. Omówienie

W różnych branżach badania patentowe są kluczowym narzędziem do analizowania konkurencji, identyfikowania potencjalnych możliwości licencjonowania lub przejęcia oraz unikania naruszania istniejących patentów.

Badania patentowe są rozległe i skomplikowane. Przeszukiwanie niezliczonych abstraktów technicznych w celu znalezienia odpowiednich innowacji jest trudnym zadaniem. Tradycyjne wyszukiwanie na podstawie słów kluczowych jest często niedokładne i czasochłonne. Abstrakty są długie i techniczne, co utrudnia szybkie zrozumienie głównej idei. Może to spowodować, że badacze nie znajdą kluczowych patentów lub stracą czas na przeglądanie nieistotnych wyników.

Sekretem tej rewolucji jest wyszukiwanie wektorowe. Zamiast polegać na prostym dopasowaniu słów kluczowych, wyszukiwanie wektorowe przekształca tekst w postaci liczbowej (wektory dystrybucyjne). Dzięki temu możemy przeszukiwać dane na podstawie znaczenia zapytania, a nie tylko konkretnych użytych słów. To przełom w szukaniu informacji o literaturze. Wyobraź sobie, że znajdujesz patent na „urządzenie do pomiaru tętna do noszenia”, nawet jeśli w dokumencie nie ma dokładnego wyrażenia.

Cel

W tym laboratorium kodu postaramy się, aby proces wyszukiwania patentów był szybszy, bardziej intuicyjny i niezwykle dokładny dzięki wykorzystaniu AlloyDB, rozszerzenia pgvector oraz zaimplementowanych funkcji Gemini 1.5 Pro, Embeddings i Vector Search.

Co utworzysz

W ramach tego laboratorium wykonasz te czynności:

  1. Tworzenie instancji AlloyDB i wczytywanie danych z publicznego zbioru danych Patents
  2. Włączanie rozszerzeń pgvector i modeli generatywnej AI w AlloyDB
  3. Generowanie wektorów dystrybucyjnych na podstawie obserwacji
  4. Przeprowadzanie w czasie rzeczywistym wyszukiwania podobieństwa według podobieństwa cosinusowego do tekstu wyszukiwanego przez użytkownika
  5. Wdrażanie rozwiązania w bezserwerowych funkcjach Cloud Functions

Poniższy diagram przedstawia przepływ danych i etapów wdrażania.

8b73c40a0d12e194.png

 High level diagram representing the flow of the Patent Search Application with AlloyDB

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, które jest wstępnie załadowane w bq. 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. Przygotuj bazę danych AlloyDB

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

Tworzenie obiektów AlloyDB

Utwórz klaster i instancję o identyfikatorze klastra „patent-cluster”, hasłem „alloydb”, zgodnym z PostgreSQL 15 i regionem „us-central1”, a także ustawieniami sieci „default”. Ustaw identyfikator instancji na „patent-instance”. Kliknij UTWÓRZ KLASTER. Szczegółowe informacje o tworzeniu klastra znajdziesz pod tym linkiem: https://cloud.google.com/alloydb/docs/cluster-create.

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) ;

Włączanie rozszerzeń

Do tworzenia aplikacji do wyszukiwania patentów użyjemy rozszerzeń pgvector i google_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 prognoz Vertex AI w celu uzyskiwania prognoz w języku SQL. Włącz te rozszerzenia, uruchamiając te DDL:

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

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 IAM przyznaj kontu 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ż przyznać dostęp za pomocą polecenia gcloud:

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"

Zmień tabelę, aby dodać kolumnę wektora do przechowywania elementów embeddingu.

Uruchom poniższy DDL, aby dodać pole abstract_embeddings do utworzonej właśnie tabeli. Ta kolumna umożliwi przechowywanie wartości wektorowych tekstu:

ALTER TABLE patents_data ADD column abstract_embeddings vector(768);

4. 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. Repozytorium alloydb-pgvector zawiera skrypt insert_into_patents_data.sql, który uruchamiamy, aby wczytać 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 wyżej skryptu insert_into_patents_data.sql. Aby szybko wypróbować ten przypadek użycia, możesz skopiować 50–100 instrukcji INSERT.
  6. Kliknij Wykonaj. Wyniki zapytania pojawią się w tabeli Wyniki.

5. Tworzenie wektorów dystrybucyjnych dla danych patentów

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

SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');

Powinien on 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 abstrakcji

Aby zaktualizować w tabeli streszczenia patentów odpowiednimi wektorami osadzania, uruchom DML:

UPDATE patents_data set abstract_embeddings = embedding( 'textembedding-gecko@003', abstract);

6. Wykonywanie wyszukiwania wektorowego

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 literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;

W tym zapytaniu

  1. Tekst wyszukiwania użytkownika: „Nowy model uczenia maszynowego związany z przetwarzaniem języka naturalnego”.
  2. W metodzie embedding() zamieniamy je na wektory w ramach modelu textembedding-gecko@003.
  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.

Oto wynik:

8e77af965fc787ae.png

Jak widać w wynikach, pasujące wyniki są bardzo podobne do tekstu wyszukiwania.

7. Przeniesienie aplikacji do sieci

Czy chcesz opublikować tę aplikację w internecie? Wykonaj te czynności:

  1. Otwórz edytor Cloud Shell i w lewym dolnym rogu (pasek stanu) kliknij ikonę „Cloud Code – Zaloguj się”. Wybierz bieżący projekt Google Cloud z włączonymi płatnościami i sprawdź, czy jesteś zalogowany(-a) w tym samym projekcie w Gemini (w prawym rogu paska stanu).
  2. Kliknij ikonę Cloud Code i poczekaj, aż pojawi się okno Cloud Code. Wybierz Nowa aplikacja, a w wyskakującym okienku Utwórz nową aplikację wybierz aplikację Cloud Functions:

a800ee1eb6cb8a5b.png

Na stronie 2 z 2 w wyskakującym okienku Utwórz nową aplikację wybierz Java: Hello World i wpisz w wybranej lokalizacji nazwę projektu „alloydb-pgvector” i kliknij OK:

5b09446ecf7d4f8d.png

  1. W powstałej strukturze projektu wyszukaj plik pom.xml i zastąp go zawartością z pliku repozytorium. Oprócz kilku innych zależności powinna mieć te:

2b3a3cdd75a57711.png

  1. Zastąp plik HelloWorld.java zawartością z pliku repo.

Pamiętaj, że musisz zastąpić podane niżej wartości swoimi rzeczywistymi wartościami:

String ALLOYDB_DB = "postgres";
String ALLOYDB_USER = "postgres";
String ALLOYDB_PASS = "*****";
String ALLOYDB_INSTANCE_NAME = "projects/<<YOUR_PROJECT_ID>>/locations/us-central1/clusters/<<YOUR_CLUSTER>>/instances/<<YOUR_INSTANCE>>";
//Replace YOUR_PROJECT_ID, YOUR_CLUSTER, YOUR_INSTANCE with your actual values

Pamiętaj, że funkcja oczekuje tekstu wyszukiwania jako parametru wejściowego z kluczem „search” (wyszukiwanie). W tej implementacji zwracamy tylko najbliższe dopasowanie z bazy danych:

// Get the request body as a JSON object.
JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
String searchText = requestJson.get("search").getAsString();

//Sample searchText: "A new Natural Language Processing related Machine Learning Model";
BufferedWriter writer = response.getWriter();
String result = "";
HikariDataSource dataSource = AlloyDbJdbcConnector();

try (Connection connection = dataSource.getConnection()) {
   //Retrieve Vector Search by text (converted to embeddings) using "Cosine Similarity" method
   try (PreparedStatement statement = connection.prepareStatement("SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', '" + searchText + "' )::vector LIMIT 1")) {
     ResultSet resultSet = statement.executeQuery();
     resultSet.next();
     String lit = resultSet.getString("literature");
     result = result + lit + "\n";
     System.out.println("Matching Literature: " + lit);
 }
writer.write("Here is the closest match: " + result);
}
  1. Aby wdrożyć utworzoną właśnie funkcję w Cloud Functions, uruchom to polecenie w terminalu Cloud Shell. Pamiętaj, aby najpierw przejść do odpowiedniego folderu projektu za pomocą tego polecenia:
cd alloydb-pgvector

Następnie uruchom to polecenie:

gcloud functions deploy patent-search --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

WAŻNY KROK:

Po rozpoczęciu wdrażania funkcje powinny być widoczne w konsoli Cloud Run Functions. Wyszukaj nowo utworzoną funkcję i otwórz ją, edytuj konfiguracje i zmodyfikuj te ustawienia:

  1. Otwórz Ustawienia środowiska wykonawczego, kompilacji, połączeń i zabezpieczeń
  2. Zwiększ czas oczekiwania do 180 sekund
  3. Otwórz kartę POŁĄCZENIA:

4e83ec8a339cda08.png

  1. W ustawieniach Ingress sprawdź, czy wybrana jest opcja „Zezwalaj na cały ruch”.
  2. W ustawieniach wyjścia kliknij menu Sieć i wybierz opcję „Dodaj nowy łącznik VPC” i postępuj zgodnie z instrukcjami wyświetlanymi w wyskakującym okienku:

8126ec78c343f199.png

  1. Podaj nazwę oprogramowania sprzęgającego VPC i upewnij się, że region jest taki sam jak w przypadku instancji. Pozostaw wartość sieci jako domyślną, a podsieć ustaw jako niestandardowy zakres adresów IP z zakresem adresów 10.8.0.0 lub podobnym, który jest dostępny.
  2. Rozwiń opcję POKAZ USTAWIENIA SKALOWANIA i upewnij się, że konfiguracja jest ustawiona dokładnie w ten sposób:

7baf980463a8a5c.png

  1. Kliknij UTWÓRZ. Ten łącznik powinien teraz być widoczny w ustawieniach wychodzących.
  2. Wybierz nowo utworzone oprogramowanie sprzęgające
  3. Wybierz opcję kierowania całego ruchu przez to oprogramowanie sprzęgające VPC.

8. Testowanie aplikacji

Po wdrożeniu powinieneś zobaczyć punkt końcowy w takim formacie:

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/patent-search

Możesz go przetestować w terminalu Cloud Shell, uruchamiając to polecenie:

gcloud functions call patent-search --region=us-central1 --gen2 --data '{"search": "A new Natural Language Processing related Machine Learning Model"}'

Efekt:

da3dcfac7d024031.png

Możesz też przetestować funkcję na liście Cloud Functions. Wybierz wdrożony element i otwórz kartę „TESTOWANIE”. W polu tekstowym sekcji Konfigurowanie zdarzenia aktywującego w pliku żądania JSON wpisz:

{"search": "A new Natural Language Processing related Machine Learning Model"}

Kliknij przycisk TESTUJ FUNKCJĘ, a efekt zobaczysz po prawej stronie strony:

e21f806d661996ff.png

Znakomicie. Wyszukiwanie wektorów podobnych jest tak proste, że można je wykonać za pomocą modelu wektorów dystrybucyjnych na danych AlloyDB.

9. 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 Zarządzaj .
  2. na stronie Zasoby.
  3. Na liście projektów wybierz projekt do usunięcia, a potem kliknij Usuń.
  4. W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.

10. Gratulacje

Gratulacje! Udało Ci się przeprowadzić wyszukiwanie podobieństwa za pomocą AlloyDB, pgvector i wyszukiwarki wektorowej. Połączenie możliwości AlloyDB, Vertex AI i wyszukiwarki wektorowej pozwoliło nam zrobić ogromny krok naprzód w czynieniu wyszukiwania literatury dostępnym, wydajnym i naprawdę ukierunkowanym na znaczenie.