Menelusuri embedding dengan penelusuran vektor
Tutorial ini menunjukkan cara menelusuri penyematan yang disimpan di
tabel BigQuery menggunakan
fungsi VECTOR_SEARCH
dan secara opsional indeks vektor.
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 menghapus indeks vektor, Anda memerlukan izin
bigquery.tables.deleteIndex
pada tabel tempat Anda menghapus indeks.
Setiap peran IAM bawaan berikut mencakup izin yang Anda perlukan untuk menggunakan indeks vektor:
- BigQuery Data Owner (
roles/bigquery.dataOwner
) - BigQuery Data Editor (
roles/bigquery.dataEditor
)
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut: Google Cloud:
- BigQuery: You incur costs for index storage and data processing in BigQuery.
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Untuk informasi lebih lanjut, lihat Harga BigQuery.
Sebelum memulai
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery API.
Membuat set data
Buat set data BigQuery:
Di konsol Google Cloud , buka halaman BigQuery.
Di panel Explorer, klik nama project Anda.
Klik
View actions > Create dataset.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
Buat tabel
patents
yang berisi penyematan paten, berdasarkan subkumpulan set data publik Google Patents: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;
Buat tabel
patents2
yang berisi penyematan 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
Buat indeks vektor
my_index
pada kolomembeddings_v1
di tabelpatents
:CREATE VECTOR INDEX my_index ON vector_search.patents(embedding_v1) OPTIONS(distance_type='COSINE', index_type='IVF', ivf_options='{"num_lists": 1000}');
Tunggu beberapa menit hingga indeks vektor dibuat, lalu jalankan kueri berikut dan konfirmasi bahwa nilai
coverage_percentage
adalah100
: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 penyematan 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 penyematan:
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 penyematan di kolom embedding_v1
dalam tabel patents2
. Kueri ini tidak menggunakan indeks vektor dalam penelusuran, sehingga VECTOR_SEARCH
menemukan tetangga terdekat yang tepat dari penyematan:
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 recall
Saat Anda melakukan penelusuran vektor dengan indeks, penelusuran akan menampilkan hasil perkiraan,
dengan mengorbankan pengurangan
recall. 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
mengidentifikasi paten secara unik, sehingga digunakan untuk 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 recall lebih rendah dari yang Anda inginkan, 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
eksekusi VECTOR_SEARCH
dengan nilai argumen yang berbeda, menyimpan hasilnya ke
tabel, lalu membandingkan hasilnya.
Pembersihan
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.