WebMCP-এর জন্য মূল্যায়ন

ক্যাসপার কুলিকোস্কি
Kasper Kulikowski

প্রকাশিত: ১৯ মে, ২০২৬

WebMCP জেনারেটিভ এআই মডেল ব্যবহারকারী এজেন্টদের সমর্থন করে। জেনারেটিভ এআই ব্যবহার করে এমন যেকোনো সিস্টেম পরীক্ষা করার জন্য, আপনার পরীক্ষাগুলোকে সম্ভাবনামূলক ফলাফল সমর্থন করতে হবে: একটি ইনপুট বিভিন্ন মাত্রার নির্ভুলতা সহ হাজার হাজার উত্তর দিতে পারে। এই পরীক্ষা পদ্ধতিকে ইভ্যালুয়েশন বা ইভ্যালস বলা হয়।

প্রোডাকশনে টুলগুলো রিলিজ করার আগে, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে এজেন্টরা বোঝে কখন টুলটি কল করতে হবে, কীভাবে এটি এক্সিকিউট করতে হবে এবং কোন উত্তরগুলো গ্রহণযোগ্য। ব্যর্থতার সম্ভাবনাগুলো ঘটার আগেই সেগুলোর সমাধান করুন।

একটি বৃহৎ ভাষা মডেল (LLM)-এর সাথে আপনার সিস্টেমের সংযোগস্থলগুলো পরীক্ষা করার জন্য মূল্যায়ন লিখুন:

  • মডেলটি তার বিবরণ এবং স্কিমার উপর ভিত্তি করে আপনার টুলের উদ্দেশ্য বুঝতে পারছে কিনা, তা যাচাই করুন।
  • যাচাই করুন যে মডেলটি ব্যবহারকারীর উদ্দেশ্য পূরণের জন্য সঠিক প্যারামিটারসহ উপযুক্ত টুলটি বেছে নিচ্ছে।
  • মডেলটি প্রাপ্ত তথ্যের ওপর ভিত্তি করে কাজ করছে কিনা তা নিশ্চিত করুন, যেমন—অন্য কোনো টুল চালু করার জন্য সেই তথ্য ব্যবহার করা।
  • সফল ইউজার জার্নি যাচাই করুন। ব্যবহারকারীর অভিপ্রায় বিবেচনা করে, একজন এজেন্ট কি প্রদত্ত সরঞ্জাম ব্যবহার করে আমার ওয়েবসাইটে ইউজার জার্নিটি সফলভাবে সম্পন্ন করতে পারে?

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

ব্যর্থতার ধরণ

ব্যর্থতা ঘটার আগেই তা প্রতিরোধ করার জন্য ডেভেলপারদের তাদের সিস্টেম পরীক্ষা করা উচিত। এটি করার জন্য, সিস্টেমটি কখন ব্যর্থ হতে পারে—নিজ থেকেই হোক বা বাহ্যিক কারণের সাথে মিথস্ক্রিয়ার ফলেই হোক—তা আপনাকে বুঝতে হবে। WebMCP-এর ক্ষেত্রে, টুলটি নিজেই ব্যর্থ হতে পারে এবং এজেন্টরাও প্রত্যাশিতভাবে টুলগুলো ব্যবহার করতে ব্যর্থ হতে পারে।

WebMCP টুলগুলো ব্যর্থ হতে পারে এবং এজেন্টও WebMCP টুলগুলোর সাথে কাজ করতে ব্যর্থ হতে পারে। উদাহরণস্বরূপ, ধরুন আপনার ব্যবহারকারী তার কার্টে একটি টি-শার্ট যোগ করতে চান।

ব্যর্থতা উদাহরণ সমস্যা সমাধান
এজেন্ট সঠিক টুলটি নির্বাচন করতে ব্যর্থ হয় অথবা সরাসরি ভুল টুলটিকে কল করে।

এজেন্ট addToCart ধাপটি এড়িয়ে সরাসরি checkout এ চলে যায়।

  • টুলটির description কি স্পষ্ট, সম্পূর্ণ এবং টুলটির কাজকে সঠিকভাবে প্রতিফলিত করে?
  • functionName কি স্বজ্ঞাত এবং বর্ণনামূলক?
  • বর্তমান অবস্থা/প্রেক্ষাপটে টুলটি কি LLM-এর কাছে সঠিকভাবে উন্মুক্ত করা হয়েছে?
  • এই টুলটির স্কিমা কি অন্য কোনো টুলের সাথে অতিরিক্ত সাদৃশ্যপূর্ণ, যার ফলে কলে অস্পষ্টতা দেখা দিতে পারে?
এজেন্ট ভুল ক্রমে টুলগুলো কল করে।

এজেন্ট checkout এবং তারপর addToCart কল করে।

  • সরঞ্জামগুলির বিবরণ কি একে অপরের সাথে মিলে যায়, যা প্রয়োজনীয় ক্রম সম্পর্কে এলএলএম-কে বিভ্রান্ত করে?
  • পূর্ববর্তী টুলের আউটপুট কি পরবর্তী টুল কলের জন্য প্রয়োজনীয় প্রেক্ষাপট প্রদান করে?
  • অবস্থাটি কি সঠিকভাবে আপডেট করা হয়েছে এবং প্রত্যাশা অনুযায়ী LLM-এ কোনো নতুন টুল উন্মোচিত হয়েছে?
  • নির্দিষ্ট কিছু টুল ভিন্ন ক্রমে কল করা হলেও কি এন্ড-টু-এন্ড ব্যবহারের ক্ষেত্রটি সঠিক থাকবে?
  • এলএলএম সঠিক পরবর্তী ধাপটি বেছে নিচ্ছে কিনা, তা নিশ্চিত করার জন্য আপনি কি পূর্ববর্তী কলগুলোকে জোর করে নির্দিষ্ট টুল কল চেইনটি আলাদাভাবে পরীক্ষা করেছেন?
এজেন্ট ভুল আর্গুমেন্ট দিয়ে টুলটিকে কল করে।

এজেন্ট addToCart কল করে, কিন্তু টি-শার্টের পরিবর্তে জুতো যোগ করে ফেলে।

  • inputSchema কি স্পষ্টভাবে সংজ্ঞায়িত করা হয়েছে, যেখানে enum ভ্যালু এবং প্রতিটি প্রপার্টির জন্য একটি ভালো description অন্তর্ভুক্ত রয়েছে?
  • সকল প্রয়োজনীয় প্যারামিটার কি স্পষ্টভাবে চিহ্নিত ও যাচাই করা হয়েছে?
  • আর্গুমেন্টের বিবরণে কি এলএলএম-কে স্পষ্টভাবে নির্দেশনা দেওয়া আছে যে ব্যবহারকারীর ইনপুটকে প্রত্যাশিত কাঠামোগত ডেটাতে (যেমন একটি নির্দিষ্ট আইডি বা ফরম্যাট) কীভাবে ম্যাপ করতে হবে?

ব্যবহারকারী যদি তার কার্টে কী আছে তা দেখতে চান তাহলে কী হবে?

ব্যর্থতা উদাহরণ সমস্যা সমাধান
টুলটির আউটপুট ভুল অথবা টুলটি কোনো কিছু বাদ দিয়েছে।

ব্যবহারকারী viewCart চাইলে, এজেন্ট পণ্যের নাম ও আলাদা আলাদা দামের পরিবর্তে কার্টের মোট মূল্য দেখিয়ে দেয়।

  • টুলটির অন্তর্নিহিত লজিকে কি কোনো বাগ আছে (ডিটারমিনিস্টিক টেস্টের মাধ্যমে যাচাই করুন)?
  • UI অবস্থা কি সঠিকভাবে আপডেট করা হয়েছিল এবং এজেন্ট কি পার্শ্ব প্রতিক্রিয়া সম্পর্কে সঠিক তথ্য পেয়েছিল?
  • যদি আউটপুটটি পরবর্তী কলগুলির জন্য এলএলএম দ্বারা ব্যবহৃত হয়, তবে এলএলএম-এ গ্রহণের জন্য আউটপুটটি কি স্পষ্টভাবে ফরম্যাট করা আছে?
  • আউটপুটটি কি অতিরিক্ত বিশদ? এতে কি কেবল পরবর্তী পদক্ষেপের জন্য এলএলএম-এর প্রয়োজনীয় ন্যূনতম তথ্যই রয়েছে?

