১. ভূমিকা
এই কোডল্যাবে আপনি লিভিং মেমোরি ডেমো তৈরি করতে শিখবেন, যা একটি এআই-চালিত সহকারী এবং আপনাকে একটি ব্যক্তিগতকৃত অভিজ্ঞতা প্রদানের জন্য আপনার কথোপকথনের 'স্মৃতি' ট্র্যাক করে।

অ্যাপ্লিকেশনটি স্বাভাবিক ভাষা বোঝার জন্য Gemini এবং শব্দার্থগত সাদৃশ্যের উপর ভিত্তি করে এই স্মৃতিগুলো সংরক্ষণ ও পুনরুদ্ধার করার জন্য pgvector এক্সটেনশনসহ PostgreSQL-এর জন্য Cloud SQL ব্যবহার করে।
এই কোডল্যাবটি এআই এবং ডেটাবেসে আগ্রহী সকল স্তরের ডেভেলপারদের জন্য তৈরি করা হয়েছে এবং এটি সম্পূর্ণ করতে প্রায় ৬০ মিনিট সময় লাগবে। এর মাধ্যমে তৈরি রিসোর্সগুলোর খরচ $৫-এর কম হওয়া উচিত।
আপনি যা করবেন
-
pgvectorসাপোর্ট সহ একটি Cloud SQL for PostgreSQL ইনস্ট্যান্স কীভাবে সেট আপ করবেন। - ব্যবহারকারীর বার্তা থেকে ইন্টারেক্টিভভাবে 'স্মৃতি' বের করতে কীভাবে জেমিনি ব্যবহার করবেন।
- এআই প্রতিক্রিয়ার জন্য প্রাসঙ্গিক তথ্য উদ্ধার করতে PostgreSQL-এ কীভাবে ভেক্টর সার্চ করতে হয়।

