Açıklama
İstenen distance_measure kullanılarak belirtilen embedding alanında en yakın komşu vektör araması gerçekleştirir.
Örnekler
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", 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();
Davranış
Mesafe Ölçüsü
find_nearest(...) aşaması, vektör mesafesi için aşağıdaki seçenekleri destekler:
euclidean: Vektörler arasındakieuclideanuzaklığını ölçer. Daha fazla bilgi için Öklid başlıklı makaleyi inceleyin.cosine: Vektörleri aralarındaki açıya göre karşılaştırır. Bu sayede, vektörlerin büyüklüğüne dayanmayan benzerliği ölçebilirsiniz. Matematiksel olarak eşdeğer olan ve daha iyi performans sunan KOSİNÜS mesafesi yerine birim normalleştirilmiş vektörlerledot_productkullanmanızı öneririz. Daha fazla bilgi için Kosinüs benzerliği başlıklı makaleyi inceleyin.dot_product:cosinedeğerine benzer ancak vektörlerin büyüklüğünden etkilenir. Daha fazla bilgi edinmek için İç çarpım başlıklı makaleyi inceleyin.
Mesafe ölçüsünü seçme
Tüm vektör yerleştirmelerinizin normalleştirilip normalleştirilmediğine bağlı olarak, uzaklık ölçüsünü bulmak için hangi uzaklık ölçüsünü kullanacağınızı belirleyebilirsiniz. Normalleştirilmiş vektör yerleştirmenin büyüklüğü (uzunluğu) tam olarak 1,0'dır.
Ayrıca, modelinizin hangi mesafe ölçüsüyle eğitildiğini biliyorsanız vektör yerleştirmeleriniz arasındaki mesafeyi hesaplamak için bu mesafe ölçüsünü kullanın.
Normalleştirilmiş veriler
Tüm vektör yerleştirmelerinin normalleştirildiği bir veri kümeniz varsa üç uzaklık ölçümünün tümü aynı semantik arama sonuçlarını sağlar. Temel olarak, her mesafe ölçüsü farklı bir değer döndürse de bu değerler aynı şekilde sıralanır. Yerleştirmeler normalleştirildiğinde dot_product genellikle hesaplama açısından en verimli yöntemdir ancak çoğu durumda fark ihmal edilebilir düzeydedir. Ancak uygulamanız performansa karşı çok hassassa dot_product, performans ayarlaması konusunda yardımcı olabilir.
Normalleştirilmemiş veriler
Vektör yerleştirmelerinin normalleştirilmediği bir veri kümeniz varsa nokta çarpımı mesafeyi ölçmediği için dot_product değerini mesafe ölçüsü olarak kullanmak matematiksel olarak doğru değildir. Yerleştirmelerin nasıl oluşturulduğuna ve hangi arama türünün tercih edildiğine bağlı olarak, cosine veya euclidean uzaklık ölçüsü, diğer uzaklık ölçülerine göre öznel olarak daha iyi arama sonuçları üretir.
Kullanım alanınız için en uygun olanı belirlemek amacıyla cosine veya euclidean ile deneme yapmanız gerekebilir.
Verilerin normalleştirilmiş veya normalleştirilmemiş olduğundan emin olmama
Verilerinizin normalleştirilip normalleştirilmediğinden emin değilseniz ve dot_product kullanmak istiyorsanız bunun yerine cosine kullanmanızı öneririz.
cosine, normalleştirme özelliği yerleşik olan dot_product işlevine benzer.
cosine kullanılarak ölçülen mesafe 0 ile 2 arasında değişir. 0 değerine yakın bir sonuç, vektörlerin çok benzer olduğunu gösterir.
Sonuçları sınırlama
limit alanını ayarlayarak sorgu tarafından döndürülen belge sayısını sınırlayabilirsiniz.
Node.js
const results = await db.pipeline()
.collection("cities")
.findNearest({
field: "embedding",
vectorValue: vector([1.5, 2.345]),
distanceMeasure: "euclidean",
limit: 10,
})
.execute();
Hesaplanmış Vektör Mesafesini Alma
Aşağıdaki örnekte gösterildiği gibi, find_nearest(...) aşamasında distance_field çıkış özelliği adı atayarak hesaplanan vektör mesafesini alabilirsiniz:
Örneğin, aşağıdaki koleksiyon için:
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])});
İstenen çıkışla distance_field vektör araması yapın:
Node.js
const results = await db.pipeline()
.collection("cities")
.findNearest({
field: "embedding",
vectorValue: vector([1.3, 2.345]),
distanceMeasure: "euclidean",
distanceField: "computedDistance",
})
.execute();
Bu işlem sonucunda aşağıdaki belgeler oluşturulur:
{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}
Sınırlamalar
Vektör yerleştirmeleriyle çalışırken aşağıdaki sınırlamaya dikkat edin:
- Desteklenen maksimum yerleştirme boyutu 2048'dir. Daha büyük dizinleri depolamak için boyut azaltma özelliğini kullanın.