Gemini और Cloud SQL pgvector की मदद से, एआई असिस्टेंट की मेमोरी को विज़ुअलाइज़ करना

1. परिचय

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

Living memory का यूज़र इंटरफ़ेस

यह ऐप्लिकेशन, नैचुरल लैंग्वेज को समझने के लिए Gemini का इस्तेमाल करता है. साथ ही, सिमैंटिक समानता के आधार पर इन यादों को सेव करने और वापस पाने के लिए, Cloud SQL for PostgreSQL के साथ pgvector एक्सटेंशन का इस्तेमाल करता है.

यह कोडलैब, एआई और डेटाबेस में दिलचस्पी रखने वाले सभी डेवलपर के लिए है. इसे पूरा करने में करीब 60 मिनट लगेंगे. बनाए गए संसाधनों की लागत पांच डॉलर से कम होनी चाहिए.

आपको क्या करना होगा

  • pgvector की सुविधा के साथ, Cloud SQL for PostgreSQL इंस्टेंस सेट अप करने का तरीका.
  • उपयोगकर्ता के मैसेज से "यादें" इंटरैक्टिव तरीके से निकालने के लिए, Gemini का इस्तेमाल कैसे करें.
  • एआई के जवाबों के लिए काम का कॉन्टेक्स्ट पाने के लिए, PostgreSQL में वेक्टर खोजें कैसे करें.

Living memory architecture

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

  • बिलिंग की सुविधा वाला Google क्लाउड प्रोजेक्ट.
  • कमांड लाइन और Node.js की बुनियादी जानकारी.

2. शुरू करने से पहले

प्रोजेक्ट सेटअप करना

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

  1. Google Cloud Console में, प्रोजेक्ट चुनने वाले पेज पर, Google Cloud प्रोजेक्ट चुनें या बनाएं.
  2. पक्का करें कि आपके Cloud प्रोजेक्ट के लिए बिलिंग की सुविधा चालू हो. किसी प्रोजेक्ट के लिए बिलिंग चालू है या नहीं, यह देखने का तरीका जानें.

Cloud Shell शुरू करना

Cloud Shell, Google Cloud में चलने वाला एक कमांड-लाइन एनवायरमेंट है. इसमें ज़रूरी टूल पहले से लोड होते हैं.

  1. Google Cloud कंसोल में सबसे ऊपर मौजूद, Cloud Shell चालू करें पर क्लिक करें.
  2. Cloud Shell से कनेक्ट होने के बाद, अपने क्रेडेंशियल की पुष्टि करें:
    gcloud auth list
    
  3. पुष्टि करें कि आपका प्रोजेक्ट कॉन्फ़िगर किया गया है:
    gcloud config get project
    
  4. अगर आपका प्रोजेक्ट उम्मीद के मुताबिक सेट नहीं है, तो इसे सेट करें:
    export PROJECT_ID=<YOUR_PROJECT_ID>
    gcloud config set project $PROJECT_ID
    

एपीआई चालू करें

ज़रूरी एपीआई चालू करने के लिए, Cloud Shell में यह कमांड चलाएं:

gcloud services enable sqladmin.googleapis.com \
                       aiplatform.googleapis.com

3. डेमो रिपॉज़िटरी को क्लोन करना

अब लिविंग मेमोरी डेमो का कोड पाएं.

  1. रिपॉज़िटरी को अपने Cloud Shell एनवायरमेंट में क्लोन करें:
    git clone https://github.com/GoogleCloudPlatform/devrel-demos.git
    cd devrel-demos/codelabs/visual-memory-postgres-demo
    
  2. डिपेंडेंसी इंस्टॉल करें:
    npm install
    

4. Cloud SQL डेटाबेस बनाना और उसे कॉन्फ़िगर करना

