বর্ণনা
অনুরোধকৃত 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দূরত্ব পরিমাপ করে। আরও জানতে, ইউক্লিডিয়ান দেখুন। -
cosine: ভেক্টরগুলোর মধ্যবর্তী কোণের উপর ভিত্তি করে তাদের তুলনা করে, যা আপনাকে ভেক্টরের মানের উপর নির্ভর না করে সাদৃশ্য পরিমাপ করতে দেয়। আমরা কোসাইন দূরত্বের পরিবর্তে একক স্বাভাবিকীকৃত ভেক্টরের সাথেdot_productব্যবহার করার পরামর্শ দিই, যা গাণিতিকভাবে সমতুল্য কিন্তু আরও ভালো পারফরম্যান্স দেয়। আরও জানতে কোসাইন সাদৃশ্য দেখুন। -
dot_product: এটিcosineঅনুরূপ, কিন্তু ভেক্টরগুলোর মান দ্বারা প্রভাবিত হয়। আরও জানতে, ডট প্রোডাক্ট দেখুন।
দূরত্বের পরিমাপ বেছে নিন
আপনার সমস্ত ভেক্টর এমবেডিং নর্মালাইজড কিনা, তার উপর নির্ভর করে আপনি দূরত্ব পরিমাপটি খুঁজে বের করার জন্য কোন দূরত্ব পরিমাপ ব্যবহার করবেন তা নির্ধারণ করতে পারেন। একটি নর্মালাইজড ভেক্টর এমবেডিং-এর ম্যাগনিটিউড (দৈর্ঘ্য) ঠিক ১.০ হয়।
এছাড়াও, আপনার মডেলটি কোন দূরত্ব পরিমাপক দিয়ে প্রশিক্ষিত হয়েছিল তা যদি আপনি জানেন, তবে আপনার ভেক্টর এমবেডিংগুলোর মধ্যে দূরত্ব গণনা করতে সেই দূরত্ব পরিমাপকটি ব্যবহার করুন।
স্বাভাবিককৃত ডেটা
যদি আপনার কাছে এমন একটি ডেটাসেট থাকে যেখানে সমস্ত ভেক্টর এমবেডিং নর্মালাইজড, তাহলে তিনটি ডিসট্যান্স মেজারই একই সিমান্টিক সার্চ রেজাল্ট প্রদান করে। মূলত, যদিও প্রতিটি ডিসট্যান্স মেজার একটি ভিন্ন মান রিটার্ন করে, সেই মানগুলো একই ক্রমে সাজানো হয়। এমবেডিংগুলো নর্মালাইজড হলে, 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();
গণনাকৃত ভেক্টর দূরত্ব পুনরুদ্ধার করা
নিম্নলিখিত উদাহরণে দেখানো অনুযায়ী, find_nearest(...) ধাপে distance_field আউটপুট প্রপার্টির নাম নির্ধারণ করে আপনি গণনা করা ভেক্টর দূরত্বটি পুনরুদ্ধার করতে পারেন:
উদাহরণস্বরূপ, নিম্নলিখিত সংগ্রহটির জন্য:
নোড.জেএস
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}
সীমাবদ্ধতা
ভেক্টর এমবেডিং নিয়ে কাজ করার সময় নিম্নলিখিত সীমাবদ্ধতাটি লক্ষ্য করুন:
- সর্বোচ্চ সমর্থিত এমবেডিং ডাইমেনশন হলো ২০৪৮। এর চেয়ে বড় ইনডেক্স সংরক্ষণ করতে ডাইমেনশনালিটি রিডাকশন ব্যবহার করুন।