Menelusuri embeddings dengan penelusuran vektor

Untuk memberikan masukan atau meminta dukungan terkait fitur ini, kirim email ke bq-vector-search@google.com.

Tutorial ini menunjukkan cara menelusuri embedding yang disimpan di tabel BigQuery menggunakan fungsi VECTOR_SEARCH dan indeks vektor (opsional).

Izin yang diperlukan

Untuk menjalankan tutorial ini, Anda memerlukan izin Identity and Access Management (IAM) berikut:

  • Untuk membuat set data, Anda memerlukan izin bigquery.datasets.create.
  • Untuk membuat tabel, Anda memerlukan izin berikut:

    • bigquery.tables.create
    • bigquery.tables.updateData
    • bigquery.jobs.create
  • Untuk membuat indeks vektor, Anda memerlukan izin bigquery.tables.createIndex pada tabel tempat Anda membuat indeks.

  • Untuk meletakkan indeks vektor, Anda memerlukan izin bigquery.tables.deleteIndex pada tabel tempat Anda meletakkan indeks.

Setiap peran IAM yang telah ditetapkan berikut mencakup izin yang Anda perlukan untuk menangani indeks vektor:

  • BigQuery Data Owner (roles/bigquery.dataOwner)
  • BigQuery Data Editor (roles/bigquery.dataEditor)

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

  • BigQuery: Anda dikenai biaya untuk penyimpanan indeks dan pemrosesan data di BigQuery.

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Untuk informasi lebih lanjut, lihat Harga BigQuery.

Sebelum memulai

  1. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  2. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  3. Enable the BigQuery API.

    Enable the API

Membuat set data

Buat set data BigQuery:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka halaman BigQuery

  2. Di panel Explorer, klik nama project Anda.

  3. Klik View actions > Create dataset.

    Buat set data.

  4. Di halaman Create dataset, lakukan hal berikut:

    • Untuk Dataset ID, masukkan vector_search.

    • Untuk Location type, pilih Multi-region, lalu pilih US (multiple regions in United States).

      Set data publik disimpan di US multi-region. Untuk mempermudah, simpan set data Anda di lokasi yang sama.

    • Jangan ubah setelan default yang tersisa, lalu klik Create dataset.

Membuat tabel pengujian

  1. Buat tabel patents yang berisi embedding paten, berdasarkan sebagian dari set data publik Google Paten:

    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. Buat tabel patents2 yang berisi embedding paten untuk menemukan tetangga terdekat untuk:

    CREATE TABLE vector_search.patents2 AS
    SELECT * FROM `patents-public-data.google_patents_research.publications`
    WHERE publication_number = 'KR-20180122872-A';
    

Membuat indeks vektor

  1. Buat indeks vektor my_index di kolom embeddings_v1 pada tabel 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. Tunggu beberapa menit hingga indeks vektor selesai dibuat, lalu jalankan kueri berikut dan konfirmasi bahwa nilai coverage_percentage adalah 100:

    SELECT * FROM vector_search.INFORMATION_SCHEMA.VECTOR_INDEXES;
    

Menggunakan fungsi VECTOR_SEARCH dengan indeks

Setelah indeks vektor dibuat dan diisi, gunakan fungsi VECTOR_SEARCH untuk menemukan tetangga terdekat untuk embedding di kolom embedding_v1 pada tabel patents2. Kueri ini menggunakan indeks vektor dalam penelusuran, sehingga VECTOR_SEARCH menggunakan metode Estimated Nearest Neighbor untuk menemukan tetangga terdekat dari embedding:

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

Hasilnya akan terlihat seperti berikut:

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

Menggunakan fungsi VECTOR_SEARCH dengan brute force

Gunakan fungsi VECTOR_SEARCH untuk menemukan tetangga terdekat untuk embedding di kolom embedding_v1 dalam tabel patents2. Kueri ini tidak menggunakan indeks vektor dalam penelusuran, sehingga VECTOR_SEARCH menemukan tetangga terdekat yang tepat dari embedding:

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

Hasilnya akan terlihat seperti berikut:

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

Mengevaluasi perolehan

Saat Anda melakukan penelusuran vektor dengan indeks, penelusuran vektor akan menampilkan hasil perkiraan, dengan kompromi dari pengurangan penarikan. Anda dapat menghitung recall dengan membandingkan hasil yang ditampilkan oleh penelusuran vektor dengan indeks dan dengan penelusuran vektor dengan brute force. Dalam set data ini, nilai publication_number secara unik mengidentifikasi paten, sehingga digunakan sebagai perbandingan.

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

Jika penarikan lebih rendah dari yang diinginkan, Anda dapat meningkatkan nilai fraction_lists_to_search, dengan kelemahan latensi dan penggunaan resource yang berpotensi lebih tinggi. Untuk menyesuaikan penelusuran vektor, Anda dapat mencoba beberapa operasi VECTOR_SEARCH dengan nilai argumen yang berbeda, menyimpan hasilnya ke tabel, lalu membandingkan hasilnya.

Pembersihan

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.