অবশেষে, কোনো টুলের কারণে জাভাস্ক্রিপ্ট কোনোভাবে ব্যর্থ হতে পারে। সমস্যা সমাধানের জন্য, নিম্নলিখিত বিষয়গুলো খতিয়ে দেখুন:

  • টুল কোডটি কি সকল সম্ভাব্য রানটাইম ত্রুটি এবং ব্যতিক্রম সঠিকভাবে সামাল দেয়?
  • ত্রুটিটি কি এজেন্ট এবং মডেলের কাছে যথাযথভাবে জানানো হয়েছে?
  • টুলটি যে বাহ্যিক API বা পরিষেবাগুলির উপর নির্ভর করে, সেগুলি কি ত্রুটিমুক্ত?
  • ত্রুটির কাঠামোটি কি এতটাই স্পষ্ট যে মডেলটি একটি অস্থায়ী সমস্যা (পুনরায় চেষ্টা) এবং একটি গুরুতর ব্যর্থতার মধ্যে পার্থক্য করতে পারে?

বিচ্ছিন্নভাবে পরীক্ষার সরঞ্জাম

যদি কোনো এজেন্ট "আমি একটি ছোট পিৎজা চাই"-এর মতো একটি অনুরোধের জন্য কোন টুলকে ডাকতে হবে তা বুঝতে না পারে, তাহলে একটি জটিল ইউজার জার্নিতে তার টিকে থাকার কোনো সুযোগই থাকবে না।

টুলগুলোকে আলাদাভাবে পরীক্ষা করার মাধ্যমে, আপনি ব্রাউজার সিমুলেশন চালানোর আগেই আপনার স্কিমা ও বর্ণনাগুলোকে অপ্টিমাইজ করতে পারেন।

পরামর্শ: আপনি using navigator.modelContext.executeTool(...) একটি WebMCP টুল কল চালু করতে পারেন।

কলের নির্ভুলতা পরিমাপ করুন

আমাদের ডেমো, WebMCP zaMaker-টি দেখুন। যখন ব্যবহারকারী "আমি একটি ছোট পিজ্জা চাই" বলে অনুরোধ করেন, তখন আপনি এমন একটি মডেল প্রতিক্রিয়া আশা করতে পারেন যা "size":"Small" আর্গুমেন্ট সহ একটি set_pizza_size কল করার অভিপ্রায় নির্দেশ করে।

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

{
  "messages": [
    {
      "role": "user",
      "content": "I'd like a small pizza."
    }
  ],
  "expectedCall": [
    {
      "functionName": "set_pizza_size",
      "arguments": { "size": "Small" }
    }
  ]
}

expectedCall একটি নিয়ম-ভিত্তিক, নির্ণায়ক পরীক্ষা সম্পাদন করতে ব্যবহৃত হয়:

আপনার WebMCP টুলগুলোকে কোনো কম্পোনেন্টের লাইফসাইকেলের সাথে যুক্ত করা সম্ভব, যার অর্থ হলো আপনার অ্যাপ্লিকেশনের স্টেট কখন WebMCP-এর প্রত্যাশার সাথে মেলে, তা আপনাকে অবশ্যই পরীক্ষা করতে হবে। এটি পরিচালনা করার জন্য, আপনি যে স্টেটটি মূল্যায়ন করতে চান তার সাথে প্রাসঙ্গিক একটি সম্পূর্ণ টুলের তালিকা প্রদান করুন। উদাহরণস্বরূপ, একজন ব্যবহারকারী তার এজেন্টের সাথে একসাথে ব্রাউজ করার সময় WebMCP zaMaker খোলেন।