আপনার যা যা লাগবে
- বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট।
- কমান্ড লাইন ও নোড.জেএস সম্পর্কে প্রাথমিক জ্ঞান।
২. শুরু করার আগে
প্রজেক্ট সেটআপ
একটি গুগল ক্লাউড প্রজেক্ট তৈরি করুন
- গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন ।
- আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন, তা জেনে নিন।
ক্লাউড শেল শুরু করুন
ক্লাউড শেল হলো গুগল ক্লাউডে চালিত একটি কমান্ড-লাইন পরিবেশ, যা প্রয়োজনীয় টুলস সহ আগে থেকেই লোড করা থাকে।
- Google Cloud কনসোলের শীর্ষে থাকা Activate Cloud Shell-এ ক্লিক করুন।
- ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনার প্রমাণীকরণ যাচাই করুন:
gcloud auth list - আপনার প্রজেক্টটি কনফিগার করা হয়েছে কিনা তা নিশ্চিত করুন:
gcloud config get project - আপনার প্রজেক্টটি প্রত্যাশা অনুযায়ী সেট করা না থাকলে, এটি সেট করুন:
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
এপিআই সক্ষম করুন
প্রয়োজনীয় API-গুলো সক্রিয় করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud services enable sqladmin.googleapis.com \
aiplatform.googleapis.com
৩. ডেমো রিপোজিটরিটি ক্লোন করুন
এখন, লিভিং মেমোরি ডেমোর জন্য কোডটি সংগ্রহ করুন।
- রিপোজিটরিটি আপনার ক্লাউড শেল এনভায়রনমেন্টে ক্লোন করুন:
git clone https://github.com/GoogleCloudPlatform/devrel-demos.git cd devrel-demos/codelabs/visual-memory-postgres-demo - নির্ভরতাগুলি ইনস্টল করুন:
npm install
৪. ক্লাউড SQL ডেটাবেস তৈরি এবং কনফিগার করুন
এই অংশে, আপনি একটি ক্লাউড এসকিউএল ইনস্ট্যান্স তৈরি করবেন, একটি ডেটাবেস ইনিশিয়ালাইজ করবেন এবং স্কিমা সেট আপ করবেন।
- অ্যাপ্লিকেশনটি কনফিগারেশনের জন্য এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে। এই সেশনের জন্য প্রয়োজনীয় ভেরিয়েবলগুলো সেট করতে আপনার ক্লাউড শেল টার্মিনালে নিম্নলিখিত ব্লকটি চালান:
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 - ইনস্ট্যান্সটি তৈরি করুন। এই ধাপে সাধারণত ৫-১০ মিনিট সময় লাগে।
ইনস্ট্যান্সটি তৈরি হওয়ার সময়, আপনি যে ডাটাবেস স্কিমাটি ব্যবহার করবেন তা বুঝে নিতে একটু সময় নিন। স্ক্রিপ্টটিgcloud sql instances create $INSTANCE_NAME \ --database-version=POSTGRES_16 \ --cpu=1 \ --memory=3840MB \ --region=$REGION \ --root-password=$DB_PASS \ --edition=ENTERPRISEvectorএক্সটেনশন সক্রিয় করে এবং অ্যাপ্লিকেশনটিকে সমর্থন করার জন্য বেশ কয়েকটি টেবিল তৈরি করে:
-
users,conversations,messages: ব্যবহারকারীর প্রোফাইল এবং কথোপকথনের ইতিহাস সংরক্ষণের জন্য ব্যবহৃত সাধারণ টেবিল। -
memories: এটি রিট্রিভাল-অগমেন্টেড জেনারেশন (RAG)-এর মূল টেবিল। প্রতিটি সারি কথোপকথন থেকে সংগৃহীত এক একটি তথ্যকে উপস্থাপন করে (যেমন, "ব্যবহারকারী হাইকিং পছন্দ করেন")। এটি সংরক্ষণ করে:-
content: স্মৃতির পাঠ্য। -
memory_type: মেমরির ধরণ (FACT,PREF, অথবাIMPLICIT)। -
embedding: জেমিনি দ্বারা তৈরি, বিষয়বস্তুর শব্দার্থিক উপস্থাপনা ধারণকারী একটি ৭৬৮-মাত্রারvectorকলাম।
-
-
pgvectorইনডেক্স :embeddingকলামের উপর একটিHNSW(Hierarchical Navigable Small World) ইনডেক্স তৈরি করা হয়। এটি k-Nearest Neighbor (k-NN) সার্চ অপটিমাইজ করার জন্য অত্যন্ত গুরুত্বপূর্ণ, যাpgvectorকোসাইন ডিসটেন্স অপারেটর (<=>) ব্যবহার করে সবচেয়ে অর্থগতভাবে সাদৃশ্যপূর্ণ মেমোরিগুলো দ্রুত খুঁজে পেতে সাহায্য করে।
-
- ডাটাবেস তৈরি করুন
gcloud sql databases create $DB_NAME --instance=$INSTANCE_NAME - অ্যাপ্লিকেশন ব্যবহারকারী তৈরি করুন
gcloud sql users create $DB_USER --instance=$INSTANCE_NAME --password=$DB_PASS - ক্লাউড এসকিউএল অথোরাইজেশন প্রক্সি চালু করুন। এই প্রক্সিটি আইপি অ্যালাওলিস্টিং কনফিগার করার প্রয়োজন ছাড়াই আপনার ইনস্ট্যান্সে নিরাপদ অ্যাক্সেস প্রদান করে।
আপনি এইরকম একটি বার্তা দেখতে পাবেন:(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! -
vectorএক্সটেনশন সক্রিয় করতে এবং প্রয়োজনীয় টেবিলগুলো তৈরি করতেschema.sqlফাইলটি প্রয়োগ করুন। যেহেতু প্রক্সিটি চালু আছে, আপনি এখন127.0.0.1ঠিকানায় আপনার ইনস্ট্যান্সে সংযোগ করতে পারবেন।psql -h 127.0.0.1 -U $DB_USER -d $DB_NAME < schema.sql - স্কিমা তৈরি সফল হয়েছে কিনা তা যাচাই করুন।
আপনি আউটপুটে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)
৫. 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মডেল ব্যবহার করে টেক্সটটিকে একটি ৭৬৮-মাত্রিক ভেক্টরে রূপান্তর করে। এই ভেক্টরটি বার্তাটির অর্থগত তাৎপর্য উপস্থাপন করে। - ক্লাউড এসকিউএল (পিজিভেক্টর) : অ্যাপ্লিকেশনটি সেই ভেক্টরটি ক্লাউড এসকিউএল-এ পাঠায়।
pgvectorএক্সটেনশন দ্বারা প্রদত্ত<=>(কোসাইন ডিসটেন্স) অপারেটরটি ব্যবহার করে, ক্লাউড এসকিউএল প্রম্পটের সাথে অর্থগতভাবে সবচেয়ে সাদৃশ্যপূর্ণ ৫টি মেমরি খুঁজে বের করে। - এর ফলাফল হলো রিট্রিভাল-অগমেন্টেড জেনারেশন (RAG)। সম্পূর্ণ হিস্ট্রি লোড করার প্রয়োজন ছাড়াই, এআই তার প্রতিক্রিয়াকে ব্যক্তিগতকৃত করার জন্য ডাটাবেস থেকে নির্দিষ্ট ও প্রাসঙ্গিক স্মৃতিগুলো ব্যবহার করতে পারে।
৬. মেমরি নিষ্কাশন বুঝুন
এরপর, দেখুন অ্যাপ্লিকেশনটি কথোপকথন থেকে কীভাবে শেখে। নিচের কোড স্নিপেটটি 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}`);
}
}
}
এটি কীভাবে কাজ করে
- জেন এআই (স্ট্রাকচার্ড আউটপুট) : অ্যাপ্লিকেশনটি ব্যবহারকারীর বার্তা বিশ্লেষণ করতে এবং কাঠামোগত তথ্য ও পছন্দসমূহকে একটি JSON অ্যারে হিসাবে বের করতে অত্যন্ত দ্রুত
gemini-2.5-flashমডেল ব্যবহার করে। - ক্লাউড এসকিউএল (হাইব্রিড স্টোরেজ) : এই নতুন ফ্যাক্টগুলোর জন্য এমবেডিং তৈরি করার পর, সেগুলো ক্লাউড এসকিউএল-এ সংরক্ষণ করা হয়। লক্ষ্য করুন যে, সাধারণ রিলেশনাল ডেটা (ইউজার আইডি, টেক্সট কন্টেন্ট, ক্যাটাগরি) উচ্চ-মাত্রিক ভেক্টর ডেটার ঠিক পাশেই একটি একক সারিতে সংরক্ষিত থাকে।
- ফলাফল : অ্যাপটি জেমিনির বিশ্লেষণাত্মক ক্ষমতা এবং ক্লাউড এসকিউএল-এর স্টোরেজ সক্ষমতা উভয়কে কাজে লাগিয়ে রিয়েল-টাইমে একটি স্বয়ংক্রিয়ভাবে আপডেট হওয়া মেমরি প্রোফাইল তৈরি করে।
৭. চ্যাট অ্যাপ্লিকেশনটি চালান।
- ডাটাবেসে কিছু নমুনা ব্যবহারকারী যুক্ত করুন।
npm run seed
- তারপর সার্ভারটি চালান।
node server.js - ক্লাউড শেলে, টার্মিনাল টুলবারের উপরের ডানদিকে থাকা ‘ওয়েব প্রিভিউ’- তে ক্লিক করুন এবং ‘চেঞ্জ পোর্ট’ নির্বাচন করুন। পোর্ট নম্বর হিসেবে
3000লিখুন এবং ‘চেঞ্জ অ্যান্ড প্রিভিউ’-তে ক্লিক করুন।
সহকারীর সাথে যোগাযোগ করুন
যখন অ্যাপ্লিকেশনটি আপনার ব্রাউজারে খুলবে, আপনি লিভিং মেমোরি চ্যাট ইন্টারফেসটি দেখতে পাবেন। ডানদিকে, এআই কর্টেক্স ডেটা ভিজ্যুয়ালাইজারটি মেমোরিগুলোকে একটি ভেক্টর স্পেসে নোড হিসেবে প্রদর্শন করে, যা ধরন অনুযায়ী (ফ্যাক্ট, প্রেফারেন্স, ইমপ্লিসিট ট্রেইট) রঙ দিয়ে চিহ্নিত করা থাকে। আপনার স্ক্রিন রেজোলিউশনের উপর নির্ভর করে মেমোরি নোডগুলোর লেখা ছোট হতে পারে; আরও ভালোভাবে দেখার জন্য জুম ও প্যান করতে আপনার মাউস বা ট্র্যাকপ্যাড ব্যবহার করুন।

বিদ্যমান স্মৃতিগুলো অনুসন্ধান করুন
আপনি আগে seed স্ক্রিপ্টটি চালিয়েছিলেন, সেটি কিছু পূর্ব-পূরিত মেমোরি সহ দুটি নমুনা ব্যবহারকারী তৈরি করেছে।
- উপরের বাম দিকের ব্যবহারকারী ড্রপডাউন মেনু থেকে একজন ব্যবহারকারী নির্বাচন করুন।
- কুইক-চ্যাট বাটনগুলোর একটি ব্যবহার করুন অথবা চ্যাট ইনপুটে
Give me restaurant recommendations in New York Cityটাইপ করে ‘Send’ চাপুন। - যখন অ্যাসিস্ট্যান্ট উত্তর দেবে, তখন সে কোন স্মৃতিগুলো ব্যবহার করেছে তা দেখতে আপনি তার মেসেজটিতে ক্লিক করতে পারেন। সেগুলো সবুজ রঙে হাইলাইট করা থাকবে এবং আপনি সেগুলোতে জুম করে দেখতে পারবেন যে সেগুলো কীভাবে উত্তরটি তৈরি করতে সাহায্য করেছে।
নতুন ব্যবহারকারী তৈরি করুন
এখন, চলুন একজন নতুন ব্যবহারকারী তৈরি করি।
- নতুন চ্যাট সেশন শুরু করতে ইউজার ড্রপডাউনের পাশে থাকা + বাটনে ক্লিক করুন।
- তৈরি করা নাম ও বিবরণ ব্যবহার করুন অথবা নিজের বর্ণনা দিতে সেগুলো সম্পাদনা করুন।
- Create-এ ক্লিক করুন এবং অ্যাপ্লিকেশনটিকে স্মৃতি সংগ্রহ করা শুরু করতে দেখুন। প্রায় ৩০ সেকেন্ডের মধ্যে, আপনি ডানদিকের ভিজ্যুয়ালাইজারে নতুন নোডগুলি দেখতে পাবেন। এগুলি হলো সেইসব তথ্য এবং পছন্দ যা জেমিনি আপনার বার্তা থেকে সংগ্রহ করে ক্লাউড SQL ডেটাবেসে সংরক্ষণ করেছে।
- সহকারীটি কথোপকথনে তার নতুন অর্জিত স্মৃতি ব্যবহার করছে কিনা তা দেখতে,
What food do I like?এর মতো একটি পরবর্তী প্রশ্ন জিজ্ঞাসা করুন।
৮. পরিষ্কার করুন
এই কোডল্যাবে ব্যবহৃত রিসোর্সগুলোর জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চলমান চার্জ এড়াতে, আপনার তৈরি করা রিসোর্সগুলো মুছে ফেলা উচিত।
- ক্লাউড SQL ইনস্ট্যান্সটি মুছে ফেলুন:
gcloud sql instances delete $INSTANCE_NAME --quiet - ডেমো রিপোজিটরিটি সরান:
rm -rf ~/devrel-demos
৯. অভিনন্দন
আপনি সফলভাবে একটি 'লিভিং মেমোরি' এআই অ্যাসিস্ট্যান্ট তৈরি এবং স্থাপন করেছেন!
আপনি যা শিখেছেন
- সিমান্টিক সার্চের জন্য ক্লাউড এসকিউএল পিজিভেক্টর কীভাবে ব্যবহার করবেন।
- ডাইনামিক মেমরি এক্সট্র্যাকশনের জন্য জেমিনি কীভাবে ব্যবহার করবেন।
পরবর্তী পদক্ষেপ
- ক্লাউড এসকিউএল পিজিভেক্টর ডকুমেন্টেশনটি অন্বেষণ করুন।
- জেমিনি এপিআই-এর সক্ষমতা সম্পর্কে আরও জানুন।
- ক্লাউড এসকিউএল অথোরাইজেশন প্রক্সি নিয়ে বিস্তারিত আলোচনা।
- বিভিন্ন ধরনের ডেটা এক্সট্র্যাক্ট করার জন্য
server.jsএরextractionPromptকাস্টমাইজ করে দেখুন!
লিভিং মেমোরির সাথে নির্মাণ উপভোগ করুন!