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

1. Przegląd

W różnych branżach wyszukiwanie patentów jest kluczowym narzędziem do zrozumienia sytuacji konkurencyjnej, identyfikowania potencjalnych możliwości licencjonowania lub przejęcia oraz unikania naruszania istniejących patentów.

Wyszukiwanie patentów jest rozległe i złożone. Przeszukiwanie niezliczonych abstraktów technicznych w celu znalezienia odpowiednich innowacji jest trudnym zadaniem. Tradycyjne wyszukiwania oparte na słowach kluczowych są często niedokładne i czasochłonne. Abstrakty są długie i techniczne, co utrudnia szybkie zrozumienie głównej idei. W rezultacie badacze mogą przeoczyć kluczowe patenty lub tracić czas na nieistotne wyniki.

Sekret tej rewolucji tkwi w wyszukiwaniu wektorowym. Zamiast polegać na prostym dopasowaniu słów kluczowych, wyszukiwanie wektorowe przekształca tekst w reprezentacje numeryczne (wektory dystrybucyjne). Dzięki temu możemy wyszukiwać na podstawie znaczenia zapytania, a nie tylko użytych słów. W świecie wyszukiwania literatury jest to przełom. Wyobraź sobie, że znajdujesz patent na „noszony na ciele monitor tętna”, nawet jeśli w dokumencie nie użyto dokładnie tej frazy.

Cel

W tym ćwiczeniu pokażemy, jak przyspieszyć, ułatwić i zwiększyć precyzję wyszukiwania patentów dzięki wykorzystaniu AlloyDB, rozszerzenia pgvector oraz wbudowanych funkcji Gemini 1.5 Pro, wektorów dystrybucyjnych i wyszukiwania wektorowego.

Co utworzysz

W ramach tego laboratorium:

  1. utworzysz instancję AlloyDB i wczytasz dane z publicznego zbioru danych o patentach,
  2. włączysz w AlloyDB rozszerzenia pgvector i modelu generatywnej AI,
  3. wygenerujesz wektory dystrybucyjne na podstawie statystyk,
  4. przeprowadzisz w czasie rzeczywistym wyszukiwanie podobieństwa cosinusowego tekstu wyszukiwanego przez użytkownika,
  5. wdrożysz rozwiązanie w bezserwerowych funkcjach w Cloud Functions.

Ten diagram przedstawia przepływ danych i etapy implementacji.

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 wyboru projektu wybierz lub utwórz projekt Google Cloud .
  2. Sprawdź, czy w projekcie w chmurze włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie są włączone płatności .
  3. Będziesz używać Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud, które jest wstępnie załadowane narzędziem bq. Kliknij Aktywuj Cloud Shell na górze konsoli Google Cloud.

Obraz przycisku aktywowania Cloud Shell

  1. Po połączeniu z Cloud Shell możesz sprawdzić, czy uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu, używając tego polecenia:
gcloud auth list
  1. Aby potwierdzić, że 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 użycie konsoli. W tym celu wyszukaj każdy produkt lub kliknij ten link.

Więcej informacji o poleceniach gcloud i ich użyciu znajdziesz w dokumentacji.

3. Przygotuj bazę danych AlloyDB

Utwórz klaster, instancję i tabelę AlloyDB, do których wczytasz zbiór danych o patentach.

Utwórz obiekty AlloyDB

Utwórz klaster i instancję z identyfikatorem klastra "patent-cluster", hasłem "alloydb", zgodnością z PostgreSQL 15 i regionem "us-central1", a także siecią ustawioną na "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

Tabelę możesz utworzyć za pomocą instrukcji DDL poniżej w AlloyDB Studio:

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 i wyszukiwanie wektorów dystrybucyjnych. Rozszerzenie google_ml_integration udostępnia funkcje, których możesz używać do uzyskiwania dostępu do punktów końcowych prognozowania Vertex AI w celu uzyskiwania prognoz w SQL. Aby włączyć te rozszerzenia, uruchom te instrukcje DDL:

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

Przyznaj uprawnienia

Uruchom poniższą instrukcję, aby przyznać uprawnienia do wykonywania funkcji „embedding”:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Przyznaj kontu usługi AlloyDB rolę Użytkownik Vertex AI

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”. Wartość PROJECT_NUMBER będzie zawierać numer Twojego projektu.

Dostęp możesz też przyznać 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ę wektorową do przechowywania wektorów dystrybucyjnych

Aby dodać do utworzonej tabeli pole abstract_embeddings, uruchom ten kod DDL: Ta kolumna będzie umożliwiać przechowywanie wartości wektorowych tekstu:

ALTER TABLE patents_data ADD column abstract_embeddings vector(3072);

4. Wczytywanie danych o patentach do bazy danych

Jako zbioru danych użyjemy publicznych zbiorów danych Patenty Google w BigQuery. Do uruchamiania zapytań użyjemy AlloyDB Studio. Repozytorium alloydb-pgvector zawiera skrypt insert_into_patents_data.sql, który uruchomimy, aby wczytać dane o patentach.

  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ę przy użyciu danych logowania.
  4. Otwórz nową kartę, klikając ikonę Nowa karta po prawej stronie.
  5. Skopiuj do edytora instrukcję zapytania insert ze wspomnianego powyżej skryptu insert_into_patents_data.sql. Aby szybko zademonstrować 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 na podstawie danych o patentach

Najpierw przetestujmy funkcję wektorów dystrybucyjnych, uruchamiając to przykładowe zapytanie:

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

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

25a1d7ef0e49e91e.png

Zaktualizuj pole wektorowe abstract_embeddings

Aby zaktualizować abstrakty patentów w tabeli o odpowiednie wektory dystrybucyjne, uruchom ten kod DML:

UPDATE patents_data set abstract_embeddings = embedding( 'gemini-embedding-001', abstract);

6. Wykonywanie wyszukiwania wektorowego

Teraz, gdy tabela, dane i wektory dystrybucyjne są gotowe, przeprowadźmy w czasie rzeczywistym wyszukiwanie wektorowe tekstu wyszukiwanego przez użytkownika. Możesz to przetestować, uruchamiając to zapytanie:

SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('gemini-embedding-001', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;

W tym zapytaniu:

  1. Tekst wyszukiwany przez użytkownika to: „Nowy model uczenia maszynowego związany z przetwarzaniem języka naturalnego”.
  2. Konwertujemy go na wektory dystrybucyjne w metodzie embedding() za pomocą modelu: gemini-embedding-001.
  3. „<=>” oznacza użycie metody odległości COSINE SIMILARITY.
  4. Wynik metody wektorów dystrybucyjnych konwertujemy na typ wektorowy, aby był zgodny z wektorami przechowywanymi w bazie danych.
  5. LIMIT 10 oznacza, że wybieramy 10 najbliższych dopasowań tekstu wyszukiwania.

Oto wynik:

8e77af965fc787ae.png

Jak widać w wynikach, dopasowania są dość zbliżone do tekstu wyszukiwania.

7. Przenoszenie aplikacji do internetu

Chcesz przenieść tę aplikację do internetu? Wykonaj te czynności:

  1. Otwórz edytor Cloud Shell i w lewym dolnym rogu (na pasku stanu) edytora kliknij ikonę „Cloud Code – Zaloguj się”. Wybierz bieżący projekt Google Cloud, w którym włączone są płatności, i upewnij się, że jesteś zalogowany w tym samym projekcie w Gemini (w prawym rogu paska stanu).
  2. Kliknij ikonę Cloud Code i poczekaj, aż pojawi się okno Cloud Code. Kliknij Nowa aplikacja, a w wyskakującym okienku Utwórz nową aplikację kliknij Aplikacja Cloud Functions:

a800ee1eb6cb8a5b.png

Na stronie 2/2 wyskakującego okienka Utwórz nową aplikację kliknij Java: Hello World i wpisz nazwę projektu „alloydb-pgvector” w wybranej lokalizacji, a następnie kliknij OK:

5b09446ecf7d4f8d.png

  1. W wyświetlonej strukturze projektu wyszukaj plik pom.xml i zastąp go zawartością pliku z repozytorium. Oprócz kilku innych zależności powinny się w nim znajdować te zależności:

2b3a3cdd75a57711.png

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

Pamiętaj, że musisz zastąpić te wartości rzeczywistymi:

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”, a w tej implementacji zwracamy tylko 1 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('tgemini-embedding-001', '" + 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ą funkcję w Cloud Functions, uruchom w terminalu Cloud Shell to polecenie. 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 funkcji Cloud Run w Google Cloud Run. Wyszukaj nowo utworzoną funkcję i otwórz ją, edytuj konfiguracje i zmień 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 ruchu przychodzącego upewnij się, że wybrana jest opcja „Zezwalaj na cały ruch”.
  2. W ustawieniach ruchu wychodzącego kliknij menu Sieć i wybierz opcję „Dodaj nowe oprogramowanie sprzęgające VPC”, a następnie postępuj zgodnie z instrukcjami w wyskakującym oknie:

8126ec78c343f199.png

  1. Podaj nazwę oprogramowania sprzęgającego VPC i upewnij się, że region jest taki sam jak w przypadku instancji. Pozostaw wartość Sieć domyślną i ustaw Podsieć jako Niestandardowy zakres adresów IP z zakresem adresów IP 10.8.0.0 lub podobnym, który jest dostępny.
  2. Rozwiń POKAŻ USTAWIENIA SKALOWANIA i upewnij się, że konfiguracja jest ustawiona dokładnie tak:

7baf980463a86a5c.png

  1. Kliknij UTWÓRZ. To oprogramowanie sprzęgające powinno być teraz widoczne w ustawieniach ruchu wychodzącego.
  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 punkt końcowy powinien być widoczny w tym 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"}'

Wynik:

da3dcfac7d024031.png

Możesz też przetestować go na liście funkcji w Cloud Functions. Wybierz wdrożoną funkcję i otwórz kartę „TESTOWANIE”. W sekcji Skonfiguruj zdarzenie wyzwalające w polu tekstowym żądania JSON wpisz:

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

Kliknij przycisk PRZETESTUJ FUNKCJĘ. Wynik zobaczysz po prawej stronie:

e21f806d661996ff.png

To wszystko. Wyszukiwanie wektorowe podobieństwa za pomocą modelu wektorów dystrybucyjnych w danych AlloyDB jest bardzo proste.

9. Zwalnianie miejsca

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

  1. W konsoli Google Cloud otwórz stronę Zarządzaj
  2. zasobami.
  3. Z listy 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 wyszukiwania wektorowego. Łącząc możliwości AlloyDB, Vertex AI i wyszukiwania wektorowego, zrobiliśmy ogromny krok naprzód w zakresie ułatwień dostępu, wydajności i prawdziwie semantycznego wyszukiwania literatury.