Vertex AI की मदद से, वेक्टर से मिलती-जुलती खोज करने की सुविधा इस्तेमाल करें

Firebase SQL Connect की वेक्टर सिमिलैरिटी सर्च सुविधा में आपका स्वागत है. यह सिमैंटिक सर्च की सुविधा है, जिसे Firebase ने लागू किया है. यह सुविधा, Google Vertex AI के साथ इंटिग्रेट होती है.

इस सुविधा में वेक्टर एम्बेडिंग का इस्तेमाल किया जाता है. ये फ़्लोटिंग पॉइंट नंबर के ऐसे ऐरे होते हैं जो टेक्स्ट या मीडिया के सिमैंटिक मतलब को दिखाते हैं. इनपुट वेक्टर एम्बेडिंग का इस्तेमाल करके, आस-पास के पड़ोसी की खोज करने से, सिमैंटिक तौर पर मिलते-जुलते सभी कॉन्टेंट को खोजा जा सकता है. SQL Connect इस सुविधा के लिए PostgreSQL के pgvector एक्सटेंशन का इस्तेमाल करता है.

सिमैंटिक सर्च की इस सुविधा का इस्तेमाल, सुझाव देने वाले इंजन और सर्च इंजन जैसे यूज़ केस के लिए किया जा सकता है. यह जनरेटिव एआई फ़्लो में, जानकारी पाने के लिए इस्तेमाल की जाने वाली जनरेटिव एआई की सुविधा का एक अहम कॉम्पोनेंट भी है. ज़्यादा जानने के लिए, Vertex AI का दस्तावेज़ देखें learn more.

SQL Connect में, Vertex AI के Embeddings API का इस्तेमाल करके, वेक्टर एम्बेडिंग को अपने-आप जनरेट करने की सुविधा मौजूद है. इसके अलावा, इस API का इस्तेमाल करके, वेक्टर एम्बेडिंग को मैन्युअल तरीके से भी जनरेट किया जा सकता है.

ज़रूरी शर्तें

  • अपने प्रोजेक्ट के लिए, सेट अप करें SQL Connect.

  • Vertex AI API चालू करें .

सेटअप

आपके पास लोकल डेवलपमेंट फ़्लो (अगर आप वेब, Kotlin Android या iOS डेवलपर हैं) या IDX फ़्लो (वेब डेवलपर के लिए) में से कोई एक विकल्प चुनने की सुविधा होती है. डेवलपमेंट के लिए, लोकल डेटाबेस या अपने प्रोडक्शन SQL Connect प्रोजेक्ट और उसके Cloud SQL 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 टाइप का नया फ़ील्ड जोड़ें. उदाहरण के लिए, अगर आपको फ़िल्मों के ब्यौरे का इस्तेमाल करके सिमैंटिक सर्च करना है, तो फ़िल्म के ब्यौरे से जुड़े वेक्टर एम्बेडिंग को सेव करने के लिए एक फ़ील्ड जोड़ें. इस स्कीमा में, descriptionEmbedding को description फ़ील्ड के लिए वेक्टर एम्बेडिंग सेव करने के लिए जोड़ा गया है.

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 के Embedding API को इंटरनल तौर पर कॉल करके, वेक्टर एम्बेडिंग जनरेट करता है. _embed सर्वर वैल्यू का इस्तेमाल, म्यूटेशन और क्वेरी, दोनों में किया जा सकता है.

म्यूटेशन

SQL Connect के ज़रिए एम्बेडिंग जनरेट करना और सेव करना

वेक्टर सर्च करने वाले अपने ऐप्लिकेशन में, शायद आपको यह अनुरोध करना हो कि डेटाबेस में रिकॉर्ड जोड़ने के तुरंत बाद, एम्बेडिंग जनरेट किए जाएं. यहां दिया गया createMovie म्यूटेशन, Movie टेबल में फ़िल्म का रिकॉर्ड जोड़ता है. साथ ही, यह तय किए गए एम्बेडिंग model के साथ फ़िल्म का ब्यौरा भी पास करता है.

mutation createMovie($title: String!, $description: String!) {
  movie_insert(data: {
    title: $title,
    description: $description,
    descriptionEmbedding_embed: {model: "text-embedding-005", text: $description}
  })
}

