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