Patentrecherche-App mit AlloyDB, Vektorsuche und Vertex AI erstellen

1. Übersicht

In verschiedenen Branchen ist die Patentrecherche ein wichtiges Instrument, um die Wettbewerbslandschaft zu verstehen, potenzielle Lizenzierungs- oder Akquisitionsmöglichkeiten zu identifizieren und Patentverletzungen zu vermeiden.

Die Patentrecherche ist umfangreich und komplex. Es ist eine entmutigende Aufgabe, unzählige technische Zusammenfassungen zu durchforsten, um relevante Innovationen zu finden. Herkömmliche keywordbasierte Suchanfragen sind oft ungenau und zeitaufwendig. Zusammenfassungen sind lang und technisch, was es schwierig macht, die Kernidee schnell zu erfassen. Das kann dazu führen, dass Forscher wichtige Patente übersehen oder Zeit mit irrelevanten Ergebnissen verschwenden.

Das Geheimnis dieser Revolution liegt in der Vektorsuche. Anstatt sich auf eine einfache Keyword-Abgleichung zu verlassen, wandelt die Vektorsuche Text in numerische Darstellungen (Einbettungen) um. So können wir nicht nur anhand der verwendeten Wörter, sondern auch anhand der Bedeutung der Suchanfrage suchen. In der Welt der Literaturrecherche ist das ein echter Gamechanger. Angenommen, Sie möchten ein Patent für einen „tragbaren Herzfrequenzmesser“ finden, auch wenn dieser Begriff im Dokument nicht genau so verwendet wird.

Ziel

In diesem Codelab arbeiten wir daran, die Suche nach Patenten mithilfe von AlloyDB, der pgvector-Erweiterung und der In-Place-Gemini 1.5 Pro-, Einbettungs- und Vektorsuche schneller, intuitiver und unglaublich präziser zu gestalten.

Aufgaben

In diesem Lab lernen Sie Folgendes:

  1. AlloyDB-Instanz erstellen und Daten aus dem öffentlichen Patent-Dataset laden
  2. pgvector- und generative AI-Modellerweiterungen in AlloyDB aktivieren
  3. Einbettungen aus den Statistiken generieren
  4. Kosinus-Ähnlichkeitssuche in Echtzeit für den Suchtext von Nutzern durchführen
  5. Lösung in serverlosen Cloud Functions bereitstellen

Das folgende Diagramm stellt den Datenfluss und die Schritte bei der Implementierung dar.

8b73c40a0d12e194.png

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

Voraussetzungen

  • Ein Browser, z. B. Chrome oder Firefox
  • Google Cloud-Projekt mit aktivierter Abrechnungsfunktion.

2. Hinweis

Projekt erstellen

  1. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
  2. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist.
  3. Sie verwenden Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird und bq bereits vorinstalliert hat. Klicken Sie oben in der Google Cloud Console auf „Cloud Shell aktivieren“.

Bild der Schaltfläche „Cloud Shell aktivieren“

  1. Nachdem Sie eine Verbindung zu Cloud Shell hergestellt haben, prüfen Sie mit dem folgenden Befehl, ob Sie bereits authentifiziert sind und das Projekt auf Ihre Projekt-ID festgelegt ist:
gcloud auth list
  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt.
gcloud config list project
  1. Wenn Ihr Projekt nicht festgelegt ist, verwenden Sie den folgenden Befehl, um es festzulegen:
gcloud config set project <YOUR_PROJECT_ID>
  1. Aktivieren Sie die erforderlichen APIs. Sie können einen gcloud-Befehl im Cloud Shell-Terminal verwenden:
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

Alternativ können Sie in der Console nach den einzelnen Produkten suchen oder diesen Link verwenden.

Weitere Informationen zu gcloud-Befehlen und deren Verwendung finden Sie in der Dokumentation.

3. AlloyDB-Datenbank vorbereiten

Erstellen Sie einen AlloyDB-Cluster, eine Instanz und eine Tabelle, in die der Patentdatensatz geladen wird.

AlloyDB-Objekte erstellen

Erstellen Sie einen Cluster und eine Instanz mit der Cluster-ID „patent-cluster“, dem Passwort „alloydb“, kompatibel mit PostgreSQL 15 und der Region „us-central1“. Legen Sie „default“ als Netzwerk fest. Legen Sie die Instanz-ID auf „patent-instance“ fest. Klicken Sie auf „CLUSTER ERSTEHEN“. Eine detaillierte Anleitung zum Erstellen eines Clusters finden Sie unter https://cloud.google.com/alloydb/docs/cluster-create.

Tabelle erstellen

Sie können eine Tabelle mit der folgenden DDL-Anweisung in AlloyDB Studio erstellen:

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

Erweiterungen aktivieren

Für die Patentrecherche-App verwenden wir die Erweiterungen „pgvector“ und „google_ml_integration“. Mit der pgvector-Erweiterung können Sie Vektoreinbettungen speichern und darin suchen. Die Erweiterung google_ml_integration bietet Funktionen, mit denen Sie auf Vertex AI-Vorhersageendpunkte zugreifen und Vorhersagen in SQL abrufen können. Aktivieren Sie diese Erweiterungen, indem Sie die folgenden DDLs ausführen:

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

Berechtigung gewähren

Führen Sie die folgende Anweisung aus, um die Ausführung der Funktion „embedding“ zu gewähren:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Dem AlloyDB-Dienstkonto die Rolle „Vertex AI User“ gewähren

Gewähren Sie in der Google Cloud IAM-Konsole dem AlloyDB-Dienstkonto (in diesem Beispiel: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) Zugriff auf die Rolle „Vertex AI-Nutzer“. PROJECT_NUMBER enthält Ihre Projektnummer.

Alternativ können Sie den Zugriff auch mit dem gcloud-Befehl gewähren:

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"

Tabelle ändern, um eine Vektorspalte zum Speichern der Einbettungen hinzuzufügen

Führen Sie die folgende DDL aus, um der gerade erstellten Tabelle das Feld „abstract_embeddings“ hinzuzufügen. In dieser Spalte können die Vektorwerte des Textes gespeichert werden:

ALTER TABLE patents_data ADD column abstract_embeddings vector(768);

4. Patentdaten in die Datenbank laden

Als Datensatz verwenden wir die öffentlichen Datasets von Google Patents in BigQuery. Wir verwenden AlloyDB Studio, um unsere Abfragen auszuführen. Das Repository alloydb-pgvector enthält das Script insert_into_patents_data.sql, das wir zum Laden der Patentdaten ausführen.

  1. Öffnen Sie in der Google Cloud Console die Seite AlloyDB.
  2. Wählen Sie den neu erstellten Cluster aus und klicken Sie auf die Instanz.
  3. Klicken Sie im AlloyDB-Navigationsmenü auf AlloyDB Studio. Melden Sie sich mit Ihren Anmeldedaten an.
  4. Öffnen Sie einen neuen Tab, indem Sie rechts auf das Symbol Neuer Tab klicken.
  5. Kopieren Sie die insert-Abfrage aus dem oben genannten insert_into_patents_data.sql-Script in den Editor. Sie können 50 bis 100 INSERT-Anweisungen kopieren, um eine kurze Demo dieses Anwendungsfalls zu erhalten.
  6. Klicken Sie auf Ausführen. Die Ergebnisse der Abfrage werden in der Tabelle Ergebnisse angezeigt.

5. Einbettungen für Patentdaten erstellen

Testen wir zuerst die Einbettungsfunktion. Führen Sie dazu die folgende Beispielabfrage aus:

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

Dadurch sollte der Einbettungsvektor für den Beispieltext in der Abfrage zurückgegeben werden. Er sieht aus wie ein Array von Gleitkommazahlen. Sie sieht so aus:

25a1d7ef0e49e91e.png

Vektorfeld „abstract_embeddings“ aktualisieren

Führen Sie die folgende DML-Anweisung aus, um die Patentabstrakte in der Tabelle mit den entsprechenden Einbettungen zu aktualisieren:

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

6. Vektorsuche ausführen

Nachdem Tabelle, Daten und Einbettungen bereit sind, führen wir die Echtzeit-Vektorsuche für den Suchtext des Nutzers durch. Sie können dies mit der folgenden Abfrage testen:

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;

In dieser Abfrage

  1. Der Suchbegriff des Nutzers lautet: „Ein neues maschinelles Lernmodell für Natural Language Processing“.
  2. Wir wandeln sie in der Methode „embedding()“ mit dem Modell „textembedding-gecko@003“ in Einbettungen um.
  3. „<=>“ steht für die Verwendung der KOSINUS-ÄHNLICHKEIT-Distanzmethode.
  4. Wir konvertieren das Ergebnis der Einbettungsmethode in den Vektortyp, damit es mit den in der Datenbank gespeicherten Vektoren kompatibel ist.
  5. Mit LIMIT 10 werden die 10 Übereinstimmungen ausgewählt, die dem Suchtext am nächsten kommen.

Das Ergebnis sieht so aus:

8e77af965fc787ae.png

Wie Sie in den Ergebnissen sehen, stimmen die Übereinstimmungen ziemlich genau mit dem Suchtext überein.

7. Anwendung im Web bereitstellen

Sind Sie bereit, diese App im Web zu veröffentlichen? Gehen Sie dazu so vor:

  1. Öffnen Sie den Cloud Shell-Editor und klicken Sie links unten (Statusleiste) auf das Symbol „Cloud Code – Anmelden“. Wählen Sie Ihr aktuelles Google Cloud-Projekt aus, für das die Abrechnung aktiviert ist, und prüfen Sie, ob Sie auch in Gemini in demselben Projekt angemeldet sind (in der rechten Ecke der Statusleiste).
  2. Klicken Sie auf das Cloud Code-Symbol und warten Sie, bis das Cloud Code-Dialogfeld angezeigt wird. Wählen Sie „Neue Anwendung“ und dann im Pop-up-Fenster „Neue Anwendung erstellen“ die Option „Cloud Functions-Anwendung“ aus:

a800ee1eb6cb8a5b.png

Wählen Sie auf Seite 2/2 des Pop-ups „Create New Application“ (Neue Anwendung erstellen) die Option „Java: Hello World“ aus, geben Sie den Namen Ihres Projekts als „alloydb-pgvector“ an Ihrem bevorzugten Speicherort ein und klicken Sie auf „OK“:

5b09446ecf7d4f8d.png

  1. Suchen Sie in der resultierenden Projektstruktur nach pom.xml und ersetzen Sie sie durch den Inhalt der Repositorydatei. Neben einigen weiteren Abhängigkeiten sollten folgende vorhanden sein:

2b3a3cdd75a57711.png

  1. Ersetzen Sie die Datei „HelloWorld.java“ durch den Inhalt der Datei repo.

Ersetzen Sie die folgenden Werte durch Ihre tatsächlichen Werte:

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

Die Funktion erwartet den Suchtext als Eingabeparameter mit dem Schlüssel „search“. In dieser Implementierung geben wir nur die beste Übereinstimmung aus der Datenbank zurück:

// 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. Führen Sie den folgenden Befehl im Cloud Shell-Terminal aus, um die gerade erstellte Cloud-Funktion bereitzustellen. Denken Sie daran, zuerst mit dem Befehl
cd alloydb-pgvector

Führen Sie dann den Befehl aus:

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

WICHTIG:

Sobald Sie mit der Bereitstellung begonnen haben, sollten Sie die Funktionen in der Cloud Run Functions-Konsole sehen können. Suchen Sie nach der neu erstellten Funktion, öffnen Sie sie, bearbeiten Sie die Konfigurationen und ändern Sie Folgendes:

  1. Gehen Sie zu „Laufzeit, Build, Verbindungen und Sicherheitseinstellungen“.
  2. Zeitlimit auf 180 Sekunden erhöhen
  3. Rufen Sie den Tab „VERBINDUNGEN“ auf:

4e83ec8a339cda08.png

  1. Achten Sie darauf, dass unter „Ingress-Einstellungen“ die Option „Gesamten Traffic zulassen“ ausgewählt ist.
  2. Klicken Sie unter „Einstellungen für ausgehenden Traffic“ auf das Drop-down-Menü „Netzwerk“ und wählen Sie die Option „Neuen VPC-Connector hinzufügen“ aus. Folgen Sie dann der Anleitung im angezeigten Dialogfeld:

8126ec78c343f199.png

  1. Geben Sie einen Namen für den VPC-Connector an und achten Sie darauf, dass die Region mit der Ihrer Instanz übereinstimmt. Lassen Sie den Wert für „Netzwerk“ als Standard bei und legen Sie „Subnetz“ als benutzerdefinierten IP-Bereich mit dem IP-Bereich 10.8.0.0 oder einem ähnlichen verfügbaren Bereich fest.
  2. Maximieren Sie die Konfiguration „ANZEIGEN-SKALIERUNGS-EINSTELLUNGEN“ und prüfen Sie, ob die folgenden Einstellungen festgelegt sind:

7baf980463a86a5c.png

  1. Klicken Sie auf „ERSTELLEN“. Dieser Connector sollte jetzt in den Einstellungen für ausgehenden Traffic aufgeführt sein.
  2. Wählen Sie den neu erstellten Connector aus.
  3. Legen Sie fest, dass der gesamte Traffic über diesen VPC-Connector weitergeleitet werden soll.

8. Anwendung testen

Nach der Bereitstellung sollte der Endpunkt im folgenden Format angezeigt werden:

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

Sie können es über das Cloud Shell-Terminal testen, indem Sie den folgenden Befehl ausführen:

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

Ergebnis:

da3dcfac7d024031.png

Sie können sie auch über die Liste Cloud Functions testen. Wählen Sie die bereitgestellte Funktion aus und rufen Sie den Tab „TESTING“ auf. Geben Sie im Textfeld „Anfrage-JSON“ im Abschnitt „Auslösendes Ereignis konfigurieren“ Folgendes ein:

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

Klicken Sie auf die Schaltfläche „Funktion testen“. Das Ergebnis wird dann rechts auf der Seite angezeigt:

e21f806d661996ff.png

Fertig! So einfach ist es, mit dem Embeddings-Modell eine Ähnlichkeitsvektorsuche in AlloyDB-Daten durchzuführen.

9. Bereinigen

Mit den folgenden Schritten vermeiden Sie, dass Ihrem Google Cloud-Konto die in diesem Beitrag verwendeten Ressourcen in Rechnung gestellt werden:

  1. Klicken Sie in der Google Cloud Console auf Verwalten .
  2. Ressourcen.
  3. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen.
  4. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

10. Glückwunsch

Glückwunsch! Sie haben eine Ähnlichkeitssuche mit AlloyDB, pgvector und der Vektorsuche durchgeführt. Durch die Kombination der Funktionen von AlloyDB, Vertex AI und Vektorsuche haben wir einen großen Schritt nach vorn gemacht, um Literaturrecherchen zugänglich, effizient und wirklich sinnvoll zu gestalten.