Spanner वेक्टर सर्च का इस्तेमाल शुरू करना

1. परिचय

Spanner, पूरी तरह से मैनेज की जाने वाली, हॉरिज़ॉन्टल तौर पर स्केल की जा सकने वाली, और दुनिया भर में उपलब्ध डेटाबेस सेवा है. यह रिलेशनल और नॉन-रिलेशनल, दोनों तरह के ऑपरेशनल वर्कलोड के लिए बेहतरीन है.

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

Spanner की वेक्टर सर्च क्वेरी, लेन-देन पूरा होने के तुरंत बाद नया रीयल-टाइम डेटा दिखाती हैं. यह आपके ऑपरेशनल डेटा पर की गई किसी भी अन्य क्वेरी की तरह ही काम करती है.

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

आर्किटेक्चर कुछ ऐसा दिखेगा:

d179a760add7adc0.png

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

आपको क्या बनाना है

इस लैब में, आपको ये काम करने होंगे:

  • Spanner इंस्टेंस बनाना
  • VertexAI में एम्बेडिंग और एलएलएम मॉडल के साथ इंटिग्रेट करने के लिए, Spanner के डेटाबेस स्कीमा को सेट अप करना
  • रीटेल डेटा सेट लोड करना
  • डेटासेट के ख़िलाफ़ मिलती-जुलती खोज क्वेरी जारी करना
  • एलएलएम मॉडल को कॉन्टेक्स्ट दें, ताकि वह प्रॉडक्ट के हिसाब से सुझाव जनरेट कर सके.
  • स्कीमा में बदलाव करें और वेक्टर इंडेक्स बनाएं.
  • वेक्टर इंडेक्स का इस्तेमाल करने के लिए, क्वेरी में बदलाव करें.

आपको क्या सीखने को मिलेगा

  • स्पैनर इंस्टेंस सेट अप करने का तरीका
  • VertexAI के साथ इंटिग्रेट करने का तरीका
  • किसी रीटेल डेटासेट में मिलते-जुलते आइटम खोजने के लिए, वेक्टर सर्च करने के लिए Spanner का इस्तेमाल कैसे करें
  • एएनएन सर्च का इस्तेमाल करके, वेक्टर सर्च के वर्कलोड को बड़े पैमाने पर मैनेज करने के लिए, अपने डेटाबेस को कैसे तैयार करें.

आपको किन चीज़ों की ज़रूरत होगी

  • Google Cloud प्रोजेक्ट, किसी बिलिंग खाते से कनेक्ट होना चाहिए.
  • कोई वेब ब्राउज़र, जैसे कि Chrome या Firefox.

2. सेटअप और ज़रूरी शर्तें

प्रोजेक्ट बनाना

अगर आपके पास पहले से कोई Google खाता (Gmail या Google Apps) नहीं है, तो आपको एक खाता बनाना होगा. Google Cloud Platform Console ( console.cloud.google.com) में साइन इन करें और एक नया प्रोजेक्ट बनाएं.

अगर आपके पास पहले से कोई प्रोजेक्ट है, तो कंसोल में सबसे ऊपर बाईं ओर मौजूद, प्रोजेक्ट चुनने वाले पुल-डाउन मेन्यू पर क्लिक करें:

6c9406d9b014760.png

इसके बाद, नया प्रोजेक्ट बनाने के लिए, डायलॉग बॉक्स में मौजूद ‘नया प्रोजेक्ट' बटन पर क्लिक करें:

949d83c8a4ee17d9.png

अगर आपके पास पहले से कोई प्रोजेक्ट नहीं है, तो आपको अपना पहला प्रोजेक्ट बनाने के लिए इस तरह का डायलॉग दिखेगा:

870a3cbd6541ee86.png

इसके बाद, प्रोजेक्ट बनाने के डायलॉग बॉक्स में, नए प्रोजेक्ट की जानकारी डाली जा सकती है:

6a92c57d3250a4b3.png

