En yakın

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ındaki euclidean uzaklığı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örlerle dot_product kullanmanızı öneririz. Daha fazla bilgi için Kosinüs benzerliği başlıklı makaleyi inceleyin.
  • dot_product: cosine değ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.