Menggunakan penelusuran vektor dengan Spanner Graph

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

  1. Membuat instance.
  2. Membuat database dengan skema Spanner Graph.
  3. Menyisipkan data grafik penting.

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:

  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 embedding untuk teks di kolom nick_name, dan isi ke kolom nick_name_embeddings baru.

    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;
    
  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 embedding untuk teks di kolom notes, dan isi ke dalam kolom notes_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;
    
  6. Setelah menambahkan kolom baru ke tabel input Account dan AccountTransferAccount, 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