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

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

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

👉 "ওপেন এডিটর" বোতামে ক্লিক করুন (এটি দেখতে পেন্সিল দিয়ে খোলা ফোল্ডারের মতো)। এটি উইন্ডোতে ক্লাউড শেল কোড এডিটর খুলবে। আপনি বাম দিকে একটি ফাইল এক্সপ্লোরার দেখতে পাবেন। 
👉ক্লাউড IDE তে টার্মিনালটি খুলুন, 
👉💻 টার্মিনালে, নিম্নলিখিত কমান্ড ব্যবহার করে যাচাই করুন যে আপনি ইতিমধ্যেই প্রমাণীকরণপ্রাপ্ত এবং প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে:
gcloud auth list
👉💻 GitHub থেকে বুটস্ট্র্যাপ প্রকল্পটি ক্লোন করুন:
git clone https://github.com/cuppibla/adk_eval_starter
👉💻 প্রজেক্ট ডিরেক্টরি থেকে সেটআপ স্ক্রিপ্টটি চালান।
⚠️ প্রজেক্ট আইডি সম্পর্কে দ্রষ্টব্য: স্ক্রিপ্টটি এলোমেলোভাবে তৈরি একটি ডিফল্ট প্রজেক্ট আইডি প্রস্তাব করবে। এই ডিফল্টটি গ্রহণ করতে আপনি এন্টার টিপতে পারেন।
তবে, যদি আপনি একটি নির্দিষ্ট নতুন প্রকল্প তৈরি করতে চান, তাহলে স্ক্রিপ্টের অনুরোধে আপনি আপনার পছন্দসই প্রকল্প আইডি টাইপ করতে পারেন।
cd ~/adk_eval_starter
./init.sh
স্ক্রিপ্টটি বাকি সেটআপ প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে পরিচালনা করবে।
👉 সমাপ্তির পর গুরুত্বপূর্ণ ধাপ: স্ক্রিপ্টটি শেষ হয়ে গেলে, আপনাকে নিশ্চিত করতে হবে যে আপনার Google Cloud Console সঠিক প্রকল্পটি দেখছে:
- console.cloud.google.com এ যান।
- পৃষ্ঠার উপরে প্রজেক্ট সিলেক্টর ড্রপডাউনে ক্লিক করুন।
- "সমস্ত" ট্যাবে ক্লিক করুন (কারণ নতুন প্রকল্পটি এখনও "সাম্প্রতিক" বিভাগে প্রদর্শিত নাও হতে পারে)।
-
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-তে, আমরা এটিকে গোল্ডেন ডেটাসেট বলি। এই ডেটাসেটে "নিখুঁত" ইন্টারঅ্যাকশন রয়েছে যা মূল্যায়নের জন্য একটি ভিত্তি সত্য হিসেবে কাজ করে।
গোল্ডেন ডেটাসেট কী?
একটি গোল্ডেন ডেটাসেট হল আপনার এজেন্টের সঠিকভাবে কাজ করার একটি স্ন্যাপশট। এটি কেবল প্রশ্নোত্তর জোড়ার একটি তালিকা নয়। এটি ক্যাপচার করে:
- ব্যবহারকারীর প্রশ্ন ("আমি টাকা ফেরত চাই")
- ট্র্যাজেক্টোরি (টুল কলের সঠিক ক্রম:
check_order->verify_eligibility->refund_transaction)। - চূড়ান্ত প্রতিক্রিয়া ("নিখুঁত" পাঠ্য উত্তর)।
আমরা Regressions সনাক্ত করতে এটি ব্যবহার করি। যদি আপনি আপনার প্রম্পট আপডেট করেন এবং এজেন্ট হঠাৎ করে রিফান্ড দেওয়ার আগে যোগ্যতা পরীক্ষা করা বন্ধ করে দেয়, তাহলে গোল্ডেন ডেটাসেট পরীক্ষা ব্যর্থ হবে কারণ ট্র্যাজেক্টোরি আর মেলে না।
ওয়েব 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): পাস করার জন্য মেট্রিক্স এবং থ্রেশহোল্ড নির্ধারণ করুন।
পরীক্ষা কনফিগারেশন ফাইল সেট আপ করুন
👉 আপনার এডিটরে 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 আপনাকে "সঠিকতা" সংজ্ঞায়িত করতে দেয়।
আসুন একটি বিস্তৃত পরীক্ষা স্যুট তৈরি করি।
পরীক্ষার কাঠামো
ADK তে একটি টেস্ট কেস লেখার সময়, এই 3-অংশের সূত্রটি অনুসরণ করুন:
- সেটআপ (
session_input) : ব্যবহারকারী কে? (যেমন,user_id,state)। এটি পরীক্ষাটিকে আলাদা করে। - প্রম্পট (
user_content) : ট্রিগার কী?
দাবি (প্রত্যাশা) সহ:
- ট্রাজেক্টোরি (
tool_uses) : এটা কি গণিত ঠিক করেছে? (যুক্তি) - প্রতিক্রিয়া (
final_response) : এটি কি সঠিক উত্তরটি বলেছে? (গুণমান) - মধ্যবর্তী (
intermediate_responses) : সাব-এজেন্টরা কি সঠিকভাবে কথা বলেছে? (অর্কেস্ট্রেশন)
টেস্ট স্যুটটি লিখুন
👉 আপনার এডিটরে 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যুক্তিটি ঠিক "ওয়্যারলেস হেডফোন"। - কেন : যদি মডেলটি টুলটি না বলেই দামের ভ্রান্ত ধারণা করে, তাহলে এই পরীক্ষাটি ব্যর্থ হয়। এটি গ্রাউন্ডিং নিশ্চিত করে।
- প্রসঙ্গ নিষ্কাশন পরীক্ষা (
purchase_history_check)
- লক্ষ্য : এজেন্ট ব্যবহারকারী প্রম্পট থেকে সত্তা (CUST001) বের করতে পারে এবং সেগুলি টুলে পাঠাতে পারে তা যাচাই করা।
- মূল বক্তব্য : আমরা পরীক্ষা করি যে
get_purchase_historycustomer_id: "CUST001"দিয়ে কল করা হয়েছে। - কেন : একটি সাধারণ ব্যর্থতা মোড হল এজেন্ট যা সঠিক টুলটি কল করে কিন্তু একটি নাল আইডি সহ। এটি প্যারামিটারের নির্ভুলতা নিশ্চিত করে।
- অ্যাকশন/ট্র্যাজেক্টরি পরীক্ষা (
refund_request)
- লক্ষ্য : একটি গুরুত্বপূর্ণ লেখার ক্রিয়াকলাপ যাচাই করা।
- মূল বক্তব্য : গতিপথ। আরও জটিল পরিস্থিতিতে, এই তালিকায় একাধিক ধাপ থাকবে:
[verify_order, calculate_refund, issue_refund]। ADK এই তালিকাটি In Order পরীক্ষা করে। - কেন : অর্থ স্থানান্তর বা ডেটা পরিবর্তনের জন্য, ক্রম ফলাফলের মতোই গুরুত্বপূর্ণ। যাচাই করার আগে আপনি ফেরত দিতে চাইবেন না।
৮. কাস্টম পরীক্ষার জন্য মূল্যায়ন চালান (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 ওয়েব) এ ফিরে যান।
- পুনরুৎপাদন : চ্যাটে ব্যর্থ পরীক্ষার সঠিক প্রম্পটটি টাইপ করুন।
- ট্রেস : ট্রেস ভিউ খুলুন। "গ্রাফ" ট্যাবে দেখুন।
- প্রম্পট ঠিক করুন : সাধারণত, আপনাকে সিস্টেম প্রম্পট আপডেট করতে হবে। পরিবর্তন করুন : "আপনি একজন সহায়ক এজেন্ট।" থেকে : "আপনি একজন সহায়ক এজেন্ট। গুরুত্বপূর্ণ: ইস্যু_রিফান্ড কল করার আগে আপনাকে বিস্তারিত যাচাই করতে lookup_order-এ কল করতে হবে। "
- পরীক্ষাটি মানিয়ে নিন : যদি ব্যবসায়িক যুক্তি পরিবর্তিত হয় (যেমন, যাচাইকরণের আর প্রয়োজন নেই), তাহলে পরীক্ষাটি ভুল। নতুন বাস্তবতার সাথে মেলাতে eval.test.json আপডেট করুন।
দৃশ্যপট খ: "রুগ" ব্যর্থতা
ত্রুটি:
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 ব্যবহার করে এবং বিচার করে যে তাদের অর্থ একই কিনা।
১০. পাইটেস্ট সহ সিআই/সিডি (পাইটেস্ট)

CLI কমান্ড মানুষের জন্য। pytest মেশিনের জন্য। উৎপাদন নির্ভরযোগ্যতা নিশ্চিত করার জন্য, আমরা আমাদের মূল্যায়নগুলিকে একটি Python পরীক্ষা স্যুটে মোড়ানো করি। এটি আপনার 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 কে অন্তর্ভুক্ত করে, আপনি আত্মবিশ্বাসের সাথে এজেন্ট তৈরি করতে পারেন, জেনে রাখুন যে আচরণের যেকোনো পরিবর্তন আপনার স্বয়ংক্রিয় পরীক্ষায় ধরা পড়বে।