অ্যাপ্লিকেশন অবস্থা

[
...
  {
    "name": "add_topping",
    "description": "Add one or more toppings to the pizza",
    ...
  },
  {
    "name": "set_pizza_size",
    "description": "Set the pizza size directly.",
    "inputSchema": {
      "type": "object",
      "properties": {
        "size": {
          "type": "string",
          "enum": [
            "Small",
            "Medium",
            "Large",
            "Extra Large"
          ],
          "description": "The specific size name."
        },
      }
    }
  },
  {
    "name": "set_pizza_style",
    "description": "Set the style of the pizza (colors/theme)",
  ...
  },
...
]

প্রত্যাশিত কল

...
 "expectedCall": [
   {
     "functionName": "set_pizza_size",
     "arguments": { "size": "Small" }
   }
 ]
...

খোলার সাথে সাথে WebMCP-তে add_topping , set_pizza_size এবং set_pizza_style টুলগুলো দেখা যায়। এই টুলগুলোর যেকোনো একটিকে সঠিকভাবে পরীক্ষা করার জন্য, একটি অনুকৃত ও সম্পূর্ণ অবস্থা তৈরি করতে আপনার সবগুলো টুলই অন্তর্ভুক্ত করা উচিত।

দ্রষ্টব্য: একজন এজেন্টের কাছে অতিরিক্ত সরঞ্জাম ব্যবহারের সুযোগ থাকতে পারে, কিন্তু আপনি যে সরঞ্জামগুলো সরবরাহ করেন, সেগুলো মূল্যায়ন করাই আপনার জন্য সর্বোত্তম।

এখন যেহেতু আপনি জানেন যে এজেন্ট প্রয়োজন অনুযায়ী সঠিক টুলটি কল করে, আপনি পরীক্ষা করে দেখতে পারেন যে টুল কলটিতে সঠিক প্যারামিটার আছে কিনা এবং ফলাফলটি প্রত্যাশিত কিনা। এর দুটি ধাপ রয়েছে: ডিটারমিনিস্টিক পরীক্ষা এবং প্রোবাবিলিস্টিক পরীক্ষা।

নির্ণায়ক পরীক্ষা চালান

যেহেতু WebMCP টুলগুলো জাভাস্ক্রিপ্ট বা HTML অ্যানোটেশন দিয়ে তৈরি, তাই আপনি নিম্নলিখিত কাজগুলো সম্পাদন করার জন্য ডিটারমিনিস্টিক টেস্ট লিখতে পারেন:

  • টুলের লজিক যাচাই করুন।
  • নির্ভরতাগুলো সঠিকভাবে কল করা হয়েছে কিনা তা নিশ্চিত করুন।
  • ইউজার ইন্টারফেস প্রত্যাশা অনুযায়ী আপডেট হয়েছে কিনা এবং এর সাথে অন্য কোনো ইচ্ছাকৃত পার্শ্বপ্রতিক্রিয়া আছে কিনা, তা নিশ্চিত করুন।
  • ফেরত আসা তথ্য প্রত্যাশিত মানের সাথে মেলে কিনা তা যাচাই করুন।
  • পরীক্ষার পরামিতিগুলো যাচাই করুন।

উদাহরণস্বরূপ, যদি আপনার টুলটি একটি SearchComponent ফাংশন ব্যবহার করে, তাহলে আপনি SearchComponent এর একটি মক (mock) পাস করে পরীক্ষা করতে পারেন। সর্বোত্তম ফলাফল পেতে, টুলটি যে পরিবেশে কাজ করছে তা সিমুলেট (impulte) করতে ভুলবেন না। অন্য কোনো অ্যাপ্লিকেশন ইন্টিগ্রেশন টেস্ট লেখার ক্ষেত্রেও আপনি একই কৌশল ব্যবহার করবেন।

সম্ভাব্যতা পরীক্ষা চালান

পরবর্তী টুলগুলোকে সঠিকভাবে কল করার জন্য যদি আপনার মডেল আউটপুটের প্রয়োজন হয়, তাহলে আপনাকে ইভ্যাল (eval) লিখতে হবে।

