মূল লেখায় যান
পার্ট ৮ ২ মিনিট পড়া

LLMOps আর অবজারভেবিলিটি

প্রোডাকশনে AI অ্যাপের ওপর নজর রাখা শিখবেন: প্রতিটা রিকোয়েস্ট ট্রেস করা, টোকেন, খরচ আর গতি মাপা, প্রম্পটের ভার্সন রাখা, A/B টেস্টে পরিবর্তন যাচাই করা, আর মডেল আপগ্রেডের পর আচরণ বদলে গেলে তা ধরা।

কুইজে যান
এই পাতায়

LLMOps আর অবজারভেবিলিটি

পুরোনো DevOps জিজ্ঞেস করে, "রিকোয়েস্ট কি ২০০ ফেরত দিয়েছে?" LLM অ্যাপে আরও গভীর প্রশ্ন লাগে: মডেল কি সঠিক উত্তর দিয়েছে, ঠিক খরচে, ঠিক সুরে, কোনো তথ্য ফাঁস না করে? এই প্রশ্নগুলোর উত্তর খোঁজার কাজকে বলে LLMOps, আর এর নিজস্ব টুলচেইন আছে।

অনুশীলন · ৪টি টাস্ক

যেকোনো ফ্রি AI চ্যাট খুলুন: ChatGPT · Claude · Gemini

অনুশীলন কীভাবে করবেন
  • নতুন চ্যাট মানে একদম নতুন কথোপকথন, আগের কোনো হিস্ট্রি নেই। ChatGPT, Claude বা Gemini-তে New chat-এ ক্লিক করুন। সাধারণত এটা উপরে বাঁ দিকে থাকে।
  • একই চ্যাট মানে: যে চ্যাট খোলা আছে, সেখানেই লিখতে থাকুন। আগে যা পাঠিয়েছেন, AI তা মনে রাখে।
  • প্রম্পট ব্যবহার করতে: কপি-তে ক্লিক করুন, চ্যাটের মেসেজ বক্সে ক্লিক করুন, পেস্ট করুন (Ctrl+V, বা ফোনে চেপে ধরে রাখুন), তারপর Enter চাপুন।
  • AI-এর উত্তর প্রতিবার একটু আলাদা হয়। আপনার উত্তর উদাহরণের সাথে হুবহু মিলতে হবে না। একই ধারণা আছে কি না, সেটা দেখুন।
  • শুধু বানানো ডেটা ব্যবহার করুন। নিজের বা অন্যের ব্যক্তিগত তথ্য চ্যাটে পেস্ট করবেন না।

টাস্ক ১

ফ্ল্যাট লগ থেকে ট্রেস বানান

এটা কেন দরকার

