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. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Weitere Informationen finden Sie unter BigQuery-Preise.

Hinweise

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  3. BigQuery API aktivieren.

    Aktivieren Sie die API

Dataset erstellen

Erstellen Sie ein BigQuery-Dataset:

  1. Rufen Sie in der Google Cloud Console die Seite „BigQuery“ auf.

    Zur Seite „BigQuery“

  2. Klicken Sie im Bereich Explorer auf den Namen Ihres Projekts.

  3. Klicken Sie auf Aktionen ansehen > Dataset erstellen.

    Dataset erstellen

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

  1. 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;
    
  2. 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

  1. Erstellen Sie den Vektorindex my_index für die Spalte embeddings_v1 der Tabelle patents:

    CREATE VECTOR INDEX my_index ON vector_search.patents(embedding_v1)
    OPTIONS(distance_type='COSINE', index_type='IVF', ivf_options='{"num_lists": 1000}');
    
  2. 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 Wert 100 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

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.