ব্যবহারকারীরা মডেলকে সরাসরি এমন প্রশ্ন করতে পারেন যা নির্দিষ্টভাবে জানতে চায় টুলটি কী কাজ করে, অথবা এমন অস্পষ্ট প্রশ্নও করতে পারেন যা থেকে বোঝা যায় যে একটি টুল ব্যবহার করা উচিত। উদাহরণস্বরূপ, "আমার পিজ্জায় পেপারনি যোগ করুন" একটি সরাসরি প্রশ্ন। "আমি আমার পিজ্জায় সব মাংস চাই" প্রশ্নটি আরও অস্পষ্ট এবং এর জন্য মডেলকে বুঝতে হয় যে তার add_topping টুলটি প্রয়োজন এবং কোন টপিংগুলোকে মাংস হিসেবে সংজ্ঞায়িত করা যেতে পারে।

আপনার মূল্যায়নের জন্য ডেটাসেট তৈরি করার সময়, বেসলাইন টুল এক্সিকিউশন পরীক্ষা করার জন্য সরাসরি কোয়েরি এবং মডেলের রিজনিং ও টুল সিলেকশন লজিক পরীক্ষা করার জন্য ওপেন-এন্ডেড কোয়েরি উভয়ই অন্তর্ভুক্ত করুন।

আপনি যদি একটি কফি শপ চালান, তাহলে আপনাকে এমন ব্যবহারকারীদের পরিষেবা দিতে হতে পারে যারা গত মাসে অর্ডার করা একই কফি পুনরায় অর্ডার করতে তাদের এজেন্টকে অনুরোধ করে। পূর্ববর্তী অর্ডারগুলো অনুসন্ধান করার জন্য OrderHistoryService একটি টুল এবং কফি অর্ডার করার জন্য আরেকটি টুল তৈরি করুন। অর্ডার হিস্ট্রি সার্ভিসটি পরীক্ষা করার জন্য, আপনি একটি মক (mock) পাঠাতে পারেন যা একটি কফি প্রোডাক্ট আইডি রিটার্ন করবে।

এই উদাহরণে, আপনি মূল্যায়ন করবেন যে মডেলটি কোয়েরির উদ্দেশ্য বুঝতে পারছে কিনা, সঠিক টুলটি বেছে নিচ্ছে কিনা, এবং সেই টুলটি পদক্ষেপ নেওয়ার জন্য সঠিক তথ্য সরবরাহ করছে কিনা। যদি মডেলটি get_order_history কল না করে, তাহলে এটি জানতে পারবে না যে order_product জন্য কোন item_id ব্যবহার করতে হবে।

এন্ড-টু-এন্ড টেস্টিং

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

উদাহরণস্বরূপ, আপনি একটি অনলাইন পোশাকের দোকান চালান। একজন ব্যবহারকারী তার এজেন্টকে জিজ্ঞাসা করেন: "আমি একটি কালো জ্যাকেট এবং একটি জিন্স কিনতে চাই। আপনি কি এতে ব্যবহৃত উপকরণগুলোর একটি বিস্তারিত বিবরণ দিতে পারবেন?"

একটি সফল সক্রিয় যাত্রা নিম্নরূপ হতে পারে:

  1. পোশাক বিভাগে যান।
  2. অনুরোধ করা পোশাকগুলোর মধ্যে একটি খুঁজে বের করুন (ক্রম গুরুত্বপূর্ণ নয়)।
  3. নির্দিষ্ট আইটেমটি খুঁজুন ( search_clothes )।
  4. উপকরণ তালিকা সম্বলিত পণ্যের বিবরণ পান ( get_product_details )।
  5. অনুরোধকৃত প্রতিটি আইটেমের জন্য ধাপ ২-৪ পুনরাবৃত্তি করুন।

যখন এজেন্ট ২ নং ধাপে পৌঁছাবে, তখন সে প্রথমে কালো পোশাকটি অথবা জিন্সটি খুঁজতে পারে, ক্রমটি গুরুত্বপূর্ণ নয়। তবে, বাকি ধাপগুলো অবশ্যই ক্রমানুসারে অনুসরণ করতে হবে।

