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

Firebase SQL Connect এর ভেক্টর সিমিলারিটি সার্চে আপনাকে স্বাগতম — এটি সিমান্টিক সার্চের Firebase-এর একটি বাস্তবায়ন যা Google Vertex AI-এর সাথে সমন্বিত।

এই ফিচারের মূলে রয়েছে ভেক্টর এমবেডিং, যা হলো ফ্লোটিং পয়েন্ট সংখ্যার অ্যারে এবং এটি কোনো টেক্সট বা মিডিয়ার অর্থগত তাৎপর্য প্রকাশ করে। একটি ইনপুট ভেক্টর এমবেডিং ব্যবহার করে নিকটতম প্রতিবেশী অনুসন্ধান (nearest neighbor search) চালানোর মাধ্যমে, আপনি অর্থগতভাবে একই রকম সমস্ত কন্টেন্ট খুঁজে পেতে পারেন। SQL Connect এই সক্ষমতার জন্য PostgreSQL-এর pgvector এক্সটেনশন ব্যবহার করে।

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

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

পূর্বশর্ত

  • আপনার প্রোজেক্টের জন্য SQL Connect সেট আপ করুন

  • Vertex AI API-গুলো সক্রিয় করুন।

সেটআপ

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

এই নির্দেশাবলী ধরে নেওয়া হচ্ছে যে আপনি কুইকস্টার্ট গাইড অনুসরণ করে আপনার SQL Connect প্রজেক্ট তৈরি করেছেন।

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

  1. একটি স্থানীয় PostgreSQL ইনস্ট্যান্স সেট আপ করুন।

  2. নিজেকে Vertex AI User IAM রোলটি প্রদান করুন

  3. আপনার পরিবেশে Google Cloud অ্যাপ্লিকেশনের ডিফল্ট ক্রেডেনশিয়াল সেট আপ করুন।

  4. আপনার স্থানীয় PostgreSQL ইনস্ট্যান্সে pgvector এক্সটেনশনটি ইনস্টল করুন।

  5. pgvector রিপোজিটরির নির্দেশাবলী অনুসারে CREATE EXTENSION vector ব্যবহার করে এক্সটেনশনটি সক্রিয় করুন।

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

  1. SQL Connect টেমপ্লেট ব্যবহার করে আপনার IDX ওয়ার্কস্পেস সেট আপ করুন।

  2. নিজেকে Vertex AI User 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)
 // ...
}

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

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

মিউটেশন

SQL 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 হলো ফ্লোট সংখ্যার একটি অ্যারে, যা সাধারণত পাঠযোগ্য নয়। তাই, SQL Connect দ্বারা তৈরি SDK-গুলি সরাসরি এটি ফেরত দেওয়া সমর্থন করে না।

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

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

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

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

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

আপনি একটি GraphQL ফাংশন সংজ্ঞায়িত করতে পারেন যা সাদৃশ্য অনুসন্ধানটি চালু করে। উপরে যেমন উল্লেখ করা হয়েছে, _embed সার্ভার ভ্যালুটি SQL 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 প্যারামিটারটি সেট করতে পারি; শুধুমাত্র সেইসব ফলাফলই অন্তর্ভুক্ত করা হবে যাদের distance, 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

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

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

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

ভার্টেক্স এমবেডিংস এপিআই ব্যবহার করে, একটি উপযুক্ত মডেল নির্দিষ্ট করুন এবং সঠিক ডাইমেনশনের এমবেডিং ফলাফলের জন্য অনুরোধ করুন।

এরপর, স্টোরেজের জন্য আপডেট অপারেশনে পাঠানোর উদ্দেশ্যে, ফেরত আসা ফ্লোট সংখ্যার অ্যারেটিকে একটি 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
      }
  }

প্রোডাকশনে স্থাপন করুন

আপনার স্কিমা এবং কানেক্টর স্থাপন করুন

একটি সাধারণ SQL Connect প্রক্রিয়ার শেষ ধাপ হলো আপনার অ্যাসেটগুলোকে প্রোডাকশনে ডেপ্লয় করা।

firebase deploy কমান্ড ব্যবহার করে যখন আপনি Vector টাইপ সম্বলিত আপনার স্কিমা Cloud SQL -এ ডেপ্লয় করেন, তখন Firebase সিএলআই আপনার Cloud SQL ইনস্ট্যান্সে ভার্টেক্স এআই-ভিত্তিক এমবেডিং জেনারেশন সক্ষম করার জন্য প্রয়োজনীয় পদক্ষেপ গ্রহণ করে।

firebase deploy --only dataconnect

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

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

স্কিমা সম্প্রসারণ

SQL Connect এর Vector ডেটা টাইপটি PostgreSQL-এর pgvector এক্সটেনশন দ্বারা সংজ্ঞায়িত vector টাইপের সাথে ম্যাপ করা হয়। PostgreSQL-এ pgvector-এর vector টাইপটি সিঙ্গেল প্রিসিশন ফ্লোটিং পয়েন্ট সংখ্যার একটি অ্যারে হিসাবে সংরক্ষিত হয়।

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

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

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

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

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

method: COSINE|INNER_PRODUCT|L2

নিকটবর্তী প্রতিবেশীদের খোঁজার জন্য ব্যবহৃত দূরত্ব ফাংশন। বর্তমানে সমর্থিত অ্যালগরিদমগুলো পিজিভেক্টর সার্চ অ্যালগরিদমগুলোর একটি উপসেট।

within: float

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

where: FDC filter condition

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

limit: int

ফেরত দেওয়ার জন্য ফলাফলের সংখ্যা।