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

আমরা আসলে কী মূল্যায়ন করছি?
এজেন্ট মূল্যায়ন সাধারণ এলএলএম মূল্যায়নের চেয়ে বেশি জটিল। আপনি শুধু প্রবন্ধ (চূড়ান্ত উত্তর) মূল্যায়ন করছেন না; আপনি এর পেছনের গণিতও (সেখানে পৌঁছানোর জন্য ব্যবহৃত যুক্তি ও উপকরণ) মূল্যায়ন করছেন।

- গতিপথ (প্রক্রিয়া): এজেন্ট কি সঠিক সময়ে সঠিক টুলটি ব্যবহার করেছে? এটি কি
place_orderআগেcheck_inventoryকল করেছে? - চূড়ান্ত প্রতিক্রিয়া (ফলাফল): উত্তরটি কি সঠিক, মার্জিত এবং তথ্যের উপর ভিত্তি করে গঠিত?
উন্নয়ন জীবনচক্র
এই কোডল্যাবে, আমরা এজেন্ট টেস্টিংয়ের পেশাগত জীবনচক্রটি ধাপে ধাপে আলোচনা করব:
- স্থানীয় চাক্ষুষ পরিদর্শন (ADK ওয়েব UI): ম্যানুয়ালি চ্যাটিং এবং লজিক যাচাই করা (ধাপ ১)।
- ইউনিট/রিগ্রেশন টেস্টিং (ADK CLI): দ্রুত ত্রুটি ধরার জন্য নির্দিষ্ট টেস্ট কেসগুলো স্থানীয়ভাবে চালানো (ধাপ ৩ ও ৪)।
- ডিবাগিং (সমস্যা সমাধান): ব্যর্থতা বিশ্লেষণ করা এবং প্রম্পট লজিক ঠিক করা (ধাপ ৫)।
- CI/CD ইন্টিগ্রেশন (Pytest): আপনার বিল্ড পাইপলাইনে টেস্ট স্বয়ংক্রিয় করা (ধাপ ৬)।
২. সেট আপ করুন
আমাদের এআই এজেন্টদের শক্তিশালী করতে দুটি জিনিস প্রয়োজন: ভিত্তি স্থাপনের জন্য একটি গুগল ক্লাউড প্রজেক্ট।
প্রথম অংশ: বিলিং অ্যাকাউন্ট সক্রিয় করুন
এই কোডল্যাবটি চালানোর জন্য আপনার কিছু ক্রেডিট সহ একটি বিলিং অ্যাকাউন্ট প্রয়োজন। শুরু করার জন্য এই কোডল্যাবের উপরের ব্যানার থেকে ক্রেডিট ব্যবহার করুন। আপনি যদি ইতিমধ্যেই একটি বিলিং অ্যাকাউন্টের সাথে সংযুক্ত থাকেন, তাহলে আপনি এই ধাপটি এড়িয়ে যেতে পারেন।
দ্বিতীয় পর্ব: উন্মুক্ত পরিবেশ
- 👉 সরাসরি ক্লাউড শেল এডিটর- এ যেতে এই লিঙ্কে ক্লিক করুন
- 👉 আজ যেকোনো সময়ে অনুমোদনের জন্য অনুরোধ করা হলে, চালিয়ে যাওয়ার জন্য 'Authorize'-এ ক্লিক করুন।

- 👉 যদি স্ক্রিনের নিচে টার্মিনালটি দেখা না যায়, তাহলে এটি খুলুন:
- ভিউ ক্লিক করুন
- টার্মিনালে ক্লিক করুন

- 👉💻 টার্মিনালে, নিম্নলিখিত কমান্ডটি ব্যবহার করে যাচাই করুন যে আপনি ইতিমধ্যেই প্রমাণীকৃত এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে:
gcloud auth list - 👉💻 গিটহাব থেকে বুটস্ট্র্যাপ প্রজেক্টটি ক্লোন করুন:
git clone https://github.com/cuppibla/adk_eval_starter - 👉💻 প্রজেক্ট ডিরেক্টরি থেকে সেটআপ স্ক্রিপ্টটি চালান।
cd ~/adk_eval_starter ./init.sh
স্ক্রিপ্টটি বাকি সেটআপ প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে সম্পন্ন করবে।
- 👉💻 প্রয়োজনীয় প্রজেক্ট আইডি সেট করুন:
gcloud config set project $(cat ~/project_id.txt) --quiet
তৃতীয় পর্ব: অনুমতি স্থাপন
- 👉💻 নিচের কমান্ডটি ব্যবহার করে প্রয়োজনীয় API-গুলো সক্রিয় করুন। এতে কয়েক মিনিট সময় লাগতে পারে।
gcloud services enable \ cloudresourcemanager.googleapis.com \ servicenetworking.googleapis.com \ run.googleapis.com \ cloudbuild.googleapis.com \ artifactregistry.googleapis.com \ aiplatform.googleapis.com \ compute.googleapis.com - 👉💻 টার্মিনালে নিম্নলিখিত কমান্ডগুলো চালিয়ে প্রয়োজনীয় অনুমতিগুলো প্রদান করুন:
. ~/adk_eval_starter/set_env.sh
লক্ষ্য করুন যে আপনার জন্য একটি .env ফাইল তৈরি হয়েছে। সেখানে আপনার প্রোজেক্টের তথ্য দেখানো হয়।
৩. গোল্ডেন ডেটাসেট তৈরি করা (adk web)

এজেন্টকে গ্রেড দেওয়ার আগে, আমাদের একটি উত্তরপত্র প্রয়োজন। ADK-তে, আমরা একে গোল্ডেন ডেটাসেট বলি। এই ডেটাসেটে 'নিখুঁত' ইন্টারঅ্যাকশনগুলো থাকে, যা মূল্যায়নের জন্য গ্রাউন্ড ট্রুথ হিসেবে কাজ করে।
গোল্ডেন ডেটাসেট বলতে কী বোঝায়?
একটি গোল্ডেন ডেটাসেট হলো আপনার এজেন্টের সঠিকভাবে কাজ করার একটি স্ন্যাপশট। এটি শুধু প্রশ্ন-উত্তরের জোড়ার একটি তালিকা নয়। এটি ধারণ করে:
- ব্যবহারকারীর জিজ্ঞাসা ("আমি টাকা ফেরত চাই")
- গতিপথ (টুল কলগুলোর সঠিক ক্রম:
check_order->verify_eligibility->refund_transaction)। - চূড়ান্ত প্রতিক্রিয়া ('নিখুঁত' লিখিত উত্তর)।
আমরা রিগ্রেশন শনাক্ত করতে এটি ব্যবহার করি। আপনি যদি আপনার প্রম্পট আপডেট করেন এবং এজেন্ট হঠাৎ করে রিফান্ড করার আগে যোগ্যতা যাচাই করা বন্ধ করে দেয়, তাহলে গোল্ডেন ডেটাসেট টেস্টটি ব্যর্থ হবে, কারণ ট্র্যাজেক্টরিটি আর মিলবে না।
ওয়েব UI খুলুন
ADK ওয়েব UI আপনার এজেন্টের সাথে বাস্তব মিথস্ক্রিয়া ক্যাপচার করার মাধ্যমে এই গোল্ডেন ডেটাসেটগুলি তৈরি করার একটি ইন্টারেক্টিভ উপায় প্রদান করে।
- 👉💻 আপনার টার্মিনালে, এটি চালান:
cd ~/adk_eval_starter uv run adk web - 👉💻 ওয়েব UI প্রিভিউটি খুলুন (সাধারণত
http://127.0.0.1:8000ঠিকানায় পাওয়া যায়)। - 👉 চ্যাট UI-তে টাইপ করুন
Hi, I'm customer CUST001. Can you check my orders? I need a refund for order ORD-102. It arrived damaged.
আপনি এই ধরনের প্রতিক্রিয়া দেখতে পাবেন: I've processed your refund for order ORD-102 due to the items arriving damaged. A full refund of $35.0 has been processed, and the status of order ORD-102 is now updated to "refunded". Is there anything else I can assist you with today, CUST001? 🛍️
সোনালী মিথস্ক্রিয়া ক্যাপচার করুন
সেশন ট্যাবে যান। এখানে সেশনে ক্লিক করে আপনি আপনার এজেন্টের কথোপকথনের ইতিহাস দেখতে পারবেন।
- একটি আদর্শ কথোপকথন ধারা তৈরি করতে আপনার এজেন্টের সাথে যোগাযোগ করুন, যেমন ক্রয়ের ইতিহাস যাচাই করা বা অর্থ ফেরতের অনুরোধ করা।
- কথোপকথনটি পর্যালোচনা করে নিশ্চিত করুন যে এটি প্রত্যাশিত আচরণের প্রতিফলন ঘটায়।

৪. গোল্ডেন ডেটাসেটটি এক্সপোর্ট করুন
ট্রেস ভিউ দিয়ে যাচাই করুন
এক্সপোর্ট করার আগে, আপনাকে অবশ্যই যাচাই করতে হবে যে এজেন্টটি শুধু ভাগ্যের জোরে সঠিক উত্তরটি পায়নি। আপনাকে এর অভ্যন্তরীণ লজিক পরীক্ষা করতে হবে।
- ওয়েব UI-তে ট্রেস ট্যাবে ক্লিক করুন।
- ট্রেসগুলো ব্যবহারকারীর বার্তা অনুযায়ী স্বয়ংক্রিয়ভাবে গ্রুপ করা হয়। চ্যাটে সংশ্লিষ্ট বার্তাটি হাইলাইট করতে যেকোনো একটি ট্রেস সারির উপর মাউস রাখুন ।
- নীল সারিগুলো পরিদর্শন করুন : এগুলো ইন্টারঅ্যাকশন থেকে উৎপন্ন ইভেন্টগুলো নির্দেশ করে। পরিদর্শন প্যানেলটি খুলতে একটি নীল সারিতে ক্লিক করুন।
- যুক্তিটি যাচাই করতে নিম্নলিখিত ট্যাবগুলি পরীক্ষা করুন:
- গ্রাফ : টুল কল এবং লজিক প্রবাহের চাক্ষুষ উপস্থাপনা। এটি কি সঠিক পথ অনুসরণ করেছে?
- অনুরোধ/প্রতিক্রিয়া : মডেলকে ঠিক কী পাঠানো হয়েছিল এবং কী ফেরত এসেছিল তা পর্যালোচনা করুন।
- যাচাইকরণ : যদি এজেন্ট ডাটাবেস টুল ব্যবহার না করেই ফেরতের পরিমাণ অনুমান করে থাকে, তবে তা একটি "ভাগ্যক্রমে ঘটা বিভ্রম"।

EvalSet-এ সেশন যোগ করুন
একবার আপনি কথোপকথন এবং চিহ্নটি নিয়ে সন্তুষ্ট হলে:
- 👉
Evalট্যাবে ক্লিক করুন, তারপরCreate Evaluation Setবোতামে ক্লিক করুন এবং এরপর eval-এর নাম হিসেবে লিখুন:evalset1
- 👉 এই evalset-এ,
Add current session to evalset1ক্লিক করুন, পপ-আপ উইন্ডোতে সেশনের নাম হিসেবে লিখুন:eval1
ADK ওয়েবে Eval চালান
- 👉 ADK ওয়েব UI-তে,
Run Evaluationক্লিক করুন, পপ-আপ উইন্ডোতে মেট্রিকগুলো ঠিক করুন এবংStartক্লিক করুন:

আপনার রেপোতে ডেটাসেট যাচাই করুন
আপনি একটি নিশ্চিতকরণ বার্তা দেখতে পাবেন যে একটি ডেটাসেট ফাইল (যেমন, evalset1.evalset.json ) আপনার রিপোজিটরিতে সংরক্ষিত হয়েছে। এই ফাইলটিতে আপনার কথোপকথনের মূল, স্বয়ংক্রিয়ভাবে তৈরি হওয়া ট্রেস রয়েছে।

৫. মূল্যায়ন ফাইলগুলি

যদিও ওয়েব UI একটি জটিল .evalset.json ফাইল তৈরি করে, আমরা প্রায়শই স্বয়ংক্রিয় পরীক্ষার জন্য একটি পরিচ্ছন্ন ও আরও সুগঠিত টেস্ট ফাইল তৈরি করতে চাই।
ADK Eval দুটি প্রধান উপাদান ব্যবহার করে:
- টেস্ট ফাইল : এটি স্বয়ংক্রিয়ভাবে তৈরি গোল্ডেন ডেটাসেট (যেমন,
customer_service_agent/evalset1.evalset.json) অথবা ম্যানুয়ালি সংকলিত সেট (যেমন,customer_service_agent/eval.test.json) হতে পারে। - কনফিগারেশন ফাইল (যেমন,
customer_service_agent/test_config.json): উত্তীর্ণ হওয়ার জন্য মেট্রিক এবং থ্রেশহোল্ড নির্ধারণ করুন।
টেস্ট কনফিগারেশন ফাইলটি সেট আপ করুন
- 👉💻 ক্লাউড শেল এডিটর টার্মিনালে , ইনপুট করুন
cloudshell edit customer_service_agent/test_config.json - 👉 আপনার এডিটরে থাকা
customer_service_agent/test_config.jsonফাইলে নিম্নলিখিত কোডটি ইনপুট করুন।{ "criteria": { "tool_trajectory_avg_score": 0.8, "response_match_score": 0.5 } }
মেট্রিক্সের পাঠোদ্ধার
-
tool_trajectory_avg_score(প্রক্রিয়া) এটি পরিমাপ করে যে এজেন্ট টুলগুলো সঠিকভাবে ব্যবহার করেছে কিনা।
- ০.৮ : আমরা ৮০% ম্যাচিং ফান্ড দাবি করছি।
-
response_match_score(আউটপুট) এটি গোল্ডেন রেফারেন্সের সাথে উত্তর তুলনা করার জন্য ROUGE-1 (শব্দ ওভারল্যাপ) ব্যবহার করে।
- সুবিধা : দ্রুত, সুনির্দিষ্ট, বিনামূল্যে।
- অসুবিধা : এজেন্ট যদি একই ধারণা ভিন্নভাবে প্রকাশ করে (যেমন, "ফেরত দেওয়া হয়েছে" বনাম "টাকা ফেরত দেওয়া হয়েছে"), তাহলে এটি ব্যর্থ হয়।
উন্নত মেট্রিক্স (যখন আপনার আরও শক্তির প্রয়োজন)
৬. গোল্ডেন ডেটাসেটের জন্য মূল্যায়ন চালান (adk eval)

এই ধাপটি ডেভেলপমেন্টের "ইনার লুপ" বা অভ্যন্তরীণ প্রক্রিয়াকে বোঝায়। আপনি একজন ডেভেলপার হিসেবে পরিবর্তন আনছেন এবং দ্রুত ফলাফল যাচাই করতে চান।
গোল্ডেন ডেটাসেটটি চালান
চলুন, ধাপ ১-এ আপনার তৈরি করা ডেটাসেটটি রান করি। এটি আপনার বেসলাইনের দৃঢ়তা নিশ্চিত করবে।
- 👉💻 আপনার টার্মিনালে, এটি চালান:
cd ~/adk_eval_starter uv run adk eval customer_service_agent customer_service_agent/evalset1.evalset.json --config_file_path=customer_service_agent/test_config.json --print_detailed_results
কী হচ্ছে?
ADK এখন:
-
customer_service_agentথেকে আপনার এজেন্টকে লোড করা হচ্ছে। -
evalset1.evalset.jsonথেকে ইনপুট কোয়েরিগুলো চালানো হচ্ছে। - এজেন্টের প্রকৃত গতিপথ ও প্রতিক্রিয়াগুলোকে প্রত্যাশিতগুলোর সাথে তুলনা করা।
-
test_config.jsonএ থাকা মানদণ্ডের ভিত্তিতে ফলাফলগুলোর স্কোরিং করা হচ্ছে।
ফলাফল বিশ্লেষণ করুন
টার্মিনালের আউটপুটটি লক্ষ্য করুন। আপনি সফল এবং ব্যর্থ টেস্টগুলোর একটি সারসংক্ষেপ দেখতে পাবেন।
Eval Run Summary
evalset1:
Tests passed: 1
Tests failed: 0
********************************************************************
Eval Set Id: evalset1
Eval Id: eval1
Overall Eval Status: PASSED
---------------------------------------------------------------------
Metric: tool_trajectory_avg_score, Status: PASSED, Score: 1.0, Threshold: 0.8
---------------------------------------------------------------------
Metric: response_match_score, Status: PASSED, Score: 0.5581395348837208, Threshold: 0.5
---------------------------------------------------------------------
Invocation Details:
+----+---------------------------+---------------------------+--------------------------+---------------------------+---------------------------+-----------------------------+------------------------+
| | prompt | expected_response | actual_response | expected_tool_calls | actual_tool_calls | tool_trajectory_avg_score | response_match_score |
+====+===========================+===========================+==========================+===========================+===========================+=============================+========================+
| 0 | Hi, I'm customer CUST001. | Great news! Your refund | Great news, CUST001! 🎉 | id='adk-051409fe-c230-43f | id='adk-4e9aa570-1cc6-4c3 | Status: PASSED, Score: | Status: PASSED, Score: |
| | Can you check my orders? | for order **ORD-102** has | I've successfully | 4-a7f1- 5747280fd878' | c-aa3e- 91dbe113dd4b' | 1.0 | 0.5581395348837208 |
| | I need a refund for order | been successfully | processed a full refund | args={'customer_id': | args={'customer_id': | | |
| | ORD-102. It arrived | processed due to the item | of $35.0 for your order | 'CUST001'} name='get_purc | 'CUST001'} name='get_purc | | |
| | damaged. | arriving damaged. You | ORD-102 because it | hase_history' | hase_history' | | |
| | | should see a full refund | arrived damaged. The | partial_args=None | partial_args=None | | |
| | | of $35.0 back to your | status of that order has | will_continue=None id= 'a | will_continue=None | | |
| | | original payment method | been updated to | dk-8a194cb8-5a82-47ce-a3a | id='adk- dad1b376-9bcc-48 | | |
| | | shortly. The status of | "refunded." Is there | 7- 3d24551f8c90' | bb-996f-a30f6ef5b70b' | | |
| | | this order has been | anything else I can | args={'reason': | args={'reason': | | |
| | | updated to "refunded". | assist you with today? | 'damaged', 'order_id': | 'damaged', 'order_id': | | |
| | | Here's your updated | | 'ORD-102'} | 'ORD-102'} | | |
| | | purchase history for | | name='issue_refund' | name='issue_refund' | | |
| | | CUST001: * **ORD-101**: | | partial_args=None | partial_args=None | | |
| | | Wireless Headphones, | | will_continue=None | will_continue=None | | |
| | | delivered on 2023-10-15 | | | | | |
| | | (Total: $120) * | | | | | |
| | | **ORD-102**: USB-C Cable, | | | | | |
| | | Phone Case, refunded on | | | | | |
| | | 2023-11-01 (Total: $35) | | | | | |
| | | Is there anything else I | | | | | |
| | | can help you with today? | | | | | |
| | | 😊 | | | | | |
+----+---------------------------+---------------------------+--------------------------+---------------------------+---------------------------+-----------------------------+------------------------+
দ্রষ্টব্য: যেহেতু আপনি এটি সরাসরি এজেন্ট থেকেই তৈরি করেছেন, তাই এটি ১০০% সফল হওয়ার কথা। যদি এটি ব্যর্থ হয়, তাহলে আপনার এজেন্টটি নন-ডিটারমিনিস্টিক (এলোমেলো)।
৭. আপনার নিজস্ব কাস্টমাইজড টেস্ট তৈরি করুন
স্বয়ংক্রিয়ভাবে তৈরি ডেটাসেটগুলো চমৎকার হলেও, কখনও কখনও আপনাকে ম্যানুয়ালি এজ কেস (যেমন, অ্যাডভারসারিয়াল অ্যাটাক বা নির্দিষ্ট এরর হ্যান্ডলিং) তৈরি করতে হয়। চলুন দেখে নেওয়া যাক, eval.test.json কীভাবে আপনাকে "Correctness" নির্ধারণ করার সুযোগ দেয়।
চলুন একটি পূর্ণাঙ্গ টেস্ট স্যুট তৈরি করি।
টেস্টিং ফ্রেমওয়ার্ক
ADK-তে টেস্ট কেস লেখার সময় এই ৩-অংশের সূত্রটি অনুসরণ করুন:
- সেটআপ (
session_input) : ব্যবহারকারী কে? (যেমন,user_id,state)। এটি পরীক্ষাটিকে পৃথক করে। - প্রম্পট (
user_content) : এর ট্রিগার কী?
দাবিগুলো (প্রত্যাশাগুলো) সহ :
- গতিপথ (
tool_uses) : হিসাবটি কি ঠিকভাবে করা হয়েছে? (যুক্তি) - প্রতিক্রিয়া (
final_response) : এটি কি সঠিক উত্তর বলেছে? (গুণমান) - মধ্যবর্তী (
intermediate_responses) : উপ-এজেন্টরা কি সঠিকভাবে কথা বলেছিল? (সমন্বয়)
টেস্ট স্যুটটি লিখুন
- 👉💻 ক্লাউড শেল এডিটর টার্মিনালে , ইনপুট করুন
cloudshell edit customer_service_agent/eval.test.json - 👉 নিম্নলিখিত কোডটি
customer_service_agent/eval.test.jsonফাইলে ইনপুট করুন।{ "eval_set_id": "customer_service_eval", "name": "Customer Service Agent Evaluation", "description": "Evaluation suite for the customer service agent covering product info, purchase history, and refunds.", "eval_cases": [ { "eval_id": "product_info_check", "session_input": { "app_name": "customer_service_agent", "user_id": "eval_user_1", "state": {} }, "conversation": [ { "invocation_id": "turn_1_product_info", "user_content": { "role": "user", "parts": [ { "text": "Do you have wireless headphones in stock?" } ] }, "final_response": { "role": "model", "parts": [ { "text": "Yes, we have wireless headphones in stock! They are priced at $120.00 and feature noise-canceling with a 20-hour battery life. 🎧" } ] }, "intermediate_data": { "tool_uses": [ { "name": "lookup_product_info", "args": { "product_name": "wireless headphones" } } ], "intermediate_responses": [] } } ] }, { "eval_id": "purchase_history_check", "session_input": { "app_name": "customer_service_agent", "user_id": "eval_user_2", "state": {} }, "conversation": [ { "invocation_id": "turn_1_purchase_history", "user_content": { "role": "user", "parts": [ { "text": "What did I buy recently? My customer ID is CUST001." } ] }, "final_response": { "role": "model", "parts": [ { "text": "Here's your recent purchase history for Customer ID CUST001:\n\n* **Order ORD-101** (October 15, 2023): Wireless Headphones, Status: delivered, Total: $120\n* **Order ORD-102** (November 1, 2023): USB-C Cable, Phone Case, Status: refunded, Total: $35\n\nLet me know if you have any other questions or need further assistance! 🛍️" } ] }, "intermediate_data": { "tool_uses": [ { "name": "get_purchase_history", "args": { "customer_id": "CUST001" } } ], "intermediate_responses": [] } } ] }, { "eval_id": "refund_request", "session_input": { "app_name": "customer_service_agent", "user_id": "eval_user_3", "state": {} }, "conversation": [ { "invocation_id": "turn_1_refund", "user_content": { "role": "user", "parts": [ { "text": "I want a refund for order ORD-102 because it was damaged." } ] }, "final_response": { "role": "model", "parts": [ { "text": "Your refund for order **ORD-102** due to \"damaged\" has been successfully processed! Refund amount: **$35.0**. Your order status has been updated to **refunded**. \nIs there anything else I can help you with today? 🛍️" } ] }, "intermediate_data": { "tool_uses": [ { "name": "issue_refund", "args": { "order_id": "ORD-102", "reason": "damaged" } } ], "intermediate_responses": [] } } ] } ] }
পরীক্ষার প্রকারভেদ বিশ্লেষণ
আমরা এখানে তিন ধরনের স্বতন্ত্র পরীক্ষা তৈরি করেছি। চলুন, প্রতিটি পরীক্ষা কী মূল্যায়ন করছে এবং কেন, তা বিশদভাবে আলোচনা করা যাক।
- একক টুল পরীক্ষা (
product_info_check)
- লক্ষ্য : প্রাথমিক তথ্য আহরণ যাচাই করা।
- মূল অ্যাসারশন : আমরা
intermediate_data.tool_usesচেক করি। আমরা অ্যাসার্ট করি যেlookup_product_infoকল করা হয়েছে। আমরা অ্যাসার্ট করি যেproduct_nameআর্গুমেন্টটি হুবহু "wireless headphones"। - কারণ : যদি মডেলটি টুলটিকে কল না করেই কোনো দাম কল্পনা করে, তাহলে এই পরীক্ষাটি ব্যর্থ হয়। এটি গ্রাউন্ডিং নিশ্চিত করে।
- প্রসঙ্গ নিষ্কাশন পরীক্ষা (
purchase_history_check)
- লক্ষ্য : এজেন্ট ব্যবহারকারীর প্রম্পট থেকে এনটিটি (CUST001) বের করে টুলে পাঠাতে পারে কিনা তা যাচাই করা।
- মূল প্রতিপাদন : আমরা যাচাই করি যে
get_purchase_historycustomer_id: "CUST001"দিয়ে কল করা হয়েছে। - কারণ : একটি সাধারণ ব্যর্থতার ধরণ হলো এজেন্ট সঠিক টুলটিকে কল করলেও আইডিটি নাল (null) থাকে। এটি প্যারামিটারের নির্ভুলতা নিশ্চিত করে।
- কার্যক্রম/গতিপথ পরীক্ষা (
refund_request)
- লক্ষ্য : একটি গুরুত্বপূর্ণ লিখন প্রক্রিয়া যাচাই করা।
- মূল প্রতিপাদ্য : গতিপথ। আরও জটিল পরিস্থিতিতে, এই তালিকায় একাধিক ধাপ থাকবে:
[verify_order, calculate_refund, issue_refund]। ADK এই তালিকাটি ক্রমানুসারে যাচাই করে। - কারণ : অর্থ লেনদেন বা ডেটা পরিবর্তনের ক্ষেত্রে, ফলাফলের মতোই কাজের ক্রমও গুরুত্বপূর্ণ। যাচাই না করে আপনি অর্থ ফেরত দিতে চাইবেন না।
৮. কাস্টম টেস্টের জন্য মূল্যায়ন চালান (adk eval)

- 👉💻 আপনার টার্মিনালে, এটি চালান:
cd ~/adk_eval_starter uv run adk eval customer_service_agent customer_service_agent/eval.test.json --config_file_path=customer_service_agent/test_config.json --print_detailed_results
আউটপুট বোঝা
আপনি এইরকম একটি PASS ফলাফল দেখতে পাবেন:
Eval Run Summary
customer_service_eval:
Tests passed: 3
Tests failed: 0
********************************************************************
Eval Set Id: customer_service_eval
Eval Id: purchase_history_check
Overall Eval Status: PASSED
---------------------------------------------------------------------
Metric: tool_trajectory_avg_score, Status: PASSED, Score: 1.0, Threshold: 0.8
---------------------------------------------------------------------
Metric: response_match_score, Status: PASSED, Score: 0.5473684210526315, Threshold: 0.5
---------------------------------------------------------------------
Invocation Details:
+----+--------------------------+---------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+------------------------+
| | prompt | expected_response | actual_response | expected_tool_calls | actual_tool_calls | tool_trajectory_avg_score | response_match_score |
+====+==========================+===========================+===========================+===========================+===========================+=============================+========================+
| 0 | What did I buy recently? | Here's your recent | Looks like your recent | id=None | id='adk-8960eb53-2933-459 | Status: PASSED, Score: | Status: PASSED, Score: |
| | My customer ID is | purchase history for | orders include: * | args={'customer_id': | f-b306- 71e3c069e77e' | 1.0 | 0.5473684210526315 |
| | CUST001. | Customer ID CUST001: * | **ORD-101 (2023-10-15):** | 'CUST001'} name='get_purc | args={'customer_id': | | |
| | | **Order ORD-101** | Wireless Headphones for | hase_history' | 'CUST001'} name='get_purc | | |
| | | (October 15, 2023): | $120.00 - Status: | partial_args=None | hase_history' | | |
| | | Wireless Headphones, | Delivered 🎧 * **ORD-102 | will_continue=None | partial_args=None | | |
| | | Status: delivered, Total: | (2023-11-01):** USB-C | | will_continue=None | | |
| | | $120 * **Order | Cable, Phone Case for | | | | |
| | | ORD-102** (November 1, | $35.00 - Status: Refunded | | | | |
| | | 2023): USB-C Cable, Phone | 📱 Is there anything else | | | | |
| | | Case, Status: refunded, | I can help you with | | | | |
| | | Total: $35 Let me know | regarding these orders? | | | | |
| | | if you have any other | | | | | |
| | | questions or need further | | | | | |
| | | assistance! 🛍️ | | | | | |
+----+--------------------------+---------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+------------------------+
********************************************************************
Eval Set Id: customer_service_eval
Eval Id: product_info_check
Overall Eval Status: PASSED
---------------------------------------------------------------------
Metric: tool_trajectory_avg_score, Status: PASSED, Score: 1.0, Threshold: 0.8
---------------------------------------------------------------------
Metric: response_match_score, Status: PASSED, Score: 0.6829268292682927, Threshold: 0.5
---------------------------------------------------------------------
Invocation Details:
+----+----------------------+---------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+------------------------+
| | prompt | expected_response | actual_response | expected_tool_calls | actual_tool_calls | tool_trajectory_avg_score | response_match_score |
+====+======================+===========================+===========================+===========================+===========================+=============================+========================+
| 0 | Do you have wireless | Yes, we have wireless | Yes, we do! 🎧 We have | id=None | id='adk-4571d660-a92b-412 | Status: PASSED, Score: | Status: PASSED, Score: |
| | headphones in stock? | headphones in stock! They | noise-canceling wireless | args={'product_name': | a-a79e- 5c54f8b8af2d' | 1.0 | 0.6829268292682927 |
| | | are priced at $120.00 and | headphones with a 20-hour | 'wireless headphones'} na | args={'product_name': | | |
| | | feature noise-canceling | battery life available | me='lookup_product_info' | 'wireless headphones'} na | | |
| | | with a 20-hour battery | for $120. | partial_args=None | me='lookup_product_info' | | |
| | | life. 🎧 | | will_continue=None | partial_args=None | | |
| | | | | | will_continue=None | | |
+----+----------------------+---------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+------------------------+
********************************************************************
Eval Set Id: customer_service_eval
Eval Id: refund_request
Overall Eval Status: PASSED
---------------------------------------------------------------------
Metric: tool_trajectory_avg_score, Status: PASSED, Score: 1.0, Threshold: 0.8
---------------------------------------------------------------------
Metric: response_match_score, Status: PASSED, Score: 0.6216216216216216, Threshold: 0.5
---------------------------------------------------------------------
Invocation Details:
+----+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+------------------------+
| | prompt | expected_response | actual_response | expected_tool_calls | actual_tool_calls | tool_trajectory_avg_score | response_match_score |
+====+===========================+===========================+===========================+===========================+===========================+=============================+========================+
| 0 | I want a refund for order | Your refund for order | Your refund for order | id=None args={'order_id': | id='adk-fb8ff1cc- cf87-41 | Status: PASSED, Score: | Status: PASSED, Score: |
| | ORD-102 because it was | **ORD-102** due to | **ORD-102** has been | 'ORD-102', 'reason': | f2-9b11-d4571b14287f' | 1.0 | 0.6216216216216216 |
| | damaged. | "damaged" has been | successfully processed! | 'damaged'} | args={'order_id': | | |
| | | successfully processed! | You should see a full | name='issue_refund' | 'ORD-102', 'reason': | | |
| | | Refund amount: **$35.0**. | refund of $35.0 appear in | partial_args=None | 'damaged'} | | |
| | | Your order status has | your account shortly. We | will_continue=None | name='issue_refund' | | |
| | | been updated to | apologize for the | | partial_args=None | | |
| | | **refunded**. Is there | inconvenience! Is there | | will_continue=None | | |
| | | anything else I can help | anything else I can | | | | |
| | | you with today? 🛍️ | assist you with today? 😊 | | | | |
+----+---------------------------+---------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+------------------------+
এর মানে হলো, আপনার এজেন্ট সঠিক সরঞ্জাম ব্যবহার করেছেন এবং আপনার প্রত্যাশার যথেষ্ট অনুরূপ একটি উত্তর দিয়েছেন।
৯. (ঐচ্ছিক: শুধুমাত্র পঠনযোগ্য) - সমস্যা সমাধান ও ডিবাগিং
টেস্ট ব্যর্থ হবেই। এটাই তাদের কাজ। কিন্তু সেগুলো ঠিক করবেন কীভাবে? চলুন, ব্যর্থতার সাধারণ পরিস্থিতিগুলো এবং কীভাবে সেগুলোর ডিবাগ করতে হয়, তা বিশ্লেষণ করা যাক।
দৃশ্যকল্প A: "গতিপথ" ব্যর্থতা
ত্রুটি:
Result: FAILED
Reason: Criteria 'tool_trajectory_avg_score' failed. Score 0.0 < Threshold 1.0
Details:
EXPECTED: tool: lookup_order, then tool: issue_refund
ACTUAL: tool: issue_refund
নির্ণয় : এজেন্ট যাচাইকরণ ধাপটি (lookup_order) এড়িয়ে গেছে। এটি একটি যৌক্তিক ত্রুটি।
সমস্যা সমাধানের উপায় :
- অনুমান করবেন না : ADK ওয়েব UI (adk web)-তে ফিরে যান।
- পুনরায় করুন : ব্যর্থ হওয়া টেস্টের হুবহু প্রম্পটটি চ্যাটে টাইপ করুন।
- ট্রেস : ট্রেস ভিউ খুলুন। "গ্রাফ" ট্যাবটি দেখুন।
- প্রম্পটটি ঠিক করুন : সাধারণত, আপনাকে সিস্টেম প্রম্পট আপডেট করতে হবে। পরিবর্তন করুন : "আপনি একজন সহায়ক এজেন্ট।" থেকে : "আপনি একজন সহায়ক এজেন্ট। গুরুত্বপূর্ণ: issue_refund কল করার আগে আপনাকে অবশ্যই lookup_order কল করে বিবরণ যাচাই করতে হবে। "
- টেস্টটি পরিবর্তন করুন : যদি ব্যবসায়িক যুক্তি পরিবর্তিত হয় (যেমন, যাচাই করার আর প্রয়োজন না থাকে), তাহলে টেস্টটি ভুল। নতুন বাস্তবতার সাথে মেলানোর জন্য eval.test.json ফাইলটি আপডেট করুন।
দৃশ্যকল্প বি: "ROUGE"-এর ব্যর্থতা
ত্রুটি:
Result: FAILED
Reason: Criteria 'response_match_score' failed. Score 0.45 < Threshold 0.8
Expected: "The refund has been processed successfully."
Actual: "I've gone ahead and returned the money to your card."
নির্ণয় : এজেন্টটি সঠিক কাজই করেছিল, কিন্তু ভিন্ন শব্দ ব্যবহার করেছিল। ROUGE (শব্দের পুনরাবৃত্তি) এটিকে দণ্ডনীয় করেছে।
কীভাবে ঠিক করবেন :
- এটা কি ভুল? যদি অর্থটি সঠিক হয়, তবে নির্দেশটি পরিবর্তন করবেন না।
- থ্রেশহোল্ড সমন্বয় করুন :
test_config.jsonফাইলে থ্রেশহোল্ড কমিয়ে দিন (যেমন,0.8থেকে0.5)। - মেট্রিকটি আপগ্রেড করুন : আপনার কনফিগে
final_response_match_v2তে পরিবর্তন করুন। এটি একটি LLM ব্যবহার করে উভয় বাক্য পড়ে এবং সেগুলোর অর্থ একই কিনা তা বিচার করে।
১০. পাইটেস্ট (pytest) ব্যবহার করে CI/CD

CLI কমান্ড মানুষের জন্য। pytest মেশিনের জন্য। প্রোডাকশন নির্ভরযোগ্যতা নিশ্চিত করতে, আমরা আমাদের মূল্যায়নগুলোকে একটি পাইথন টেস্ট স্যুটের মধ্যে রাখি। এর ফলে, এজেন্টের মান খারাপ হয়ে গেলে আপনার CI/CD পাইপলাইন (GitHub Actions, Jenkins) ডেপ্লয়মেন্ট আটকে দিতে পারে।
এই ফাইলে কী কী থাকবে?
এই পাইথন ফাইলটি আপনার CI/CD রানার এবং ADK ইভ্যালুয়েটরের মধ্যে সংযোগ স্থাপনকারী হিসেবে কাজ করে। এটিকে যা করতে হবে তা হলো:
- আপনার এজেন্ট লোড করুন : আপনার এজেন্ট কোড ডায়নামিকভাবে ইম্পোর্ট করুন।
- অবস্থা রিসেট করুন : এজেন্ট মেমরি পরিষ্কার আছে কিনা তা নিশ্চিত করুন, যাতে টেস্টগুলো একে অপরের মধ্যে ছড়িয়ে না পড়ে।
- মূল্যায়ন চালান : প্রোগ্রামগতভাবে
AgentEvaluator.evaluate()কল করুন। - অ্যাসার্ট সাকসেস : যদি ইভ্যালুয়েশন স্কোর কম হয়, তাহলে বিল্ডটি ব্যর্থ করুন।
ইন্টিগ্রেশন টেস্ট কোড
- 👉
customer_service_agent/test_agent_eval.pyখুলুন। এই স্ক্রিপ্টটিeval.test.jsonফাইলে সংজ্ঞায়িত টেস্টগুলো চালানোর জন্যAgentEvaluator.evaluateব্যবহার করে। - 👉 আপনার এডিটরে থাকা
customer_service_agent/test_agent_eval.pyফাইলে নিম্নলিখিত কোডটি ইনপুট করুন।from google.adk.evaluation.agent_evaluator import AgentEvaluator import pytest import importlib import sys import os @pytest.mark.asyncio async def test_with_single_test_file(): """Test the agent's basic ability via a session file.""" # Load the agent module robustly module_name = "customer_service_agent.agent" try: agent_module = importlib.import_module(module_name) # Reset the mock data to ensure a fresh state for the test if hasattr(agent_module, 'reset_mock_data'): agent_module.reset_mock_data() except ImportError: # Fallback if running from a different context sys.path.append(os.getcwd()) agent_module = importlib.import_module(module_name) if hasattr(agent_module, 'reset_mock_data'): agent_module.reset_mock_data() # Use absolute path to the eval file to be robust to where pytest is run script_dir = os.path.dirname(os.path.abspath(__file__)) eval_file = os.path.join(script_dir, "eval.test.json") await AgentEvaluator.evaluate( agent_module=module_name, eval_dataset_file_path_or_dir=eval_file, num_runs=1, )
পাইটেস্ট চালান
- 👉💻 আপনার টার্মিনালে, এটি চালান:
আপনি এইরকম ফলাফল দেখতে পাবেন:cd ~/adk_eval_starter uv pip install pytest uv run pytest customer_service_agent/test_agent_eval.py``` -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =============== 1 passed, 15 warnings in 12.84s =============== ```
১১. উপসংহার
অভিনন্দন! আপনি ADK Eval ব্যবহার করে আপনার কাস্টমার সার্ভিস এজেন্টকে সফলভাবে মূল্যায়ন করেছেন।
আপনি যা শিখেছেন
এই কোডল্যাবে, আপনি শিখেছেন কীভাবে:
- ✅ আপনার এজেন্টের জন্য একটি গ্রাউন্ড ট্রুথ প্রতিষ্ঠা করতে একটি গোল্ডেন ডেটাসেট তৈরি করুন ।
- ✅ সফলতার মানদণ্ড নির্ধারণের জন্য মূল্যায়ন কনফিগারেশন বুঝুন ।
- ✅ রিগ্রেশন দ্রুত শনাক্ত করতে স্বয়ংক্রিয় মূল্যায়ন চালান ।
আপনার ডেভেলপমেন্ট ওয়ার্কফ্লোতে ADK Eval অন্তর্ভুক্ত করার মাধ্যমে, আপনি আত্মবিশ্বাসের সাথে এজেন্ট তৈরি করতে পারেন, এই জেনে যে আচরণের যেকোনো পরিবর্তন আপনার স্বয়ংক্রিয় টেস্টের মাধ্যমে ধরা পড়বে।
এই ল্যাবটি ‘প্রোডাকশন-রেডি এআই উইথ গুগল ক্লাউড’ লার্নিং পাথের একটি অংশ।
- প্রোটোটাইপ থেকে উৎপাদনে উত্তরণের ব্যবধান পূরণ করতে সম্পূর্ণ পাঠ্যক্রমটি অন্বেষণ করুন ।
-
ProductionReadyAIহ্যাশট্যাগটি ব্যবহার করে আপনার কাজের অগ্রগতি শেয়ার করুন।
আরও পঠন: