Halaman ini menjelaskan cara melakukan penelusuran kesamaan vektor di Spanner Graph untuk menemukan tetangga terdekat K (KNN) dan perkiraan tetangga terdekat (ANN). Anda dapat menggunakan fungsi jarak vektor untuk melakukan penelusuran vektor KNN dan ANN untuk kasus penggunaan seperti penelusuran kesamaan atau pembuatan yang ditingkatkan pengambilan untuk aplikasi AI generatif.
Spanner Graph mendukung fungsi jarak berikut untuk melakukan penelusuran kemiripan 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 Anda mengetahui bahwa semua embedding vektor dalam set data Anda dinormalisasi, Anda dapat menggunakanDOT_PRODUCT()
sebagai fungsi jarak.
Untuk informasi selengkapnya, lihat Melakukan penelusuran kesamaan vektor di Spanner dengan menemukan tetangga terdekat K.
Spanner Graph juga mendukung fungsi jarak perkiraan berikut untuk melakukan penelusuran kemiripan 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 Anda mengetahui bahwa semua embedding vektor dalam set data Anda dinormalisasi, Anda dapat menggunakanDOT_PRODUCT()
sebagai fungsi jarak.
Untuk mengetahui informasi selengkapnya, lihat Menemukan perkiraan tetangga terdekat, membuat indeks vektor, dan membuat kueri terhadap embedding vektor.
Sebelum memulai
Untuk menjalankan contoh dalam dokumen ini, Anda harus mengikuti langkah-langkah di Menyiapkan dan membuat kueri Grafik Spanner terlebih dahulu untuk melakukan hal berikut:
Setelah menyisipkan data grafik yang penting, lakukan pembaruan berikut pada database Anda.
Menyisipkan data vektor tambahan dalam database grafik
Untuk melakukan pembaruan yang diperlukan pada database grafik, lakukan tindakan 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 penyematan untuk teks di kolom
nick_name
, lalu isi ke kolomnick_name_embeddings
baru.Untuk membuat embedding Vertex AI untuk data operasional Anda di Spanner Graph, lihat Mendapatkan embedding teks Vertex AI.
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
:notes
dannotes_embeddings
.ALTER TABLE AccountTransferAccount ADD COLUMN notes STRING(MAX); ALTER TABLE AccountTransferAccount ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
Buat penyematan untuk teks di kolom
notes
, dan isi ke dalam kolomnotes_embeddings
.Untuk membuat embedding Vertex AI untuk data operasional Anda di Spanner Graph, lihat Mendapatkan embedding teks Vertex AI.
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
Account
danAccountTransferAccount
, update 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 tetangga terdekat
Pada contoh berikut, gunakan fungsi EUCLIDEAN_DISTANCE()
untuk melakukan penelusuran vektor
KNN pada node dan tepi 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 name
pemilik akun
dan nick_name
akun. Dalam contoh berikut, hasilnya menunjukkan dua tetangga terdekat K teratas untuk akun untuk perjalanan rekreasi dan liburan, yang diwakili oleh penyematan 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 bepergian |
Melakukan penelusuran vektor KNN pada tepi grafik
Anda dapat melakukan penelusuran vektor KNN pada properti notes_embeddings
dari tepi Owns
. Penelusuran vektor KNN ini menampilkan name
pemilik akun dan
notes
transfer. Dalam contoh berikut, hasilnya menunjukkan dua tetangga terdekat
K teratas untuk biaya makanan, yang direpresentasikan oleh
penyematan vektor [0.2, 0.4, 0.9, 0.6]
.
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 sekali makan siangnya |
Membuat indeks vektor dan menemukan perkiraan tetangga terdekat
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 Anda dengan menetapkan parameter distance_type
ke salah satu dari COSINE
, DOT_PRODUCT
, atau EUCLIDEAN
. Untuk mengetahui informasi selengkapnya, lihat
pernyataan VECTOR INDEX.
Dalam contoh berikut, Anda membuat indeks vektor menggunakan jenis jarak euclidean di kolom nick_name_embedding
pada 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
node Account
. Penelusuran vektor ANN menampilkan
name
pemilik akun dan nick_name
akun. Dalam contoh berikut,
hasilnya menunjukkan dua tetangga terdekat terdekat untuk akun untuk
perjalanan dan liburan rekreasi, yang diwakili oleh
penyematan vektor [0.2, 0.4, 0.9, 0.6]
.
Petunjuk grafik memaksa pengoptimal kueri 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 bepergian |
Langkah selanjutnya
- Lakukan penelusuran kemiripan vektor di Spanner dengan menemukan K-nearest neighbors.
- Menemukan perkiraan tetangga terdekat, membuat indeks vektor, dan membuat kueri pada embedding vektor.
- Mendapatkan embedding teks Vertex AI
- Pelajari kueri Grafik Spanner lebih lanjut.
- Pelajari praktik terbaik untuk menyesuaikan kueri.