توضیحات
با استفاده از distance_measure درخواستی، جستجوی برداری نزدیکترین همسایه را روی فیلد embedding داده شده انجام میدهد.
مثالها
نود جی اس
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" }));
سویفت
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();
پایتون
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() )
جاوا
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بین بردارها را اندازهگیری میکند. برای کسب اطلاعات بیشتر، به Euclidean مراجعه کنید. -
cosine: بردارها را بر اساس زاویه بین آنها مقایسه میکند که به شما امکان میدهد شباهتی را که بر اساس بزرگی بردارها نیست، اندازهگیری کنید. توصیه میکنیم به جای فاصله COSINEdot_productبا بردارهای نرمال شده واحد استفاده کنید، که از نظر ریاضی معادل با عملکرد بهتر است. برای کسب اطلاعات بیشتر به شباهت کسینوسی مراجعه کنید. -
dot_product: مشابهcosineاست اما تحت تأثیر بزرگی بردارها قرار میگیرد. برای کسب اطلاعات بیشتر، به ضرب نقطهای مراجعه کنید.
انتخاب معیار فاصله
بسته به اینکه آیا همهٔ جاسازیهای برداری شما نرمالسازی شدهاند یا خیر، میتوانید تعیین کنید که از کدام معیار فاصله برای یافتن معیار فاصله استفاده کنید. یک جاسازی برداری نرمالسازی شده دارای بزرگی (طول) دقیقاً ۱.۰ است.
علاوه بر این، اگر میدانید مدل شما با کدام معیار فاصله آموزش دیده است، از آن معیار فاصله برای محاسبه فاصله بین جاسازیهای برداری خود استفاده کنید.
دادههای نرمالشده
اگر مجموعه دادهای دارید که در آن تمام جاسازیهای برداری نرمالسازی شدهاند، هر سه معیار فاصله نتایج جستجوی معنایی یکسانی را ارائه میدهند. در اصل، اگرچه هر معیار فاصله مقدار متفاوتی را برمیگرداند، اما آن مقادیر به یک روش مرتبسازی میشوند. وقتی جاسازیها نرمالسازی میشوند، dot_product معمولاً از نظر محاسباتی کارآمدترین است، اما در بیشتر موارد تفاوت ناچیز است. با این حال، اگر برنامه شما به عملکرد بسیار حساس است، dot_product ممکن است به تنظیم عملکرد کمک کند.
دادههای غیر نرمالشده
اگر مجموعه دادهای دارید که در آن جاسازیهای برداری نرمالسازی نشدهاند، از نظر ریاضی استفاده dot_product به عنوان معیار فاصله صحیح نیست زیرا dot product فاصله را اندازهگیری نمیکند. بسته به نحوه ایجاد جاسازیها و نوع جستجوی ترجیحی، معیار فاصله cosine یا euclidean نتایج جستجویی را تولید میکند که از نظر ذهنی بهتر از سایر معیارهای فاصله هستند. آزمایش با cosine یا euclidean ممکن است برای تعیین اینکه کدام یک برای مورد استفاده شما بهتر است، ضروری باشد.
مطمئن نیستم که دادهها نرمال شدهاند یا نرمال نشدهاند
اگر مطمئن نیستید که دادههای شما نرمالسازی شدهاند یا خیر و میخواهید از dot_product استفاده کنید، توصیه میکنیم به جای آن cosine استفاده کنید. cosine مانند dot_product است که نرمالسازی در آن تعبیه شده است. فاصله اندازهگیری شده با استفاده از cosine از 0 تا 2 متغیر است. نتیجهای که نزدیک به 0 باشد نشان میدهد که بردارها بسیار شبیه به هم هستند.
محدود کردن نتایج
شما میتوانید با تنظیم فیلد limit ، تعداد اسنادی که توسط پرسوجو برگردانده میشوند را محدود کنید.
نود جی اس
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(...) بازیابی کنید، همانطور که در مثال زیر نشان داده شده است:
به عنوان مثال، برای مجموعه زیر:
نود جی اس
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 :
نود جی اس
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}
محدودیتها
هنگام کار با جاسازیهای برداری، به محدودیتهای زیر توجه داشته باشید:
- حداکثر بُعد جاسازی پشتیبانیشده ۲۰۴۸ است. برای ذخیره شاخصهای بزرگتر، از کاهش ابعاد استفاده کنید.