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

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

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

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

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

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

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

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

सेटअप

अगर आप वेब, Kotlin, Android या iOS डेवलपर हैं, तो आपके पास लोकल डेवलपमेंट फ़्लो या वेब डेवलपर के लिए IDX फ़्लो में से किसी एक को चुनने का विकल्प होता है. डेवलपमेंट के लिए, किसी लोकल डेटाबेस या अपने प्रोडक्शन Data Connect प्रोजेक्ट और उसके Cloud SQL for PostgreSQL इंस्टेंस का इस्तेमाल किया जा सकता है.

इन निर्देशों में यह माना गया है कि आपने क्विकस्टार्ट गाइड का पालन करके अपना Data Connect प्रोजेक्ट बनाया है.

स्थानीय PostgreSQL के साथ इंटिग्रेट करना

  1. स्थानीय PostgreSQL इंस्टेंस सेट अप करें.
  2. अपने लिए Vertex AI उपयोगकर्ता की IAM भूमिका असाइन करें.
  3. अपने एनवायरमेंट में Google Cloud ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल सेट अप करें.
  4. अपने स्थानीय PostgreSQL इंस्टेंस में pgvector एक्सटेंशन इंस्टॉल करें.
  5. pgvector के निर्देशों के मुताबिक, CREATE EXTENSION vector का इस्तेमाल करके एक्सटेंशन चालू करें.

IDX के साथ इंटिग्रेट करना

  1. Data Connect टेंप्लेट का इस्तेमाल करके, अपना IDX वर्कस्पेस सेट अप करें.
  2. अपने लिए Vertex AI उपयोगकर्ता की 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)
 // ...
}

एम्बेड जनरेट करना और उन्हें वापस लाना

Data Connect, _embed सर्वर वैल्यू के साथ वेक्टर एम्बेडिंग के लिए इंटिग्रेट की गई सहायता देता है. इससे Data Connect को, Vertex AI के एम्बेडिंग एपीआई को अंदरूनी तौर पर कॉल करके, वैक्टर एम्बेड जनरेट करने का निर्देश मिलता है. _embed सर्वर वैल्यू का इस्तेमाल, म्यूटेशन और क्वेरी, दोनों में किया जा सकता है.

म्यूटेशन

Data Connect की मदद से, एम्बेड करने के लिए कोड जनरेट करना और उसे सेव करना

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

mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
  movie_insert(data: {
    ...movieData,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
  })
}

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

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

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

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

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

// Use the response

क्वेरी

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

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

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

मिलती-जुलती खोज करना

अब हम मिलती-जुलती खोज कर सकते हैं.

हर Vector फ़ील्ड के लिए, Data Connect एक ऐसा GraphQL फ़ंक्शन जनरेट करता है जो मिलती-जुलती खोज को लागू करता है. जनरेट किए गए इस फ़ंक्शन का नाम ${pluralType}_${vectorFieldName}_similarity है. यह कुछ पैरामीटर के साथ काम करता है, जैसा कि नीचे दिए गए उदाहरणों और रेफ़रंस सूची में दिखाया गया है.

आपके पास ऐसा GraphQL फ़ंक्शन तय करने का विकल्प है जो मिलती-जुलती खोज को ट्रिगर करता है. जैसा कि ऊपर बताया गया है, _embed सर्वर वैल्यू, Data Connect को Vertex AI के एम्बेडिंग एपीआई का इस्तेमाल करके वेक्टर एम्बेड जनरेट करने का निर्देश देती है. इस मामले में, मूवी की जानकारी के एम्बेड की तुलना करने के लिए इस्तेमाल की जाने वाली खोज स्ट्रिंग के लिए एम्बेड बनाने के लिए.

इस उदाहरण में, मिलती-जुलती फ़िल्में खोजने की सुविधा, ऐसी पांच फ़िल्में दिखाएगी जिनकी जानकारी, इनपुट क्वेरी से मिलती-जुलती है. नतीजों के सेट को, दूरी के हिसाब से बढ़ते क्रम में लगाया जाता है.

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

मिलती-जुलती क्वेरी को कॉल करना

क्लाइंट कोड से मिलती-जुलती चीज़ों की खोज करने के लिए:

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

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

कस्टम एम्बेड का इस्तेमाल करना

Data Connect की मदद से, एम्बेड को सीधे Vector के तौर पर इस्तेमाल किया जा सकता है. इसके लिए, _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
      }
  }

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

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

आम तौर पर, Data Connect के किसी खास वर्शन को रिलीज़ करने के बाद, अपनी एसेट को प्रोडक्शन में डिप्लॉय करना ज़रूरी होता है.

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

firebase deploy --only dataconnect

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

वेक्टर खोज का सिंटैक्स

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

Data Connect का Vector डेटा टाइप, PostgreSQL के vector टाइप से मैप होता है, जैसा कि pgvector एक्सटेंशन में बताया गया है. 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 के एम्बेडिंग एपीआई का इस्तेमाल करके, एम्बेड जनरेट करने और उन्हें सेव करने का निर्देश देती है. इस सर्वर वैल्यू का इस्तेमाल, क्वेरी और म्यूटेशन, दोनों पर किया जा सकता है.

मिलती-जुलती खोज के लिए पैरामीटर

method: COSINE|INNER_PRODUCT|L2

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

within: float

वह दूरी जिससे कम की दूरी पर मौजूद वैल्यू के लिए, सबसे नज़दीकी पड़ोसी खोज की जाती है.

where: FDC filter condition

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

limit: int

कितने नतीजे दिखाने हैं.