Menelusuri embedding dengan penelusuran vektor

Tutorial ini menunjukkan cara melakukan penelusuran kesamaan pada embedding yang disimpan dalam tabel BigQuery menggunakan fungsi VECTOR_SEARCH dan indeks vektor.

Penelusuran vektor adalah teknik untuk membandingkan objek serupa menggunakan embedding, dan digunakan untuk mendukung produk Google, termasuk Google Penelusuran, YouTube, dan Google Play. Anda dapat menggunakan penelusuran vektor untuk melakukan penelusuran semantik dalam skala besar, atau Anda dapat melakukan penelusuran hybrid yang menggabungkan penelusuran semantik dengan penelusuran leksikal (kata kunci). Saat menggunakan indeks vektor dengan penelusuran vektor, Anda dapat memanfaatkan teknologi dasar seperti pengindeksan file terbalik (IVF) dan algoritma ScaNN.

Penelusuran vektor dibangun di atas embedding. Embedding adalah vektor numerik berdimensi tinggi yang merepresentasikan entity tertentu, seperti potongan teks atau file audio. Model machine learning (ML) menggunakan embedding untuk mengenkode semantik tentang entity tersebut agar lebih mudah dipahami dan dibandingkan. Misalnya, operasi umum dalam model pengelompokan, klasifikasi, dan rekomendasi adalah mengukur jarak antara vektor dalam ruang embedding untuk menemukan item yang paling mirip secara semantik.

Tujuan

  • Lakukan penelusuran kesamaan pada embedding yang disimpan dalam tabel BigQuery menggunakan fungsi VECTOR_SEARCH.
  • Gunakan indeks vektor untuk meningkatkan performa penelusuran vektor.
  • Lakukan penelusuran yang menggunakan indeks vektor dan penelusuran yang tidak menggunakan indeks.
  • Evaluasi ingatan dengan membandingkan hasil penelusuran dengan indeks dan penelusuran tanpa indeks.

Biaya

Fungsi VECTOR_SEARCH menggunakan harga komputasi BigQuery. Anda akan ditagih untuk penelusuran kemiripan, menggunakan harga on-demand atau edisi.

  • On-demand: Anda akan ditagih untuk jumlah byte yang dipindai dalam tabel dasar, indeks, dan kueri penelusuran.
  • Harga edisi: Anda akan ditagih untuk slot yang diperlukan untuk menyelesaikan tugas dalam edisi reservasi Anda. Penghitungan kemiripan yang lebih besar dan lebih kompleks akan dikenai biaya lebih banyak.

Untuk informasi lebih lanjut, lihat Harga BigQuery.

Sebelum memulai

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

    Peran yang diperlukan untuk memilih atau membuat project

    • Pilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project mana pun yang telah diberi peran.
    • Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator (roles/resourcemanager.projectCreator), yang berisi izin resourcemanager.projects.create. Pelajari cara memberikan peran.

    Buka pemilih project

  2. Verifikasi bahwa penagihan diaktifkan untuk project Google Cloud Anda.

  3. Aktifkan BigQuery API, jika belum diaktifkan.

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan izin serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.

    Mengaktifkan API

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial ini, minta administrator Anda untuk memberi Anda peran IAM berikut di project:

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Membuat set data

Untuk membuat set data BigQuery, pilih salah satu opsi berikut:

Konsol

  1. Di konsol Google Cloud , buka halaman BigQuery.

    Buka BigQuery

  2. Di panel kiri, klik Explorer:

    Tombol yang ditandai untuk panel Explorer.

    Jika Anda tidak melihat panel kiri, klik Luaskan panel kiri untuk membuka panel.

  3. Di Explorer, luaskan project Anda, lalu klik Datasets.

  4. Di halaman Set Data, klik Buat set data.

  5. Di panel Create dataset, lakukan hal berikut:

    • Untuk Dataset ID, masukkan bqml_tutorial.

    • Untuk Lokasi data, pilih Amerika Serikat.

    Jangan ubah setelan default yang tersisa.

  6. Klik Create dataset.

bq

Untuk membuat set data baru, gunakan perintah bq mk --dataset.

  1. Buat set data bernama bqml_tutorial dengan lokasi data yang ditetapkan ke US:

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. Pastikan set data telah dibuat:

    bq ls

API

Panggil metode datasets.insert dengan resource set data yang ditentukan:

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

Membuat tabel untuk menyimpan data dan embedding

Di bagian ini, Anda akan membuat tabel patents yang berisi sematan paten. Penyematan didasarkan pada subkumpulan set data publik Google Paten. Anda juga membuat tabel patents2 yang berisi embedding paten untuk menemukan tetangga terdekat.

Untuk membuat tabel, ikuti langkah-langkah berikut:

  1. Untuk membuat tabel patents, tempelkan kode berikut di editor kueri, lalu klik Run:

    CREATE TABLE bqml_tutorial.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;

    Anda akan menerima pesan konfirmasi seperti berikut: This statement created a new table named patents.

  2. Untuk membuat tabel patents2 yang berisi penyematan paten untuk menemukan tetangga terdekat, tempelkan kode berikut di editor kueri, lalu klik Run:

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

    Anda akan menerima pesan konfirmasi seperti berikut: This statement created a new table named patents2.

