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 jarakeuclideanantar-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 gunakandot_productdengan 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 dengancosinetetapi 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.