प्रोजेक्ट आईडी याद रखें. यह सभी Google Cloud प्रोजेक्ट के लिए एक यूनीक नाम होता है. ऊपर दिया गया नाम पहले ही इस्तेमाल किया जा चुका है. इसलिए, यह आपके लिए काम नहीं करेगा. माफ़ करें! इस कोड लैब में इसे बाद में PROJECT_ID के तौर पर दिखाया जाएगा.

इसके बाद, अगर आपने अब तक ऐसा नहीं किया है, तो आपको Google Cloud के संसाधनों का इस्तेमाल करने के लिए, Developers Console में बिलिंग चालू करनी होगी. साथ ही, Spanner API चालू करना होगा.

15d0ef27a8fbab27.png

इस कोडलैब को पूरा करने में आपको कुछ डॉलर से ज़्यादा खर्च नहीं करने पड़ेंगे. हालांकि, अगर आपको ज़्यादा संसाधनों का इस्तेमाल करना है या उन्हें चालू रखना है, तो यह खर्च बढ़ सकता है. इस दस्तावेज़ के आखिर में "सफाई" सेक्शन देखें. Google Cloud Spanner की कीमत के बारे में जानकारी यहां दी गई है.

Google Cloud Platform के नए उपयोगकर्ताओं को, मुफ़्त में आज़माने के लिए 300 डॉलर मिलते हैं. इससे इस कोडलैब का इस्तेमाल बिना किसी शुल्क के किया जा सकता है.

Google Cloud Shell का सेटअप

Google Cloud और Spanner को लैपटॉप से रिमोटली ऐक्सेस किया जा सकता है. हालांकि, इस कोडलैब में हम Google Cloud Shell का इस्तेमाल करेंगे. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

यह Debian पर आधारित वर्चुअल मशीन है. इसमें डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud में चलता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इसका मतलब है कि इस कोडलैब के लिए, आपको सिर्फ़ एक ब्राउज़र की ज़रूरत होगी. हां, यह Chromebook पर भी काम करता है.

  1. Cloud Console से Cloud Shell को चालू करने के लिए, बस Cloud Shell चालू करें gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A पर क्लिक करें. इसे चालू होने और एनवायरमेंट से कनेक्ट होने में कुछ ही समय लगता है.

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSrDc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvIEx9pIkE-246DomWuCfiGHK78DgoeWkHRw

Screen Shot 2017-06-14 at 10.13.43 PM.png

Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि पहले ही हो चुकी है और प्रोजेक्ट पहले से ही आपके PROJECT_ID पर सेट है.

gcloud auth list

कमांड आउटपुट

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर किसी वजह से प्रोजेक्ट सेट नहीं है, तो यह कमांड दें:

gcloud config set project <PROJECT_ID>

क्या आपको PROJECT_ID की तलाश है? देखें कि आपने सेटअप के दौरान किस आईडी का इस्तेमाल किया था या Cloud Console के डैशबोर्ड में जाकर इसे देखें:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

Cloud Shell, कुछ एनवायरमेंट वैरिएबल को डिफ़ॉल्ट रूप से भी सेट करता है. ये वैरिएबल, आने वाले समय में कमांड चलाने के दौरान आपके काम आ सकते हैं.

echo $GOOGLE_CLOUD_PROJECT

कमांड आउटपुट

<PROJECT_ID>

Spanner API और VertexAI API चालू करना

gcloud services enable spanner.googleapis.com
gcloud services enable aiplatform.googleapis.com

आईएएम नीति की जांच करें:

किसी Spanner इंस्टेंस में वेक्टर सर्च की सुविधा काम करे, इसके लिए IAM नीति में सिर्फ़ यह ज़रूरी है कि service-<PROJECT_NUMBER>@gcp-sa-spanner.iam.gserviceaccount.com को Cloud Spanner API सर्विस एजेंट के तौर पर अनुमति दी गई हो. सबसे ऊपर बाएं कोने में मौजूद, तीन बार वाले आइकॉन पर क्लिक करें. यह आइकॉन यहां दिया गया है,

4ee603eabf02695d.png

आपको वहां आईएएम नीति दिखेगी:

9ffe38da6fcd7a72.png

यहां दिए गए तरीके से, अनुमति सेक्शन में जाकर IAM सेटिंग देखी जा सकती है.

