এই পৃষ্ঠাটি আপনাকে দেখাবে কিভাবে নিম্নলিখিত কৌশলগুলি ব্যবহার করে Cloud Firestore মাধ্যমে কে-নিয়ারেস্ট নেইবার (কেএনএন) ভেক্টর অনুসন্ধান করা যায়:
- ভেক্টর মান সংরক্ষণ করুন
- KNN ভেক্টর সূচক তৈরি এবং পরিচালনা করুন
- সমর্থিত ভেক্টর দূরত্ব পরিমাপগুলোর মধ্যে একটি ব্যবহার করে একটি কে-নিকটতম-প্রতিবেশী (KNN) কোয়েরি তৈরি করুন।
শুরু করার আগে
Cloud Firestore এমবেডিং সংরক্ষণ করার আগে, আপনাকে অবশ্যই ভেক্টর এমবেডিং তৈরি করতে হবে। Cloud Firestore থেকে এমবেডিং তৈরি করে না। আপনি আপনার Cloud Firestore ডেটা থেকে ভেক্টর ভ্যালু, যেমন টেক্সট এমবেডিং , তৈরি করার জন্য ভার্টেক্স এআই (Vertex AI)- এর মতো কোনো পরিষেবা ব্যবহার করতে পারেন। এরপর আপনি এই এমবেডিংগুলো আবার Cloud Firestore ডকুমেন্টে সংরক্ষণ করতে পারবেন।
এমবেডিং সম্পর্কে আরও জানতে, ‘এমবেডিং কী?’ দেখুন।
Vertex AI ব্যবহার করে কীভাবে টেক্সট এমবেডিং পাওয়া যায় তা জানতে, “Get text embeddings” দেখুন।
ভেক্টর এমবেডিং সংরক্ষণ করুন
নিম্নলিখিত উদাহরণগুলিতে দেখানো হয়েছে কিভাবে Cloud Firestore ভেক্টর এমবেডিং সংরক্ষণ করতে হয়।
ভেক্টর এমবেডিং সহ লেখার অপারেশন
নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি Cloud Firestore ডকুমেন্টে ভেক্টর এমবেডিং সংরক্ষণ করতে হয়:
পাইথন
নোড.জেএস
import { Firestore, FieldValue, } from "@google-cloud/firestore"; const db = new Firestore(); const coll = db.collection('coffee-beans'); await coll.add({ name: "Kahawa coffee beans", description: "Information about the Kahawa coffee beans.", embedding_field: FieldValue.vector([1.0 , 2.0, 3.0]) });
যান
জাভা
import com.google.cloud.firestore.CollectionReference; import com.google.cloud.firestore.DocumentReference; import com.google.cloud.firestore.FieldValue; import com.google.cloud.firestore.VectorQuery; CollectionReference coll = firestore.collection("coffee-beans"); Map<String, Object> docData = new HashMap<>(); docData.put("name", "Kahawa coffee beans"); docData.put("description", "Information about the Kahawa coffee beans."); docData.put("embedding_field", FieldValue.vector(new double[] {1.0, 2.0, 3.0})); ApiFuture<DocumentReference> future = coll.add(docData); DocumentReference documentReference = future.get();
ক্লাউড ফাংশন ব্যবহার করে ভেক্টর এমবেডিং গণনা করুন
যখনই কোনো ডকুমেন্ট আপডেট বা তৈরি করা হয়, তখন ভেক্টর এমবেডিং গণনা ও সংরক্ষণ করার জন্য আপনি একটি ক্লাউড ফাংশন সেট আপ করতে পারেন:
পাইথন
@functions_framework.cloud_event def store_embedding(cloud_event) -> None: """Triggers by a change to a Firestore document. """ firestore_payload = firestore.DocumentEventData() payload = firestore_payload._pb.ParseFromString(cloud_event.data) collection_id, doc_id = from_payload(payload) # Call a function to calculate the embedding embedding = calculate_embedding(payload) # Update the document doc = firestore_client.collection(collection_id).document(doc_id) doc.set({"embedding_field": embedding}, merge=True)
নোড.জেএস
/** * A vector embedding will be computed from the * value of the `content` field. The vector value * will be stored in the `embedding` field. The * field names `content` and `embedding` are arbitrary * field names chosen for this example. */ async function storeEmbedding(event: FirestoreEvent<any>): Promise<void> { // Get the previous value of the document's `content` field. const previousDocumentSnapshot = event.data.before as QueryDocumentSnapshot; const previousContent = previousDocumentSnapshot.get("content"); // Get the current value of the document's `content` field. const currentDocumentSnapshot = event.data.after as QueryDocumentSnapshot; const currentContent = currentDocumentSnapshot.get("content"); // Don't update the embedding if the content field did not change if (previousContent === currentContent) { return; } // Call a function to calculate the embedding for the value // of the `content` field. const embeddingVector = calculateEmbedding(currentContent); // Update the `embedding` field on the document. await currentDocumentSnapshot.ref.update({ embedding: embeddingVector, }); }
যান
// Not yet supported in the Go client library
জাভা
// Not yet supported in the Java client library
ভেক্টর সূচক তৈরি এবং পরিচালনা করুন
আপনার ভেক্টর এমবেডিং ব্যবহার করে নিকটতম প্রতিবেশী অনুসন্ধান (nearest neighbor search) করার আগে, আপনাকে অবশ্যই একটি সংশ্লিষ্ট ইনডেক্স তৈরি করতে হবে। নিম্নলিখিত উদাহরণগুলিতে দেখানো হয়েছে কিভাবে Google Cloud CLI এবং কনসোল ব্যবহার করে ভেক্টর ইনডেক্স তৈরি ও পরিচালনা করা যায়। ভেক্টর ইনডেক্স Firebase CLI এবং Terraform ব্যবহার করেও পরিচালনা করা যায়।
একটি ভেক্টর সূচক তৈরি করুন
গুগল ক্লাউড কনসোল
গুগল ক্লাউড কনসোল থেকে ম্যানুয়ালি একটি নতুন ইনডেক্স তৈরি করতে:
- গুগল ক্লাউড কনসোলে, ডেটাবেস পৃষ্ঠায় যান।
- ডাটাবেসের তালিকা থেকে প্রয়োজনীয় ডাটাবেসটি নির্বাচন করুন।
- নেভিগেশন মেনুতে, Indexes-এ ক্লিক করুন এবং তারপরে Manual ট্যাবে ক্লিক করুন।
- সূচী তৈরি করুন- এ ক্লিক করুন।
ভেক্টর অনুসন্ধানের জন্য একটি ভেক্টর ফিল্ডকে ইন্ডেক্স করতে, ‘ক্রিয়েট ভেক্টর ইন্ডেক্স’ নির্বাচন করুন।
একটি কালেকশন আইডি দিন। একটি ভেক্টর ফিল্ড পাথ এবং ভেক্টর এমবেডিং ডাইমেনশনের সংখ্যা দিন। আপনি যে অতিরিক্ত ফিল্ডগুলো ইনডেক্স করতে চান সেগুলোর নাম এবং প্রতিটি ফিল্ডের জন্য একটি ইনডেক্স মোড যোগ করুন।
সূচক সংরক্ষণ করুন- এ ক্লিক করুন।
আপনার নতুন ইনডেক্সটি ম্যানুয়াল ইনডেক্সের তালিকায় দেখা যাবে এবং Cloud Firestore আপনার ইনডেক্স তৈরি করা শুরু করবে। ইনডেক্স তৈরি হয়ে গেলে, আপনি ইনডেক্সটির পাশে একটি সবুজ টিক চিহ্ন দেখতে পাবেন।
জিক্লাউড
ভেক্টর ইনডেক্স তৈরি করার আগে, Google Cloud CLI এর সর্বশেষ সংস্করণে আপগ্রেড করুন:
gcloud components update
ভেক্টর ইনডেক্স তৈরি করতে gcloud firestore indexes composite create ব্যবহার করুন:
gcloud firestore indexes composite create \ --collection-group=collection-group \ --query-scope=COLLECTION \ --field-config field-path=vector-field,vector-config='vector-configuration' \ --database=database-id
যেখানে:
- collection-group হলো কালেকশন গ্রুপের আইডি।
- vector-field হলো সেই ফিল্ডের নাম যা ভেক্টর এমবেডিং ধারণ করে।
- database-id হলো ডাটাবেসের আইডি।
- vector-configuration ভেক্টর
dimensionএবং ইনডেক্স টাইপ অন্তর্ভুক্ত থাকে।dimension২০৪৮ পর্যন্ত একটি পূর্ণসংখ্যা। ইনডেক্স টাইপ অবশ্যইflatহতে হবে। ইনডেক্স কনফিগারেশনটি নিম্নরূপে ফর্ম্যাট করুন:{"dimension":" DIMENSION ", "flat": "{}"}।
নিম্নলিখিত উদাহরণটি একটি যৌগিক সূচক তৈরি করে, যার মধ্যে vector-field ফিল্ডের জন্য একটি ভেক্টর সূচক এবং color ফিল্ডের জন্য একটি আরোহী সূচক অন্তর্ভুক্ত রয়েছে। নিকটতম প্রতিবেশী অনুসন্ধানের আগে ডেটা প্রি-ফিল্টার করতে আপনি এই ধরনের সূচক ব্যবহার করতে পারেন।
gcloud firestore indexes composite create \ --collection-group=collection-group \ --query-scope=COLLECTION \ --field-config=order=ASCENDING,field-path="color" \ --field-config field-path=vector-field,vector-config='{"dimension":"1024", "flat": "{}"}' \ --database=database-id
সমস্ত ভেক্টর সূচক তালিকাভুক্ত করুন
গুগল ক্লাউড কনসোল
- গুগল ক্লাউড কনসোলে, ডেটাবেস পৃষ্ঠায় যান।
- ডাটাবেসের তালিকা থেকে প্রয়োজনীয় ডাটাবেসটি নির্বাচন করুন।
নেভিগেশন মেনুতে, Indexes-এ ক্লিক করুন এবং তারপরে Manual ট্যাবে ক্লিক করুন।
ইনডেক্স টেবিলে ডাটাবেসের সমস্ত ইনডেক্স তালিকাভুক্ত করা থাকে। ভেক্টর ইনডেক্সগুলোর মধ্যে একটি আইকনসহ একটি ভেক্টর ফিল্ড অন্তর্ভুক্ত থাকে।
জিক্লাউড
সমস্ত ইনডেক্সের তালিকা তৈরি করতে এবং ইনডেক্স আইডিগুলো পুনরুদ্ধার করতে:
gcloud firestore indexes composite list --database=database-id
database-id এর জায়গায় ডাটাবেসের আইডিটি বসান।
কোনো ইনডেক্স সম্পর্কে আরও বিস্তারিত তথ্য দেখতে আপনি ইনডেক্স আইডি ব্যবহার করতে পারেন:
gcloud firestore indexes composite describe index-id --database=database-id
যেখানে:
- index-id হলো বর্ণনা করার জন্য ইনডেক্সটির আইডি।
- database-id হলো ডাটাবেসের আইডি।
একটি ভেক্টর সূচক মুছুন
গুগল ক্লাউড কনসোল
- গুগল ক্লাউড কনসোলে, ডেটাবেস পৃষ্ঠায় যান।
- ডাটাবেসের তালিকা থেকে প্রয়োজনীয় ডাটাবেসটি নির্বাচন করুন।
নেভিগেশন মেনুতে, Indexes-এ ক্লিক করুন এবং তারপরে Manual ট্যাবে ক্লিক করুন।
- আপনার ম্যানুয়াল ইনডেক্সগুলোর তালিকায়, যে ইনডেক্সটি মুছতে চান সেটির জন্য 'More' বোতামে ক্লিক করুন। 'Delete'-এ ক্লিক করুন।
- অ্যালার্ট থেকে 'ডিলিট ইনডেক্স'-এ ক্লিক করে নিশ্চিত করুন যে আপনি এই ইনডেক্সটি মুছে ফেলতে চান।
জিক্লাউড
gcloud firestore indexes composite delete index-id --database=database-id
যেখানে:
- index-id হলো যে ইনডেক্সটি ডিলিট করতে হবে তার আইডি। ইনডেক্স আইডিটি পাওয়ার জন্য
indexes composite listব্যবহার করুন। - database-id হলো ডাটাবেসের আইডি।
নিকটতম-প্রতিবেশী কোয়েরি করুন
একটি ভেক্টর এমবেডিং-এর নিকটতম প্রতিবেশীদের খুঁজে বের করার জন্য আপনি সিমিলারিটি সার্চ করতে পারেন। সিমিলারিটি সার্চের জন্য ভেক্টর ইনডেক্স প্রয়োজন। যদি কোনো ইনডেক্স না থাকে, তাহলে Cloud Firestore gcloud CLI ব্যবহার করে একটি ইনডেক্স তৈরি করার পরামর্শ দেয়।
নিম্নলিখিত উদাহরণটি কোয়েরি ভেক্টরের ১০টি নিকটতম প্রতিবেশী খুঁজে বের করে।
পাইথন
নোড.জেএস
import { Firestore, FieldValue, VectorQuery, VectorQuerySnapshot, } from "@google-cloud/firestore"; // Requires a single-field vector index const vectorQuery: VectorQuery = coll.findNearest({ vectorField: 'embedding_field', queryVector: [3.0, 1.0, 2.0], limit: 10, distanceMeasure: 'EUCLIDEAN' }); const vectorQuerySnapshot: VectorQuerySnapshot = await vectorQuery.get();
যান
জাভা
import com.google.cloud.firestore.VectorQuery; import com.google.cloud.firestore.VectorQuerySnapshot; VectorQuery vectorQuery = coll.findNearest( "embedding_field", new double[] {3.0, 1.0, 2.0}, /* limit */ 10, VectorQuery.DistanceMeasure.EUCLIDEAN); ApiFuture<VectorQuerySnapshot> future = vectorQuery.get(); VectorQuerySnapshot vectorQuerySnapshot = future.get();
ভেক্টর দূরত্ব
নিকটতম-প্রতিবেশী কোয়েরিগুলো ভেক্টর দূরত্বের জন্য নিম্নলিখিত বিকল্পগুলো সমর্থন করে:
-
EUCLIDEAN: ভেক্টরগুলোর মধ্যেEUCLIDEANদূরত্ব পরিমাপ করে। আরও জানতে, ইউক্লিডিয়ান দেখুন। -
COSINE: এটি ভেক্টরগুলোর মধ্যবর্তী কোণের উপর ভিত্তি করে তাদের তুলনা করে, যার মাধ্যমে ভেক্টরের মানের উপর নির্ভর না করে সাদৃশ্য পরিমাপ করা যায়। আমরা কোসাইন দূরত্বের পরিবর্তে একক স্বাভাবিকীকৃত ভেক্টরের ক্ষেত্রেDOT_PRODUCTব্যবহার করার পরামর্শ দিই, যা গাণিতিকভাবে সমতুল্য হলেও এর কার্যকারিতা আরও ভালো। এ বিষয়ে আরও জানতে, কোসাইন সাদৃশ্য (Cosine similarity ) দেখুন। -
DOT_PRODUCT: এটিCOSINEঅনুরূপ, কিন্তু ভেক্টরগুলোর মান দ্বারা প্রভাবিত হয়। আরও জানতে, ডট প্রোডাক্ট দেখুন।
দূরত্বের পরিমাপ বেছে নিন
আপনার সমস্ত ভেক্টর এমবেডিং নর্মালাইজড কিনা, তার উপর নির্ভর করে আপনি দূরত্ব পরিমাপটি খুঁজে বের করার জন্য কোন দূরত্ব পরিমাপ ব্যবহার করবেন তা নির্ধারণ করতে পারেন। একটি নর্মালাইজড ভেক্টর এমবেডিং-এর ম্যাগনিটিউড (দৈর্ঘ্য) ঠিক ১.০ হয়।
এছাড়াও, আপনার মডেলটি কোন দূরত্ব পরিমাপক দিয়ে প্রশিক্ষিত হয়েছিল তা যদি আপনি জানেন, তবে আপনার ভেক্টর এমবেডিংগুলোর মধ্যে দূরত্ব গণনা করতে সেই দূরত্ব পরিমাপকটি ব্যবহার করুন।
স্বাভাবিককৃত ডেটা
যদি আপনার কাছে এমন একটি ডেটাসেট থাকে যেখানে সমস্ত ভেক্টর এমবেডিং নর্মালাইজড, তাহলে তিনটি ডিসট্যান্স মেজারই একই সিমান্টিক সার্চ রেজাল্ট প্রদান করে। মূলত, যদিও প্রতিটি ডিসট্যান্স মেজার একটি ভিন্ন মান রিটার্ন করে, সেই মানগুলো একই ক্রমে সাজানো হয়। এমবেডিংগুলো নর্মালাইজড হলে, DOT_PRODUCT সাধারণত সবচেয়ে বেশি কম্পিউটেশনালি এফিশিয়েন্ট হয়, কিন্তু বেশিরভাগ ক্ষেত্রে পার্থক্যটি নগণ্য। তবে, যদি আপনার অ্যাপ্লিকেশনটি পারফরম্যান্সের প্রতি অত্যন্ত সংবেদনশীল হয়, তাহলে পারফরম্যান্স টিউনিং-এর জন্য DOT_PRODUCT সহায়ক হতে পারে।
অ-স্বাভাবিকীকৃত ডেটা
যদি আপনার কাছে এমন কোনো ডেটাসেট থাকে যেখানে ভেক্টর এমবেডিংগুলো নর্মালাইজড নয়, তাহলে দূরত্বের পরিমাপক হিসেবে DOT_PRODUCT ব্যবহার করা গাণিতিকভাবে সঠিক নয়, কারণ ডট প্রোডাক্ট দূরত্ব পরিমাপ করে না। এমবেডিংগুলো কীভাবে তৈরি করা হয়েছে এবং কোন ধরনের সার্চ পছন্দ করা হচ্ছে, তার উপর নির্ভর করে COSINE বা EUCLIDEAN দূরত্বের পরিমাপকগুলো অন্যান্য দূরত্বের পরিমাপকগুলোর তুলনায় বিষয়গতভাবে ভালো সার্চ ফলাফল প্রদান করে। আপনার ব্যবহারের ক্ষেত্রে কোনটি সবচেয়ে ভালো, তা নির্ধারণ করার জন্য COSINE বা EUCLIDEAN নিয়ে পরীক্ষা-নিরীক্ষা করার প্রয়োজন হতে পারে।
ডেটা নর্মালাইজড নাকি নন-নর্মালাইজড তা নিশ্চিত নই।
আপনার ডেটা নর্মালাইজড কিনা সে বিষয়ে আপনি অনিশ্চিত থাকলে এবং DOT_PRODUCT ব্যবহার করতে চাইলে, আমরা আপনাকে এর পরিবর্তে COSINE ব্যবহার করার পরামর্শ দিই। COSINE হলো DOT_PRODUCT মতোই, তবে এতে নর্মালাইজেশন অন্তর্নির্মিত থাকে। COSINE ব্যবহার করে পরিমাপ করা দূরত্বের মান 0 থেকে 2 পর্যন্ত হয়ে থাকে। 0 এর কাছাকাছি ফলাফল নির্দেশ করে যে ভেক্টরগুলো খুব সাদৃশ্যপূর্ণ।
প্রি-ফিল্টার ডকুমেন্ট
নিকটতম প্রতিবেশী খোঁজার আগে ডকুমেন্টগুলো প্রি-ফিল্টার করতে, আপনি অন্যান্য কোয়েরি অপারেটরের সাথে সিমিলারিটি সার্চ একত্রিত করতে পারেন। 'and and ' or কম্পোজিট ফিল্টারগুলো সমর্থিত। সমর্থিত ফিল্ড ফিল্টার সম্পর্কে আরও তথ্যের জন্য, কোয়েরি অপারেটরসমূহ দেখুন।
পাইথন
নোড.জেএস
// Similarity search with pre-filter // Requires composite vector index const preFilteredVectorQuery: VectorQuery = coll .where("color", "==", "red") .findNearest({ vectorField: "embedding_field", queryVector: [3.0, 1.0, 2.0], limit: 5, distanceMeasure: "EUCLIDEAN", }); const vectorQueryResults = await preFilteredVectorQuery.get();
যান
জাভা
import com.google.cloud.firestore.VectorQuery; import com.google.cloud.firestore.VectorQuerySnapshot; VectorQuery preFilteredVectorQuery = coll .whereEqualTo("color", "red") .findNearest( "embedding_field", new double[] {3.0, 1.0, 2.0}, /* limit */ 10, VectorQuery.DistanceMeasure.EUCLIDEAN); ApiFuture<VectorQuerySnapshot> future = preFilteredVectorQuery.get(); VectorQuerySnapshot vectorQuerySnapshot = future.get();
গণনাকৃত ভেক্টর দূরত্ব পুনরুদ্ধার করুন
নিম্নলিখিত উদাহরণে দেখানো অনুযায়ী, FindNearest কোয়েরিতে distance_result_field আউটপুট প্রপার্টির নাম নির্ধারণ করে আপনি গণনা করা ভেক্টর দূরত্বটি পুনরুদ্ধার করতে পারেন:
পাইথন
নোড.জেএস
const vectorQuery: VectorQuery = coll.findNearest( { vectorField: 'embedding_field', queryVector: [3.0, 1.0, 2.0], limit: 10, distanceMeasure: 'EUCLIDEAN', distanceResultField: 'vector_distance' }); const snapshot: VectorQuerySnapshot = await vectorQuery.get(); snapshot.forEach((doc) => { console.log(doc.id, ' Distance: ', doc.get('vector_distance')); });
যান
জাভা
import com.google.cloud.firestore.VectorQuery; import com.google.cloud.firestore.VectorQueryOptions; import com.google.cloud.firestore.VectorQuerySnapshot; VectorQuery vectorQuery = coll.findNearest( "embedding_field", new double[] {3.0, 1.0, 2.0}, /* limit */ 10, VectorQuery.DistanceMeasure.EUCLIDEAN, VectorQueryOptions.newBuilder().setDistanceResultField("vector_distance").build()); ApiFuture<VectorQuerySnapshot> future = vectorQuery.get(); VectorQuerySnapshot vectorQuerySnapshot = future.get(); for (DocumentSnapshot document : vectorQuerySnapshot.getDocuments()) { System.out.println(document.getId() + " Distance: " + document.get("vector_distance")); }
যদি আপনি distanceResultField এর সাথে ডকুমেন্টের ফিল্ডগুলোর একটি উপসেট ফেরত দেওয়ার জন্য ফিল্ড মাস্ক ব্যবহার করতে চান, তাহলে আপনাকে অবশ্যই ফিল্ড মাস্কে distanceResultField এর মানটিও অন্তর্ভুক্ত করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
পাইথন
নোড.জেএস
const vectorQuery: VectorQuery = coll .select('name', 'description', 'vector_distance') .findNearest({ vectorField: 'embedding_field', queryVector: [3.0, 1.0, 2.0], limit: 10, distanceMeasure: 'EUCLIDEAN', distanceResultField: 'vector_distance' });
যান
জাভা
import com.google.cloud.firestore.VectorQuery; import com.google.cloud.firestore.VectorQueryOptions; import com.google.cloud.firestore.VectorQuerySnapshot; VectorQuery vectorQuery = coll .select("name", "description", "vector_distance") .findNearest( "embedding_field", new double[] {3.0, 1.0, 2.0}, /* limit */ 10, VectorQuery.DistanceMeasure.EUCLIDEAN, VectorQueryOptions.newBuilder() .setDistanceResultField("vector_distance") .build()); ApiFuture<VectorQuerySnapshot> future = vectorQuery.get(); VectorQuerySnapshot vectorQuerySnapshot = future.get(); for (DocumentSnapshot document : vectorQuerySnapshot.getDocuments()) { System.out.println(document.getId() + " Distance: " + document.get("vector_distance")); }
একটি দূরত্বের সীমা নির্দিষ্ট করুন
আপনি একটি সাদৃশ্য সীমা নির্দিষ্ট করতে পারেন যা শুধুমাত্র সেই সীমার মধ্যে থাকা ডকুমেন্টগুলো ফেরত দেবে। থ্রেশহোল্ড ফিল্ডের আচরণ আপনার নির্বাচিত দূরত্বের পরিমাপের উপর নির্ভর করে:
-
EUCLIDEANএবংCOSINEদূরত্ব সেইসব ডকুমেন্টের জন্য থ্রেশহোল্ডকে সীমাবদ্ধ করে, যেখানে দূরত্ব নির্দিষ্ট থ্রেশহোল্ডের চেয়ে কম বা সমান। ভেক্টরগুলো যত বেশি সাদৃশ্যপূর্ণ হয়, এই দূরত্বের পরিমাপ তত হ্রাস পায়। -
DOT_PRODUCTদূরত্ব সেইসব ডকুমেন্টের মধ্যে থ্রেশহোল্ডকে সীমাবদ্ধ করে, যেখানে দূরত্ব নির্দিষ্ট থ্রেশহোল্ডের চেয়ে বেশি বা সমান। ভেক্টরগুলো যত বেশি সাদৃশ্যপূর্ণ হয়, ডট প্রোডাক্ট দূরত্ব তত বাড়তে থাকে।
নিম্নলিখিত উদাহরণটি দেখায় কিভাবে EUCLIDEAN দূরত্ব মেট্রিক ব্যবহার করে একটি দূরত্বের থ্রেশহোল্ড নির্দিষ্ট করতে হয়, যার মাধ্যমে সর্বাধিক ৪.৫ ইউনিট দূরে অবস্থিত ১০টি নিকটতম ডকুমেন্ট ফেরত পাওয়া যাবে:
পাইথন
নোড.জেএস
const vectorQuery: VectorQuery = coll.findNearest({ vectorField: 'embedding_field', queryVector: [3.0, 1.0, 2.0], limit: 10, distanceMeasure: 'EUCLIDEAN', distanceThreshold: 4.5 }); const snapshot: VectorQuerySnapshot = await vectorQuery.get(); snapshot.forEach((doc) => { console.log(doc.id); });
যান
জাভা
import com.google.cloud.firestore.VectorQuery; import com.google.cloud.firestore.VectorQueryOptions; import com.google.cloud.firestore.VectorQuerySnapshot; VectorQuery vectorQuery = coll.findNearest( "embedding_field", new double[] {3.0, 1.0, 2.0}, /* limit */ 10, VectorQuery.DistanceMeasure.EUCLIDEAN, VectorQueryOptions.newBuilder() .setDistanceThreshold(4.5) .build()); ApiFuture<VectorQuerySnapshot> future = vectorQuery.get(); VectorQuerySnapshot vectorQuerySnapshot = future.get(); for (DocumentSnapshot document : vectorQuerySnapshot.getDocuments()) { System.out.println(document.getId()); }
সীমাবদ্ধতা
ভেক্টর এমবেডিং নিয়ে কাজ করার সময় নিম্নলিখিত সীমাবদ্ধতাগুলো লক্ষ্য করুন:
- সর্বোচ্চ সমর্থিত এমবেডিং ডাইমেনশন হলো ২০৪৮। এর চেয়ে বড় ইনডেক্স সংরক্ষণ করতে ডাইমেনশনালিটি রিডাকশন ব্যবহার করুন।
- নিকটতম-প্রতিবেশী কোয়েরি থেকে ফেরত আসা ডকুমেন্টের সর্বোচ্চ সংখ্যা হল ১০০০।
- ভেক্টর সার্চ রিয়েল-টাইম স্ন্যাপশট লিসেনার সমর্থন করে না।
- শুধুমাত্র পাইথন, নোড.জেএস, গো এবং জাভা ক্লায়েন্ট লাইব্রেরিগুলো ভেক্টর সার্চ সমর্থন করে।
এরপর কী?
- Cloud Firestore সেরা অনুশীলনগুলো সম্পর্কে পড়ুন।
- বৃহৎ পরিসরে পঠন ও লিখন বোঝা।