টাইপ অনুযায়ী মেমরি সাজানোর ফলে রিট্রিভ করা টোকেন প্রায় ৪০% কমে যায়।
কেন একটি ফ্ল্যাট মেমরি স্টোর অকার্যকর হয়ে পড়ে
বেশিরভাগ শিক্ষানবিশদের টিউটোরিয়ালগুলোতে একটি LLM এজেন্টকে "মনে রাখার" জন্য প্রতিটি নতুন তথ্য একটি একক তালিকায় যুক্ত করতে এবং প্রতিবার সেই তালিকাটি মডেলকে ফেরত দেওয়ার কথা শেখানো হয়। কোডটি আক্ষরিক অর্থে মাত্র তিন লাইনের হয় এবং এটি একটি কার্যকরী ডেমো তৈরি করে। বাস্তবে, এই তালিকাটি অনিয়ন্ত্রিতভাবে বাড়তে থাকে। এর ফলে দুটি লক্ষণ দেখা দেয়:
- এজেন্ট পুরনো ডেটাকে এখনও সত্য হিসেবে গণ্য করে, উদাহরণস্বরূপ কয়েক ঘণ্টা আগে শেষ হয়ে যাওয়া একটি ETA প্রদান করে।
- কনটেক্সট উইন্ডো এমন সব অপ্রাসঙ্গিক তথ্যে ভরে যায় যা উত্তরের ওপর কোনো প্রভাব ফেলে না, ফলে API খরচ বেড়ে যায় এবং রেসপন্স টাইম ধীর হয়ে যায়।
একটি সাধারণ ভেক্টর স্টোর বা সাধারণ কী-ভ্যালু (key-value) ক্যাশ ব্যবহারকারীর পদবি এবং একটি সাময়িক প্রজেক্ট স্ট্যাটাসের মধ্যে পার্থক্য করতে পারে না। যখন এজেন্ট একটি সিম্যান্টিক সার্চ চালায়, তখন সিমিলারিটি অ্যালগরিদম হয়তো একটি পুরনো ETA সামনে নিয়ে আসতে পারে শুধুমাত্র কারণ কুয়েরিতে একই শব্দ রয়েছে, যদিও সেই তথ্যটি আর প্রাসঙ্গিক নয়।
স্ট্রাকচার্ড মেমরি: চারটি বাকেট, একটি উদ্দেশ্য
এর সমাধান হলো মেমরিকে একটি একক বস্তু হিসেবে দেখা বন্ধ করা এবং প্রতিটি এন্ট্রিকে চারটি ক্যাটাগরির যেকোনো একটিতে শ্রেণীবদ্ধ করা শুরু করা:
- User facts – স্থিতিশীল বৈশিষ্ট্য যেমন ব্যবহারকারীর ভূমিকা, পছন্দের ভাষা বা সিকিউরিটি ক্লিয়ারেন্স। এগুলো খুব কমই পরিবর্তিত হয় এবং পুরো সেশনের জন্য ক্যাশ করে রাখা যেতে পারে।
- Feedback – সুনির্দিষ্ট নিয়ম যা এজেন্টকে অবশ্যই মেনে চলতে হবে, যেমন, "কখনও ডেটাবেস পাসওয়ার্ড প্রকাশ করবেন না" বা "কমপ্লায়েন্স কুয়েরিতে কৌতুক এড়িয়ে চলুন।" যেহেতু এগুলো আচরণ নিয়ন্ত্রণ করে, তাই এগুলো সার্চেবল পুলের পরিবর্তে সিস্টেম প্রম্পটে থাকা উচিত।
- Project state – দ্রুত পরিবর্তনশীল ডেটা যেমন বর্তমান ETA, কাজের অগ্রগতি বা সাময়িক টোকেন। এই বাকেটের জন্য একটি এক্সপায়ারি চেক প্রয়োজন; একবার টাইমস্ট্যাম্প একটি নির্দিষ্ট সময়ের বাইরে চলে গেলে এন্ট্রিটি মুছে ফেলা উচিত।
- References – এক্সটার্নাল সার্ভিস, ডকুমেন্ট আইডি বা API এন্ডপয়েন্টের দিকে নির্দেশক। এগুলো প্রদর্শনের জন্য কোনো কন্টেন্ট নয়, বরং প্রয়োজনের সময় নতুন ডেটা সংগ্রহের পথ।
Mem0 ডেভেলপারদের প্রতিটি মেমরি রেকর্ডে যেকোনো মেটাডেটা যুক্ত করার সুবিধা দেয়। "kind" ফিল্ডের ওপর ইনডেক্সিং করার মাধ্যমে, LLM ফলাফলটি কীভাবে ব্যবহার করবে তা নির্ধারণ করার আগে একটি কুয়েরি প্রথমে প্রাসঙ্গিক বাকেটটি ফিল্টার করতে পারে।
Mem0-এর মাধ্যমে দুই-ধাপের রিট্রিভাল
- Pull memories by kind – একটি ছোট ফিল্টার কুয়েরি Mem0-এর কাছে "সব ফিডব্যাক" বা "একটি নির্দিষ্ট সময়ের চেয়ে নতুন প্রজেক্ট-state এন্ট্রি" জানতে চায়। এর ফলে রেজাল্ট সেটটি ইতিমধ্যেই সঠিক ক্যাটাগরিতে সীমিত হয়ে আসে।
- Let the LLM decide – ফিল্টার করা স্নিপেটগুলো ব্যবহারকারীর বর্তমান প্রশ্নের সাথে প্রম্পটে যুক্ত করা হয়। মডেলটি এখন অপ্রাসঙ্গিক তথ্য ঘেঁটে না দেখেই সেগুলো নিয়ে যুক্তি দিতে পারে।
একটি বাস্তব উদাহরণ: "ডেটাবেস নিয়ে ঠাট্টা করবেন না" নিয়মটি একটি সিম্যান্টিক ম্যাচের জন্য অপেক্ষা করার পরিবর্তে, ডেভেলপার সেশন শুরুর সময় সরাসরি সিস্টেম প্রম্পটে সেই নিয়মটি যুক্ত করে দেন এবং পুরো ইন্টারঅ্যাকশনের জন্য এটি ক্যাশ করে রাখেন। ব্যবহারকারীর কুয়েরিতে ডেটাবেসের কোনো স্পষ্ট উল্লেখ না থাকলেও মডেলটি আগে থেকেই সেই সীমাবদ্ধতা সম্পর্কে জানে।
খরচ কমানোর ব্যবহারিক কৌশলসমূহ
- Cache feedback rules – প্রতিবার সার্চ করার পরিবর্তে প্রতি সেশনে একবার নিয়ম সেটটি সংরক্ষণ করুন এবং পুনরায় ব্যবহার করুন। এটি প্রতি রাউন্ডে টোকেন ব্যবহার কমায়।
- Skip project-state searches when irrelevant – যদি ব্যবহারকারী সম্পূর্ণ ধারণাগত প্রশ্ন করেন (যেমন, "supervised এবং reinforcement learning-এর মধ্যে পার্থক্য কী?"), তবে কোনো ETA বা কাজের অগ্রগতি সংক্রান্ত ডেটা আনার প্রয়োজন নেই।
এই দুটি অভ্যাস প্রয়োগ করার মাধ্যমে, একটি সাধারণ ফ্ল্যাট মেমরি পদ্ধতির তুলনায় টোকেন ব্যবহার প্রায় ৪০% কমিয়ে আনা সম্ভব। এই সাশ্রয় সরাসরি কম API বিল এবং দ্রুত রেসপন্সে রূপান্তরিত হয়, বিশেষ করে সেই এজেন্টগুলোর জন্য যারা অনেক দীর্ঘ কথোপকথন চালিয়ে যায়।
কারা লাভবান হবে, কারা চিন্তিত হবে
Winners – কাস্টমার-সাপোর্ট বট, ইন্টারনাল ওয়ার্কফ্লো অ্যাসিস্ট্যান্ট বা যেকোনো মাল্টি-টার্ন LLM ইন্টারফেস তৈরি করা টিমগুলো। তারা আরও নির্ভরযোগ্য উত্তর পায়, পুরনো ডেটার কারণে হওয়া বিব্রতকর ভুল এড়ায় এবং তাদের বাজেট আরও কার্যকরভাবে ব্যবহার করতে পারে।
মূল কথা
আপনি যদি এমন একটি LLM এজেন্ট চান যা দীর্ঘ সেশন জুড়ে কার্যকর থাকে, তবে প্রতিটি তথ্য একটি একক কনটেক্সট উইন্ডোতে ঠাসা বন্ধ করুন। প্রতিটি মেমরিকে user fact, feedback, project state অথবা reference হিসেবে ট্যাগ করুন, যেখানে প্রয়োজন সেখানে এক্সপায়ারি নিশ্চিত করুন এবং Mem0-এর মতো টুলকে মূল কাজটি করতে দিন। এর ফলে আপনি পাবেন আরও সাম্প্রতিক উত্তর, কম অপ্রয়োজনীয় টোকেন এবং পরিচালন খরচে উল্লেখযোগ্য হ্রাস।