इस सेक्शन में, आपको Cloud SQL इंस्टेंस बनाने, डेटाबेस को शुरू करने, और स्कीमा सेट अप करने का तरीका बताया जाएगा.

  1. यह ऐप्लिकेशन, कॉन्फ़िगरेशन के लिए एनवायरमेंट वैरिएबल का इस्तेमाल करता है. इस सेशन के लिए ज़रूरी वैरिएबल सेट करने के लिए, अपने Cloud Shell टर्मिनल में यह ब्लॉक चलाएं:
    export REGION="us-central1"
    export INSTANCE_NAME="living-memory-db"
    export DB_HOST=127.0.0.1
    export DB_PORT=5432
    export DB_USER=memory_app
    export DB_PASS=memory_app_password
    export DB_NAME=living_memory
    export PGPASSWORD=$DB_PASS
    
  2. इंस्टेंस बनाएं. आम तौर पर, इस चरण में 5 से 10 मिनट लगते हैं.
    gcloud sql instances create $INSTANCE_NAME \
        --database-version=POSTGRES_16 \
        --cpu=1 \
        --memory=3840MB \
        --region=$REGION \
        --root-password=$DB_PASS \
        --edition=ENTERPRISE
    
    इंस्टेंस बनाते समय, उस डेटाबेस स्कीमा के बारे में जान लें जिसका इस्तेमाल किया जाएगा.. यह स्क्रिप्ट, vector एक्सटेंशन को चालू करती है और ऐप्लिकेशन के साथ काम करने के लिए कई टेबल बनाती है:विज़ुअल मेमोरी स्कीमा का डायग्राम
    • users, conversations, messages: ये स्टैंडर्ड टेबल हैं. इनका इस्तेमाल उपयोगकर्ता की प्रोफ़ाइल और बातचीत का इतिहास सेव करने के लिए किया जाता है.
    • memories: यह, रीट्रिवल-ऑगमेंटेड जनरेशन (आरएजी) के लिए मुख्य टेबल है. हर लाइन में, बातचीत से निकाली गई जानकारी का एक हिस्सा होता है. जैसे, "उपयोगकर्ता को हाइकिंग पसंद है". यह कुकी इन चीज़ों को सेव करती है:
      • content: यादों का टेक्स्ट.
      • memory_type: यादों का टाइप (FACT, PREF या IMPLICIT).
      • embedding: यह 768 डाइमेंशन वाला vector कॉलम है. इसमें कॉन्टेंट का सिमैंटिक रिप्रज़ेंटेशन होता है. इसे Gemini ने जनरेट किया है.
    • pgvector इंडेक्स: embedding कॉलम पर HNSW (हायरार्किकल नेविगेबल स्मॉल वर्ल्ड) इंडेक्स बनाया जाता है. यह k-Nearest Neighbor (k-NN) खोजों को ऑप्टिमाइज़ करने के लिए ज़रूरी है. इससे pgvector, कोसाइन डिस्टेंस ऑपरेटर (<=>) का इस्तेमाल करके, सिमैंटिक तौर पर सबसे मिलती-जुलती यादों को तुरंत ढूंढने में मदद मिलती है.
  3. डेटाबेस बनाना
    gcloud sql databases create $DB_NAME --instance=$INSTANCE_NAME
    
  4. ऐप्लिकेशन उपयोगकर्ता बनाना
    gcloud sql users create $DB_USER --instance=$INSTANCE_NAME --password=$DB_PASS
    
  5. Cloud SQL Auth प्रॉक्सी शुरू करें. प्रॉक्सी, आपके इंस्टेंस को सुरक्षित ऐक्सेस देती है. इसके लिए, आईपी पतों को अनुमति देने की सुविधा को कॉन्फ़िगर करने की ज़रूरत नहीं होती.
    (cloud-sql-proxy ${GOOGLE_CLOUD_PROJECT}:us-central1:living-memory-db &) && sleep 2 && echo ""
    
    आपको इस तरह का मैसेज दिखेगा: The proxy has started successfully and is ready for new connections!.
  6. vector एक्सटेंशन को चालू करने और ज़रूरी टेबल बनाने के लिए, schema.sql को लागू करें. प्रॉक्सी चालू होने की वजह से, अब 127.0.0.1 पर अपने इंस्टेंस से कनेक्ट किया जा सकता है.
    psql -h 127.0.0.1 -U $DB_USER -d $DB_NAME < schema.sql
    
  7. पुष्टि करें कि स्कीमा बन गया है.
    psql -h 127.0.0.1 -U $DB_USER -d $DB_NAME -c "\dt"
    
    आपको conversations, memories, messages, और users टेबल की सूची वाला आउटपुट दिखेगा.
                      List of relations
    Schema |     Name      | Type  |   Owner    
    --------+---------------+-------+------------
    public | conversations | table | memory_app
    public | memories      | table | memory_app
    public | messages      | table | memory_app
    public | queries_log   | table | memory_app
    public | users         | table | memory_app
    (5 rows)
    

5. pgvector की मदद से सिमैंटिक रिट्रीवल को समझना

इस सेक्शन में, यह देखा जाएगा कि जवाब जनरेट करने से पहले, ऐप्लिकेशन एआई के लिए काम का कॉन्टेक्स्ट कैसे ढूंढता है. server.js के इस स्निपेट में, /api/chat एंडपॉइंट में इसके लिए ज़िम्मेदार कोड दिखाया गया है:

// Retrieve Similar Memories for Context (Using pgvector)
const promptEmbeddingRes = await ai.models.embedContent({
  model: 'gemini-embedding-001',
  contents: message,
  config: { outputDimensionality: 768 },
});

const promptEmbedding = promptEmbeddingRes.embeddings[0].values;
const embeddingStr = `[${promptEmbedding.join(',')}]`;

