নিম্নলিখিত কৌশলগুলি ব্যবহার করে K- নিকটতম প্রতিবেশী (KNN) ভেক্টর অনুসন্ধানগুলি সম্পাদন করতে Cloud Firestore কীভাবে ব্যবহার করবেন তা পৃষ্ঠাটি আপনাকে দেখায়:
- ভেক্টর মান সংরক্ষণ করুন
- KNN ভেক্টর সূচক তৈরি এবং পরিচালনা করুন
- সমর্থিত ভেক্টর দূরত্ব পরিমাপগুলির একটি ব্যবহার করে একটি K-নিকটবর্তী-প্রতিবেশী (KNN) প্রশ্ন তৈরি করুন
ভেক্টর এমবেডিং সঞ্চয় করুন
আপনি আপনার Cloud Firestore ডেটা থেকে টেক্সট এম্বেডিংয়ের মতো ভেক্টর মান তৈরি করতে পারেন এবং সেগুলিকে Cloud Firestore নথিতে সংরক্ষণ করতে পারেন।
একটি ভেক্টর এমবেডিং সহ অপারেশন লিখুন
নিম্নলিখিত উদাহরণ দেখায় কিভাবে একটি Cloud Firestore নথিতে একটি ভেক্টর এমবেডিং সংরক্ষণ করতে হয়:
পাইথন
Node.js
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)
Node.js
/** * 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
ভেক্টর সূচক তৈরি এবং পরিচালনা করুন
আপনি আপনার ভেক্টর এম্বেডিংয়ের সাথে একটি নিকটতম প্রতিবেশী অনুসন্ধান সম্পাদন করার আগে, আপনাকে অবশ্যই একটি সংশ্লিষ্ট সূচক তৈরি করতে হবে। নিম্নলিখিত উদাহরণগুলি দেখায় যে কীভাবে Google Cloud CLI সাহায্যে ভেক্টর সূচী তৈরি ও পরিচালনা করতে হয়। ভেক্টর সূচীগুলি Firebase CLI এবং Terraform এর মাধ্যমেও পরিচালনা করা যেতে পারে।
একটি ভেক্টর সূচক তৈরি করুন
আপনি একটি ভেক্টর সূচক তৈরি করার আগে, 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
2048 পর্যন্ত একটি পূর্ণসংখ্যা। সূচকের ধরন অবশ্যই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
সমস্ত ভেক্টর সূচী তালিকা
জিক্লাউড
gcloud firestore indexes composite list --database=database-id
ডাটাবেসের আইডি দিয়ে database-id প্রতিস্থাপন করুন।
একটি ভেক্টর সূচক মুছুন
জিক্লাউড
gcloud firestore indexes composite delete index-id --database=database-id
কোথায়:
- index-id হল মুছে ফেলার সূচকের ID। সূচী আইডি পুনরুদ্ধার করতে
indexes composite list
ব্যবহার করুন। - database-id হল ডাটাবেসের আইডি।
একটি ভেক্টর সূচক বর্ণনা কর
জিক্লাউড
gcloud firestore indexes composite describe index-id --database=database-id
কোথায়:
- index-id বর্ণনা করার জন্য সূচকের ID। সূচক আইডি পুনরুদ্ধার করতে
indexes composite list
। - database-id হল ডাটাবেসের আইডি।
একটি নিকটতম-প্রতিবেশী প্রশ্ন করুন
আপনি একটি ভেক্টর এম্বেডিংয়ের নিকটতম প্রতিবেশীদের খুঁজে পেতে একটি মিল অনুসন্ধান করতে পারেন। সাদৃশ্য অনুসন্ধানের জন্য ভেক্টর সূচী প্রয়োজন। যদি একটি সূচক বিদ্যমান না থাকে, Cloud Firestore gcloud CLI ব্যবহার করে একটি সূচক তৈরি করার পরামর্শ দেয়।
নিম্নলিখিত উদাহরণটি অনুসন্ধান ভেক্টরের 10টি নিকটতম প্রতিবেশী খুঁজে পায়।
পাইথন
Node.js
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
: ভেক্টরগুলির মধ্যে কোণের উপর ভিত্তি করে তুলনা করে যা আপনাকে সাদৃশ্য পরিমাপ করতে দেয় যা ভেক্টরের মাত্রার উপর ভিত্তি করে নয়। আমরা 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
এর কাছাকাছি একটি ফলাফল নির্দেশ করে যে ভেক্টরগুলি খুব অনুরূপ।
প্রি-ফিল্টার নথি
নিকটতম প্রতিবেশীদের খোঁজার আগে নথিগুলি প্রাক-ফিল্টার করতে, আপনি অন্যান্য ক্যোয়ারী অপারেটরগুলির সাথে একটি মিল অনুসন্ধান একত্রিত করতে পারেন। and
এবং or
যৌগিক ফিল্টার সমর্থিত। সমর্থিত ফিল্ড ফিল্টার সম্পর্কে আরও তথ্যের জন্য, ক্যোয়ারী অপারেটর দেখুন।
পাইথন
Node.js
// 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
আউটপুট সম্পত্তির নাম বরাদ্দ করে গণনাকৃত ভেক্টর দূরত্ব পুনরুদ্ধার করতে পারেন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
পাইথন
Node.js
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
মান অন্তর্ভুক্ত করতে হবে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
পাইথন
Node.js
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
দূরত্ব থ্রেশহোল্ডকে নথিতে সীমাবদ্ধ করে যেখানে দূরত্ব নির্দিষ্ট থ্রেশহোল্ডের চেয়ে বেশি বা সমান। ভেক্টরগুলি আরও অনুরূপ হওয়ার সাথে সাথে ডট পণ্যের দূরত্ব বৃদ্ধি পায়।
নিম্নোক্ত উদাহরণটি দেখায় যে কীভাবে দূরত্বের থ্রেশহোল্ড নির্দিষ্ট করতে হয় 10টি নিকটতম নথিতে ফেরত দিতে, যা সর্বাধিক 4.5 ইউনিট দূরে EUCLIDEAN
দূরত্ব মেট্রিক ব্যবহার করে:
পাইথন
Node.js
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()); }
সীমাবদ্ধতা
আপনি ভেক্টর এম্বেডিংয়ের সাথে কাজ করার সময়, নিম্নলিখিত সীমাবদ্ধতাগুলি নোট করুন:
- সর্বাধিক সমর্থিত এমবেডিং মাত্রা হল 2048৷ বড় সূচকগুলি সংরক্ষণ করতে, মাত্রা হ্রাস ব্যবহার করুন৷
- নিকটতম-প্রতিবেশী কোয়েরি থেকে ফেরত দেওয়ার জন্য সর্বাধিক 1000 নথি।
- ভেক্টর অনুসন্ধান রিয়েল-টাইম স্ন্যাপশট শ্রোতাদের সমর্থন করে না।
- শুধুমাত্র Python, Node.js, Go, এবং Java ক্লায়েন্ট লাইব্রেরিগুলি ভেক্টর অনুসন্ধান সমর্থন করে।
এরপর কি
- Cloud Firestore জন্য সেরা অনুশীলন সম্পর্কে পড়ুন।
- স্কেলে পড়া এবং লিখতে বোঝা।