Temukan yang terdekat

Deskripsi

Melakukan penelusuran vektor tetangga terdekat di kolom embedding yang diberikan menggunakan distance_measure yang diminta

Sintaksis

Node.js

const results = await db.pipeline()
  .collection("cities")
  .findNearest({
      field: 'embedding',
      vectorValue: vector([1.5, 2.345]),
      distanceMeasure: 'euclidean',
  })
  .execute();

Contoh klien

Node.js
const results = await db.pipeline()
  .collection("cities")
  .findNearest({
      field: "embedding",
      vectorValue: [1.5, 2.345],
      distanceMeasure: "euclidean"
  })
  .execute();

Web

const results = await execute(db.pipeline()
  .collection("cities")
  .findNearest({
      field: "embedding",
      vectorValue: [1.5, 2.345],
      distanceMeasure: "euclidean"
  }));
Swift
let results = try await db.pipeline()
  .collection("cities")
  .findNearest(
    field: Field("embedding"),
    vectorValue: VectorValue([1.5, 2.345]),
    distanceMeasure: .euclidean
  )
  .execute()

Kotlin

val results = db.pipeline()
    .collection("cities")
    .findNearest(
        "embedding",
        FieldValue.vector(doubleArrayOf(1.5, 2.345)),
        FindNearestStage.DistanceMeasure.EUCLIDEAN
    )
    .execute()

Java

Task<Pipeline.Snapshot> results = db.pipeline()
        .collection("cities")
        .findNearest(
            "embedding",
            new double[] {1.5, 2.345},
            FindNearestStage.DistanceMeasure.EUCLIDEAN
        )
        .execute();
Python
from google.cloud.firestore_v1.vector import Vector
from google.cloud.firestore_v1.base_vector_query import DistanceMeasure

results = (
    client.pipeline()
    .collection("cities")
    .find_nearest(
        field="embedding",
        vector_value=Vector([1.5, 2.345]),
        distance_measure=DistanceMeasure.EUCLIDEAN,
    )
    .execute()
)
Java
Pipeline.Snapshot results =
    firestore
        .pipeline()
        .collection("cities")
        .findNearest(
            "embedding",
            new double[] {1.5, 2.345},
            FindNearest.DistanceMeasure.EUCLIDEAN,
            new FindNearestOptions())
        .execute()
        .get();

Perilaku

Ukuran Jarak

Tahap find_nearest mendukung opsi berikut untuk jarak vektor:

  • euclidean: Mengukur jarak euclidean antar-vektor. Untuk mempelajari lebih lanjut, lihat Euclidean.
  • cosine: Membandingkan vektor berdasarkan sudut antarvektor yang memungkinkan Anda mengukur kesamaan yang tidak didasarkan pada besaran vektor. Sebaiknya gunakan dot_product dengan vektor yang dinormalisasi unit, bukan jarak KOSINUS, yang secara matematis setara dengan performa yang lebih baik. Untuk mempelajari lebih lanjut, lihat Kesamaan kosinus.
  • dot_product: Serupa dengan cosine tetapi dipengaruhi oleh besarnya vektor. Untuk mempelajari lebih lanjut, lihat Perkalian titik.

Memilih ukuran jarak

Anda dapat menentukan ukuran jarak yang akan digunakan untuk menemukan ukuran jarak, tergantung pada apakah semua embedding vektor Anda dinormalisasi atau tidak. Embedding vektor yang dinormalisasi memiliki besaran (panjang) tepat 1,0.

Selain itu, jika Anda mengetahui ukuran jarak yang digunakan untuk melatih model, gunakan ukuran jarak tersebut untuk menghitung jarak antara embedding vektor Anda.

Data yang dinormalisasi

Jika Anda memiliki set data tempat semua embedding vektor dinormalisasi, ketiga ukuran jarak akan memberikan hasil penelusuran semantik yang sama. Pada dasarnya, meskipun setiap ukuran jarak menampilkan nilai yang berbeda, nilai tersebut diurutkan dengan cara yang sama. Saat embedding dinormalisasi, dot_product biasanya paling efisien secara komputasi, tetapi perbedaannya dapat diabaikan dalam sebagian besar kasus. Namun, jika aplikasi Anda sangat sensitif terhadap performa, dot_product dapat membantu penyesuaian performa.

Data yang tidak dinormalisasi

Jika Anda memiliki set data yang tidak melakukan normalisasi pada embedding vektor, maka secara matematis tidak benar untuk menggunakan dot_product sebagai ukuran jarak karena perkalian titik tidak mengukur jarak. Bergantung pada cara pembuatan embedding dan jenis penelusuran yang lebih disukai, ukuran jarak cosine atau euclidean akan menghasilkan hasil penelusuran yang secara subjektif lebih baik daripada pengukuran jarak lainnya. Eksperimen dengan cosine atau euclidean mungkin diperlukan guna menentukan pilihan terbaik untuk kasus penggunaan Anda.

Tidak yakin apakah data dinormalisasi atau tidak

Jika Anda tidak yakin apakah data dinormalisasi atau tidak dan ingin menggunakan dot_product, sebaiknya gunakan cosine. cosine mirip dengan dot_product dengan normalisasi bawaan. Jarak yang diukur menggunakan cosine berkisar dari 0 hingga 2. Hasil yang mendekati 0 menunjukkan bahwa vektor sangat mirip.

Membatasi hasil

Anda dapat membatasi jumlah dokumen yang ditampilkan oleh kueri dengan menyetel kolom limit.

Node.js

const results = await db.pipeline()
  .collection("cities")
  .findNearest({
      field: 'embedding',
      vectorValue: vector([1.5, 2.345]),
      distanceMeasure: 'euclidean',
      limit: 10,
  })
  .execute();

Mengambil Jarak Vektor yang Dihitung

Anda dapat mengambil jarak vektor yang dihitung dengan menetapkan nama properti output distance_field pada tahap find_nearest, seperti yang ditunjukkan dalam contoh berikut:

Misalnya, untuk koleksi berikut:

Node.js

await db.collection('cities').doc('SF').set({name: 'San Francisco', embedding: vector([1.0, -1.0])});
await db.collection('cities').doc('TO').set({name: 'Toronto', embedding: vector([5.0, -10.0])});
await db.collection('cities').doc('AT').set({name: 'Atlantis', embedding: vector([2.0, -4.0])});

Melakukan penelusuran vektor dengan output distance_field yang diminta:

Node.js

const results = await db.pipeline()
  .collection("cities")
  .findNearest({
      field: 'embedding',
      vectorValue: vector([1.3, 2.345]),
      distanceMeasure: 'euclidean',
      distanceField: 'computedDistance',
  })
  .execute();

Yang menghasilkan dokumen berikut:

{name: 'San Francisco', embedding: vector([1.0, -1.0]), computedDistance: 3.3584259705999178},
{name: 'Atlantis', embedding: vector([2.0, -4.0]), computedDistance: 6.383496299051172},
{name: 'Toronto', embedding: vector([5.0, -10.0]), computedDistance: 12.887553103673328}

Batasan

Saat Anda bekerja dengan embedding vektor, perhatikan batasan berikut ini:

  • Dimensi embedding maksimal yang didukung adalah 2048. Untuk menyimpan indeks yang lebih besar, gunakan pengurangan dimensi.