Tutorial ini menunjukkan cara melakukan penelusuran
kesamaan pada
embedding yang disimpan dalam tabel BigQuery menggunakan
VECTOR_SEARCH fungsi
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 berdasarkan embedding. Embedding adalah vektor numerik berdimensi tinggi yang merepresentasikan entity tertentu, seperti teks atau file audio. Model machine learning (ML) menggunakan embedding untuk mengenkode semantik tentang entity tersebut agar lebih mudah untuk 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
- Melakukan penelusuran kesamaan pada embedding yang disimpan dalam tabel BigQuery menggunakan fungsi
VECTOR_SEARCH. - Menggunakan indeks vektor untuk meningkatkan performa penelusuran vektor.
- Melakukan penelusuran yang menggunakan indeks vektor dan penelusuran yang tidak menggunakan indeks.
- Mengevaluasi perolehan dengan membandingkan hasil penelusuran dengan indeks dan penelusuran tanpa indeks.
Biaya
Fungsi VECTOR_SEARCH menggunakan
harga komputasi BigQuery.
Anda akan dikenai biaya untuk penelusuran kesamaan, menggunakan harga on-demand atau edisi.
- On-demand: Anda akan dikenai biaya untuk jumlah byte yang dipindai dalam tabel dasar, indeks, dan kueri penelusuran.
Harga edisi: Anda akan dikenai biaya untuk slot yang diperlukan untuk menyelesaikan tugas dalam edisi reservasi Anda. Perhitungan kesamaan yang lebih besar dan lebih kompleks akan dikenai biaya yang lebih besar.
Untuk informasi lebih lanjut, lihat Harga BigQuery.
Sebelum memulai
-
Di Google Cloud konsol, pada halaman pemilih project, pilih atau buat Google Cloud project.
Peran yang diperlukan untuk memilih atau membuat project
- Memilih 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 izinresourcemanager.projects.create. Pelajari cara memberikan peran.
-
Pastikan penagihan diaktifkan untuk Google Cloud project Anda.
-
Aktifkan BigQuery API.
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 Service Usage (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.
Peran yang diperlukan
Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial ini, minta administrator Anda untuk memberi Anda peran IAM berikut di project:
-
Membuat set data, tabel, dan indeks vektor:
Editor Data BigQuery (
roles/bigquery.dataEditor) -
Menjalankan tugas BigQuery:
Pengguna Tugas BigQuery (
roles/bigquery.jobUser)
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
Di Google Cloud konsol, buka halaman BigQuery.
Di panel kiri, klik Explorer:

Jika Anda tidak melihat panel kiri, klik Luaskan panel kiri untuk membuka panel.
Di Explorer, luaskan project Anda, lalu klik Datasets.
Di halaman Datasets, klik Create dataset.
Di panel Create dataset, lakukan hal berikut:
Untuk Dataset ID, masukkan
bqml_tutorial.Untuk Data location, pilih US.
Biarkan setelan default yang tersisa seperti apa adanya.
Klik Create dataset.
bq
Untuk membuat set data baru, gunakan perintah
bq mk --dataset.
Buat set data bernama
bqml_tutorialdengan lokasi data ditetapkan keUS:bq mk --dataset \ --location=US \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
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 embedding paten. Embedding didasarkan pada subset set data publik Google Patents. Anda juga membuat tabel patents2 yang berisi embedding paten untuk menemukan tetangga terdekat.
Untuk membuat tabel, ikuti langkah-langkah berikut:
Untuk membuat tabel
patents, tempelkan kode berikut di editor kueri, dan lalu klik Jalankan: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.Untuk membuat tabel
patents2yang berisi embedding 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 akan menggunakan metode
Approximate Nearest Neighbor
untuk meningkatkan performa penelusuran vektor, dengan mengurangi
perolehan
dan menampilkan hasil yang lebih perkiraan. Tanpa indeks vektor,
VECTOR_SEARCH menggunakan
penelusuran brute force
untuk mengukur jarak setiap rekaman.
Di bagian ini, Anda akan membuat indeks vektor my_index di kolom embedding_v1 tabel patents. Kemudian, Anda akan memverifikasi bahwa indeks tersedia.
Untuk membuat indeks vektor, ikuti langkah-langkah berikut:
Untuk membuat indeks vektor
my_indexdi kolomembedding_v1tabelpatents, 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.Untuk mengonfirmasi bahwa indeks vektor sudah siap, tempelkan kode berikut di editor kueri, lalu klik Run:
SELECT * FROM bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES;
Dalam hasil kueri, pastikan
index_statusadalahACTIVE, dan nilaicoverage_percentageadalah100. Mungkin perlu waktu beberapa menit agarcoverage_percentagemencapai100.
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, 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 => '{"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
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_SEARCH menemukan tetangga terdekat embedding yang tepat.
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 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 akan menampilkan hasil perkiraan,
tetapi akan mengurangi perolehan. Anda dapat menghitung perolehan dengan membandingkan hasil yang ditampilkan oleh penelusuran vektor dengan indeks, dan hasil yang ditampilkan oleh penelusuran vektor dengan brute force. Nilai publication_number secara unik mengidentifikasi paten, sehingga digunakan untuk perbandingan dalam kueri berikut.
Untuk mengevaluasi perolehan, tempelkan kode berikut di editor kueri, lalu klik Jalankan:
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 perolehan 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 kali menjalankan 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.
- Di Google Cloud konsol, buka halaman Manage resources.
- Pada daftar project, pilih project yang Anda ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Atau, untuk menyimpan project dan menghapus resource yang digunakan dalam tutorial ini, ikuti langkah-langkah berikut:
Buka halaman BigQuery.
Di panel kiri, luaskan project Anda, lalu klik Datasets.
Untuk set data
bqml_tutorial, klik Open actions > Delete.Di dialog Delete dataset, klik Delete untuk mengonfirmasi.