Membuat indeks vektor

Saat Anda menggunakan VECTOR_SEARCH dengan indeks vektor, VECTOR_SEARCH menggunakan metode Approximate Nearest Neighbor untuk meningkatkan performa penelusuran vektor, dengan mengurangi recall dan menampilkan hasil yang lebih mendekati. Tanpa indeks vektor, VECTOR_SEARCH menggunakan penelusuran brute force untuk mengukur jarak setiap catatan.

Di bagian ini, Anda akan membuat indeks vektor my_index pada kolom embedding_v1 tabel patents. Kemudian, Anda memverifikasi bahwa indeks tersedia.

Untuk membuat indeks vektor, ikuti langkah-langkah berikut:

  1. Untuk membuat indeks vektor my_index pada kolom embedding_v1 tabel patents, tempelkan kode berikut di editor kueri, lalu klik Run:

    CREATE OR REPLACE VECTOR INDEX my_index ON bqml_tutorial.patents(embedding_v1)
    STORING(publication_number, title)
    OPTIONS(distance_type='COSINE', index_type='IVF');

    Anda akan menerima pesan konfirmasi seperti berikut: The vector index creation on table bqml_tutorial.patents was initiated. Please query bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES to check the progress of the index.

  2. Untuk mengonfirmasi bahwa indeks vektor sudah siap, tempel kode berikut di editor kueri, lalu klik Run:

    SELECT * FROM bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES;

    Dalam hasil kueri, pastikan index_status adalah ACTIVE, dan nilai coverage_percentage adalah 100. Mungkin perlu waktu beberapa menit agar coverage_percentage mencapai 100.

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 dalam tabel patents2. Kueri ini menggunakan indeks vektor dalam penelusuran, sehingga VECTOR_SEARCH menggunakan metode Approximate Nearest Neighbor untuk menemukan tetangga terdekat embedding.

Untuk menggunakan fungsi VECTOR_SEARCH dengan indeks, tempel kode berikut di editor kueri, lalu klik Run:

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 bqml_tutorial.patents,
    'embedding_v1',
    TABLE bqml_tutorial.patents2,
    top_k => 5,
    distance_type => 'COSINE',
    options => '{"fraction_lists_to_search": 0.005}');

Hasilnya akan mirip 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

Di bagian ini, Anda akan menggunakan 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_SEARCHmenemukan tetangga terdekat yang tepat dari embedding.

Untuk menggunakan VECTOR_SEARCH dengan brute force, tempelkan kode berikut di editor kueri, lalu klik Run:

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 bqml_tutorial.patents,
    'embedding_v1',
    TABLE bqml_tutorial.patents2,
    top_k => 5,
    distance_type => 'COSINE',
    options => '{"use_brute_force":true}');

Hasilnya akan mirip 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 ingatan

Saat Anda melakukan penelusuran vektor dengan indeks, hasil yang ditampilkan adalah hasil perkiraan, tetapi perolehan kembali akan berkurang. Anda dapat menghitung perolehan kembali dengan membandingkan hasil yang ditampilkan oleh penelusuran vektor dengan indeks, dan hasil yang ditampilkan oleh penelusuran vektor dengan brute force. Nilai publication_number mengidentifikasi paten secara unik, sehingga digunakan untuk perbandingan dalam kueri berikutnya.

Untuk mengevaluasi recall, tempel kode berikut di editor kueri, lalu klik Run:

WITH approx_results AS (
  SELECT query.publication_number AS query_publication_number,
    base.publication_number AS base_publication_number
  FROM
    VECTOR_SEARCH(
      TABLE bqml_tutorial.patents,
      'embedding_v1',
      TABLE bqml_tutorial.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 bqml_tutorial.patents,
      'embedding_v1',
      TABLE bqml_tutorial.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;

Hasilnya akan terlihat seperti berikut:

+--------------------------+--------+
| query_publication_number | recall |
+--------------------------+--------+
| KR-20180122872-A         |    1.0 |
+--------------------------+--------+

Jika recall lebih rendah dari yang Anda inginkan, Anda dapat meningkatkan nilai fraction_lists_to_search, tetapi Anda berpotensi mengalami latensi dan penggunaan resource yang lebih tinggi. Untuk menyesuaikan penelusuran vektor, Anda dapat mencoba beberapa eksekusi VECTOR_SEARCH dengan nilai argumen yang berbeda, menyimpan hasilnya ke tabel, lalu membandingkan hasilnya.

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

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

    Buka Kelola 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.

Atau, untuk mempertahankan project dan menghapus resource yang digunakan dalam tutorial ini, ikuti langkah-langkah berikut:

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di panel kiri, luaskan project Anda, lalu klik Set Data.

  3. Untuk set data bqml_tutorial, klik Open actions > Delete.

  4. Di dialog Hapus set data, klik Hapus untuk mengonfirmasi.

Langkah berikutnya