Melakukan penelusuran kemiripan vektor di Spanner Graph

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 menggunakan DOT_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 menggunakan DOT_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:

  1. Buat instance.
  2. Buat database dengan skema Spanner Graph.
  3. Sisipkan data grafik yang penting.

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:

  1. Tambahkan kolom baru, nick_name_embeddings, ke tabel input Account.

    ALTER TABLE Account
    ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  2. 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;
    
  3. Buat penyematan untuk teks di kolom nick_name, lalu isi ke kolom nick_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;
    
  4. Tambahkan dua kolom baru ke tabel input AccountTransferAccount: notes dan notes_embeddings.

    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes STRING(MAX);
    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  5. Buat penyematan untuk teks di kolom notes, dan isi ke dalam kolom notes_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;
    
  6. Setelah menambahkan kolom baru ke tabel input Account dan AccountTransferAccount, 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