Firebase Data Connect के वेक्टर सिमिलैरिटी सर्च में आपका स्वागत है. यह सिमेंटिक सर्च को लागू करने वाला Firebase का टूल है. यह Google Vertex AI के साथ इंटिग्रेट होता है.
इस सुविधा के केंद्र में वेक्टर एम्बेडिंग होती हैं. ये फ़्लोटिंग पॉइंट नंबर के ऐसे ऐरे होते हैं जो टेक्स्ट या मीडिया के सिमैंटिक मतलब को दिखाते हैं. इनपुट वेक्टर एम्बेडिंग का इस्तेमाल करके, सबसे मिलते-जुलते पड़ोसी की खोज करने पर, आपको अर्थ के हिसाब से मिलता-जुलता सारा कॉन्टेंट मिल सकता है. Data Connect इस सुविधा के लिए, PostgreSQL के pgvector
एक्सटेंशन का इस्तेमाल करता है.
सिमेंटिक सर्च की इस सुविधा का इस्तेमाल, सुझाव देने वाले इंजन और सर्च इंजन जैसे मामलों में किया जा सकता है. यह जनरेटिव एआई फ़्लो में, जानकारी हासिल करके जवाब देने की प्रोसेस का एक अहम हिस्सा भी है. ज़्यादा जानने के लिए, Vertex AI का दस्तावेज़ पढ़ें.
Data Connect में, Vertex AI के Embeddings API का इस्तेमाल करके, वेक्टर एम्बेडिंग अपने-आप जनरेट करने की सुविधा पहले से मौजूद है. इसका इस्तेमाल किया जा सकता है. इसके अलावा, इस एपीआई का इस्तेमाल करके, वेक्टर एम्बेडिंग को मैन्युअल तरीके से भी जनरेट किया जा सकता है.
ज़रूरी शर्तें
अपने प्रोजेक्ट के लिए, डेटा कनेक्ट की सुविधा सेट अप करें.
Vertex AI API चालू करें.
सेटअप
आपके पास लोकल डेवलपमेंट फ़्लो (अगर आप वेब, Kotlin Android या iOS डेवलपर हैं) या IDX फ़्लो (वेब डेवलपर के लिए) में से किसी एक को चुनने का विकल्प होता है. डेवलपमेंट के लिए, लोकल डेटाबेस या अपने प्रोडक्शन Data Connect प्रोजेक्ट और उसके Cloud SQL for PostgreSQL इंस्टेंस का इस्तेमाल किया जा सकता है.
इन निर्देशों में यह माना गया है कि आपने Data Connect प्रोजेक्ट क्विकस्टार्ट गाइड के मुताबिक बना लिया है.
लोकल PostgreSQL के साथ इंटिग्रेट करना
- लोकल PostgreSQL इंस्टेंस सेट अप करें.
- अपने लिए, Vertex AI उपयोगकर्ता की IAM भूमिका असाइन करें.
- अपने एनवायरमेंट में Google Cloud ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल सेट अप करें.
- अपने लोकल PostgreSQL इंस्टेंस में
pgvector
एक्सटेंशन इंस्टॉल करें. pgvector
रिपॉज़िटरी में दिए गए निर्देशों के मुताबिक,CREATE EXTENSION vector
का इस्तेमाल करके एक्सटेंशन चालू करें.
IDX के साथ इंटिग्रेट करना
- डेटा कनेक्ट टेंप्लेट का इस्तेमाल करके, अपना IDX वर्कस्पेस सेट अप करें.
- अपने लिए, Vertex AI उपयोगकर्ता की IAM भूमिका असाइन करें.
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 के Embedding 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 से जनरेट किए गए एसडीके, सीधे तौर पर इसे वापस लाने की सुविधा नहीं देते.
मिलती-जुलती चीज़ें खोजने के लिए, लौटाए गए वेक्टर एम्बेडिंग का इस्तेमाल किया जा सकता है. इसके बारे में अगले सेक्शन में बताया गया है.
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 की मदद से, एम्बेडिंग के साथ सीधे 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 के Embedding API का इस्तेमाल करके, एम्बेडिंग जनरेट करने और उन्हें सेव करने का निर्देश देती है. इस सर्वर वैल्यू का इस्तेमाल, क्वेरी और म्यूटेशन, दोनों पर किया जा सकता है.
मिलती-जुलती खोज के लिए पैरामीटर
method: COSINE|INNER_PRODUCT|L2
आस-पास के पॉइंट ढूंढने के लिए, दूरी के फ़ंक्शन का इस्तेमाल किया जाता है. फ़िलहाल, इस्तेमाल किए जा रहे एल्गोरिदम, pgvector search algorithms का सबसेट हैं.
within: float
यह दूरी की एक सीमा होती है. इस सीमा के अंदर ही, सबसे नज़दीकी पड़ोसी की खोज की जाती है.
where: FDC filter condition
स्कीमा, क्वेरी, और म्यूटेशन से जुड़ी गाइड देखें.
limit: int
नतीजों की वह संख्या जिसे दिखाना है.