17c283eb06a6bd58.png

अगर Cloud Spanner API Service Agent मौजूद नहीं है, तो इसे अनुमति देने के लिए यहां दिया गया निर्देश इस्तेमाल करें. ज़्यादा निर्देश यहां देखे जा सकते हैं.

$ gcloud beta services identity create --service=spanner.googleapis.com --project=<PROJECT_ID>
$ gcloud projects add-iam-policy-binding <PROJECT_NUMBER>  --member=serviceAccount:service-<PROJECT_NUMBER>@gcp-sa-spanner.iam.gserviceaccount.com  --role=roles/spanner.serviceAgent --condition=None

खास जानकारी

इस चरण में, अगर आपके पास पहले से कोई प्रोजेक्ट नहीं था, तो आपने उसे सेट अप कर लिया है. साथ ही, आपने Cloud Shell को चालू कर लिया है और ज़रूरी एपीआई चालू कर लिए हैं.

अगला

इसके बाद, आपको Spanner इंस्टेंस और डेटाबेस सेट अप करना होगा.

3. Spanner इंस्टेंस और डेटाबेस बनाना

Spanner इंस्टेंस बनाना

इस चरण में, हम कोडलैब के लिए अपना Spanner इंस्टेंस सेट अप करते हैं. इसके लिए, Cloud Shell खोलें और यह निर्देश चलाएं:

export SPANNER_INSTANCE_ID=retail-demo
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--edition=ENTERPRISE \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1

सबसे कम एडिशन ENTERPRISE होना चाहिए. STANDARD के वर्शन में, वेक्टर सर्च की सुविधा नहीं है.

कमांड का आउटपुट:

$ Creating instance...done.  

डेटाबेस बनाना

आपका इंस्टेंस चालू होने के बाद, डेटाबेस बनाया जा सकता है. Spanner में, एक इंस्टेंस पर कई डेटाबेस बनाए जा सकते हैं.

डेटाबेस में ही स्कीमा तय किया जाता है. आपके पास यह कंट्रोल करने का विकल्प भी होता है कि डेटाबेस को कौन ऐक्सेस कर सकता है. साथ ही, कस्टम एन्क्रिप्शन सेट अप करने, ऑप्टिमाइज़र को कॉन्फ़िगर करने, और डेटा सुरक्षित रखने की अवधि सेट करने का विकल्प भी होता है.

डेटाबेस बनाने के लिए, gcloud कमांड लाइन टूल का फिर से इस्तेमाल करें:

export SPANNER_DATABASE=cymbal-bikes
gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID

कमांड का आउटपुट:

$ Creating database...done.

खास जानकारी

इस चरण में, आपने Spanner इंस्टेंस और डेटाबेस बनाया है.

अगला

इसके बाद, आपको Spanner स्कीमा और डेटा सेट अप करना होगा.

4. Cymbal स्कीमा और डेटा लोड करना

Cymbal स्कीमा बनाना

स्कीमा सेट अप करने के लिए, Spanner Studio पर जाएं:

3e1a0fed928b33cf.png

स्कीमा के दो हिस्से होते हैं. सबसे पहले, आपको products टेबल जोड़नी है. इस स्टेटमेंट को कॉपी करके, खाली टैब में चिपकाएं.

स्कीमा के लिए, इस DDL को कॉपी करके बॉक्स में चिपकाएं:

CREATE TABLE products(
  categoryId INT64 NOT NULL,
  productId INT64 NOT NULL,
  productName STRING(MAX) NOT NULL,
  productDescription STRING(MAX) NOT NULL,
  productDescriptionEmbedding ARRAY<FLOAT32>,
  createTime TIMESTAMP NOT NULL
  OPTIONS (
    allow_commit_timestamp = TRUE),
  inventoryCount INT64 NOT NULL,
  priceInCents INT64,)
  PRIMARY KEY(categoryId, productId);

इसके बाद, run बटन पर क्लिक करें और अपने स्कीमा के बनने का कुछ सेकंड तक इंतज़ार करें.