এজেন্ট প্রত্যাশিত ক্রমে টুলগুলো কল করছে কিনা তা যাচাই করার জন্য একটি এন্ড-টু-এন্ড ইভ্যাল লিখুন:

{
  "messages": [
    {
      "role": "user",
      "content": "I am looking to buy a black jacket and a pair of jeans.
        Could you provide a breakdown of the materials used ?"
    }
  ],
  "expectedCall": [
    {
      "functionName": "navigate_to_category",
      "arguments": { "category": "clothes" }
    },
    {
      "unordered": [
        {
          "ordered": [
            {
              "functionName": "search_clothes",
              "arguments": { "query": "black jacket" }
            },
            {
              "functionName": "get_product_details",
              "arguments": { "productId": "JACKET002" }
            }
          ]
        },
        {
          "ordered": [
            {
              "functionName": "search_clothes",
              "arguments": { "query": "jeans" }
            },
            {
              "functionName": "get_product_details",
              "arguments": { "productId": "JEANS001" }
            }
          ]
        }
      ]
    }
  ]
}

মধ্য-শৃঙ্খল ব্যর্থতা মূল্যায়ন করুন

উদাহরণস্বরূপ, এই টুলটিতে একজন ব্যবহারকারী ছাড়যুক্ত পিজ্জার অনুরোধ করেন।
যখন কোনো ব্যবহারকারী ডিসকাউন্ট কুপন ব্যবহার করে পিজ্জা অর্ডার করার অনুরোধ করেন, তখন ধারাবাহিকভাবে কয়েকটি টুল কল করা হয়: start_pizza_creator , set_pizza_style , set_pizza_size , start_checkout , add_discount_coupon , এবং complete_checkoutadd_discount_coupon টুলটি ব্যর্থ হলেও, প্রক্রিয়াটি সম্পন্ন হতে পেরেছিল, যার অর্থ হলো ব্যবহারকারী কোনো ডিসকাউন্ট পাননি।

এমন সময় আসতে পারে যখন একজন এজেন্টকে পর্যায়ক্রমে একাধিক টুল ব্যবহার করতে হয়। এই প্রক্রিয়ার মাঝখানে কোনো টুল বিকল হয়ে গেলে কী হবে? উদাহরণস্বরূপ, একজন ব্যবহারকারী তার কুপন কোড ব্যবহার করে একটি পিজ্জা অর্ডার করতে চান:

আমি একটি ছোট পেস্টো পিজ্জা নিতে চাই। আমার প্রোমো কোড, FreePizza ব্যবহার করুন।

এমনটা হতে পারে যে এজেন্ট add_discount_coupon ধাপে ব্যর্থ হয়ে সম্পূর্ণ মূল্যের পিজ্জা কেনার জন্য চেকআউটে চলে যাবে। add_discount_coupon টুলটি পরীক্ষা করার জন্য, আপনি কোনো মডেলের সাথে ইন্টারঅ্যাক্ট না করে, এই সিনারিওটি ​​সিমুলেট করতে ম্যানুয়ালি টুল কলগুলোর এই ক্রমটি চালাতে পারেন। আপনার অ্যাপ্লিকেশনটিকে এমন একটি অবস্থায় নিয়ে আসুন যেখানে আপনি টুলটির ব্যর্থ হওয়ার আশঙ্কা করছেন। এক্ষেত্রে, সেটি হলো start_checkout টুলের পরের অবস্থা। তারপর, আপনি add_discount_coupon আলাদাভাবে মূল্যায়ন করতে পারবেন।

WebMCP দিয়ে পরীক্ষা করুন

টুলগুলির মূল্যায়ন আলাদাভাবে পরীক্ষা করা শুরু করুন এবং যেকোনো WebMCP সামঞ্জস্যপূর্ণ এজেন্ট দিয়ে আপনার নিজের WebMCP-সক্ষম সাইটগুলি মূল্যায়ন করুন: