Vertex AI এর সাথে ভেক্টর সাদৃশ্য অনুসন্ধান করুন

Firebase Data Connect এর ভেক্টর সাদৃশ্য অনুসন্ধানে আপনাকে স্বাগতম — Firebase এর সিমান্টিক অনুসন্ধানের বাস্তবায়ন যা Google Vertex AI এর সাথে একীভূত হয়।

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

এই শক্তিশালী শব্দার্থিক অনুসন্ধান সুপারিশ ইঞ্জিন এবং অনুসন্ধান ইঞ্জিনের মতো ব্যবহারের ক্ষেত্রেও কাজ করতে পারে। এটি জেনারেটিভ এআই প্রবাহে পুনরুদ্ধার-বর্ধিত জেনারেশনের একটি মূল উপাদান। ভার্টেক্স এআই ডকুমেন্টেশন আরও জানার জন্য একটি দুর্দান্ত জায়গা।

আপনি Vertex AI এর Embeddings API ব্যবহার করে স্বয়ংক্রিয়ভাবে ভেক্টর এম্বেডিং তৈরির জন্য Data Connect এর অন্তর্নির্মিত সহায়তার উপর নির্ভর করতে পারেন, অথবা ম্যানুয়ালি জেনারেট করার জন্য সেই API ব্যবহার করতে পারেন।

পূর্বশর্ত

  • আপনার প্রকল্পের জন্য ডেটা কানেক্ট সেট আপ করুন

  • Vertex AI API গুলি সক্ষম করুন।

সেটআপ

আপনি স্থানীয় ডেভেলপমেন্ট ফ্লো (যদি আপনি ওয়েব, কোটলিন অ্যান্ড্রয়েড, অথবা iOS ডেভেলপার হন) অথবা একটি IDX ফ্লো (ওয়েব ডেভেলপারদের জন্য) এর মধ্যে একটি বেছে নিতে পারেন। ডেভেলপমেন্টের জন্য আপনি একটি স্থানীয় ডাটাবেস অথবা আপনার প্রোডাকশন Data Connect প্রজেক্ট এবং এর ক্লাউড SQL for PostgreSQL ইনস্ট্যান্স ব্যবহার করতে পারেন।

এই নির্দেশাবলী ধরে নিচ্ছে যে আপনি কুইকস্টার্ট নির্দেশিকা অনুসরণ করে আপনার Data Connect প্রকল্প তৈরি করেছেন।

স্থানীয় PostgreSQL এর সাথে একীভূত করুন

  1. একটি স্থানীয় PostgreSQL ইনস্ট্যান্স সেট আপ করুন।
  2. নিজেকে Vertex AI ব্যবহারকারী IAM ভূমিকা দিন
  3. আপনার পরিবেশে গুগল ক্লাউড অ্যাপ্লিকেশন ডিফল্ট শংসাপত্র সেট আপ করুন।
  4. আপনার স্থানীয় PostgreSQL ইনস্ট্যান্সে pgvector এক্সটেনশনটি ইনস্টল করুন।
  5. pgvector রিপোজিটরি নির্দেশাবলী অনুসারে CREATE EXTENSION vector ব্যবহার করে এক্সটেনশনটি সক্ষম করুন।

IDX এর সাথে একীভূত করুন

  1. ডেটা কানেক্ট টেমপ্লেট ব্যবহার করে আপনার IDX ওয়ার্কস্পেস সেট আপ করুন।
  2. নিজেকে Vertex AI ব্যবহারকারী IAM ভূমিকা দিন
  3. pgvector রিপোজিটরি নির্দেশাবলী অনুসারে CREATE EXTENSION vector ব্যবহার করে এক্সটেনশনটি সক্ষম করুন।

আপনার স্কিমা ডিজাইন করুন

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