কোনো ইউজার যখন বলে "আপনার চ্যাটবট খারাপ উত্তর দিয়েছে", তখন একসারি ফ্ল্যাট লগ পড়া কঠিন। ট্রেস প্রতিটা ধাপ আর তার সময় দেখায়, তাই ভাঙা ধাপটা তাড়াতাড়ি খুঁজে পাওয়া যায়।

  1. ধাপ ১
    নতুন চ্যাট

    এই প্রম্পটের লগ দেখুন। আন্দাজ করুন কোন ধাপে সবচেয়ে বেশি সময় লেগেছে। তারপর প্রম্পটটা কপি করুন, পেস্ট করে Enter চাপুন।

    প্রম্পট
    এখানে একটা agent run-এর flat log আছে (বানানো data)। Span হলো run-এর একটা ধাপ, যার একটা শুরু আর একটা শেষ আছে।
    
    10:02:11.000 REQUEST_START POST /chat user=u_204 prompt_id=support-v7
    10:02:11.020 SPAN_START build_system_prompt
    10:02:11.040 SPAN_END   build_system_prompt
    10:02:11.040 SPAN_START llm_call_1 model=model-x
    10:02:12.440 SPAN_END   llm_call_1 in_tokens=1200 out_tokens=60 decision="call tool search_orders"
    10:02:12.440 SPAN_START tool_search_orders args={"customer":"u_204"}
    10:02:16.940 SPAN_END   tool_search_orders status=timeout
    10:02:16.940 SPAN_START llm_call_2 model=model-x
    10:02:18.140 SPAN_END   llm_call_2 in_tokens=1350 out_tokens=80
    10:02:18.150 REQUEST_END status=200 answer="Sorry, I could not check your order right now."
    
    কাজ:
    1. এই run-টাকে trace হিসেবে আঁকো: span-এর একটা tree, indentation দিয়ে। প্রতিটা span-এর সময় সেকেন্ডে দেখাও।
    2. সবচেয়ে ধীর span-এর নাম বলো, আর মোট সময়ের কত ভাগ সেটা নিয়েছে বলো।
    3. আসল সমস্যা কোন span-এ শুরু হয়েছে, বলো।

    আপনি দেখবেন: একটা ট্রি, উপরে রিকোয়েস্ট আর নিচে চারটা ধাপ। সবচেয়ে ধীর স্প্যান হলো tool_search_orders, প্রায় ৪.৫ s, যা মোট ৭.১৫ s-এর প্রায় ৬৩%। সমস্যা ওখানেই শুরু (টাইমআউট)।

    উদাহরণ উত্তর
    REQUEST POST /chat (7.15 s)
      build_system_prompt (0.02 s)
      llm_call_1 (1.4 s)
      tool_search_orders (4.5 s) status=timeout
      llm_call_2 (1.2 s)
    সবচেয়ে ধীর span: tool_search_orders, 4.5 s, 7.15 s-এর প্রায় 63%।
    আসল সমস্যা শুরু হয়েছে tool_search_orders-এ, যেটা timeout হয়েছে।

    আপনার উত্তরের ভাষা একটু আলাদা হবে।

  2. ধাপ ২
    একই চ্যাট

    একটা সময় নিজে হাতে মিলিয়ে দেখুন: টুল স্প্যানের শেষের সময় (১৬.৯৪০) থেকে শুরুর সময় (১২.৪৪০) বিয়োগ করুন।

    আপনি দেখবেন: ৪.৫ সেকেন্ড। এটা মডেলের ট্রির সাথে মেলে।

  3. ধাপ ৩
    একই চ্যাট

    এই প্রম্পটটা কপি করুন, একই চ্যাটে পেস্ট করে Enter চাপুন। ২০০ স্ট্যাটাস নিয়ে মডেল কী বলে, পড়ুন।

    প্রম্পট
    Request-টা status 200 ফেরত দিয়েছে। পুরনো ধরনের DevOps dashboard এটার জন্য সবুজ দেখায়। ৩টা ছোট বাক্যে বলো, শুধু 200 দেখলে এই run-এর কোন জিনিসটা ধরা পড়ে না। তারপর trace-এ কোন ৪টা field রাখা উচিত তার list দাও, যাতে পরে এই failure খুঁজে পাওয়া যায়।

    আপনি দেখবেন: মডেল বলবে ২০০ শুধু বোঝায় সার্ভার সাড়া দিয়েছে। উত্তরটা তবুও ইউজারের কোনো কাজে লাগেনি। সে প্রম্পট ভার্সন, মডেল, টোকেন সংখ্যা, খরচ, ল্যাটেন্সি আর টুল স্ট্যাটাসের মতো ফিল্ডের তালিকা দেবে।

    উদাহরণ উত্তর
    200 শুধু বলে server সাড়া দিয়েছে। উত্তর ভালো ছিল কি না, সেটা বলে না। এখানে tool timeout হয়েছে, তাই user পেয়েছে "Sorry, I could not check your order"। Dashboard সবুজই থাকে, অথচ user ব্যর্থ হয়।
    Field: prompt_id, model-এর নাম, token সংখ্যা ও cost, tool status ও latency।

    আপনার উত্তরের ভাষা একটু আলাদা হবে।

এইমাত্র কী হলো

ট্রেস হলো স্প্যান-এর একটা ট্রি। স্প্যান হলো একটা ধাপ, যেমন LLM কল বা টুল কল, তার সময়সহ। ট্রি দেখাচ্ছে টুল কল মোট সময়ের ৬৩% নিয়েছে আর ফেইল করেছে। সার্ভার তবুও ২০০ ফেরত দিয়েছে, তাই শুধু স্ট্যাটাস দেখলে কিছু ধরা পড়ত না। LLM অ্যাপে উত্তর কোথায় ভেঙেছে দেখতে ট্রেস লাগে।

কাজ শেষ, যখন আপনার কাছে ৪ ধাপের একটা স্প্যান ট্রি আছে, আপনি সবচেয়ে ধীর ধাপটা (৪.৫ s) জানেন, আর লগে রাখার ৪টা ফিল্ডের তালিকা আছে।

নিজেকে যাচাই করুনস্ট্যাটাস ২০০ দেখেই এই রিকোয়েস্টকে সুস্থ বলা যায় না কেন?উত্তর দেখুন

সার্ভার সাড়া দিয়েছে, কিন্তু টুল টাইমআউট হওয়ায় ইউজারের জন্য উত্তরটা ভুল ছিল। LLMOps জানতে চায় উত্তরটা ঠিক ছিল কি না। স্প্যানের ট্রেস দেখায় কোথায় ভেঙেছে।

আরেকটু কঠিন করে দেখুন

লগ বদলে এমন করুন যাতে দ্বিতীয় একটা টুল কল প্রথমটার সাথে একই সময়ে শুরু হয়। মডেলকে ট্রি আবার আঁকতে বলুন। মোট সময় কীভাবে বদলায়?

টাস্ক ২

কোন ফিচার লোকসানে চলছে, খুঁজে বের করুন

এটা কেন দরকার

আপনার অ্যাপে কয়েকটা AI ফিচার থাকলে মাসের বিল একটাই বড় সংখ্যা। কোন ফিচার আয়ের চেয়ে বেশি খরচ করছে, সেটা না জানলে আপনি তা ঠিক করতে পারবেন না।

  1. ধাপ ১
    নতুন চ্যাট

    এই প্রম্পটের ৬টা লগ সারি দেখুন। আন্দাজ করুন কোন ফিচার লোকসানে। তারপর প্রম্পটটা কপি করুন, পেস্ট করে Enter চাপুন।

    প্রম্পট
    এখানে log করা কয়েকটা LLM request আছে (বানানো data)। প্রতি 1 million token-এর দাম: small model = input 0.20 USD আর output 0.80 USD। Large model = input 3.00 USD আর output 15.00 USD।
    
    id | feature       | user | model | in_tokens | out_tokens | latency_s
    1  | autocomplete  | u1   | small | 300       | 20         | 0.4
    2  | autocomplete  | u2   | small | 280       | 25         | 0.5
    3  | autocomplete  | u1   | small | 310       | 18         | 0.4
    4  | report_writer | u3   | large | 12000     | 1500       | 14.2
    5  | report_writer | u4   | large | 9000      | 1200       | 11.8
    6  | report_writer | u3   | large | 15000     | 2000       | 18.5
    
    আয়: প্রতিটা autocomplete request 0.001 USD আয় করে। প্রতিটা report_writer request 0.04 USD আয় করে।
    
    কাজ:
    1. প্রতিটা request-এর cost USD-তে বের করো। Formula একবার দেখাও, তারপর একটা table দাও।
    2. প্রতিটা feature-এর cost আর আয় যোগ করো।
    3. কোন feature লোকসানে আছে আর গড়ে প্রতি request-এ কত লোকসান, বলো।

    আপনি দেখবেন: অটোকমপ্লিটের খরচ এক পয়সার ভগ্নাংশ, আর সেটা লাভে। report_writer লোকসানে: তার গড় খরচ প্রতি রিকোয়েস্টে প্রায় ০.০৫৯৫ USD, কিন্তু আয় ০.০৪ USD। গড় লোকসান প্রায় ০.০১৯৫ USD।

    উদাহরণ উত্তর
    Cost = in_tokens × in_price ÷ 1,000,000 + out_tokens × out_price ÷ 1,000,000
    1: 0.000076  2: 0.000076  3: 0.0000764
    4: 0.0585  5: 0.045  6: 0.075
    autocomplete: cost প্রায় 0.00023 USD, আয় 0.003 USD। লাভ।
    report_writer: cost 0.1785 USD, আয় 0.12 USD। লোকসান 0.0585 USD, প্রতি request-এ প্রায় 0.0195 USD।
    report_writer লোকসানে চলছে।

    আপনার উত্তরের ভাষা একটু আলাদা হবে।

  2. ধাপ ২
    একই চ্যাট

    ক্যালকুলেটর দিয়ে ৪ নম্বর রিকোয়েস্ট নিজে হাতে মিলান: ১২,০০০ × ৩ ÷ ১,০০০,০০০, সাথে ১,৫০০ × ১৫ ÷ ১,০০০,০০০।

    আপনি দেখবেন: ০.০৩৬ + ০.০২২৫ = ০.০৫৮৫ USD। এটা টেবিলের সাথে মেলে, আর এই রিকোয়েস্টের আয় ০.০৪ USD-এর চেয়ে বেশি।

  3. ধাপ ৩
    একই চ্যাট

    এই প্রম্পটটা কপি করুন, একই চ্যাটে পেস্ট করে Enter চাপুন। নতুন খরচ আর সতর্কবার্তাটা পড়ুন।

    প্রম্পট
    এবার ধরো আমরা report_writer-কে small model-এ নিয়ে যাচ্ছি। 4, 5 আর 6 নম্বর request-এ একই token সংখ্যা ধরো। প্রতি request-এর নতুন গড় cost কত? Production-এ এই বদল করার আগে আমাদের কী মেপে দেখতে হবে? 100 শব্দের কম লিখে উত্তর দাও।

    আপনি দেখবেন: প্রতি রিকোয়েস্টে নতুন গড় খরচ প্রায় ০.০০৩৭ USD। ভালো উত্তরে এটাও থাকবে যে আগে উত্তরের মান যাচাই করতে হবে, যেমন ইভ্যাল দিয়ে (যে টেস্ট উত্তরের নম্বর দেয়)।

    উদাহরণ উত্তর
    Small model-এ গড় cost প্রতি request-এ প্রায় 0.0037 USD (4, 5, 6 নম্বর request-এ 0.0036, 0.0028 আর 0.0046)। এটা 0.04 USD আয়ের অনেক নিচে।
    বদলের আগে আসল report request-এ eval দিয়ে উত্তরের মান মাপো। সস্তা model খারাপ report লিখতে পারে, তাই user feedback আর latency-ও দেখো।

    আপনার উত্তরের ভাষা একটু আলাদা হবে।

