Einbettungen mit Vektorsuche suchen
Wenn Sie Feedback geben oder Support für dieses Feature anfordern möchten, senden Sie eine E-Mail an bq-vector-search@google.com.
In dieser Anleitung wird gezeigt, wie Sie in BigQuery-Tabellen gespeicherte Einbettungen mit der Funktion VECTOR_SEARCH
und optional einem Vektorindex suchen.
Erforderliche Berechtigungen
Zum Ausführen dieser Anleitung benötigen Sie die folgenden IAM-Berechtigungen (Identity and Access Management):
- Zum Erstellen des Datasets benötigen Sie die Berechtigung
bigquery.datasets.create
. Zum Erstellen einer Tabelle benötigen Sie folgende Berechtigungen:
bigquery.tables.create
bigquery.tables.updateData
bigquery.jobs.create
Zum Erstellen eines Vektorindex benötigen Sie die Berechtigung
bigquery.tables.createIndex
für die Tabelle, in der Sie den Index erstellen.Zum Löschen eines Vektorindex benötigen Sie die Berechtigung
bigquery.tables.deleteIndex
für die Tabelle, aus der Sie den Index löschen.
Jede der folgenden vordefinierten IAM-Rollen enthält die Berechtigungen, die Sie benötigen, um mit Vektorindexen zu arbeiten:
- BigQuery Dateninhaber (
roles/bigquery.dataOwner
) - BigQuery Datenmitbearbeiter (
roles/bigquery.dataEditor
)
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
- BigQuery Es fallen Kosten für die Indexspeicherung und die Datenverarbeitung in BigQuery an.
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Weitere Informationen finden Sie unter BigQuery-Preise.
Hinweise
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
-
BigQuery API aktivieren.
Dataset erstellen
Erstellen Sie ein BigQuery-Dataset:
Rufen Sie in der Google Cloud Console die Seite „BigQuery“ auf.
Klicken Sie im Bereich Explorer auf den Namen Ihres Projekts.
Klicken Sie auf
Aktionen ansehen > Dataset erstellen.Führen Sie auf der Seite Dataset erstellen die folgenden Schritte aus:
Geben Sie unter Dataset-ID
vector_search
ein.Wählen Sie als Standorttyp die Option Mehrere Regionen und dann USA (mehrere Regionen in den USA) aus.
Die öffentlichen Datasets sind am multiregionalen Standort
US
gespeichert. Der Einfachheit halber sollten Sie Ihr Dataset am selben Standort speichern.Übernehmen Sie die verbleibenden Standardeinstellungen unverändert und klicken Sie auf Dataset erstellen.
Testtabellen erstellen
Erstellen Sie die Tabelle
patents
mit Patenteinbettungen, basierend auf einer Teilmenge des öffentlichen Datasets Google Patentsuche:CREATE TABLE vector_search.patents AS SELECT * FROM `patents-public-data.google_patents_research.publications` WHERE ARRAY_LENGTH(embedding_v1) > 0 AND publication_number NOT IN ('KR-20180122872-A') LIMIT 1000000;
Erstellen Sie die Tabelle
patents2
mit einer Patenteinbettung, um die nächsten Nachbarn zu finden:CREATE TABLE vector_search.patents2 AS SELECT * FROM `patents-public-data.google_patents_research.publications` WHERE publication_number = 'KR-20180122872-A';
Vektorindex erstellen
Erstellen Sie den Vektorindex
my_index
für die Spalteembeddings_v1
der Tabellepatents
:CREATE VECTOR INDEX my_index ON vector_search.patents(embedding_v1) OPTIONS(distance_type='COSINE', index_type='IVF', ivf_options='{"num_lists": 1000}');
Warten Sie einige Minuten, bis der Vektorindex erstellt wurde, führen Sie dann die folgende Abfrage aus und prüfen Sie, ob für
coverage_percentage
der Wert100
gilt:SELECT * FROM vector_search.INFORMATION_SCHEMA.VECTOR_INDEXES;
Funktion VECTOR_SEARCH
mit einem Index verwenden
Nachdem der Vektorindex erstellt und gefüllt wurde, verwenden Sie die Funktion VECTOR_SEARCH
, um in der Spalte embedding_v1
der Tabelle patents2
den nächsten Nachbarn für die Einbettung zu ermitteln. Bei dieser Abfrage wird der Vektorindex in der Suche verwendet, sodass VECTOR_SEARCH
mit der Methode Ungefährer nächster Nachbar den nächsten Nachbarn der Einbettung ermittelt:
SELECT query.publication_number AS query_publication_number, query.title AS query_title, base.publication_number AS base_publication_number, base.title AS base_title, distance FROM VECTOR_SEARCH( TABLE vector_search.patents, 'embedding_v1', TABLE vector_search.patents2, top_k => 5, distance_type => 'COSINE', options => '{"fraction_lists_to_search": 0.005}');
Die Ergebnisse sehen in etwa so aus:
+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | query_publication_number | query_title | base_publication_number | base_title | distance | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-106599080-B | A kind of rapid generation for keeping away big vast transfer figure based on GIS | 0.14471956347590609 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-114118544-A | Urban waterlogging detection method and device | 0.17472108931171348 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-20200048143-A | Method and system for mornitoring dry stream using unmanned aerial vehicle | 0.17561990745619782 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-101721695-B1 | Urban Climate Impact Assessment method of Reflecting Urban Planning Scenarios and Analysis System using the same | 0.17696129365559843 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-109000731-B | The experimental rig and method that research inlet for stom water chocking-up degree influences water discharged amount | 0.17902723269642917 | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
Funktion VECTOR_SEARCH
mit Brute-Force verwenden
Verwenden Sie die Funktion VECTOR_SEARCH
, um den nächsten Nachbarn für die Einbettung in der Spalte embedding_v1
der Tabelle patents2
zu finden. Bei dieser Abfrage wird der Vektorindex nicht bei der Suche verwendet, sodass VECTOR_SEARCH
den genauen nächsten Nachbarn der Einbettung findet:
SELECT query.publication_number AS query_publication_number, query.title AS query_title, base.publication_number AS base_publication_number, base.title AS base_title, distance FROM VECTOR_SEARCH( TABLE vector_search.patents, 'embedding_v1', TABLE vector_search.patents2, top_k => 5, distance_type => 'COSINE', options => '{"use_brute_force":true}');
Die Ergebnisse sehen in etwa so aus:
+--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | query_publication_number | query_title | base_publication_number | base_title | distance | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+ | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-106599080-B | A kind of rapid generation for keeping away big vast transfer figure based on GIS | 0.1447195634759062 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-114118544-A | Urban waterlogging detection method and device | 0.1747210893117136 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-20200048143-A | Method and system for mornitoring dry stream using unmanned aerial vehicle | 0.17561990745619782 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | KR-101721695-B1 | Urban Climate Impact Assessment method of Reflecting Urban Planning Scenarios and Analysis System using the same | 0.17696129365559843 | | KR-20180122872-A | Rainwater management system based on rainwater keeping unit | CN-109000731-B | The experimental rig and method that research inlet for stom water chocking-up degree influences water discharged amount | 0.17902723269642928 | +--------------------------+-------------------------------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------+
Recall bewerten
Wenn Sie eine Vektorsuche mit einem Index durchführen, werden ungefähre Ergebnisse zurückgegeben, wobei jedoch die Trefferquote reduziert werden muss. Sie können den Recall berechnen, wenn Sie die Ergebnisse der Vektorsuche mit einem Index und der Vektorsuche mit Brute-Force-Vorgängen vergleichen. In diesem Dataset identifiziert der Wert publication_number
ein Patent eindeutig, sodass er zum Vergleich verwendet wird.
WITH approx_results AS ( SELECT query.publication_number AS query_publication_number, base.publication_number AS base_publication_number FROM VECTOR_SEARCH( TABLE vector_search.patents, 'embedding_v1', TABLE vector_search.patents2, top_k => 5, distance_type => 'COSINE', options => '{"fraction_lists_to_search": 0.005}') ), exact_results AS ( SELECT query.publication_number AS query_publication_number, base.publication_number AS base_publication_number FROM VECTOR_SEARCH( TABLE vector_search.patents, 'embedding_v1', TABLE vector_search.patents2, top_k => 5, distance_type => 'COSINE', options => '{"use_brute_force":true}') ) SELECT a.query_publication_number, SUM(CASE WHEN a.base_publication_number = e.base_publication_number THEN 1 ELSE 0 END) / 5 AS recall FROM exact_results e LEFT JOIN approx_results a ON e.query_publication_number = a.query_publication_number GROUP BY a.query_publication_number
Wenn die Trefferquote niedriger ist als Sie möchten, können Sie den Wert fraction_lists_to_search
erhöhen, was zu einer höheren Latenz und einer höheren Ressourcennutzung führen kann. Zum Optimieren Ihrer Vektorsuche können Sie mehrere Ausführungen von VECTOR_SEARCH
mit unterschiedlichen Argumentwerten ausprobieren, die Ergebnisse in Tabellen speichern und dann die Ergebnisse vergleichen.
Bereinigen
- Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.