type Movie @table {
 id: ID! @col(name: "movie_id") @default(id: ID! @col(name: "movie_id") @default(expr: "uuidV4()")
 title: String!
 description: String
 descriptionEmbedding: Vector! @col(size:768)
 // ...
}

এম্বেডিং তৈরি করুন এবং পুনরুদ্ধার করুন

Data Connect _embed সার্ভার ভ্যালুর সাথে ভেক্টর এম্বেডিংয়ের জন্য ইন্টিগ্রেটেড সাপোর্ট নিয়ে আসে। এটি Data Connect Vertex AI এর এম্বেডিং API গুলিকে অভ্যন্তরীণভাবে কল করে ভেক্টর এম্বেডিং তৈরি করতে নির্দেশ দেয়। _embed সার্ভার ভ্যালু মিউটেশন এবং কোয়েরি উভয় ক্ষেত্রেই ব্যবহার করা যেতে পারে।

মিউটেশন

Data Connect মাধ্যমে একটি এম্বেডিং তৈরি এবং সংরক্ষণ করুন

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

mutation createMovie($title: String!, $description: String!) {
  movie_insert(data: {
    title: $title,
    description: $description,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
  })
}

কিছু ক্ষেত্রে, আপনি সিনেমার বিবরণ এবং এম্বেডিং আপডেট করতে চাইতে পারেন।

mutation updateDescription($id: String!, $description: String!) {
  movie_update(id: $id, data: {
    description: $description,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
  })
}

ক্লায়েন্টের কাছ থেকে পরবর্তী মিউটেশনটি কল করতে:

import { updateMovieDescription } from 'lib/dataconnect-sdk/';

await updateMovieDescription({ id: movieId, description: description});

// Use the response

প্রশ্ন

নিচের মতো কোয়েরি ব্যবহার করে ভেক্টর এম্বেডিং আনুন। মনে রাখবেন যে কোয়েরি দ্বারা ফেরত দেওয়া descriptionEmbedding হল ফ্লোটের একটি অ্যারে, যা সাধারণত মানুষের পঠনযোগ্য নয়। অতএব, Data Connect জেনারেটেড SDK গুলি এটি সরাসরি ফেরত দেওয়া সমর্থন করে না।

পরবর্তী বিভাগে বর্ণিত হিসাবে, আপনি সাদৃশ্য অনুসন্ধান করতে রিটার্নড ভেক্টর এম্বেডিং ব্যবহার করতে পারেন।

query getMovieDescription($id: String!) @auth(level: PUBLIC) {
 movie(id: $id)
   id
   description
   descriptionEmbedding
}

সাদৃশ্য অনুসন্ধান করুন

এখন আমরা সাদৃশ্য অনুসন্ধান করতে পারি।

প্রতিটি Vector ক্ষেত্রের জন্য, Data Connect একটি GraphQL ফাংশন তৈরি করে যা সাদৃশ্য অনুসন্ধান বাস্তবায়ন করে। এই তৈরি ফাংশনটির নাম হল ${pluralType}_${vectorFieldName}_similarity । এটি নিম্নলিখিত উদাহরণ এবং রেফারেন্স তালিকায় দেখানো কয়েকটি প্যারামিটার সমর্থন করে।

আপনি একটি GraphQL ফাংশন সংজ্ঞায়িত করতে পারেন যা সাদৃশ্য অনুসন্ধানকে আহ্বান করে। উপরে উল্লিখিত হিসাবে, _embed সার্ভার মান Data Connect Vertex AI এর Embedding API ব্যবহার করে ভেক্টর এম্বেডিং তৈরি করতে নির্দেশ দেয়, এই ক্ষেত্রে সিনেমার বর্ণনা এম্বেডিংয়ের সাথে তুলনা করার জন্য ব্যবহৃত অনুসন্ধান স্ট্রিংয়ের জন্য এম্বেডিং তৈরি করতে।

এই উদাহরণে, সাদৃশ্য অনুসন্ধানে সর্বাধিক ৫টি সিনেমা দেখা যাবে যার বর্ণনা ইনপুট কোয়েরির শব্দার্থগতভাবে সবচেয়ে কাছাকাছি। ফলাফল সেটটি দূরত্বের ঊর্ধ্বক্রম অনুসারে সাজানো হয়েছে - সবচেয়ে দূরবর্তী স্থানের কাছাকাছি।

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "textembedding-gecko@003", text: $query},
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
      }
  }

সাদৃশ্য কোয়েরি টিউন করুন

বেশিরভাগ ব্যবহারের ক্ষেত্রেই সার্চ প্যারামিটারের ডিফল্ট মান যেমন method এবং within ভালোভাবে কাজ করে। তবে, যদি আপনি লক্ষ্য করেন যে আপনার কোয়েরি এমন ফলাফল প্রদান করে যা খুব বেশি ভিন্ন, অথবা আপনি যে ফলাফলগুলি অন্তর্ভুক্ত করতে চান তা অনুপস্থিত, তাহলে এই প্যারামিটারগুলি টিউন করার চেষ্টা করুন।

within জন্য একটি উপযুক্ত মান খুঁজে পেতে, আমরা নির্বাচিত ক্ষেত্রগুলিতে _metadata.distance যোগ করতে পারি যাতে প্রতিটি ফলাফল কোয়েরি ভেক্টর থেকে কত দূরে তা দেখতে পারি। ফিরে আসা distance মানের উপর ভিত্তি করে, আমরা within প্যারামিটার সেট করতে পারি; শুধুমাত্র within এর মানের চেয়ে কম দূরত্বের ফলাফল অন্তর্ভুক্ত করা হবে:

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "textembedding-gecko@003", text: $query},
      within: 2,
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
        _metadata {
          distance
        }
      }
  }

আপনি method প্যারামিটার সেট করে বিভিন্ন দূরত্ব ফাংশন নিয়েও পরীক্ষা করতে পারেন।

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "textembedding-gecko@003", text: $query},
      within: .5,
      method: COSINE,
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
        _metadata {
          distance
        }
      }
  }

মনে রাখবেন যে বিভিন্ন পদ্ধতি দূরত্বের জন্য খুব আলাদা মান প্রদান করে: যদি আপনি within সেট করে থাকেন, তাহলে method পরিবর্তন করার পরে আপনাকে আবার সেই মানটি টিউন করতে হবে।

সাদৃশ্য কোয়েরিটি কল করুন

ক্লায়েন্ট কোড থেকে একটি সাদৃশ্য অনুসন্ধান কল করতে:

import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

কাস্টম এম্বেডিং ব্যবহার করুন

Data Connect আপনাকে _embed সার্ভার মান ব্যবহার করে তৈরি করার পরিবর্তে সরাসরি Vector হিসাবে এম্বেডিংগুলির সাথে কাজ করতে দেয়।

একটি কাস্টম এম্বেডিং সংরক্ষণ করুন

Vertex Embeddings API ব্যবহার করে, একটি মিলে যাওয়া মডেল নির্দিষ্ট করুন এবং সঠিক মাত্রার এম্বেডিং ফলাফলের অনুরোধ করুন।

তারপর, স্টোরেজের জন্য আপডেট অপারেশনে যাওয়ার জন্য ফ্লোটগুলির ফেরত অ্যারেটি একটি Vector কাস্ট করুন।

mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
  movie_update(id: $id, data: {
    // title, genre...
    description: $description,
    descriptionEmbedding: $descriptionEmbedding
  })
}

কাস্টম এম্বেডিং ব্যবহার করে সাদৃশ্য অনুসন্ধান করুন

অনুসন্ধান পদগুলির জন্য এম্বেডিংগুলি পুনরুদ্ধার করতে এবং সেগুলিকে Vectors এ কাস্ট করতে একই অপারেশনটি সম্পাদন করুন।

তারপর, প্রতিটি অনুসন্ধান সম্পাদনের জন্য _similarity কোয়েরিটি কল করুন।

query searchMovieDescriptionUsingL2Similarity($compare: Vector!, $within: Float, $excludesContent: String, $limit: Int) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare: $compare,
      method: L2,
      within: $within,
      where: {content: {ne: $excludesContent}}, limit: $limit)
      {
        id
        title
        description
      }
  }