कुछ मामलों में, आपको फ़िल्म का ब्यौरा और एम्बेडिंग अपडेट करना पड़ सकता है.

mutation updateDescription($id: String!, $description: String!) {
  movie_update(id: $id, data: {
    description: $description,
    descriptionEmbedding_embed: {model: "text-embedding-005", text: $description}
  })
}

क्लाइंट से, दूसरे म्यूटेशन को कॉल करने के लिए:

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

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

// Use the response

क्वेरी

नीचे दी गई क्वेरी की तरह कोई क्वेरी इस्तेमाल करके, वेक्टर एम्बेडिंग फ़ेच करें. ध्यान दें कि क्वेरी से मिलने वाला descriptionEmbedding, फ़्लोट का एक ऐरे होता है. आम तौर पर, इसे पढ़ा नहीं जा सकता. इसलिए, SQL Connect जनरेट किए गए एसडीके, इसे सीधे तौर पर वापस नहीं करते.

मिलने वाले वेक्टर एम्बेडिंग का इस्तेमाल, समानता के आधार पर खोज करने के लिए किया जा सकता है. इसके बारे में अगले सेक्शन में बताया गया है.

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: "text-embedding-005", 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: "text-embedding-005", 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: "text-embedding-005", 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 में, एम्बेडिंग के साथ सीधे तौर पर Vectors के तौर पर काम किया जा सकता है. इसके लिए, _embed सर्वर वैल्यू का इस्तेमाल करके, एम्बेडिंग जनरेट करने की ज़रूरत नहीं होती.

कस्टम एम्बेडिंग सेव करना

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
      }
  }

प्रोडक्शन पर डिप्लॉय करना

अपना स्कीमा और कनेक्टर डिप्लॉय करना

किसी भी SQL Connect वर्शन को डिप्लॉय करने का आखिरी चरण, अपनी ऐसेट को प्रोडक्शन पर डिप्लॉय करना होता है.

firebase deploy कमांड का इस्तेमाल करके, Vector टाइप वाले अपने स्कीमा को Cloud SQL पर डिप्लॉय करते समय, Firebase CLI, Cloud SQL इंस्टेंस पर Vertex AI की मदद से एम्बेडिंग जनरेट करने की सुविधा चालू करने के लिए ज़रूरी कदम उठाता है.

firebase deploy --only dataconnect

अगर आपको एम्बेडिंग की सुविधा को Cloud SQL इंस्टेंस में मैन्युअल तरीके से चालू करना है या आपको CLI में कोई गड़बड़ी दिखती है, तो इन निर्देशों का पालन करें.

वेक्टर सर्च का सिंटैक्स

स्कीमा एक्सटेंशन

SQL Connect का Vector डेटा टाइप, PostgreSQL के vector टाइप पर मैप होता है जिसे pgvector एक्सटेंशन से तय किया जाता है. pgvector का vector टाइप, PostgreSQL में सिंगल प्रिसिशन फ़्लोटिंग पॉइंट नंबर के ऐरे के तौर पर सेव होता है.

SQL 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

इस सर्वर वैल्यू से, SQL Connect सेवा को एम्बेडिंग जनरेट करने और सेव करने का निर्देश मिलता है. इसके लिए, Vertex AI के Embedding API का इस्तेमाल किया जाता है. इस सर्वर वैल्यू का इस्तेमाल, क्वेरी और म्यूटेशन, दोनों के लिए किया जा सकता है.

समानता के आधार पर खोज के लिए पैरामीटर

method: COSINE|INNER_PRODUCT|L2

आस-पास के पड़ोसी को खोजने के लिए इस्तेमाल किया जाने वाला दूरी का फ़ंक्शन. फ़िलहाल, काम करने वाले एल्गोरिदम, pgvector के खोज एल्गोरिदम का सबसेट हैं.

within: float

दूरी पर एक कंस्ट्रेंट. इसके अंदर, आस-पास के पड़ोसी की खोज की जाती है.

where: FDC filter condition

स्कीमा, क्वेरी, और म्यूटेशन की गाइड देखें .

limit: int

कितने नतीजे वापस लाने हैं, इसे बताने वाली संख्या.