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:
- utworzysz instancję AlloyDB i wczytasz dane z publicznego zbioru danych o patentach,
- włączysz w AlloyDB rozszerzenia pgvector i modelu generatywnej AI,
- wygenerujesz wektory dystrybucyjne na podstawie statystyk,
- przeprowadzisz w czasie rzeczywistym wyszukiwanie podobieństwa cosinusowego tekstu wyszukiwanego przez użytkownika,
- wdrożysz rozwiązanie w bezserwerowych funkcjach w Cloud Functions.
Ten diagram przedstawia przepływ danych i etapy implementacji.

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 wyboru projektu wybierz lub utwórz projekt Google Cloud .
- 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 .
- 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.

- 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
- 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:
gcloud config set project <YOUR_PROJECT_ID>
- 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.
- W konsoli Google Cloud otwórz stronę AlloyDB.
- Wybierz nowo utworzony klaster i kliknij instancję.
- W menu nawigacyjnym AlloyDB kliknij AlloyDB Studio. Zaloguj się przy użyciu danych logowania.
- Otwórz nową kartę, klikając ikonę Nowa karta po prawej stronie.
- Skopiuj do edytora instrukcję zapytania
insertze wspomnianego powyżej skryptuinsert_into_patents_data.sql. Aby szybko zademonstrować ten przypadek użycia, możesz skopiować 50–100 instrukcji insert. - 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:

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:
- Tekst wyszukiwany przez użytkownika to: „Nowy model uczenia maszynowego związany z przetwarzaniem języka naturalnego”.
- Konwertujemy go na wektory dystrybucyjne w metodzie embedding() za pomocą modelu: gemini-embedding-001.
- „<=>” oznacza użycie metody odległości COSINE SIMILARITY.
- Wynik metody wektorów dystrybucyjnych konwertujemy na typ wektorowy, 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 przenieść tę aplikację do internetu? Wykonaj te czynności:
- 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).
- 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:

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:

- 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:

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

- 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.
- Rozwiń POKAŻ USTAWIENIA SKALOWANIA i upewnij się, że konfiguracja jest ustawiona dokładnie tak:

- Kliknij UTWÓRZ. To oprogramowanie sprzęgające powinno być teraz widoczne w ustawieniach ruchu wychodzącego.
- Wybierz nowo utworzone oprogramowanie sprzęgające.
- 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:

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:

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:
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.