উৎপাদনে স্থাপন করুন

আপনার স্কিমা এবং সংযোগকারী স্থাপন করুন

একটি সাধারণ Data Connect পুনরাবৃত্তির শেষ ধাপ হল আপনার সম্পদগুলিকে উৎপাদনে স্থাপন করা।

firebase deploy কমান্ড ব্যবহার করে CloudSQL-এ Vector টাইপ ধারণকারী আপনার স্কিমা স্থাপন করার সময়, Firebase CLI আপনার CloudSQL ইনস্ট্যান্সে Vertex AI-ভিত্তিক এমবেডিং জেনারেশন সক্ষম করার জন্য প্রয়োজনীয় পদক্ষেপ গ্রহণ করে।

firebase deploy --only dataconnect

যদি আপনি আপনার CloudSQL ইনস্ট্যান্সে ম্যানুয়ালি এম্বেডিং সাপোর্ট সক্ষম করতে চান, অথবা কোনও CLI ত্রুটির সম্মুখীন হন, তাহলে এই নির্দেশাবলী অনুসরণ করুন।

ভেক্টর অনুসন্ধান সিনট্যাক্স

স্কিমা এক্সটেনশন

Data Connect Vector ডেটা টাইপ pgvector এক্সটেনশন দ্বারা সংজ্ঞায়িত PostgreSQL এর vector টাইপের সাথে ম্যাপ করে। pgvector এর vector টাইপ PostgreSQL এ একক নির্ভুলতা ভাসমান বিন্দু সংখ্যার একটি অ্যারে হিসাবে সংরক্ষণ করা হয়।

Data Connect এ, Vector টাইপকে JSON সংখ্যার একটি অ্যারে হিসেবে উপস্থাপন করা হয়। ইনপুটগুলিকে float32 মানের একটি অ্যারেতে জোর করে ঢোকানো হয়। যদি জোর করে কাজ করা ব্যর্থ হয়, তাহলে একটি ত্রুটি দেখা দেয়।

ভেক্টরের মাত্রা নির্ধারণ করতে @col নির্দেশিকার আকার প্যারামিটার ব্যবহার করুন।

type Question @table {
    text: String!
    category: String!
    textEmbedding: Vector! @col(size: 768)
}

size শুধুমাত্র Vector প্রকারের জন্য সমর্থিত। Vector ক্রিয়াকলাপ, যেমন সাদৃশ্য-অনুসন্ধান, সমস্ত Vector মাত্রা একই সংখ্যক থাকা আবশ্যক।

directive @col(
  # … existing args
  """
  Defines a fixed column size for certain scalar types.

  - For Vector, size is required.
  - For all other types, size is currently unsupported and hence supplying it will result in a schema error.
  """
  size: Int
) on FIELD_DEFINITION

কোয়েরি এবং মিউটেশনের জন্য _embed সার্ভার মান

_embed

এই সার্ভার মানটি Data Connect পরিষেবাকে Vertex AI এর Embedding API ব্যবহার করে এম্বেডিং তৈরি এবং সংরক্ষণ করার নির্দেশ দেয়। এই সার্ভার মানটি কোয়েরি এবং মিউটেশন উভয় ক্ষেত্রেই ব্যবহার করা যেতে পারে।

সাদৃশ্য অনুসন্ধানের জন্য পরামিতি

method: COSINE|INNER_PRODUCT|L2

কাছাকাছি প্রতিবেশীদের অনুসন্ধান করতে ব্যবহৃত দূরত্ব ফাংশন। বর্তমানে সমর্থিত অ্যালগরিদমগুলি pgvector অনুসন্ধান অ্যালগরিদমের একটি উপসেট।

within: float

নিকটতম প্রতিবেশীর অনুসন্ধান কত দূরত্বের মধ্যে করা হবে তার একটি সীমাবদ্ধতা।

where: FDC filter condition

স্কিমা, কোয়েরি এবং মিউটেশন নির্দেশিকা দেখুন।

limit: int

কতগুলি ফলাফল দেখানো হবে।