इसके बाद, आपको दो मॉडल बनाने होंगे और उन्हें VertexAI मॉडल एंडपॉइंट के लिए कॉन्फ़िगर करना होगा.

पहला मॉडल, एक एम्बेडिंग मॉडल है. इसका इस्तेमाल टेक्स्ट से एम्बेडिंग जनरेट करने के लिए किया जाता है. दूसरा मॉडल, एक एलएलएम मॉडल है. इसका इस्तेमाल Spanner में मौजूद डेटा के आधार पर जवाब जनरेट करने के लिए किया जाता है.

नीचे दिए गए स्कीमा को Spanner Studio के नए टैब में चिपकाएं:

CREATE OR REPLACE MODEL EmbeddingsModel
  INPUT(content STRING(MAX)) OUTPUT(embeddings STRUCT<values ARRAY<FLOAT32>>) REMOTE
  OPTIONS (
    endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/text-embedding-004');


CREATE OR REPLACE MODEL LLMModel
  INPUT(prompt STRING(MAX)) OUTPUT(content STRING(MAX)) REMOTE
  OPTIONS (
    endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/gemini-2.0-flash-001',
    default_batch_size = 1);

इसके बाद, run बटन पर क्लिक करें और मॉडल बनने के लिए कुछ सेकंड इंतज़ार करें.

Spanner Studio के बाएं पैनल में, आपको ये टेबल और मॉडल दिखने चाहिए:

62455aa4b0e839d9.png

डेटा लोड करना

अब आपको अपने डेटाबेस में कुछ प्रॉडक्ट डालने होंगे. Spanner Studio में नया टैब खोलें. इसके बाद, यहां दिए गए INSERT स्टेटमेंट को कॉपी करके चिपकाएं:

INSERT INTO products (categoryId, productId, productName, productDescription, createTime, inventoryCount, priceInCents)
VALUES (1, 1, "Cymbal Helios Helmet", "Safety meets style with the Cymbal children's bike helmet. Its lightweight design, superior ventilation, and adjustable fit ensure comfort and protection on every ride. Stay bright and keep your child safe under the sun with Cymbal Helios!", PENDING_COMMIT_TIMESTAMP(), 100, 10999),
(1, 2, "Cymbal Sprout", "Let their cycling journey begin with the Cymbal Sprout, the ideal balance bike for beginning riders ages 2-4 years. Its lightweight frame, low seat height, and puncture-proof tires promote stability and confidence as little ones learn to balance and steer. Watch them sprout into cycling enthusiasts with Cymbal Sprout!", PENDING_COMMIT_TIMESTAMP(), 10, 13999),
(1, 3, "Cymbal Spark Jr.", "Light, vibrant, and ready for adventure, the Spark Jr. is the perfect first bike for young riders (ages 5-8). Its sturdy frame, easy-to-use brakes, and puncture-resistant tires inspire confidence and endless playtime. Let the spark of cycling ignite with Cymbal!", PENDING_COMMIT_TIMESTAMP(), 34, 13900),
(1, 4, "Cymbal Summit", "Conquering trails is a breeze with the Summit mountain bike. Its lightweight aluminum frame, responsive suspension, and powerful disc brakes provide exceptional control and comfort for experienced bikers navigating rocky climbs or shredding downhill. Reach new heights with Cymbal Summit!", PENDING_COMMIT_TIMESTAMP(), 0, 79999),
(1, 5, "Cymbal Breeze", "Cruise in style and embrace effortless pedaling with the Breeze electric bike. Its whisper-quiet motor and long-lasting battery let you conquer hills and distances with ease. Enjoy scenic rides, commutes, or errands with a boost of confidence from Cymbal Breeze!", PENDING_COMMIT_TIMESTAMP(), 72, 129999),
(1, 6, "Cymbal Trailblazer Backpack", "Carry all your essentials in style with the Trailblazer backpack. Its water-resistant material, multiple compartments, and comfortable straps keep your gear organized and accessible, allowing you to focus on the adventure. Blaze new trails with Cymbal Trailblazer!", PENDING_COMMIT_TIMESTAMP(), 24, 7999),
(1, 7, "Cymbal Phoenix Lights", "See and be seen with the Phoenix bike lights. Powerful LEDs and multiple light modes ensure superior visibility, enhancing your safety and enjoyment during day or night rides. Light up your journey with Cymbal Phoenix!", PENDING_COMMIT_TIMESTAMP(), 87, 3999),
(1, 8, "Cymbal Windstar Pump", "Flat tires are no match for the Windstar pump. Its compact design, lightweight construction, and high-pressure capacity make inflating tires quick and effortless. Get back on the road in no time with Cymbal Windstar!", PENDING_COMMIT_TIMESTAMP(), 36, 24999),
(1, 9,"Cymbal Odyssey Multi-Tool","Be prepared for anything with the Odyssey multi-tool. This handy gadget features essential tools like screwdrivers, hex wrenches, and tire levers, keeping you ready for minor repairs and adjustments on the go. Conquer your journey with Cymbal Odyssey!", PENDING_COMMIT_TIMESTAMP(), 52, 999),
(1, 10,"Cymbal Nomad Water Bottle","Stay hydrated on every ride with the Nomad water bottle. Its sleek design, BPA-free construction, and secure lock lid make it the perfect companion for staying refreshed and motivated throughout your adventures. Hydrate and explore with Cymbal Nomad!", PENDING_COMMIT_TIMESTAMP(), 42, 1299);

डेटा डालने के लिए, run बटन पर क्लिक करें.

खास जानकारी

इस चरण में, आपने स्कीमा बनाया और cymbal-bikes डेटाबेस में कुछ बुनियादी डेटा लोड किया.

अगला

इसके बाद, आपको एम्बेडिंग मॉडल के साथ इंटिग्रेट करना होगा, ताकि प्रॉडक्ट की जानकारी के लिए एम्बेडिंग जनरेट की जा सकें. साथ ही, टेक्स्ट वाली खोज के अनुरोध को एम्बेडिंग में बदला जा सके, ताकि काम के प्रॉडक्ट खोजे जा सकें.

5. एम्बेड किए गए ऑब्जेक्ट के साथ काम करना

प्रॉडक्ट के ब्यौरे के लिए वेक्टर एम्बेडिंग जनरेट करना

प्रॉडक्ट के लिए, मिलते-जुलते प्रॉडक्ट खोजने की सुविधा का इस्तेमाल करने के लिए, आपको प्रॉडक्ट के ब्यौरे के लिए एम्बेडिंग जनरेट करनी होंगी.

स्कीमा में बनाए गए EmbeddingsModel की मदद से, यह एक सामान्य UPDATE DML स्टेटमेंट है.

UPDATE products p1
SET
  productDescriptionEmbedding = (
    SELECT embeddings.values
    FROM
      ML.PREDICT(
        MODEL EmbeddingsModel,
        (SELECT productDescription AS content))
  )
WHERE categoryId = 1;

प्रॉडक्ट के ब्यौरे अपडेट करने के लिए, run बटन पर क्लिक करें.

अगर आपको कोई गड़बड़ी दिखती है, तो ज़्यादा जानकारी देने वाला गड़बड़ी का मैसेज पाने के लिए, gcloud कमांड का इस्तेमाल करके टर्मिनल में sql कमांड को एक्ज़ीक्यूट करें. उदाहरण के लिए:

gcloud spanner databases execute-sql <YOUR_DATA_BASE> --instance=<YOUR_INSTANCE> --sql 'UPDATE products p1
SET
  productDescriptionEmbedding = (
    SELECT embeddings.values
    FROM
      ML.PREDICT(
        MODEL EmbeddingsModel,
        (SELECT productDescription AS content FROM products p2 WHERE p2.productId = p1.productId))
  )
WHERE categoryId = 1;'

इस उदाहरण में, एसक्यूएल क्वेरी के ज़रिए आम बोलचाल की भाषा में खोज का अनुरोध किया जाएगा. इस क्वेरी से, खोज के अनुरोध को एम्बेडिंग में बदल दिया जाएगा. इसके बाद, यह पिछले चरण में जनरेट की गई प्रॉडक्ट की जानकारी की सेव की गई एम्बेडिंग के आधार पर मिलते-जुलते नतीजे खोजेगी.

-- Use Spanner's vector search, and integration with embedding and LLM models to
-- return items that are semantically relevant and available in inventory based on
-- real-time data.

SELECT
  productName,
  productDescription,
  inventoryCount,
  COSINE_DISTANCE(
    productDescriptionEmbedding,
    (
      SELECT embeddings.values
      FROM
        ML.PREDICT(
          MODEL EmbeddingsModel,
          (SELECT "I'd like to buy a starter bike for my 3 year old child" AS content))
    )) AS distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;

मिलते-जुलते प्रॉडक्ट ढूंढने के लिए, run बटन पर क्लिक करें. नतीजे कुछ इस तरह दिखने चाहिए:

672e111753077fcf.png

ध्यान दें कि क्वेरी में अन्य फ़िल्टर का इस्तेमाल किया गया है. जैसे, सिर्फ़ उन प्रॉडक्ट में दिलचस्पी है जो स्टॉक में हैं (inventoryCount > 0).

खास जानकारी

इस चरण में, आपने SQL का इस्तेमाल करके प्रॉडक्ट के ब्यौरे की एम्बेडिंग और खोज के अनुरोध की एम्बेडिंग बनाई. इसके लिए, आपने VertexAI में मौजूद मॉडल के साथ Spanner के इंटिग्रेशन का फ़ायदा उठाया. आपने मिलती-जुलती खोज करने के लिए, वेक्टर सर्च का इस्तेमाल किया. इससे खोज के अनुरोध से मिलते-जुलते प्रॉडक्ट खोजे जा सकते हैं.

अगले चरण

इसके बाद, खोज के नतीजों का इस्तेमाल करके एलएलएम को इनपुट दें, ताकि हर प्रॉडक्ट के लिए पसंद के मुताबिक जवाब जनरेट किया जा सके.

6. एलएलएम का इस्तेमाल करना

Spanner को VertexAI से उपलब्ध कराए गए एलएलएम मॉडल के साथ आसानी से इंटिग्रेट किया जा सकता है. इससे डेवलपर, सीधे तौर पर एलएलएम के साथ इंटरफ़ेस करने के लिए एसक्यूएल का इस्तेमाल कर सकते हैं. इसके लिए, ऐप्लिकेशन को लॉजिक लागू करने की ज़रूरत नहीं होती.

उदाहरण के लिए, हमारे पास उपयोगकर्ता "I'd like to buy a starter bike for my 3 year old child". की पिछली SQL क्वेरी के नतीजे हैं

डेवलपर, हर नतीजे के लिए यह जानकारी देना चाहता है कि प्रॉडक्ट, उपयोगकर्ता के लिए सही है या नहीं. इसके लिए, वह यहां दिए गए प्रॉम्प्ट का इस्तेमाल करेगा:

"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me? I'd like to buy a starter bike for my 3 year old child"

यहां दी गई क्वेरी का इस्तेमाल किया जा सकता है:

-- Use an LLM to analyze this list and provide a recommendation on whether each
-- product is a good fit for the user. We use the vector search and real time
-- inventory data to first filter the products to reduce the size of the prompt to
-- the LLM.
SELECT productName, productDescription, inventoryCount, content AS LLMResponse
FROM
  ML.PREDICT(
    MODEL LLMModel,
    (
      SELECT
        FORMAT(
          """Answer with Yes or No and explain why: Is this a good fit for me?
          I would like to buy a starter bike for my 3 year old child \n Product Name: %s\nProduct Description: %s""", productName,productDescription) AS prompt,
        -- Pass through columns.
        inventoryCount,
        productName,
        productDescription,
      FROM products
      WHERE inventoryCount > 0
      ORDER BY
        COSINE_DISTANCE(
          productDescriptionEmbedding,
          (
            SELECT embeddings.values
            FROM
              ML.PREDICT(
                MODEL EmbeddingsModel,
                (SELECT "I'd like to buy a starter bike for my 3 year old child" AS content))
          ))
      LIMIT 5
    ));

क्वेरी जारी करने के लिए, run बटन पर क्लिक करें. नतीजे कुछ इस तरह दिखने चाहिए:

35878cd0f88f1470.png

पहला प्रॉडक्ट, तीन साल के बच्चे के लिए सही है. ऐसा इसलिए, क्योंकि प्रॉडक्ट की जानकारी में उम्र की सीमा (दो से चार साल) दी गई है. अन्य प्रॉडक्ट, क्वेरी के हिसाब से सही नहीं हैं.

खास जानकारी

इस चरण में, आपने एलएलएम का इस्तेमाल करके, किसी उपयोगकर्ता के प्रॉम्प्ट के बुनियादी जवाब जनरेट किए.

अगले चरण

अब, आइए जानते हैं कि वेक्टर सर्च को बेहतर बनाने के लिए, एएनएन का इस्तेमाल कैसे किया जाता है.

7. वेक्टर सर्च को स्केल करना

वेक्टर सर्च के पिछले उदाहरणों में, सटीक-केएनएन वेक्टर सर्च का इस्तेमाल किया गया था. यह तब सबसे अच्छा होता है, जब आपके पास Spanner डेटा के बहुत खास सबसेट को क्वेरी करने की सुविधा हो. इस तरह की क्वेरी को ज़्यादा पार्टीशन की जा सकने वाली क्वेरी कहा जाता है.

अगर आपके पास ऐसे वर्कलोड नहीं हैं जिन्हें कई हिस्सों में बांटा जा सकता है और आपके पास बड़ी मात्रा में डेटा है, तो आपको लुकअप परफ़ॉर्मेंस को बेहतर बनाने के लिए, ScaNN एल्गोरिदम का इस्तेमाल करके, एएनएन वेक्टर सर्च का इस्तेमाल करना होगा.

Spanner में ऐसा करने के लिए, आपको ये दो काम करने होंगे:

  • वेक्टर इंडेक्स बनाना
  • दूरी के APPROX फ़ंक्शन का इस्तेमाल करने के लिए, अपनी क्वेरी में बदलाव करें.

वेक्टर इंडेक्स बनाना

इस डेटासेट पर वेक्टर इंडेक्स बनाने के लिए, हमें सबसे पहले productDescriptionEmbeddings कॉलम में बदलाव करना होगा, ताकि हर वेक्टर की लंबाई तय की जा सके. किसी कॉलम में वेक्टर की लंबाई जोड़ने के लिए, आपको ओरिजनल कॉलम को हटाकर फिर से बनाना होगा.

ALTER TABLE products DROP COLUMN productDescriptionEmbedding;

ALTER TABLE products
ADD COLUMN productDescriptionEmbedding ARRAY<FLOAT32>(vector_length => 768);

इसके बाद, Generate Vector embedding चरण से फिर से एम्बेडिंग बनाएं.

UPDATE products p1
SET
  productDescriptionEmbedding = (
    SELECT embeddings.values
    FROM
      ML.PREDICT(
        MODEL EmbeddingsModel,
        (SELECT productDescription AS content FROM products p2 WHERE p2.productId = p1.productId))
  )
WHERE categoryId = 1;

कॉलम बनाने के बाद, इंडेक्स बनाएं:

CREATE VECTOR INDEX ProductDescriptionEmbeddingIndex
    ON products(productDescriptionEmbedding)
    WHERE productDescriptionEmbedding IS NOT NULL
OPTIONS (
 distance_type = 'COSINE'
);

अगर आपको PDML के बारे में ज़्यादा जानना है, तो https://cloud.google.com/spanner/docs/backfill-embeddings पर जाएं. एक DML स्टेटमेंट, 80 हज़ार म्यूटेशन की सीमा के साथ एक लेन-देन होता है. इसलिए, एक साथ बहुत सारी पंक्तियों को अपडेट नहीं किया जा सकता. PDML, डेटा को छोटे-छोटे बैच में बांटने का काम आसानी से करता है.

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

नए वेक्टर इंडेक्स का इस्तेमाल करने के लिए, आपको पिछली एम्बेडिंग क्वेरी में थोड़ा बदलाव करना होगा.

यहां ओरिजनल क्वेरी दी गई है:

SELECT
  productName,
  productDescription,
  inventoryCount,
  COSINE_DISTANCE(
    productDescriptionEmbedding,
    (
      SELECT embeddings.values
      FROM
        ML.PREDICT(
          MODEL EmbeddingsModel,
          (SELECT "I'd like to buy a starter bike for my 3 year old child" AS content))
    )) AS distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;

आपको ये बदलाव करने होंगे:

  • नए वेक्टर इंडेक्स के लिए इंडेक्स हिंट का इस्तेमाल करें: @{force_index=ProductDescriptionEmbeddingIndex}
  • COSINE_DISTANCE फ़ंक्शन कॉल को APPROX_COSINE_DISTANCE में बदलें. ध्यान दें कि नीचे दी गई फ़ाइनल क्वेरी में JSON विकल्प भी ज़रूरी हैं.
  • ML.PREDICT फ़ंक्शन से एम्बेडिंग को अलग से जनरेट करें.
  • एम्बेडिंग के नतीजों को फ़ाइनल क्वेरी में कॉपी करें.

एम्बेडिंग जनरेट करना और उनका इस्तेमाल करना:

-- Generate the prompt embeddings
SELECT embeddings.values
FROM ML.PREDICT(
  MODEL EmbeddingsModel,
   (SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
  );

क्वेरी के नतीजों को हाइलाइट करें और उन्हें कॉपी करें.

1b43c5ae4ef9ab68.png

इसके बाद, कॉपी की गई एम्बेडिंग को नीचे दी गई क्वेरी में <VECTOR> की जगह चिपकाएं.

-- Generate the embeddings and query them using the vector index
SELECT
  productName,
  productDescription,
  inventoryCount,
  APPROX_COSINE_DISTANCE(
    productDescriptionEmbedding,
    array<float32>[@VECTOR],
    options => JSON '{\"num_leaves_to_search\": 10}') AS distance
FROM products @{force_index = ProductDescriptionEmbeddingIndex}
WHERE productDescriptionEmbedding IS NOT NULL AND inventoryCount > 0
ORDER BY distance
LIMIT 5;

यह कुछ ऐसी नज़र आनी चाहिए:

12397107ec49c491.png

खास जानकारी

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

अगले चरण

इसके बाद, बारी आती है साफ़-सफ़ाई की!

8. डेटा को व्यवस्थित करना (ज़रूरी नहीं)

कोड को साफ़ करने के लिए, कोडलैब में बनाए गए 'retail-demo' इंस्टेंस को मिटा दें.

41cbc1a84b3588d5.png

9. बधाई हो!

बधाई हो, आपने Spanner की बिल्ट-इन वेक्टर सर्च सुविधा का इस्तेमाल करके, मिलती-जुलती इमेज खोजने की सुविधा का इस्तेमाल कर लिया है. इसके अलावा, आपने देखा कि SQL का इस्तेमाल करके, सीधे तौर पर जनरेटिव एआई की सुविधा देने के लिए, एम्बेडिंग और एलएलएम मॉडल के साथ काम करना कितना आसान है.

आखिर में, आपने वेक्टर सर्च के वर्कलोड को बढ़ाने के लिए, ScaNN एल्गोरिदम की मदद से एएनएन सर्च करने की प्रोसेस के बारे में जाना.

आगे क्या करना है?

Spanner की केएनएन वेक्टर सर्च (के-नियरेस्ट नेबर) सुविधा के बारे में ज़्यादा जानने के लिए, यहां जाएं: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

Spanner की एप्रोक्सिमेट नियरेस्ट नेबर (एएनएन वेक्टर सर्च) सुविधा के बारे में यहां ज़्यादा जानें: https://cloud.google.com/spanner/docs/find-approximate-nearest-neighbors

Spanner के VertexAI इंटिग्रेशन का इस्तेमाल करके, SQL की मदद से ऑनलाइन अनुमान लगाने के तरीके के बारे में यहां ज़्यादा जानें: https://cloud.google.com/spanner/docs/ml