পাঠ ৫৭ · ৫৭-এর মধ্যে · মডিউল ১৩
Home / AI Courses / Human-Centered AI / ক্যাপস্টোন

ক্যাপস্টোন — একটি হিউম্যান-সেন্টার্ড AI ফিচার এন্ড-টু-এন্ড ডিজাইন ও ইভালুয়েশন

Capstone: designing & evaluating a human-centered AI feature end-to-end
১৮ মিনিট পড়া উন্নত · Advanced Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

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

১ · ক্যাপস্টোন পরিকল্পনা — স্মার্ট রিপ্লাই সাজেশন ফিচার মূল্যায়ন

L56-এ আমরা একটি ইমেইল ক্লায়েন্টের "স্মার্ট রিপ্লাই সাজেশন" ফিচার ডিজাইন করেছিলাম (সম্পূর্ণ কাল্পনিক ও ইলাস্ট্রেটিভ) — সর্বোচ্চ ৩টি রিপ্লাই-চিপ, শুধুমাত্র কনফিডেন্স ≥ ০.৫৫ হলে দেখানো হয়, সংখ্যাসূচক কনফিডেন্স-শতাংশ ছাড়া, ব্যবহারকারী এডিট/উপেক্ষা করতে পারেন, সিস্টেম কখনও নিজে থেকে Send করে না। কোর্স জুড়ে আমরা একটি একটি করে মূল্যায়ন-প্যাটার্ন শিখেছি — ট্রাস্ট ক্যালিব্রেশন (M3/L09-L13), ইউজেবিলিটি মেট্রিক্স (M9/L42), অ্যাক্সেসিবিলিটি কনট্রাস্ট (M7/L30), অটোমেশন লেভেল (M5/L20), ও ওয়েটেড চেকলিস্ট স্কোরিং (M10/L47)। এই ক্যাপস্টোনে সেগুলো আলাদা আলাদা না রেখে একসাথে জোড়া লাগিয়ে একটি সম্পূর্ণ, প্রমাণ-ভিত্তিক মূল্যায়ন চালানো হবে — ঠিক একজন প্রকৃত HCAI ডিজাইনার/রিসার্চার শিপ করার আগে যা করবেন।

ধাপ ১ · ট্রাস্ট-ক্যালিব্রেশন চেক ধাপ ২ · SUS ইউজেবিলিটি স্কোর ধাপ ৩ · WCAG কনট্রাস্ট চেক ধাপ ৪ · অটোমেশন লেভেল ধাপ ৫ · ওয়েটেড HCAI চেকলিস্ট ধাপ ৬ চূড়ান্ত মূল্যায়ন ও সুপারিশ
প্রতিটি ধাপ একটি প্রকৃত সংখ্যা/সিদ্ধান্ত তৈরি করে; ধাপ ৬ সেগুলোকে একত্র করে একটি প্রমাণ-ভিত্তিক চূড়ান্ত সুপারিশে পৌঁছায়।
নিচের কোড সেলগুলো একটি একক Pyodide সেশনে ক্রমানুসারে চলে — একটি সেলে সংজ্ঞায়িত ভ্যারিয়েবল/ফাংশন পরের সেলে ব্যবহার করা যায়, ঠিক যেমন একটি Jupyter নোটবুকে হয়। তাই সঠিক ফলাফল পেতে সেলগুলো উপর থেকে নিচে, ক্রমানুসারে Run করুন।

২ · ধাপ ১ — ট্রাস্ট-ক্যালিব্রেশন / কনফিডেন্স চেক

প্রথম টুকরোটি M3-এর প্যাটার্নে (L01, L10-এর ধাঁচে, কিন্তু নতুন সংখ্যা ও নতুন সিনারিওতে) পরীক্ষা করে: ফিচারের কনফিডেন্স-গেটিং (L56-এ ঠিক করা থ্রেশহোল্ড ০.৫৫) সত্যিই ট্রাস্টকে ঠিকভাবে ক্যালিব্রেট করে কি না। আমরা দুটো প্রেক্ষাপট সিমুলেট করি — রুটিন (সংক্ষিপ্ত, পরিচিত ইমেইল, প্রকৃত appropriateness ৯৩%) ও নতুন (জটিল/স্পর্শকাতর ইমেইল, প্রকৃত appropriateness মাত্র ৬১%) — কিন্তু ইচ্ছাকৃতভাবে দুই প্রেক্ষাপটেই মডেলের গড় কনফিডেন্স প্রায় একই রকম উচ্চ রাখা হয়েছে, ঠিক যেমন বাস্তবে একটি মডেলের কনফিডেন্স প্রায়ই ডোমেইন-শিফটের সাথে যথেষ্ট কমে না।

Python
# ========== ধাপ ১: ট্রাস্ট-ক্যালিব্রেশন / কনফিডেন্স চেক ==========
import random
random.seed(31)

def simulate_suggestions(n, appropriate_prob, conf_mean, conf_sd):
    rows = []
    for _ in range(n):
        conf = min(0.99, max(0.05, random.gauss(conf_mean, conf_sd)))
        appropriate = random.random() < appropriate_prob
        rows.append({"confidence": conf, "appropriate": appropriate})
    return rows

# রুটিন প্রেক্ষাপট: সংক্ষিপ্ত, পরিচিত ইমেইল (অ্যাকনলেজমেন্ট, শিডিউলিং কনফার্মেশন)
routine = simulate_suggestions(200, appropriate_prob=0.93, conf_mean=0.82, conf_sd=0.10)
# নতুন প্রেক্ষাপট: জটিল/স্পর্শকাতর ইমেইল -- মডেলের কনফিডেন্স প্রায় একই রকম উচ্চ থাকে,
# কিন্তু প্রকৃত appropriateness নাটকীয়ভাবে কমে যায়
novel = simulate_suggestions(200, appropriate_prob=0.61, conf_mean=0.78, conf_sd=0.12)

CONF_THRESHOLD = 0.55  # L56-এ ঠিক করা থ্রেশহোল্ড -- এর নিচে কোনো চিপ দেখানো হয় না

def shown(rows, threshold):
    return [r for r in rows if r["confidence"] >= threshold]

shown_routine = shown(routine, CONF_THRESHOLD)
shown_novel = shown(novel, CONF_THRESHOLD)

def pct(x, n):
    return x / n * 100 if n else 0.0

def actual_rate(rows):
    return pct(sum(1 for r in rows if r["appropriate"]), len(rows))

def avg_conf(rows):
    return pct(sum(r["confidence"] for r in rows), len(rows))

routine_shown_rate = pct(len(shown_routine), len(routine))
novel_shown_rate = pct(len(shown_novel), len(novel))
routine_actual = actual_rate(shown_routine)
novel_actual = actual_rate(shown_novel)
routine_conf = avg_conf(shown_routine)
novel_conf = avg_conf(shown_novel)
routine_gap = routine_conf - routine_actual
novel_gap = novel_conf - novel_actual

print(f"রুটিন প্রেক্ষাপট (n={len(routine)}): {len(shown_routine)}টি চিপ দেখানো হয়েছে ({routine_shown_rate:.1f}%)")
print(f"  গড় কনফিডেন্স {routine_conf:.1f}%  |  প্রকৃত appropriate-rate {routine_actual:.1f}%  |  গ্যাপ {routine_gap:+.1f}")
print(f"\nনতুন প্রেক্ষাপট (n={len(novel)}): {len(shown_novel)}টি চিপ দেখানো হয়েছে ({novel_shown_rate:.1f}%)")
print(f"  গড় কনফিডেন্স {novel_conf:.1f}%  |  প্রকৃত appropriate-rate {novel_actual:.1f}%  |  গ্যাপ {novel_gap:+.1f}")

    
গণনা করা ফলাফল: রুটিন প্রেক্ষাপটে ২০০-এর মধ্যে সবগুলো (১০০.০%) চিপ থ্রেশহোল্ড পার করেছে, গড় কনফিডেন্স ৮১.২% বনাম প্রকৃত appropriate-rate ৯৩.০% — গ্যাপ −১১.৮ (ঋণাত্মক, অর্থাৎ মডেল আসলে তার কনফিডেন্সের চেয়েও বেশি নির্ভরযোগ্য, আন্ডার-কনফিডেন্ট)। কিন্তু নতুন প্রেক্ষাপটে ৯৬.০% চিপ থ্রেশহোল্ড পার করেছে (১৯২/২০০), গড় কনফিডেন্স মাত্র সামান্য কমে ৭৮.৫%, অথচ প্রকৃত appropriate-rate ধসে পড়ে ৫৮.৯%-এ — গ্যাপ +১৯.৬। অর্থাৎ ঠিক সেই প্রেক্ষাপটে যেখানে ব্যবহারকারীর সবচেয়ে বেশি সতর্ক হওয়া দরকার, কনফিডেন্স সিগন্যাল তা প্রতিফলিত করে না — L56-এর প্রশ্ন ০২-এ যে ঝুঁকির কথা বলা হয়েছিল, এখানে তার একটি প্রকৃত, গণনা করা প্রমাণ।

৩ · ধাপ ২ — System Usability Scale (SUS) স্কোর

দ্বিতীয় টুকরোটি M9/L42-এর প্যাটার্নে একটি হাইপোথেটিক্যাল ইউজেবিলিটি টেস্টের ৫ জন অংশগ্রহণকারীর ১০-আইটেম SUS প্রতিক্রিয়া (১-৫ Likert স্কেল) থেকে প্রকৃত SUS ফর্মুলা দিয়ে স্কোর গণনা করে — বিজোড় আইটেম (ইতিবাচক ভাষায় লেখা): স্কোর − ১; জোড় আইটেম (নেতিবাচক ভাষায় লেখা): ৫ − স্কোর; মোট যোগফল × ২.৫।

Python
# ========== ধাপ ২: System Usability Scale (SUS) স্কোর ==========
respondents = [
    [4, 2, 5, 1, 4, 2, 5, 1, 4, 2],
    [5, 1, 4, 2, 4, 1, 5, 2, 4, 1],
    [3, 3, 4, 2, 3, 2, 4, 2, 3, 3],
    [4, 2, 5, 2, 4, 1, 4, 1, 5, 2],
    [2, 4, 3, 3, 3, 3, 3, 3, 3, 4],
]

def sus_score(responses):
    total = 0
    for i, score in enumerate(responses):
        item_num = i + 1
        if item_num % 2 == 1:          # বিজোড় আইটেম (ইতিবাচক ভাষায় লেখা): score - 1
            total += (score - 1)
        else:                          # জোড় আইটেম (নেতিবাচক ভাষায় লেখা): 5 - score
            total += (5 - score)
    return total * 2.5

sus_scores = [sus_score(r) for r in respondents]
for i, s in enumerate(sus_scores):
    print(f"রেসপন্ডেন্ট {i+1}: {respondents[i]}  ->  SUS = {s:.1f}")

avg_sus = sum(sus_scores) / len(sus_scores)
print(f"\nগড় SUS স্কোর (n={len(sus_scores)}): {avg_sus:.1f}  (ইন্ডাস্ট্রি-গড় বেঞ্চমার্ক প্রায় ৬৮)")

    
গণনা করা ফলাফল: পাঁচ রেসপন্ডেন্টের SUS স্কোর যথাক্রমে ৮৫.০, ৮৭.৫, ৬২.৫, ৮৫.০, ৪২.৫ — বেশ বিস্তৃত পরিসর, শেষ রেসপন্ডেন্ট স্পষ্টতই সন্তুষ্ট নন। গড় SUS স্কোর ৭২.৫, যা প্রায়ই উদ্ধৃত ইন্ডাস্ট্রি-গড় বেঞ্চমার্ক (≈৬৮)-এর উপরে — অর্থাৎ গড়ে ফিচারটি "গড়ের চেয়ে ভালো" ইউজেবিলিটি দেখাচ্ছে, যদিও রেসপন্ডেন্ট ৫-এর মতো বিচ্ছিন্ন কম-স্কোর একা গড়ে চাপা পড়ে যেতে পারে — এই ভ্যারিয়েন্সটাও একটি প্রকৃত অডিটে আলাদাভাবে লক্ষ্য করা উচিত, শুধু গড় নম্বরে নয়।

৪ · ধাপ ৩ — WCAG কনট্রাস্ট-রেশিও চেক

তৃতীয় টুকরোটি M7/L30-এর প্যাটার্নে প্রকৃত WCAG রিলেটিভ-লুমিনেন্স ও কনট্রাস্ট-রেশিও ফর্মুলা ব্যবহার করে ফিচারের তিনটি UI রঙ-জোড়া (চিপ টেক্সট/ব্যাকগ্রাউন্ড, হাই-কনফিডেন্স স্টাইল, ও একটি মিউটেড হেল্পার-টেক্সট) AA নরমাল-টেক্সট থ্রেশহোল্ড (৪.৫:১) এর বিপরীতে যাচাই করে।

Python
# ========== ধাপ ৩: WCAG কনট্রাস্ট-রেশিও চেক ==========
def relative_luminance(rgb):
    def channel(c):
        c = c / 255
        if c <= 0.03928:
            return c / 12.92
        return ((c + 0.055) / 1.055) ** 2.4
    r, g, b = rgb
    return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b)

def contrast_ratio(rgb1, rgb2):
    l1 = relative_luminance(rgb1)
    l2 = relative_luminance(rgb2)
    lighter, darker = max(l1, l2), min(l1, l2)
    return (lighter + 0.05) / (darker + 0.05)

AA_NORMAL = 4.5

pairs = [
    ("সাজেশন চিপ টেক্সট (navy) অন চিপ ব্যাকগ্রাউন্ড (হালকা নীল)", (26, 54, 93), (234, 242, 255)),
    ("হাই-কনফিডেন্স স্টাইল টেক্সট (সাদা) অন এক্সেন্ট ব্যাকগ্রাউন্ড (সবুজ)", (255, 255, 255), (47, 133, 90)),
    ("মিউটেড হেল্পার টেক্সট (হালকা ধূসর) অন সাদা ব্যাকগ্রাউন্ড", (148, 163, 184), (255, 255, 255)),
]

results = []
for label, fg, bg in pairs:
    ratio = contrast_ratio(fg, bg)
    status = "PASS" if ratio >= AA_NORMAL else "FAIL"
    results.append((label, ratio, status))
    print(f"{label}\n  contrast = {ratio:.2f}:1  (AA থ্রেশহোল্ড {AA_NORMAL}:1)  ->  {status}\n")

passed_pairs = sum(1 for _, _, s in results if s == "PASS")
total_pairs = len(results)
print(f"মোট {total_pairs}টি রঙ-জোড়ার মধ্যে {passed_pairs}টি AA পাস করেছে")

    
গণনা করা ফলাফল: সাজেশন চিপের নেভি-টেক্সট অন হালকা-নীল-ব্যাকগ্রাউন্ড কনট্রাস্ট ১০.৭৮:১ — স্বচ্ছন্দে PASS। হাই-কনফিডেন্স সাদা-টেক্সট অন সবুজ-ব্যাকগ্রাউন্ড কনট্রাস্ট ৪.৫৪:১ — থ্রেশহোল্ডের (৪.৫:১) খুবই কাছাকাছি হলেও PASS। কিন্তু মিউটেড ধূসর হেল্পার-টেক্সট অন সাদা ব্যাকগ্রাউন্ড কনট্রাস্ট মাত্র ২.৫৬:১ — স্পষ্টভাবে FAIL। তিনটির মধ্যে ২টি পাস, ১টি ফেল (passed_pairs = 2, total_pairs = 3) — এই মিউটেড হেল্পার-টেক্সটের রঙ ঠিক না করলে এটি একটি বাস্তব অ্যাক্সেসিবিলিটি সমস্যা।

৫ · ধাপ ৪ — লেভেল-অফ-অটোমেশন শ্রেণীবিভাগ

চতুর্থ টুকরোটি L56-এ তৈরি একই লেভেল-অফ-অটোমেশন ক্লাসিফায়ার (M5/L20-এর প্যাটার্ন) ফিচারের চূড়ান্ত শিপড ডিজাইনের উপর পুনরায় প্রয়োগ করে, এবং ধাপ ১-এর ডেটা পুনরায় ব্যবহার করে হিসাব করে দুই প্রেক্ষাপট মিলিয়ে কতবার ব্যবহারকারী আদৌ কোনো AI-চিপ দেখেন।

Python
# ========== ধাপ ৪: লেভেল-অফ-অটোমেশন শ্রেণীবিভাগ (চূড়ান্ত শিপড ডিজাইন) ==========
def classify_automation_level(d):
    if not d["ai_suggests"]:
        return 1
    if d["shows_multiple_options"] and d["requires_manual_send"]:
        return 3
    if d["prefilled_in_box"] and d["requires_manual_send"]:
        return 5
    if d["requires_manual_send"]:
        return 4
    if d["auto_sends"] and d["veto_window_seconds"] > 0:
        return 6
    if d["auto_sends"]:
        return 8
    return 2

shipped_design = {
    "name": "শিপড ডিজাইন -- কনফিডেন্স থ্রেশহোল্ড পার হলে ৩টি চিপ, ম্যানুয়াল সিলেক্ট ও সেন্ড",
    "ai_suggests": True, "shows_multiple_options": True, "requires_manual_send": True,
    "prefilled_in_box": False, "auto_sends": False, "veto_window_seconds": 0,
}
level = classify_automation_level(shipped_design)
print(f"{shipped_design['name']}")
print(f"অটোমেশন লেভেল: {level}\n")

# ধাপ ১-এর ডেটা পুনরায় ব্যবহার করে সামগ্রিক 'অ্যাসিস্ট রেট'
combined_n = len(routine) + len(novel)
combined_shown = len(shown_routine) + len(shown_novel)
overall_assist_rate = pct(combined_shown, combined_n)
print(f"দুই প্রেক্ষাপট মিলিয়ে মোট {combined_n}টি ইমেইলের মধ্যে {combined_shown}টিতে অন্তত একটি চিপ দেখানো হয়েছে ({overall_assist_rate:.1f}%)")
print(f"কিন্তু লেভেল {level} মানে -- কনফিডেন্স যতই বেশি হোক না কেন, AI কখনও নিজে থেকে Send করে না; চূড়ান্ত ক্লিক সবসময় মানুষের")

    
গণনা করা ফলাফল: চূড়ান্ত শিপড ডিজাইন classify_automation_level অনুযায়ী লেভেল ৩-এ শ্রেণীবদ্ধ হয়েছে — L56-এর সিদ্ধান্তের সাথে সামঞ্জস্যপূর্ণ। দুই প্রেক্ষাপট মিলিয়ে ৪০০টি সিমুলেটেড ইমেইলের মধ্যে ৩৯২টিতে (৯৮.০%) অন্তত একটি চিপ দেখানো হয়েছে — অর্থাৎ কনফিডেন্স-গেটিং প্রায় সবসময় "পাস" করে দিচ্ছে, এমনকি নতুন প্রেক্ষাপটেও (৯৬.০%)। এটি ধাপ ১-এর ফলাফলের সাথে মিলিয়ে পড়লে গুরুত্বপূর্ণ: শুধু "কতবার চিপ দেখানো হলো" তার হার দিয়ে বিচার করলে ফিচারটিকে নিরাপদ মনে হতে পারে, কিন্তু আসল প্রশ্ন হলো সেই দেখানো চিপগুলো কতটা প্রাসঙ্গিক ছিল (ধাপ ১-এর গ্যাপ) — লেভেল ৩ নিশ্চিত করে অন্তত ক্ষতিটা একজন মানুষের চূড়ান্ত ক্লিকের পেছনে থাকবে, কিন্তু এটি ভুল-সাজেশন দেখানো বন্ধ করে না।

৬ · ধাপ ৫ — ওয়েটেড HCAI চেকলিস্ট স্কোর

পঞ্চম টুকরোটি M10/L47-এর ওয়েটেড-চেকলিস্ট প্যাটার্নে উপরের চারটি ধাপের প্রকৃত গণনা করা ফলাফল থেকে ৪টি আইটেমের স্কোর সরাসরি বের করে আনে (কোনো নতুন সংখ্যা হার্ডকোড না করে), এবং আরও ৪টি আইটেম L56-এর ডিজাইন-সিদ্ধান্ত থেকে যোগ করে — মোট ৮টি আইটেম, প্রতিটির নিজস্ব ওজন সহ।

Python
# ========== ধাপ ৫: ওয়েটেড HCAI চেকলিস্ট স্কোর ==========
checklist = [
    {"name": "ট্রাস্ট ক্যালিব্রেশন গ্যাপ (নতুন প্রেক্ষাপট) যুক্তিসঙ্গত সীমার মধ্যে (<=15 পয়েন্ট)", "weight": 3,
     "score": 1.0 if novel_gap <= 15 else (0.5 if novel_gap <= 25 else 0.0)},
    {"name": "SUS স্কোর ইন্ডাস্ট্রি-গড় (68) এর উপরে", "weight": 3,
     "score": 1.0 if avg_sus >= 68 else (0.5 if avg_sus >= 60 else 0.0)},
    {"name": "WCAG AA কনট্রাস্ট (4.5:1) সব UI টেক্সট পেয়ারে পাস", "weight": 2,
     "score": passed_pairs / total_pairs},
    {"name": "চূড়ান্ত সেন্ড-সিদ্ধান্তে মানুষ থাকে (automation level <= 5)", "weight": 3,
     "score": 1.0 if level <= 5 else 0.0},
    {"name": "কম-কনফিডেন্স ক্ষেত্রে সাজেশন লুকানো থাকে (over-trust ঝুঁকি সীমিত)", "weight": 2, "score": 1.0},
    {"name": "সহজে এডিট/ওভাররাইড/ডিসমিস করা যায় (গ্রেসফুল ফলব্যাক)", "weight": 2, "score": 1.0},
    {"name": "সর্বোচ্চ ৩টি অপশন -- কগনিটিভ লোড সীমিত", "weight": 1, "score": 1.0},
    {"name": "ব্যবহারকারীর সংশোধন/ইগনোর থেকে সিস্টেম শেখে (ফিডব্যাক লুপ) -- আংশিক বাস্তবায়িত", "weight": 1, "score": 0.5},
]

total_weight = sum(item["weight"] for item in checklist)
weighted_sum = sum(item["weight"] * item["score"] for item in checklist)
checklist_pct = weighted_sum / total_weight * 100

for item in checklist:
    print(f"[w={item['weight']}] {item['score']:.2f}  {item['name']}")

print(f"\nমোট ওজন: {total_weight}  |  ওয়েটেড স্কোর: {weighted_sum:.2f}  |  চূড়ান্ত চেকলিস্ট স্কোর: {checklist_pct:.1f}%")

    
গণনা করা ফলাফল: মোট ওজন ১৭-এর মধ্যে ওয়েটেড স্কোর ১৪.৩৩, অর্থাৎ চূড়ান্ত চেকলিস্ট স্কোর ৮৪.৩%। লক্ষ্য করুন প্রথম আইটেমটি (ট্রাস্ট-ক্যালিব্রেশন গ্যাপ) স্কোর মাত্র ০.৫ পেয়েছে, কারণ নতুন-প্রেক্ষাপট গ্যাপ (১৯.৬) ১৫-এর সীমা ছাড়িয়ে গেছে কিন্তু ২৫-এর নিচে আছে। WCAG আইটেমও পূর্ণ স্কোর পায়নি (2/3 = ০.৬৭), কারণ একটি রঙ-জোড়া ফেল করেছে। বাকি সব আইটেম পূর্ণ বা প্রায়-পূর্ণ স্কোর পেয়েছে।

৭ · ধাপ ৬ — চূড়ান্ত মূল্যায়ন সারাংশ ও সুপারিশ

শেষ টুকরোটি উপরের পাঁচটি ধাপের প্রকৃত গণনা করা ফলাফল একত্র করে একটি একক, প্রমাণ-ভিত্তিক সুপারিশে পৌঁছায় — কোনো হার্ডকোড করা উপসংহার নয়, বরং major_issues-এর একটি সাধারণ শর্ত-চেক থেকে বেরিয়ে আসে।

Python
# ========== ধাপ ৬: চূড়ান্ত মূল্যায়ন সারাংশ ও সুপারিশ -- ধাপ ১-৫-এর প্রকৃত ফলাফল থেকে ==========
major_issues = [item["name"] for item in checklist if item["weight"] >= 3 and item["score"] < 1.0]
minor_issues = [item["name"] for item in checklist if item["weight"] < 3 and item["score"] < 1.0]

print("=" * 70)
print("চূড়ান্ত মূল্যায়ন সারাংশ -- স্মার্ট রিপ্লাই সাজেশন ফিচার (হাইপোথেটিক্যাল)")
print("=" * 70)
print(f"১. ট্রাস্ট-ক্যালিব্রেশন গ্যাপ: রুটিন {routine_gap:+.1f}, নতুন প্রেক্ষাপট {novel_gap:+.1f}")
print(f"২. গড় SUS স্কোর: {avg_sus:.1f} / 100")
print(f"৩. WCAG AA কনট্রাস্ট: {passed_pairs}/{total_pairs} পেয়ার পাস")
print(f"৪. অটোমেশন লেভেল: {level} (Sheridan-Verplanck-ধাঁচ স্কেলে)")
print(f"৫. ওয়েটেড HCAI চেকলিস্ট স্কোর: {checklist_pct:.1f}%")
print()
print(f"মেজর ইস্যু ({len(major_issues)}টি): {major_issues}")
print(f"মাইনর ইস্যু ({len(minor_issues)}টি): {minor_issues}")

if major_issues:
    verdict = "মেজর রিভিশন দরকার -- উপরের মেজর ইস্যু সমাধানের পর পুনরায় মূল্যায়ন আবশ্যক"
elif checklist_pct >= 90:
    verdict = "রেডি টু শিপ"
elif checklist_pct >= 75:
    verdict = "মাইনর রিভিশন সহ শিপ করা যায়"
else:
    verdict = "রিভিশন দরকার"

print(f"\nচূড়ান্ত সুপারিশ: {verdict}")

    
গণনা করা চূড়ান্ত ফলাফল: ট্রাস্ট-ক্যালিব্রেশন গ্যাপ রুটিনে −১১.৮, নতুন প্রেক্ষাপটে +১৯.৬; গড় SUS ৭২.৫; WCAG কনট্রাস্ট ২/৩ পাস; অটোমেশন লেভেল ৩; ওয়েটেড চেকলিস্ট স্কোর ৮৪.৩%। major_issues-এ ঠিক ১টি আইটেম পড়েছে — নতুন-প্রেক্ষাপট ট্রাস্ট-ক্যালিব্রেশন গ্যাপ — আর minor_issues-এ ২টি (WCAG কনট্রাস্ট ও ফিডব্যাক-লুপ)। যেহেতু major_issues খালি নয়, শর্ত-চেইনের প্রথম শাখাই সক্রিয় হয়, চেকলিস্ট স্কোর ৮৪.৩% "মাইনর রিভিশন" সীমার (৭৫-৮৯%) মধ্যে থাকা সত্ত্বেও। চূড়ান্ত সুপারিশ: "মেজর রিভিশন দরকার"। এটি একটি গুরুত্বপূর্ণ শিক্ষা: ফিচারটির ইউজেবিলিটি ভালো (SUS ৭২.৫), অটোমেশন লেভেল যথাযথ (৩), ও সামগ্রিক চেকলিস্ট স্কোরও মন্দ নয় (৮৪.৩%) — কিন্তু একটি একক, উচ্চ-ওজনের সমস্যা (নতুন প্রেক্ষাপটে কনফিডেন্স সিগন্যাল বাস্তব নির্ভরযোগ্যতার সাথে ক্যালিব্রেটেড নয়) পুরো ফিচারকে "রেডি টু শিপ" হওয়া থেকে আটকে দেয় — ঠিক যেমন এই কোর্সের L01-এই শেখা হয়েছিল, ট্রাস্ট ক্যালিব্রেশনই HCAI-এর কেন্দ্রীয় সমস্যা, আর একটি ভালো গড় স্কোরও তাকে চাপা দিতে পারে না।
মূল কথা · Key takeaway

একটি বাস্তবসম্মত HCAI মূল্যায়ন কখনোই একটি একক মেট্রিক নয় — এটি একাধিক স্বাধীন কিন্তু আন্তঃসংযুক্ত পরীক্ষার সমষ্টি: কনফিডেন্স সিগন্যাল বাস্তব নির্ভরযোগ্যতার সাথে কতটা মেলে (M3), ব্যবহারকারীরা প্রকৃতপক্ষে ফিচারটি কতটা ব্যবহারযোগ্য মনে করেন (M9), ইন্টারফেস সবার জন্য কতটা দৃশ্যমান (M7), মানুষ চূড়ান্ত নিয়ন্ত্রণে আছেন কি না (M5), ও এই সবকিছু একসাথে মিলিয়ে ওজন দিলে সামগ্রিক ছবিটা কেমন দাঁড়ায় (M10)। এই কোর্সে আমরা এই প্রতিটি লেন্স আলাদা আলাদা করে গভীরভাবে শিখেছি (M1-M13), আর এই শেষ পাঠে দেখলাম কীভাবে তারা একসাথে একটি বাস্তবসম্মত, প্রমাণ-ভিত্তিক মূল্যায়নে রূপ নেয়। Human-Centered AI কোনো একটি সূত্র বা একটি চেকবক্স নয় — এটি একটি অনুশীলন, যা এই কোর্স জুড়ে ধাপে ধাপে তৈরি করা টুল ও প্রশ্নগুলো দিয়ে প্রতিটি নতুন ফিচারের সাথে নতুন করে প্রয়োগ করতে হয়।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ ধাপ ১-এ নতুন প্রেক্ষাপটে গড় কনফিডেন্স মাত্র সামান্য কমেছে (৮১.২%→৭৮.৫%), কিন্তু প্রকৃত appropriate-rate অনেক বেশি কমেছে (৯৩.০%→৫৮.৯%)। কেন এই একটি অসামঞ্জস্যই পুরো চূড়ান্ত সুপারিশ পাল্টে দিয়েছে?

কারণ চেকলিস্টের এই আইটেমটির ওজন সবচেয়ে বেশি (৩), এবং কোড এমনভাবে লেখা যে যেকোনো একটি উচ্চ-ওজনের (weight ≥ 3) আইটেম পূর্ণ স্কোর না পেলেই তা major_issues-এ পড়ে, আর major_issues অ-খালি থাকলে সামগ্রিক পার্সেন্টেজ যত ভালোই হোক (৮৪.৩%), সুপারিশ সরাসরি "মেজর রিভিশন দরকার"-এ চলে যায়। এটি ইচ্ছাকৃত ডিজাইন — ট্রাস্ট-ক্যালিব্রেশন এই কোর্সের কেন্দ্রীয় বিষয় (M3), তাই এটিকে বাকি সবকিছুর গড়ে চাপা পড়তে দেওয়া হয়নি।

প্র ০২ ধাপ ৩-এ হাই-কনফিডেন্স ব্যাজের কনট্রাস্ট মাত্র ৪.৫৪:১ — থ্রেশহোল্ডের (৪.৫:১) খুবই কাছাকাছি হলেও পাস করেছে। এটাকে "নিরাপদ পাস" বলা কি ঠিক হবে?

না, খুব সতর্কভাবে দেখা উচিত। থ্রেশহোল্ডের এত কাছাকাছি একটি পাস মানে স্ক্রিন ক্যালিব্রেশনের সামান্য পার্থক্য, সাব-পিক্সেল রেন্ডারিং, বা কম-দৃষ্টিশক্তিসম্পন্ন ব্যবহারকারীর প্রকৃত অভিজ্ঞতা সহজেই এটিকে ফেলের দিকে ঠেলে দিতে পারে। একটি দৃঢ় ডিজাইন ন্যূনতম থ্রেশহোল্ড ছুঁয়ে থাকার বদলে তার উপরে একটি নিরাপত্তা-মার্জিন রাখা উচিত (M7-এর অ্যাক্সেসিবিলিটি নীতির একটি ব্যবহারিক প্রয়োগ)।

প্র ০৩ চেকলিস্টে "কম-কনফিডেন্স ক্ষেত্রে সাজেশন লুকানো থাকে" আইটেমটির স্কোর সরাসরি ১.০ (হার্ডকোড করা), যেখানে অন্য আইটেমগুলো আগের ধাপের গণনা থেকে বের হয়ে এসেছে। এটা কি এই ক্যাপস্টোনের একটি দুর্বলতা?

