ভেক্টর এমবেডিং দিয়ে অনুসন্ধান করুন

এই কৌশলগুলি ব্যবহার করে K- নিকটতম প্রতিবেশী (KNN) ভেক্টর অনুসন্ধানগুলি সম্পাদন করতে ক্লাউড ফায়ারস্টোর কীভাবে ব্যবহার করবেন তা পৃষ্ঠাটি আপনাকে দেখায়:

  • ভেক্টর মান সংরক্ষণ করুন
  • KNN ভেক্টর সূচক তৈরি এবং পরিচালনা করুন
  • সমর্থিত ভেক্টর দূরত্ব ফাংশনগুলির একটি ব্যবহার করে একটি K-নিকটবর্তী-প্রতিবেশী (KNN) কোয়েরি তৈরি করুন

ভেক্টর এমবেডিং সঞ্চয় করুন

আপনি আপনার ক্লাউড ফায়ারস্টোর ডেটা থেকে টেক্সট এম্বেডিংয়ের মতো ভেক্টর মান তৈরি করতে পারেন এবং সেগুলিকে ক্লাউড ফায়ারস্টোর নথিতে সংরক্ষণ করতে পারেন।

একটি ভেক্টর এমবেডিং সহ অপারেশন লিখুন

নিম্নলিখিত উদাহরণ দেখায় কিভাবে একটি ক্লাউড ফায়ারস্টোর নথিতে একটি ভেক্টর এমবেডিং সংরক্ষণ করতে হয়:

পাইথন
from google.cloud import firestore
from google.cloud.firestore_v1.vector import Vector

collection = firestore_client.collection("coffee-beans")
doc = {
  "name": "Kahawa coffee beans"
  "description": "Information about the Kahawa coffee beans."
  "embedding_field": Vector([1.0 , 2.0, 3.0])
}

collection.add(doc)
    
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])
});
    

একটি ক্লাউড ফাংশন সহ ভেক্টর এম্বেডিং গণনা করুন

যখনই একটি নথি আপডেট বা তৈরি করা হয় তখন ভেক্টর এমবেডিংগুলি গণনা করতে এবং সঞ্চয় করতে, আপনি একটি ক্লাউড ফাংশন সেট আপ করতে পারেন:

পাইথন
@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,
  });
}
    

ভেক্টর সূচক তৈরি এবং পরিচালনা করুন

আপনি আপনার ভেক্টর এম্বেডিংয়ের সাথে একটি নিকটতম প্রতিবেশী অনুসন্ধান সম্পাদন করার আগে, আপনাকে অবশ্যই একটি সংশ্লিষ্ট সূচক তৈরি করতে হবে। নিম্নলিখিত উদাহরণগুলি দেখায় কিভাবে ভেক্টর সূচী তৈরি এবং পরিচালনা করতে হয়।

একটি একক-ক্ষেত্র ভেক্টর সূচক তৈরি করুন

একটি একক-ক্ষেত্র ভেক্টর সূচক তৈরি করতে, ব্যবহার করুন gcloud alpha firestore indexes composite create :

জিক্লাউড
gcloud alpha 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": "{}"}

একটি যৌগিক ভেক্টর সূচক তৈরি করুন

নিম্নলিখিত উদাহরণটি ক্ষেত্রের color এবং একটি ভেক্টর এমবেডিং ক্ষেত্রের জন্য একটি যৌগিক ভেক্টর সূচক তৈরি করে।

জিক্লাউড
gcloud alpha firestore indexes composite create \
--collection-group=collection-group \
--query-scope=COLLECTION \
--field-config=order=ASCENDING,field-path="color" \
--field-config field-path=field,vector-config='{"dimension":"1024", "flat": "{}"}' \
--database=database-id
    

সমস্ত ভেক্টর সূচী তালিকা

জিক্লাউড
gcloud alpha firestore indexes composite list --database=database-id

ডাটাবেসের আইডি দিয়ে database-id প্রতিস্থাপন করুন।

একটি ভেক্টর সূচক মুছুন

জিক্লাউড
gcloud alpha firestore indexes composite delete index-id --database=database-id
    

কোথায়:

  • index-id হল মুছে ফেলার সূচকের ID। সূচী আইডি পুনরুদ্ধার করতে indexes composite list ব্যবহার করুন।
  • database-id হল ডাটাবেসের আইডি।

একটি ভেক্টর সূচক বর্ণনা কর

জিক্লাউড
gcloud alpha firestore indexes composite describe index-id --database=database-id
    

কোথায়:

  • index-id বর্ণনা করার জন্য সূচকের ID। সূচক আইডি পুনরুদ্ধার করতে indexes composite list
  • database-id হল ডাটাবেসের আইডি।

একটি নিকটতম-প্রতিবেশী প্রশ্ন করুন

আপনি একটি ভেক্টর এম্বেডিংয়ের নিকটতম প্রতিবেশীদের খুঁজে পেতে একটি মিল অনুসন্ধান করতে পারেন। সাদৃশ্য অনুসন্ধানের জন্য ভেক্টর সূচী প্রয়োজন। যদি একটি সূচক বিদ্যমান না থাকে, ক্লাউড ফায়ারস্টোর gCloud CLI ব্যবহার করে একটি সূচক তৈরি করার পরামর্শ দেয়।

পাইথন
from google.cloud.firestore_v1.base_vector_query import DistanceMeasure

collection = collection("coffee-beans")

// Requires vector index
collection.find_nearest(
   vector_field="embedding_field",
   query_vector=Vector([3.0, 1.0, 2.0]),
   distance_measure=DistanceMeasure.EUCLIDEAN,
   limit=5)
    
Node.js
import {
  Firestore,
  FieldValue,
  VectorQuery,
  VectorQuerySnapshot,
} from "@google-cloud/firestore";

// Requires single-field vector index
const vectorQuery: VectorQuery = coll.findNearest('embedding_field', FieldValue.vector([3.0, 1.0, 2.0]), {
  limit: 5,
  distanceMeasure: 'EUCLIDEAN'
});

const vectorQuerySnapshot: VectorQuerySnapshot = await vectorQuery.get();
    

ভেক্টর দূরত্ব

নিকটতম-প্রতিবেশী প্রশ্নগুলি ভেক্টর দূরত্বের জন্য নিম্নলিখিত বিকল্পগুলিকে সমর্থন করে:

  • EUCLIDEAN : ভেক্টরের মধ্যে EUCLIDEAN দূরত্ব পরিমাপ করে। আরও জানতে, ইউক্লিডিয়ান দেখুন।
  • COSINE : ভেক্টরগুলির মধ্যে কোণের উপর ভিত্তি করে তুলনা করে যা আপনাকে সাদৃশ্য পরিমাপ করতে দেয় যা ভেক্টরের মাত্রার উপর ভিত্তি করে নয়। আমরা COSINE দূরত্বের পরিবর্তে ইউনিট স্বাভাবিক ভেক্টর সহ DOT_PRODUCT ব্যবহার করার পরামর্শ দিই, যা গাণিতিকভাবে আরও ভাল পারফরম্যান্সের সমতুল্য। আরও জানতে Cosine সাদৃশ্য দেখুন আরও জানতে।
  • DOT_PRODUCT : COSINE এর মতো কিন্তু ভেক্টরের মাত্রার দ্বারা প্রভাবিত হয়। আরও জানতে, ডট পণ্য দেখুন।

প্রাক-ফিল্টার ডেটা

নিকটতম প্রতিবেশীদের খুঁজে বের করার আগে ডেটা প্রাক-ফিল্টার করতে, আপনি অসমতা ফিল্টার ছাড়া অন্যান্য ফিল্টারের সাথে একটি মিল অনুসন্ধান একত্রিত করতে পারেন। and এবং or যৌগিক ফিল্টার সমর্থিত। ফিল্ড ফিল্টারগুলির জন্য, নিম্নলিখিত ফিল্টারগুলি সমর্থিত:

  • == সমান
  • in
  • array_contains
  • array_contains_any
পাইথন
// Similarity search with pre-filter
// Requires composite vector index
collection.where("color", "==", "red").find_nearest(
   vector_field="embedding_field",
   query_vector=Vector([3.0, 1.0, 2.0]),
   distance_measure=DistanceMeasure.EUCLIDEAN,
   limit=5)
    
Node.js
// Similarity search with pre-filter
// Requires composite vector index
const preFilteredVectorQuery: VectorQuery = coll
  .where("color", "==", "red")
  .findNearest("embedding_field", FieldValue.vector([3.0, 1.0, 2.0]), {
    limit: 5,
    distanceMeasure: "EUCLIDEAN",
  });

vectorQueryResults = await preFilteredVectorQuery.get();
    

সীমাবদ্ধতা

আপনি ভেক্টর এম্বেডিংয়ের সাথে কাজ করার সময়, নিম্নলিখিত সীমাবদ্ধতাগুলি নোট করুন:

  • সর্বাধিক সমর্থিত এমবেডিং মাত্রা হল 2048৷ বড় সূচকগুলি সঞ্চয় করতে, মাত্রা হ্রাস ব্যবহার করুন৷
  • নিকটতম-প্রতিবেশী কোয়েরি থেকে ফেরত দেওয়ার জন্য নথির সর্বাধিক সংখ্যা 1000।
  • ভেক্টর অনুসন্ধান রিয়েল-টাইম স্ন্যাপশট শ্রোতাদের সমর্থন করে না।
  • ডেটা প্রাক-ফিল্টার করতে আপনি অসমতা ফিল্টার ব্যবহার করতে পারবেন না।
  • শুধুমাত্র Python এবং Node.js ক্লায়েন্ট লাইব্রেরি ভেক্টর অনুসন্ধান সমর্থন করে।

এরপর কি