এইমাত্র কী হলো

প্রতিটা রিকোয়েস্টে ইনপুট টোকেন আর আউটপুট টোকেন থাকে। মডেলের দাম দিয়ে গুণ করলে সেই রিকোয়েস্টের খরচ পাওয়া যায়। লগে ট্যাগ (লেবেল) থাকলে, যেমন ফিচার আর মডেল, আপনি ফিচার ধরে খরচ ভাগ করতে পারেন। ফিচার ট্যাগ না থাকলে "কোন ফিচার লোকসানে?" প্রশ্নের উত্তর দেওয়া যেত না। সস্তা মডেল খরচ কমায়, কিন্তু মানও যাচাই করতে হয়।

কাজ শেষ, যখন আপনার কাছে ৬টা রিকোয়েস্টের প্রত্যেকটার খরচ আছে, কোন ফিচার লোকসানে আপনি জানেন, আর ৪ নম্বর রিকোয়েস্ট আপনি হাতে মিলিয়েছেন।

নিজেকে যাচাই করুন"এই ফিচার কি লোকসানে?" প্রশ্নের উত্তর দিতে লগের কোন ফিল্ড লাগে?উত্তর দেখুন

ইনপুট টোকেন, আউটপুট টোকেন আর মডেল থেকে ভেন্ডরের দাম দিয়ে খরচ পাওয়া যায়। ফিচার ট্যাগ রিকোয়েস্টগুলোকে ভাগ করে। এই ফিল্ড না থাকলে ডেটা দিয়ে প্রশ্নটার উত্তর দেওয়া যায় না।

আরেকটু কঠিন করে দেখুন

একটা নিয়ম যোগ করুন: বড় মডেলের ইনপুট টোকেনের অর্ধেক ক্যাশ করা, আর ক্যাশ করা টোকেনের দাম স্বাভাবিক দামের ১০%। মডেলকে আবার হিসাব করতে বলুন। report_writer কি এখনো লোকসানে?

টাস্ক ৩

A/B টেস্ট কখন থামাবেন, ঠিক করুন

এটা কেন দরকার

আপনি যখন প্রোডাকশনে নতুন প্রম্পট টেস্ট করবেন, শুরুর একটা ভালো ফলাফল লোভ দেখায়। খুব তাড়াতাড়ি শিপ করলে আপনি এমন প্রম্পটের জন্য বেশি টাকা দিতে পারেন, যা আসলে ভালো না।

  1. ধাপ ১
    নতুন চ্যাট

    এই প্রম্পটের সংখ্যাগুলো পড়ুন। ঠিক করুন: ১ম দিনের পরই v8 শিপ করবেন, না ৭ম দিন পর্যন্ত অপেক্ষা করবেন? কারণ লিখে রাখুন। তারপর প্রম্পটটা কপি করুন, পেস্ট করে Enter চাপুন।

    প্রম্পট
    আমরা production-এ আমাদের support-bot-এর prompt-এর দুটো version test করছি (বানানো data)। Traffic ভাগ করা হয়েছে user_id-র hash দিয়ে। Version support-v7 হলো এখনকার prompt। Version support-v8 একটা নতুন, লম্বা prompt।
    
    ১ম দিনের বিকেল পর:
    - v7: 60টা rate করা উত্তরের মধ্যে 40টা thumbs-up
    - v8: 60টা rate করা উত্তরের মধ্যে 45টা thumbs-up
    
    ৭ম দিন পর:
    - v7: 420টা rate করা উত্তরের মধ্যে 290টা thumbs-up, প্রতি উত্তরে গড় cost 0.8 cent, গড় latency 2.1 s
    - v8: 420টা rate করা উত্তরের মধ্যে 292টা thumbs-up, প্রতি উত্তরে গড় cost 1.1 cent, গড় latency 3.3 s
    
    কাজ:
    1. ১ম দিনে আর ৭ম দিনে প্রতিটা version-এর thumbs-up হার বের করো।
    2. ১ম দিনের পর কি আমাদের থেমে v8 ship করা উচিত? কেন বা কেন নয়?
    3. ৭ম দিনে আমাদের কী করা উচিত?
    4. Test শুরুর আগে আমাদের কোন metric বেছে নেওয়া উচিত ছিল?
    ছোট আর সরাসরি উত্তর দাও।

    আপনি দেখবেন: ১ম দিন: v7 ৬৬.৭%, v8 ৭৫.০%। ৭ম দিন: v7 ৬৯.০%, v8 ৬৯.৫%। শুরুর ব্যবধান প্রায় মিলিয়ে গেছে। ৭ম দিনে v8-এর মান প্রায় সমান, কিন্তু খরচ বেশি আর ধীর। বেশিরভাগ মডেল বলবে v7 রাখুন।

    উদাহরণ উত্তর
    1. ১ম দিন: v7 40/60 = 66.7%, v8 45/60 = 75.0%। ৭ম দিন: v7 290/420 = 69.0%, v8 292/420 = 69.5%।
    2. না। প্রতি version-এ মাত্র 60টা rating নিয়ে একটা বিকেল অনেক কম data। Chance-এর কারণে v8 ভালো দেখাতে পারে।
    3. v7 রাখো। v8-এর মান প্রায় একই, কিন্তু তার cost 0.8 cent-এর বদলে 1.1 cent আর সে ধীর (2.1 s-এর বদলে 3.3 s)।
    4. Test শুরুর আগেই মূল metric, cost-এর সীমা, latency-র সীমা আর test কত দিন চলবে, ঠিক করা উচিত ছিল।

    আপনার উত্তরের ভাষা একটু আলাদা হবে।

  2. ধাপ ২
    একই চ্যাট

    এই প্রম্পটটা কপি করুন, একই চ্যাটে পেস্ট করে Enter চাপুন। পড়ুন, ভাগ করতে user_id-র হ্যাশ কেন ব্যবহার করা হয়।

    প্রম্পট
    আমরা user_id-র hash দিয়ে traffic ভাগ করি (একটা স্থির নিয়ম, যা প্রতিটা user-কে সবসময় একই version-এ পাঠায়)। আমরা এটা করি কেন, প্রতিটা message-এ random বাছি না কেন? আর প্রতিটা trace-এ support-v8-এর মতো prompt version ID রাখা উচিত কেন? ৪টা ছোট বাক্যে উত্তর দাও।

    আপনি দেখবেন: চারটা ছোট বাক্য। হ্যাশ প্রতিটা ইউজারকে একটা ভার্সনেই রাখে, তাই ইউজার দুটো আলাদা বট দেখে না। প্রতিটা ট্রেসে ভার্সন ID থাকলে বোঝা যায় কোন প্রম্পট কোন উত্তর বানিয়েছে।

    উদাহরণ উত্তর
    Hash প্রতিটা user-কে সবসময় একই version-এ পাঠায়। প্রতি message-এ random বাছলে এক user একই chat-এ দুটো আলাদা bot দেখতে পারে। প্রতিটা trace-এ version ID থাকলে বোঝা যায় কোন prompt কোন উত্তর বানিয়েছে। তখন তুমি বলতে পারো "support-v8-এর user-রা বেশি timeout পেয়েছে" আর খারাপ version তাড়াতাড়ি খুঁজে পাও।

    আপনার উত্তরের ভাষা একটু আলাদা হবে।

এইমাত্র কী হলো

রেটিং কম হলে চান্স-এর কারণে একটা ভার্সন ভালো দেখাতে পারে। ৬০টা রেটিংয়ে v8 এগিয়ে ছিল ৮ পয়েন্ট। ৪২০টা রেটিংয়ে এগিয়ে থাকা নেমে এল ০.৫ পয়েন্টে। মেট্রিক (আর খরচ ও ল্যাটেন্সির সীমা) আপনি টেস্টের আগে ঠিক করুন, আর থামুন শুধু তখন, যখন একটা ভার্সন সেই মেট্রিকে পরিষ্কারভাবে জেতে। কোনো প্রম্পট ফিডব্যাকে জিতেও খারাপ লেনদেন হতে পারে, যদি সে ধীর হয় আর বেশি খরচ করে।

কাজ শেষ, যখন আপনার কাছে ১ম দিনের (৬৬.৭% আর ৭৫.০%) আর ৭ম দিনের (৬৯.০% আর ৬৯.৫%) থাম্বস-আপ হার আছে, আর প্রতিটা দিনের জন্য একটা সিদ্ধান্ত আছে।

নিজেকে যাচাই করুনএকটা ভালো বিকেল দেখেই টেস্ট থামিয়ে দেওয়া ভুল কেন?উত্তর দেখুন

রেটিং কম হলে চান্সের কারণে একটা ভার্সন ভালো দেখাতে পারে। আগে মেট্রিক ঠিক করুন, আর থামুন শুধু যখন একটা ভার্সন সেই মেট্রিকে পরিষ্কারভাবে জেতে। খরচ আর ল্যাটেন্সিও গোনায় ধরতে হয়।

আরেকটু কঠিন করে দেখুন

৭ম দিনের সংখ্যা এমন বদলান যাতে v8 থাম্বস-আপে ৮ পয়েন্টে জেতে কিন্তু খরচ ৪০% বেশি। মডেলকে সিদ্ধান্ত নিতে সাহায্য করতে বলুন। সে আর কোন তথ্য চাইবে?

টাস্ক ৪

নীরবে মডেল বদল ধরুন

এটা কেন দরকার

ভেন্ডর নাম না বদলেই একটা মডেল আপডেট করতে পারে। আপনার কোড একই থাকে, কিন্তু আপনার JSON ভেঙে যেতে পারে। ইউজার ধরার আগে আপনি যেন এটা ধরতে পারেন, তার একটা উপায় দরকার।

  1. ধাপ ১
    নতুন চ্যাট

    এই প্রম্পটের ৫টা কেস পড়ুন। কোনগুলো বদলেছে, দাগ দিন। তারপর প্রম্পটটা কপি করুন, পেস্ট করে Enter চাপুন। মডেলের তালিকার সাথে নিজেরটা মেলান।

    প্রম্পট
    আমাদের app একটা model-কে দিয়ে message থেকে {"name": ..., "amount_bdt": ...}-এর মতো JSON বের করায়। Vendor একই model নামের পেছনের model আপডেট করেছে। আমরা 5টা production input পুরনো আর নতুন version দিয়ে চালিয়েছি (বানানো data)।
    
    1. Input: "Rahim paid 1,200 taka"
       OLD: {"name":"Rahim","amount_bdt":1200}
       NEW: {"name":"Rahim","amount_bdt":1200}
    2. Input: "Sumi sent 5k BDT"
       OLD: {"name":"Sumi","amount_bdt":5000}
       NEW: {"name":"Sumi","amount_bdt":"5k"}
    3. Input: "Tanvir paid 300 taka and Mina paid 450 taka"
       OLD: [{"name":"Tanvir","amount_bdt":300},{"name":"Mina","amount_bdt":450}]
       NEW: {"name":"Tanvir","amount_bdt":300}
    4. Input: "Lina paid 75 taka"
       OLD: {"name":"Lina","amount_bdt":75}
       NEW: Sure! Here is the JSON: {"name":"Lina","amount_bdt":75}
    5. Input: "Arif paid 2,000 taka"
       OLD: {"name":"Arif","amount_bdt":2000}
       NEW: {"name":"Arif","amount_bdt":2000}
    
    কাজ:
    1. প্রতিটা case-এর জন্য বলো SAME না CHANGED, আর বদলের ধরন কী।
    2. প্রতিটা বদলের জন্য একটা automatic check লেখো (এমন নিয়ম যা একটা program পরীক্ষা করতে পারে)।
    3. Live traffic-এর কত অংশ দুই model দিয়েই চালানো উচিত, আর কিসের উপর alert দেওয়া উচিত, বলো।

    আপনি দেখবেন: ১ আর ৫ নম্বর কেস SAME। ২, ৩ আর ৪ নম্বর CHANGED: ভুল টাইপ (সংখ্যার বদলে লেখা), দ্বিতীয় মানুষটা বাদ পড়া, আর JSON-এর চারপাশে বাড়তি লেখা।

    উদাহরণ উত্তর
    1 SAME
    2 CHANGED: amount_bdt এখন "5k" নামের লেখা, সংখ্যা নয়। Check: amount_bdt অবশ্যই সংখ্যা হতে হবে।
    3 CHANGED: list একটা object হয়ে গেছে, Mina হারিয়ে গেছে। Check: output-এ মানুষের সংখ্যা input-এর সংখ্যার সমান হতে হবে।
    4 CHANGED: JSON-এর চারপাশে বাড়তি লেখা। Check: পুরো উত্তরটা JSON হিসেবে parse হতে হবে।
    5 SAME
    Live traffic-এর 1-5% দুই model দিয়েই চালাও। Check-এর pass rate আলাদা হলে alert দাও।

    আপনার উত্তরের ভাষা একটু আলাদা হবে।

  2. ধাপ ২
    একই চ্যাট

    এই প্রম্পটটা কপি করুন, একই চ্যাটে পেস্ট করে Enter চাপুন। দেখুন, এক্সপেক্টেড আউটপুটটা ঠিক মনে হচ্ছে কি না।

    প্রম্পট
    একজন user এই উত্তরে thumbs-down দিয়েছে।
    Input: "Karim paid 1.5 lakh taka" (1 lakh = 100,000)
    Output: {"name":"Karim","amount_bdt":1.5}
    
    এই failure-টাকে আমাদের eval dataset-এর জন্য একটা test case বানাও। Input, expected output আর যে নিয়ম দিয়ে এটা পরীক্ষা হবে, তা দাও। তারপর ২ বাক্যে বলো, এই রকম হাজারটা আসল failure বানানো test-এর চেয়ে বেশি কাজের কেন।

    আপনি দেখবেন: একটা টেস্ট কেস। ইনপুট হলো Karim-এর বাক্য, এক্সপেক্টেড আউটপুটে "amount_bdt": 150000 আছে, আর নিয়ম বলে amount অবশ্যই ১৫০০০০ হতে হবে। তারপর আসল ফেইলিউর নিয়ে ২টা বাক্য।

    উদাহরণ উত্তর
    Input: "Karim paid 1.5 lakh taka"
    Expected output: {"name":"Karim","amount_bdt":150000}
    নিয়ম: JSON parse হয়, আর amount_bdt একটা সংখ্যা এবং সেটা 150000।
    আসল failure আসে আসল user-দের কাছ থেকে, তাই সেগুলো দেখায় কোন case তোমার app ভাঙে। বানানো test শুধু সেটাই ধরে, যা তুমি আগে ভেবেছ।

    আপনার উত্তরের ভাষা একটু আলাদা হবে।

এইমাত্র কী হলো

ড্রিফট মানে মডেলের নাম একই থেকে যায়, কিন্তু তার আচরণ বদলে যায়। ১ আর ৫ নম্বর কেস ঠিক দেখাচ্ছে, তাই শুধু সহজ ইনপুটের টেস্ট কিছুই ধরত না। কঠিন কেসগুলো ভেঙেছে। ড্রিফট ধরতে লাইভ ট্র্যাফিকের অল্প অংশ (1-5%) পুরোনো আর নতুন মডেল দিয়ে চালান, চেকের ফলাফল মেলান, আর পার্থক্যে অ্যালার্ট দিন। ইউজারদের আসল ফেইলিউর নতুন টেস্ট কেস হয়ে যায়।

কাজ শেষ, যখন আপনার কাছে ৩টা বদলানো কেসের তালিকা আছে, প্রতিটার একটা করে চেক সহ, আর Karim-এর জন্য একটা নতুন টেস্ট কেস আছে।

নিজেকে যাচাই করুনঅফলাইন ইভ্যাল এই ধরনের বদল মিস করতে পারে কেন?উত্তর দেখুন

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

আরেকটু কঠিন করে দেখুন

৬ নম্বর একটা কেস যোগ করুন, যেখানে নতুন মডেল পুরোনোর চেয়ে ভালো করে। মডেলকে রিগ্রেশন (খারাপ হওয়া) আর ইমপ্রুভমেন্ট আলাদা করতে বলুন। শুধু এক দিকের অ্যালার্ট যথেষ্ট নয় কেন?

ভিডিও দেখুন · ৭টি

কুইজ

কী শিখলেন যাচাই করুন। ৫টি প্রশ্ন।

১. এই পার্ট অনুযায়ী LLM ট্রেস কী?

২. এই পার্ট অনুযায়ী একটি দলের প্রম্পট কীভাবে সামলানো উচিত?

৩. একটি রিকোয়েস্ট ২০০ ফেরত দিয়েছে কি না, এমন চিরাচরিত DevOps চেকই জানার জন্য যথেষ্ট যে LLM অ্যাপ সঠিক, সাশ্রয়ী ও নিরাপদ উত্তর দিচ্ছে কি না।

৪. ভেন্ডর একই নামের মডেল চুপচাপ বদলে দিলে ড্রিফট ধরার জন্য টেক্সট কী পরামর্শ দেয়?

৫. এই পার্ট বলছে, দুটি প্রম্পট ভার্সন A/B টেস্ট করতে user_id-এর হ্যাশ দিয়ে তাদের মধ্যে ট্র্যাফিক ভাগ করে দিতে হবে।

মেলাতে সব প্রশ্নের উত্তর দিন।

তথ্যসূত্র

সোর্স

সব সাইটেশন মূল পেপার (arXiv), ভেন্ডরের ডক্স (OpenAI, Anthropic, Google) বা অফিশিয়াল টিম ব্লগে যায়। প্রতিটি পাতা খুলে সাইটেশনের তথ্য যাচাই করা হয়েছে।

  1. [1]Yao et al., "ReAct: Synergizing Reasoning and Acting in Language Models" (ICLR 2023)
  2. [2]Wei et al., "Plan-and-Execute Agents" / "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models" — NeurIPS 2022
  3. [3]Shinn et al., "Reflexion: Language Agents with Verbal Reinforcement Learning" — NeurIPS 2023
  4. [4]Xu et al., "ReWOO: Decoupling Reasoning from Observations for Efficient Augmented Language Models"
  5. [5]Anthropic Engineering blog — "How we built our multi-agent research system" (2025)
  6. [6]LangGraph — official documentation (LangChain)
  7. [7]Temporal — "Durable Execution for LLM Agents"
  8. [8]Park et al., "Generative Agents: Interactive Simulacra of Human Behavior" — 2023
  9. [9]Anthropic — "Introducing computer use, a new Claude 3.5 Sonnet capability" (Oct 2024)
  10. [10]Anthropic — Tool use / function calling documentation
  11. [11]OpenAI — Function calling guide
  12. [12]Anthropic — Model Context Protocol (MCP) specification
  13. [13]Kwon et al., "Efficient Memory Management for Large Language Model Serving with PagedAttention" — vLLM paper, SOSP 2023
  14. [14]Zheng et al., "SGLang: Efficient Execution of Structured Language Model Programs" — 2023
  15. [15]llama.cpp — open-source GGUF-native inference (ggerganov)
  16. [16]Lin et al., "AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration" — MLSys 2024
  17. [17]Anthropic — Prompt caching documentation
  18. [18]Zheng et al., "Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena" — NeurIPS 2023
  19. [19]Es et al., "Ragas: Automated Evaluation of Information Retrieval Augmented Language Models" — 2023
  20. [20]Yue et al., "Large Language Model Cascades with Mixture of Thought Representations" — 2024
  21. [21]GPTCache — open-source semantic cache
  22. [22]Guo et al., "DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via RL" — 2025
  23. [23]Jiang et al., "LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models" — EMNLP 2023
  24. [24]LiteLLM — unified interface for 100+ LLMs
  25. [25]OWASP — "Top 10 for LLM Applications" (LLM01 Prompt Injection, 2025)
  26. [26]Bai et al., "Constitutional AI: Harmlessness from AI Feedback" — Anthropic, 2022
  27. [27]NVIDIA NeMo Guardrails — open-source toolkit
  28. [28]Qwen2-VL Team, "Qwen2-VL: Enhancing Vision-Language Model's Perception of the World at Any Resolution" — 2024
  29. [29]OpenAI — Realtime API documentation
  30. [30]OpenAI — Production best practices guide