البحث عن الأقرب

الوصف

تُجري هذه الدالة عملية بحث عن أقرب جيران متّجهين في الحقل embedding المحدّد باستخدام distance_measure المطلوب.

أمثلة

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();

السلوك

قياس المسافة

تتيح مرحلة find_nearest(...) الخيارات التالية لمسافة المتّجه:

  • euclidean: تقيس euclidean المسافة بين المتجهات. لمزيد من المعلومات، يُرجى الاطّلاع على المسافة الإقليدية.
  • cosine: تقارن هذه الطريقة المتّجهات استنادًا إلى الزاوية بينها، ما يتيح لك قياس التشابه الذي لا يستند إلى مقدار المتّجهات. ننصحك باستخدام dot_product مع الخطوط المتجهة الموحّدة بدلاً من مسافة COSINE، لأنّها مكافئة رياضيًا وتوفّر أداءً أفضل. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة تشابه الجيب التمامي.
  • dot_product: مشابهة لـ cosine ولكنها تتأثر بحجم المتجهات. لمزيد من المعلومات، اطّلِع على الضرب النقطي.

اختيار مقياس المسافة

استنادًا إلى ما إذا كانت جميع تضمينات المتّجهات قد تمّت تسويتها أم لا، يمكنك تحديد مقياس المسافة الذي تريد استخدامه للعثور على مقياس المسافة. يبلغ مقدار (طول) تضمين المتّجه العادي 1.0 بالضبط.

بالإضافة إلى ذلك، إذا كنت تعرف مقياس المسافة الذي تم تدريب النموذج عليه، استخدِم مقياس المسافة هذا لاحتساب المسافة بين تضمينات المتجهات.

البيانات الموحّدة

إذا كانت لديك مجموعة بيانات تم فيها تسوية جميع عمليات تضمين المتّجهات، ستوفّر مقاييس المسافة الثلاثة النتائج نفسها للبحث الدلالي. في الأساس، على الرغم من أنّ كل مقياس مسافة يعرض قيمة مختلفة، يتم ترتيب هذه القيم بالطريقة نفسها. عندما يتم تسوية التضمينات، يكون dot_product عادةً الأكثر فعالية من الناحية الحسابية، ولكن يكون الفرق ضئيلاً في معظم الحالات. ومع ذلك، إذا كان تطبيقك يتطلّب أداءً عاليًا، قد تساعدك السمة dot_product في تحسين الأداء.

البيانات غير الموحّدة

إذا كان لديك مجموعة بيانات لا يتم فيها تسوية تضمينات المتجهات، لن يكون من الصحيح رياضيًا استخدام dot_product كمقياس للمسافة لأنّ حاصل الضرب النقطي لا يقيس المسافة. استنادًا إلى طريقة إنشاء التضمينات ونوع البحث المفضّل، يمكن أن يؤدي مقياس المسافة cosine أو euclidean إلى نتائج بحث أفضل من الناحية الموضوعية مقارنةً بمقاييس المسافة الأخرى. قد يكون من الضروري إجراء تجربة باستخدام cosine أو euclidean لتحديد الخيار الأنسب لحالة الاستخدام.

إذا لم تكن متأكدًا مما إذا كانت البيانات منمّطة أو غير منمّطة

إذا لم تكن متأكدًا مما إذا كانت بياناتك مسوّاة أم لا وكنت تريد استخدام dot_product، ننصحك باستخدام cosine بدلاً من ذلك. cosine تشبه dot_product مع تضمين ميزة التسوية. تتراوح المسافة المقاسة باستخدام cosine بين 0 و2. تشير النتيجة القريبة من 0 إلى أنّ الخطوط المتجهة متشابهة جدًا.

حصر النتائج

يمكنك الحدّ من عدد المستندات التي يعرضها طلب البحث من خلال ضبط الحقل limit.

Node.js

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

استرداد مسافة المتّجه المحسوبة

يمكنك استرداد مسافة المتّجه المحسوبة من خلال تعيين اسم لخاصية الإخراج distance_field في مرحلة find_nearest(...)، كما هو موضّح في المثال التالي:

على سبيل المثال، بالنسبة إلى المجموعة التالية:

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])});

إجراء بحث مستند إلى المتجهات باستخدام ناتج مطلوب distance_field:

Node.js

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

التي تنتج المستندات التالية:

{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}

القيود

أثناء استخدام عمليات تضمين المتجهات، يُرجى ملاحظة القيد التالي:

  • الحد الأقصى لأبعاد التضمين المسموح بها هو 2048. لتخزين فهارس أكبر، استخدِم تقنية خفض الأبعاد.