আপনার AI বিল রাতারাতি তিনগুণ হয়ে গেল। মডেল, ট্রাফিক ভলিউম এমনকি প্রম্পটের টেক্সটও একই ছিল; দোষী ছিল মাত্র একটি লাইনের কোড যা OpenAI-এর প্রম্পট ক্যাশ (prompt cache) নষ্ট করে দিয়েছিল।

কেন ক্যাশ গুরুত্বপূর্ণ

প্রোভাইডারের প্রম্পট ক্যাশ আপনাকে টাকা সাশ্রয় করে কারণ এটি এমন যেকোনো রিকোয়েস্টের পুনঃপ্রক্রিয়াকরণ (re-processing) এড়িয়ে চলে যার শুরুটা বাইট-ফর-বাইট (byte-for-byte) হুবহু এক। যদি প্রথম টোকেনগুলো আগের কোনো কলের সাথে মিলে যায়, তবে প্রোভাইডার সেই টোকেনগুলোর আগে থেকে গণনা করা রিপ্রেজেন্টেশন পুনরায় ব্যবহার করে এবং শুধুমাত্র নতুন সাফিক্স (suffix)-এর জন্য চার্জ করে। নিয়মটি কঠোর: মিলটি অবশ্যই হুবহু হতে হবে, কেবল সদৃশ হলে চলবে না। শুরুতে একটি ভিন্ন টোকেন পুরো ক্যাশ হিট (cache hit) নষ্ট করে দেয়।

যে ভুলটি হিট রেট কমিয়ে দিয়েছিল

আমাদের এজেন্টে আমরা মডেলকে "বর্তমান সময়" সম্পর্কে ধারণা দেওয়ার জন্য সিস্টেম প্রম্পটের একেবারে শুরুতে একটি বর্তমান টাইমস্ট্যাম্প (timestamp) রেখেছিলাম। যেহেতু টাইমস্ট্যাম্প প্রতি সেকেন্ডে পরিবর্তিত হয়, তাই প্রতিটি রিকোয়েস্টের জন্য প্রথম টোকেন সিকোয়েন্সটি ছিল অনন্য। ক্যাশ কখনোই কোনো মিল খুঁজে পায়নি, ফলে প্রতিটি কলের জন্য পরবর্তী ১৮,০০০ স্ট্যাটিক টোকেনের (tool schemas, documentation snippets, few-shot examples এবং fixed instructions) পুরো দাম দিতে হয়েছিল। এর ফলে ক্যাশ হিট রেট ছিল ০% এবং বিল তিনগুণ বেড়ে গিয়েছিল।

ক্যাশ করার উপযোগী করার জন্য পুনরায় সাজানো

সমাধানটি সহজ: যা কখনো পরিবর্তন হয় না সেগুলোকে প্রম্পটের শুরুতে রাখুন এবং যেকোনো পরিবর্তনশীল (volatile) ডেটাকে শেষে পাঠিয়ে দিন।

Static prefix (cacheable)

  • Tool definitions
  • Retrieval documents
  • Few-shot examples
  • Fixed system instructions

Volatile suffix (non-cacheable)

  • Current time
  • Session identifiers
  • User messages
  • Live context

যদি মডেলের সময়ের প্রয়োজন হয়, তবে এটিকে প্রম্পটের শুরুতে যোগ না করে স্ট্যাটিক ব্লকের পরে যুক্ত করুন। এতে ক্যাশ ভারী স্ট্যাটিক অংশটি পুনরায় ব্যবহার করতে পারবে এবং আপনি শেষে নতুন কনটেক্সট সরবরাহ করতে পারবেন।

স্ট্যাকের মধ্যে লুকিয়ে থাকা বিপদসমূহ

টেমপ্লেটটি সঠিক মনে হলেও, পেলোডটি API-তে পৌঁছানোর আগে মিডলওয়্যার (middleware) বা SDK-গুলো নীরবে মেটাডেটা—যেমন রিকোয়েস্ট আইডি, টাইমস্ট্যাম্প বা অন্যান্য হেডার—প্রিেন্ড (prepend) করতে পারে। কিছু ডিপ্লয়মেন্ট পাইপলাইনও প্রতিটি রোলআউটের সময় টুল ডেফিনিশনগুলো এলোমেলো করে দেয়। এই অদৃশ্য পরিবর্তনগুলো বাইট সিকোয়েন্স বদলে দেয় এবং আপনার নিজস্ব প্রম্পট বিল্ডারে কোনো কোড পরিবর্তন না করেই ক্যাশকে অকেজো করে দেয়।

ক্যাশ হিট রেট পর্যবেক্ষণ করুন

যেকোনো AI এজেন্টের জন্য ক্যাশ হিট রেটকে একটি প্রাথমিক হেলথ মেট্রিক হিসেবে বিবেচনা করুন। হঠাৎ পতন নির্দেশ করে যে রিকোয়েস্টের শুরুর বাইটগুলোর মধ্যে কিছু পরিবর্তনশীল হয়ে পড়েছে। যে মনিটরিং টুলগুলো হিট পার্সেন্টেজ দেখায়, সেগুলো আপনাকে খরচ অস্বাভাবিকভাবে বাড়ার আগেই তা শনাক্ত করতে সাহায্য করবে।

সারসংক্ষেপ

প্রম্পট ক্যাশিং একটি অপরিবর্তনীয় (immutable) প্রিফিক্সের ওপর নির্ভর করে। প্রতিটি রিকোয়েস্টের শুরুতে যা কিছু পরিবর্তিত হয়—এমনকি একটি মাত্র টাইমস্ট্যাম্পও—তা ক্যাশকে বাতিল করে দেয় এবং আপনার বিল তিনগুণ বাড়িয়ে দিতে পারে। স্ট্যাটিক কন্টেন্ট প্রথমে রাখুন, ভোলটাইল কন্টেন্ট শেষে রাখুন, আপনার টুলচেইনে কোনো লুকানো প্রিপ্রেন্ডার (prependers) আছে কিনা তা পরীক্ষা করুন এবং ক্যাশ হিট রেট পর্যবেক্ষণ করুন। একটি সুশৃঙ্খল প্রম্পট লেআউট পারফরম্যান্স এবং খরচ—উভয়ই রক্ষা করে।