Halaman ini menjelaskan cara menggunakan penelusuran vektor di Spanner Graph untuk menemukan K-nearest neighbors (KNN) dan approximate nearest neighbors (ANN). Anda dapat menggunakan fungsi jarak vektor untuk melakukan penelusuran vektor KNN dan ANN untuk kasus penggunaan seperti penelusuran kesamaan atau pembuatan yang diperluas pengambilan untuk aplikasi AI generatif.
Spanner Graph mendukung fungsi jarak berikut untuk melakukan penelusuran kesamaan vektor KNN:
COSINE_DISTANCE(): mengukur jarak terpendek antara dua vektor.EUCLIDEAN_DISTANCE(): mengukur kosinus sudut antara dua vektor.DOT_PRODUCT(): menghitung kosinus sudut yang dikalikan dengan produk besaran vektor yang sesuai. Jika mengetahui bahwa semua embedding vektor dalam set data Anda dinormalisasi, Anda dapat menggunakanDOT_PRODUCT()sebagai fungsi jarak.
Untuk mengetahui informasi selengkapnya, lihat Melakukan penelusuran kesamaan vektor di Spanner dengan menemukan K-nearest neighbors.
Spanner Graph juga mendukung fungsi jarak perkiraan berikut untuk melakukan penelusuran kesamaan vektor ANN:
APPROX_COSINE_DISTANCE: mengukur perkiraan jarak terpendek antara dua vektor.APPROX_EUCLIDEAN_DISTANCE: mengukur perkiraan kosinus sudut antara dua vektor.APPROX_DOT_PRODUCT: menghitung perkiraan kosinus sudut yang dikalikan dengan produk besaran vektor yang sesuai. Jika mengetahui bahwa semua embedding vektor dalam set data Anda dinormalisasi, Anda dapat menggunakanDOT_PRODUCT()sebagai fungsi jarak.
Untuk mengetahui informasi selengkapnya, lihat Menemukan approximate nearest neighbors, membuat indeks vektor, dan mengkueri embedding vektor.
Sebelum memulai
Untuk menjalankan contoh dalam dokumen ini, Anda harus terlebih dahulu mengikuti langkah-langkah di Menyiapkan dan mengkueri Spanner Graph untuk melakukan hal berikut:
Setelah menyisipkan data grafik penting, lakukan pembaruan berikut pada database Anda.
Menyisipkan data vektor tambahan di database grafik
Untuk melakukan pembaruan yang diperlukan pada database grafik, lakukan hal berikut:
Tambahkan kolom baru,
nick_name_embeddings, ke tabel inputAccount.ALTER TABLE Account ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);Tambahkan data ke kolom
nick_name.UPDATE Account SET nick_name = "Fund for a refreshing tropical vacation" WHERE id = 7; UPDATE Account SET nick_name = "Fund for a rainy day!" WHERE id = 16; UPDATE Account SET nick_name = "Saving up for travel" WHERE id = 20;Buat embedding untuk teks di kolom
nick_name, dan isi ke kolomnick_name_embeddingsbaru.Untuk membuat embedding Gemini Enterprise Agent Platform untuk data operasional Anda di Spanner Graph, lihat Mendapatkan embedding teks Agent Platform.
Untuk tujuan ilustrasi, contoh kami menggunakan nilai vektor buatan berdimensi rendah.
UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7] WHERE id = 7; UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.4, 0.9, 0.7, 0.1] WHERE id = 16; UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.2, 0.5, 0.6, 0.6] WHERE id = 20;Tambahkan dua kolom baru ke tabel input
AccountTransferAccount:notesdannotes_embeddings.ALTER TABLE AccountTransferAccount ADD COLUMN notes STRING(MAX); ALTER TABLE AccountTransferAccount ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);Buat embedding untuk teks di kolom
notes, dan isi ke dalam kolomnotes_embeddings.Untuk membuat embedding Agent Platform untuk data operasional Anda di Spanner Graph, lihat Mendapatkan embedding teks Agent Platform.
Untuk tujuan ilustrasi, contoh kami menggunakan nilai vektor buatan berdimensi rendah.
UPDATE AccountTransferAccount SET notes = "for shared cost of dinner", notes_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7] WHERE id = 16 AND to_id = 20; UPDATE AccountTransferAccount SET notes = "fees for tuition", notes_embeddings = ARRAY<FLOAT32>[0.1, 0.9, 0.1, 0.7] WHERE id = 20 AND to_id = 7; UPDATE AccountTransferAccount SET notes = 'loved the lunch', notes_embeddings = ARRAY<FLOAT32>[0.4, 0.5, 0.7, 0.9] WHERE id = 20 AND to_id = 16;Setelah menambahkan kolom baru ke tabel input
AccountdanAccountTransferAccount, perbarui definisi grafik properti menggunakan pernyataan berikut. Untuk mengetahui informasi selengkapnya, lihat Memperbarui definisi node atau edge yang ada.CREATE OR REPLACE PROPERTY GRAPH FinGraph NODE TABLES (Account, Person) EDGE TABLES ( PersonOwnAccount SOURCE KEY (id) REFERENCES Person (id) DESTINATION KEY (account_id) REFERENCES Account (id) LABEL Owns, AccountTransferAccount SOURCE KEY (id) REFERENCES Account (id) DESTINATION KEY (to_id) REFERENCES Account (id) LABEL Transfers );
Menemukan K-nearest neighbors
Dalam contoh berikut, gunakan fungsi EUCLIDEAN_DISTANCE() untuk melakukan penelusuran vektor KNN pada node dan edge database grafik Anda.
Melakukan penelusuran vektor KNN pada node grafik
Anda dapat melakukan penelusuran vektor KNN pada properti nick_name_embeddings dari node Account. Penelusuran vektor KNN ini menampilkan pemilik akun name
dan nick_name akun. Dalam contoh berikut, hasilnya menunjukkan dua K-nearest neighbors teratas untuk akun untuk perjalanan dan liburan, yang diwakili oleh embedding vektor [0.2, 0.4, 0.9, 0.6].
GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(a:Account)
RETURN p.name, a.nick_name
ORDER BY EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
-- An illustrative embedding for 'accounts for leisure travel and vacation'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;
Hasil
| nama | nick_name |
|---|---|
| Alex | Dana untuk liburan tropis yang menyegarkan |
| Dana | Menabung untuk perjalanan |
Melakukan penelusuran vektor KNN pada edge grafik
Anda dapat melakukan penelusuran vektor KNN pada properti notes_embeddings dari edge Owns. Penelusuran vektor KNN ini menampilkan name pemilik akun dan notes transfer. Dalam contoh berikut, hasilnya menunjukkan dua K-nearest neighbors teratas untuk pengeluaran makanan, yang diwakili oleh [0.2, 0.4, 0.9, 0.6] embedding vektor.
GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(:Account)-[t:Transfers]->(:Account)
WHERE t.notes_embeddings IS NOT NULL
RETURN p.name, t.notes
ORDER BY EUCLIDEAN_DISTANCE(t.notes_embeddings,
-- An illustrative vector embedding for 'food expenses'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;
Hasil
| nama | catatan |
|---|---|
| Lee | untuk biaya makan malam bersama |
| Dana | suka makan siangnya |
Membuat indeks vektor dan menemukan approximate nearest neighbors
Untuk melakukan penelusuran ANN, Anda harus membuat indeks vektor khusus
yang digunakan Spanner Graph untuk mempercepat penelusuran vektor. Indeks vektor harus menggunakan metrik jarak tertentu. Anda dapat memilih metrik jarak yang paling sesuai untuk kasus penggunaan dengan menetapkan parameter distance_type ke salah satu dari COSINE, DOT_PRODUCT, atau EUCLIDEAN. Untuk mengetahui informasi selengkapnya, lihat
pernyataan INDEKS VEKTOR.
Dalam contoh berikut, Anda membuat indeks vektor menggunakan jenis jarak Euclidean pada kolom nick_name_embedding dari tabel input Account:
CREATE VECTOR INDEX NickNameEmbeddingIndex
ON Account(nick_name_embeddings)
WHERE nick_name_embeddings IS NOT NULL
OPTIONS (distance_type = 'EUCLIDEAN', tree_depth = 2, num_leaves = 1000);
Melakukan penelusuran vektor ANN pada node grafik
Setelah membuat indeks vektor, Anda dapat melakukan penelusuran vektor ANN pada properti nick_name dari node Account. Penelusuran vektor ANN menampilkan
pemilik akun name dan nick_name akun. Dalam contoh berikut,
hasilnya menunjukkan dua approximate nearest neighbors teratas untuk akun untuk
perjalanan dan liburan, yang diwakili oleh
[0.2, 0.4, 0.9, 0.6] embedding vektor.
Petunjuk grafik memaksa pengoptimal kueri untuk menggunakan indeks vektor yang ditentukan dalam rencana eksekusi kueri.
GRAPH FinGraph
MATCH (@{FORCE_INDEX=NickNameEmbeddingIndex} a:Account)
WHERE a.nick_name_embeddings IS NOT NULL
RETURN a, APPROX_EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
-- An illustrative embedding for 'accounts for leisure travel and vacation'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6],
options => JSON '{"num_leaves_to_search": 10}') AS distance
ORDER BY distance
LIMIT 2
NEXT
MATCH (p:Person)-[:Owns]->(a)
RETURN p.name, a.nick_name;
Hasil
| nama | nick_name |
|---|---|
| Alex | Dana untuk liburan tropis yang menyegarkan |
| Dana | Menabung untuk perjalanan |
Langkah berikutnya
- Melakukan penelusuran kesamaan vektor di Spanner dengan menemukan K-nearest neighbors.
- Menemukan approximate nearest neighbors, membuat indeks vektor, dan mengkueri embedding vektor.
- Mendapatkan embedding teks Agent Platform
- Mempelajari kueri Spanner Graph lebih lanjut.
- Mempelajari praktik terbaik untuk menyesuaikan kueri.