// Query DB for top 5 closest memories
const relevantMemories = await pool.query(
  `SELECT id, content, memory_type, category 
   FROM memories 
   WHERE user_id = $1 
   ORDER BY embedding <=> $2::vector 
   LIMIT 5`,
  [userId, embeddingStr]
);

यह कैसे काम करता है

  • जेन एआई (एम्बेडिंग): यह ऐप्लिकेशन, उपयोगकर्ता से मिले मैसेज को लेता है और gemini-embedding-001 मॉडल का इस्तेमाल करके, टेक्स्ट को 768 डाइमेंशन वाले वेक्टर में बदलता है. यह वेक्टर, मैसेज के सिमैंटिक मतलब को दिखाता है.
  • Cloud SQL (pgvector): ऐप्लिकेशन, उस वेक्टर को Cloud SQL को पास करता है. Cloud SQL, pgvector एक्सटेंशन के ज़रिए उपलब्ध कराए गए <=> (कोसाइन दूरी) ऑपरेटर का इस्तेमाल करके, प्रॉम्प्ट से मिलती-जुलती पांच यादें ढूंढता है.
  • नतीजा: यह Retrieval-Augmented Generation (RAG) है. एआई को डेटाबेस से, काम की कुछ खास यादों का ऐक्सेस मिलता है. इससे वह आपकी दिलचस्पी के हिसाब से जवाब दे पाता है. इसके लिए, उसे पूरा इतिहास लोड करने की ज़रूरत नहीं होती.

6. यादें बनाने के लिए फ़ोटो से जानकारी निकालने की प्रोसेस के बारे में जानकारी

इसके बाद, देखें कि ऐप्लिकेशन बातचीत से कैसे सीखता है. यहां दिया गया स्निपेट, server.js में मौजूद extractMemoriesAsync फ़ंक्शन का है:

// MEMORY EXTRACTION LOGIC
async function extractMemoriesAsync(userMessage, userId, messageId) {
  const extractionPrompt = `
    Analyze the following user message. A memory profile is being built for this user.
    Extract ANY explicit facts (Facts), preferences (Pref), or implicit behavioral traits/styles (Implicit).
    Return the result as a raw JSON array of objects (NO Markdown blocks, just the JSON array).
    Format: [{"content": "string fact/sentence", "type": "FACT|PREF|IMPLICIT", "category": "General|Travel|Hobby|Persona"}]
    If nothing is found, return [].
    Message: "${userMessage}"
    `;

  const result = await ai.models.generateContent({
    model: 'gemini-2.5-flash',
    contents: extractionPrompt
  });
  let rawJson = result.text.replace(/^```json/g, '').replace(/```$/g, '').trim();

  let extracted;
  try {
    extracted = JSON.parse(rawJson);
  } catch (e) {
    console.warn("Could not parse extracted JSON:", rawJson);
    return;
  }

  if (Array.isArray(extracted) && extracted.length > 0) {
    // Compute embeddings and save each to the DB
    for (const memory of extracted) {
      const embedRes = await ai.models.embedContent({
        model: 'gemini-embedding-001',
        contents: memory.content,
        config: { outputDimensionality: 768 },
      });
      const vectorData = `[${embedRes.embeddings[0].values.join(',')}]`;

      await pool.query(
        `INSERT INTO memories (user_id, content, memory_type, category, embedding, source_message_id)
                 VALUES ($1, $2, $3, $4, $5, $6)`,
        [userId, memory.content, memory.type.toUpperCase(), memory.category, vectorData, messageId]
      );
      console.log(`Saved new memory: ${memory.content}`);
    }
  }
}

यह कैसे काम करता है

  • जन एआई (स्ट्रक्चर्ड आउटपुट): यह ऐप्लिकेशन, gemini-2.5-flash मॉडल का इस्तेमाल करके उपयोगकर्ता के मैसेज का विश्लेषण करता है. साथ ही, स्ट्रक्चर्ड फ़ैक्ट और प्राथमिकताओं को JSON ऐरे के तौर पर निकालता है.
  • Cloud SQL (हाइब्रिड स्टोरेज): इन नए तथ्यों के लिए एम्बेडिंग जनरेट करने के बाद, इन्हें Cloud SQL में सेव किया जाता है. ध्यान दें कि स्टैंडर्ड रिलेशनल डेटा (उपयोगकर्ता आईडी, टेक्स्ट कॉन्टेंट, कैटगरी) को एक ही लाइन में, ज़्यादा डाइमेंशन वाले वेक्टर डेटा के साथ सेव किया जाता है.
  • नतीजा: यह ऐप्लिकेशन, Gemini की विश्लेषण करने की क्षमता और Cloud SQL की स्टोरेज क्षमता का इस्तेमाल करके, रीयल-टाइम में अपने-आप अपडेट होने वाली मेमोरी प्रोफ़ाइल बनाता है.

7. चैट ऐप्लिकेशन चलाएं

  1. डेटाबेस में कुछ उदाहरण उपयोगकर्ताओं को शामिल करना
    npm run seed
    
    सीड मेमोरी
  2. इसके बाद, सर्वर चलाएं
    node server.js
    
  3. Cloud Shell में, टर्मिनल टूलबार में सबसे ऊपर दाईं ओर मौजूद वेब प्रीव्यू पर क्लिक करें. इसके बाद, पोर्ट बदलें को चुनें. पोर्ट किए जाने वाले नंबर के लिए 3000 डालें. इसके बाद, बदलें और झलक देखें पर क्लिक करें.

Assistant से बातचीत करना

जब ऐप्लिकेशन आपके ब्राउज़र में खुलेगा, तब आपको लिविंग मेमोरी का चैट इंटरफ़ेस दिखेगा. दाईं ओर, AI Cortex Data Visualizer में, यादों को वेक्टर स्पेस में नोड के तौर पर दिखाया गया है. इन्हें टाइप के हिसाब से कलर-कोड किया गया है (तथ्य, पसंद, छिपी हुई खासियत). आपकी स्क्रीन के रिज़ॉल्यूशन के हिसाब से, मेमोरी नोड पर मौजूद टेक्स्ट छोटा हो सकता है. ज़्यादा बारीकी से देखने के लिए, ज़ूम और पैन करने के लिए माउस या ट्रैकपैड का इस्तेमाल करें.

Living memory का यूज़र इंटरफ़ेस

मौजूदा यादों के बारे में क्वेरी करना

आपने पहले जो seed स्क्रिप्ट चलाई थी उससे दो सैंपल उपयोगकर्ता बनाए गए हैं. साथ ही, उनमें पहले से कुछ यादें मौजूद हैं.

  1. सबसे ऊपर बाईं ओर मौजूद, उपयोगकर्ता ड्रॉपडाउन मेन्यू से कोई उपयोगकर्ता चुनें.
  2. क्विक-चैट बटन में से किसी एक का इस्तेमाल करें या चैट इनपुट में Give me restaurant recommendations in New York City टाइप करें. इसके बाद, भेजें दबाएं.
  3. जवाब मिलने के बाद, Assistant के मैसेज पर क्लिक करके देखा जा सकता है कि उसने किन यादों का इस्तेमाल किया है. इन्हें हरे रंग से हाइलाइट किया जाएगा. साथ ही, इन्हें ज़ूम करके देखा जा सकता है. इससे यह पता चलेगा कि जवाब बनाने में इनकी क्या भूमिका रही.

नया उपयोगकर्ता बनाना

अब, नया उपयोगकर्ता बनाते हैं.

  1. नया चैट सेशन शुरू करने के लिए, उपयोगकर्ता ड्रॉपडाउन के बगल में मौजूद + बटन पर क्लिक करें.
  2. जनरेट किए गए नाम और ब्यौरे का इस्तेमाल करें या अपने बारे में बताने के लिए उनमें बदलाव करें.
  3. बनाएं पर क्लिक करें. इसके बाद, ऐप्लिकेशन को यादें एक्सट्रैक्ट करते हुए देखें. लगभग 30 सेकंड में, आपको दाईं ओर मौजूद विज़ुअलाइज़र में नए नोड दिखने चाहिए. इनमें वे तथ्य और प्राथमिकताएँ शामिल होती हैं जिन्हें Gemini ने आपके मैसेज से निकाला है और Cloud SQL डेटाबेस में सेव किया है.
  4. बातचीत के दौरान, Assistant से कोई फ़ॉलो-अप सवाल पूछें. जैसे, What food do I like?. इससे आपको पता चलेगा कि Assistant, बातचीत के दौरान अपनी नई यादों का इस्तेमाल कैसे करती है.

8. व्यवस्थित करें

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

  1. Cloud SQL इंस्टेंस मिटाएं:
    gcloud sql instances delete $INSTANCE_NAME --quiet
    
  2. डेमो रिपॉज़िटरी हटाएं:
    rm -rf ~/devrel-demos
    

9. बधाई हो

आपने "Living Memory" एआई असिस्टेंट को बना लिया है और उसे डिप्लॉय कर दिया है!

आपने क्या सीखा

  • सिमैंटिक सर्च के लिए, Cloud SQL pgvector का इस्तेमाल करने का तरीका.
  • डाइनैमिक मेमोरी एक्सट्रैक्शन के लिए, Gemini का इस्तेमाल कैसे करें.

अगले चरण

Living Memory की मदद से, अपनी यादों को यादगार बनाएं!