Informacje o tym ćwiczeniu (w Codelabs)
1. Przegląd
W różnych branżach badania patentowe są kluczowym narzędziem do poznawania konkurencji, identyfikowania potencjalnych możliwości licencjonowania lub przejęcia oraz unikania naruszania istniejących patentów.
Badania patentowe są rozległe i złożone. Przeszukiwanie niezliczonych streszczeń technicznych w celu znalezienia odpowiednich innowacji jest trudnym zadaniem. Tradycyjne wyszukiwanie oparte na słowach kluczowych jest często niedokładne i czasochłonne. Streszczenia są długie i techniczne, co utrudnia szybkie zrozumienie głównej idei. Może to spowodować, że badacze pominą kluczowe patenty lub będą tracić czas na nieistotne wyniki.
Tajemnica tej rewolucji tkwi w wyszukiwaniu wektorowym. Zamiast polegać na prostym dopasowywaniu 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 konkretnych użytych słów. W świecie wyszukiwania literatury to przełom. Wyobraź sobie, że znajdujesz patent na „monitor pracy serca do noszenia”, nawet jeśli w dokumencie nie użyto dokładnie tego wyrażenia.
Cel
W tym laboratorium kodowania pokażemy, jak przyspieszyć, usprawnić i zwiększyć precyzję wyszukiwania patentów dzięki wykorzystaniu AlloyDB, rozszerzenia pgvector oraz wbudowanych funkcji Gemini 1.5 Pro, Embeddings i wyszukiwania wektorowego.
Co utworzysz
W tym module:
- Tworzenie instancji AlloyDB i wczytywanie danych z publicznego zbioru danych Patents
- Włączanie rozszerzeń pgvector i modeli generatywnej AI w AlloyDB
- Generowanie wektorów dystrybucyjnych na podstawie obserwacji
- Przeprowadzanie w czasie rzeczywistym wyszukiwania podobieństwa kosinusowego dla tekstu wyszukiwanego przez użytkownika
- Wdrażanie rozwiązania w bezserwerowych funkcjach Cloud Functions
Poniższy diagram przedstawia przepływ danych i etapy wdrażania.
High level diagram representing the flow of the Patent Search Application with AlloyDB
Wymagania
2. Zanim zaczniesz
Utwórz projekt
- W konsoli Google Cloud na stronie selektora projektów wybierz lub utwórz projekt Google Cloud.
- Sprawdź, czy w projekcie Cloud włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie włączone są płatności .
- 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. U góry konsoli Google Cloud kliknij Aktywuj Cloud Shell.
- Po połączeniu z Cloud Shell sprawdź, czy jesteś już uwierzytelniony i czy projekt jest ustawiony na Twój identyfikator projektu, używając tego polecenia:
gcloud auth list
- Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project
- Jeśli projekt nie jest ustawiony, użyj tego polecenia, aby go ustawić:
gcloud config set project <YOUR_PROJECT_ID>
- Włącz wymagane interfejsy API. Możesz użyć polecenia gcloud w terminalu Cloud Shell:
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 wyszukanie poszczególnych usług w konsoli lub skorzystanie z tego linku.
Informacje o poleceniach gcloud i ich użyciu znajdziesz w dokumentacji.
3. Przygotowywanie bazy danych AlloyDB
Utwórzmy klaster, instancję i tabelę AlloyDB, do których zostanie załadowany zbiór danych patentów.
Tworzenie obiektów AlloyDB
Utwórz klaster i instancję o identyfikatorze klastra „patent-cluster
”, haśle „alloydb
”, zgodne z PostgreSQL 15, w regionie „us-central1
” i z 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łącz rozszerzenia
Do utworzenia 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 możesz używać 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 vector;
CREATE EXTENSION google_ml_integration;
Przyznaj uprawnienia
Aby przyznać uprawnienia do wykonywania funkcji „embedding”, uruchom to polecenie:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
Przyznawanie roli Użytkownik Vertex AI kontu 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ę wektorową do przechowywania dystrybucji.
Uruchom poniższy kod DDL, aby dodać pole abstract_embeddings do utworzonej właśnie tabeli. Ta kolumna będzie przechowywać wartości wektorowe tekstu:
ALTER TABLE patents_data ADD column abstract_embeddings vector(3072);
4. Wczytywanie danych patentowych do bazy danych
Jako zbioru danych użyjemy publicznych zbiorów danych Google Patents w BigQuery. Do uruchamiania zapytań będziemy używać AlloyDB Studio. Repozytorium alloydb-pgvector zawiera skrypt insert_into_patents_data.sql
, który uruchomimy, aby załadować dane patentowe.
- W konsoli Google Cloud otwórz stronę AlloyDB.
- Wybierz nowo utworzony klaster i kliknij instancję.
- W menu nawigacyjnym AlloyDB kliknij AlloyDB Studio. Zaloguj się za pomocą swoich danych logowania.
- Otwórz nową kartę, klikając ikonę Nowa karta po prawej stronie.
- Skopiuj do edytora instrukcję zapytania
insert
ze wspomnianego wyżejinsert_into_patents_data.sql
skryptu. Możesz skopiować 50–100 instrukcji wstawiania, aby szybko zademonstrować ten przypadek użycia. - Kliknij Wykonaj. Wyniki zapytania pojawią się w tabeli Wyniki.
5. Tworzenie wektorów dystrybucyjnych na podstawie danych patentowych
Najpierw przetestujmy funkcję osadzania, uruchamiając to przykładowe zapytanie:
SELECT embedding( 'gemini-embedding-001', 'AlloyDB is a managed, cloud-hosted SQL database service.');
Powinien on zwrócić wektor osadzania, który wygląda jak tablica liczb zmiennoprzecinkowych, dla przykładowego tekstu w zapytaniu. Wygląda to tak:
Zaktualizuj pole wektora abstract_embeddings
Uruchom poniższy język DML, aby zaktualizować streszczenia patentów w tabeli o odpowiednie osadzanie:
UPDATE patents_data set abstract_embeddings = embedding( 'gemini-embedding-001', abstract);
6. Wykonywanie wyszukiwania wektorowego
Gdy tabela, dane i wektory są gotowe, możemy przeprowadzić 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('gemini-embedding-001', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;
W tym zapytaniu
- Tekst wyszukiwania użytkownika to: „A new Natural Language Processing related Machine Learning Model” (Nowy model uczenia maszynowego związany z przetwarzaniem języka naturalnego).
- Przekształcamy go w wektory dystrybucyjne za pomocą metody embedding() i modelu gemini-embedding-001.
- „<=>” oznacza użycie metody odległości COSINE SIMILARITY.
- Wynik metody osadzania przekształcamy w typ wektora, aby był zgodny z wektorami przechowywanymi w bazie danych.
- LIMIT 10 oznacza, że wybieramy 10 najbliższych dopasowań tekstu wyszukiwania.
Oto wynik:
Jak widać w wynikach, dopasowania są dość zbliżone do tekstu wyszukiwania.
7. Przenoszenie aplikacji do internetu
Chcesz udostępnić tę aplikację w internecie? Wykonaj te czynności:
- Otwórz edytor Cloud Shell i w lewym dolnym rogu (na pasku stanu) kliknij ikonę „Cloud Code – zaloguj się”. Wybierz bieżący projekt Google Cloud, w którym włączone są płatności, i sprawdź, czy jesteś zalogowany w tym samym projekcie w Gemini (w prawym rogu paska stanu).
- Kliknij ikonę Cloud Code i poczekaj, aż pojawi się okno Cloud Code. Kliknij Nowa aplikacja, a w wyskakującym okienku Utwórz nową aplikację wybierz Aplikacja Cloud Functions:
Na stronie 2/2 okna Utwórz nową aplikację wybierz Java: Hello World i wpisz nazwę projektu „alloydb-pgvector” w wybranej lokalizacji, a następnie kliknij OK:
- W strukturze projektu wyszukaj plik pom.xml i zastąp go zawartością pliku z repozytorium. Oprócz kilku innych zależności powinna ona mieć te zależności:
- Zastąp plik HelloWorld.java zawartością pliku z repo.
Pamiętaj, że musisz zastąpić poniższe 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”. W tej implementacji zwracamy tylko jedno 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);
}
- 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 Cloud Run Functions w Google. Wyszukaj nowo utworzoną funkcję i otwórz ją, edytuj konfiguracje i zmień te ustawienia:
- Otwórz Ustawienia środowiska wykonawczego, kompilacji, połączeń i zabezpieczeń
- Zwiększ czas oczekiwania do 180 sekund.
- Otwórz kartę POŁĄCZENIA:
- W ustawieniach ruchu przychodzącego upewnij się, że wybrana jest opcja „Zezwalaj na cały ruch”.
- W sekcji Ustawienia wyjścia kliknij menu Sieć i wybierz opcję „Dodaj nowy łącznik VPC”, a następnie postępuj zgodnie z instrukcjami w wyświetlonym oknie:
- Podaj nazwę oprogramowania sprzęgającego VPC i upewnij się, że region jest taki sam jak w przypadku instancji. Pozostaw domyślną wartość Sieć 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.
- Rozwiń POKAŻ USTAWIENIA SKALOWANIA i upewnij się, że konfiguracja jest dokładnie taka:
- Kliknij UTWÓRZ. Ten łącznik powinien być teraz widoczny w ustawieniach ruchu wychodzącego.
- Wybierz nowo utworzony łącznik.
- Wybierz opcję kierowania całego ruchu przez to oprogramowanie sprzęgające z dostępem do 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 to sprawdzić 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:
Możesz też przetestować ją na liście Cloud Functions. Wybierz wdrożoną funkcję i otwórz kartę „TESTOWANIE”. W polu tekstowym sekcji Skonfiguruj zdarzenie aktywujące dla żądania JSON wpisz:
{"search": "A new Natural Language Processing related Machine Learning Model"}
Kliknij przycisk TEST THE FUNCTION (PRZETESTUJ FUNKCJĘ), a wynik zobaczysz po prawej stronie:
Znakomicie. Wykonywanie wyszukiwania wektorowego na podstawie podobieństwa za pomocą modelu wektorów dystrybucyjnych na danych AlloyDB jest bardzo proste.
9. Czyszczenie danych
Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby użyte w tym poście, wykonaj te czynności:
10. Gratulacje
Gratulacje! Udało Ci się przeprowadzić wyszukiwanie podobieństw za pomocą AlloyDB, pgvector i wyszukiwarki wektorowej. Łącząc możliwości AlloyDB, Vertex AI i wyszukiwania wektorowego, zrobiliśmy ogromny krok naprzód w kierunku udostępnienia wyszukiwania literatury w sposób przystępny, wydajny i naprawdę oparty na znaczeniu.