হ্যাঁ, এবং এটি স্বীকার করা জরুরি। বাস্তবে এই দাবিটিও পরিমাপযোগ্য — যেমন প্রকৃত ব্যবহার-লগে কনফিডেন্স থ্রেশহোল্ডের নিচে সত্যিই কখনও চিপ দেখানো হয়নি কি না, তা যাচাই করে একটি প্রকৃত হার বের করা যেত (ধাপ ৪-এর shown() ফাংশনের মতোই)। একটি আরও কঠোর ক্যাপস্টোন প্রতিটি চেকলিস্ট আইটেমকে পরিমাপ থেকে বের করবে, ডিজাইন-অভিপ্রায় থেকে অনুমান করবে না — এটাই প্রকৃত অডিট ও "মনে হচ্ছে ঠিক আছে" ধরনের মূল্যায়নের মধ্যে পার্থক্য।

অনুশীলন

  1. চিন্তা করুন: ধাপ ৫-এর কোড সেলে প্রথম চেকলিস্ট আইটেমের 1.0 if novel_gap <= 15 else ... শর্তে 15-কে 25-এ পরিবর্তন করলে (নতুন-প্রেক্ষাপট গ্যাপ ১৯.৬, মনে রাখুন) সেই আইটেমের স্কোর, চূড়ান্ত চেকলিস্ট পার্সেন্টেজ, ও চূড়ান্ত সুপারিশ কীভাবে বদলাবে বলে আপনার ধারণা?

    যেহেতু ১৯.৬ ≤ ২৫, আইটেমটির স্কোর ০.৫ থেকে বেড়ে ১.০ হবে। এতে major_issues তালিকা থেকে এই আইটেমটি বাদ পড়বে (আর কোনো weight≥3 আইটেম ফেল করছে না), অর্থাৎ major_issues খালি হয়ে যাবে। ওয়েটেড স্কোর ১৪.৩৩ থেকে বেড়ে ১৫.৮৩ হবে ((1.0-0.5)*3 = 1.5 যোগ হয়ে), চূড়ান্ত চেকলিস্ট স্কোর ৯৩.১%-এ পৌঁছাবে — যা ৯০%-এর সীমা ছাড়িয়ে যায়, তাই major_issues খালি ও পার্সেন্টেজ ≥৯০% হওয়ায় সুপারিশ বদলে "রেডি টু শিপ" হয়ে যাবে।

  2. পরীক্ষা করুন: ধাপ ৫-এর কোড সেলে থ্রেশহোল্ড 15-কে 25-এ পরিবর্তন করে, তারপর ধাপ ৬-এর কোড সেলটি আবার Run করে আপনার অনুমান যাচাই করুন।

    ফলাফল নিশ্চিত করবে চেকলিস্ট স্কোর ৯৩.১%, major_issues = [], এবং চূড়ান্ত সুপারিশ "রেডি টু শিপ"। এই একটি ছোট থ্রেশহোল্ড-পরিবর্তন গোটা উপসংহার পাল্টে দিলো — এটি দেখায় একটি ওয়েটেড চেকলিস্টে থ্রেশহোল্ড-সংখ্যাগুলো নিজেই নীতিগত সিদ্ধান্ত, নির্বিচারে বেছে নেওয়া মান নয়, এবং সেগুলো কীভাবে নির্ধারণ করা হচ্ছে তা স্বচ্ছভাবে ডকুমেন্ট করা উচিত।

কোর্স সম্পূর্ণ — অভিনন্দন!

  • Human-Centered AI কোর্সের সম্পূর্ণ সিলেবাস পুনরায় দেখুন ৫৭টি পাঠ — সম্পূর্ণ M1 ফাউন্ডেশন থেকে M13 ক্যাপস্টোন পর্যন্ত — ট্রাস্ট ক্যালিব্রেশন, এক্সপ্লেইনেবিলিটি, হিউম্যান-ইন-দ্য-লুপ ডিজাইন, কগনিটিভ লোড, অ্যাক্সেসিবিলিটি, হিউম্যান-AI টিমিং, ইউজেবিলিটি ইভালুয়েশন, ইন্ডাস্ট্রি ফ্রেমওয়ার্ক, গভর্নেন্স ও এই ক্যাপস্টোন — কোর্সের সবগুলো পাঠ এখন সম্পূর্ণ।
  • AI Ethics কোর্স পরবর্তী কোর্স এই কোর্স শিখিয়েছে মানুষ ও AI কীভাবে ভালোভাবে ইন্টারঅ্যাক্ট করবে — AI Ethics কোর্স সেই একই সিস্টেমগুলোর নৈতিক ফ্রেমওয়ার্ক, বায়াস-ফেয়ারনেস, প্রাইভেসি ও অ্যালাইনমেন্টের দিকটি গভীরভাবে কভার করে।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, Machine Learning, Deep Learning, System Design, Cybersecurity, Cloud Computing & DevOps, এবং আরও অনেক কোর্স — সব এক জায়গায়।
আগের পাঠ
একটি হিউম্যান-সেন্টার্ড AI ফিচার ডিজাইন করা — রিসার্চ থেকে ডিজাইন