নিয়ম-ভিত্তিক মূল্যায়ন তৈরি করুন

মৌলিক বিষয়গুলো স্বয়ংক্রিয় করুন: সাধারণ ভুল ধরতে কোড ব্যবহার করুন।

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

  • evalDataFormat() : ডেটার ফরম্যাট সঠিক কিনা তা পরীক্ষা করে। এর মধ্যে রয়েছে বৈধ JSON, সমস্ত কী-এর উপস্থিতি, কোনো খালি মান না থাকা, নীতিবাক্য ছয় শব্দের কম হওয়া এবং হেক্সাডেসিমেল রং ব্যবহার।
  • evalContrastRatio() : টেক্সট ও ব্যাকগ্রাউন্ডের রঙের বৈসাদৃশ্য অনুপাতটি ব্যবহারযোগ্য কিনা তা পরীক্ষা করে।

নিয়ম-ভিত্তিক মূল্যায়ন বাস্তবায়ন করুন

একটি স্কোরিং পদ্ধতি বেছে নিন

মূল্যায়নের মানদণ্ডগুলো বাইনারি। আপনার নিয়ম-ভিত্তিক মূল্যায়ন ফাংশনগুলোর একটি বাইনারি আউটপুট তৈরি করা উচিত, যেমন PASS বা FAIL লেবেল।

  • ThemeBuilder অ্যাপের আউটপুট (সম্পূর্ণ থিম অবজেক্ট) → evalDataFormat()PASS বা FAIL লেবেল। ডেটা ফরম্যাট সমস্ত শর্ত পূরণ করলে PASS দেখাবে। অন্যথায় FAIL
  • থিমবিল্ডার অ্যাপের আউটপুট (কালার প্যালেট অবজেক্ট) → evalContrastRatio()PASS বা FAIL লেবেল। অনুপাতটি ৪.৫-এর বেশি হলে PASS । অন্যথায় FAIL

একটি ইভ্যালস টাইপ সংজ্ঞায়িত করুন

PASS বা FAIL মেট্রিকটি একটি বুলিয়ান, কিন্তু পাঠযোগ্যতার জন্য আপনি এটিকে একটি স্ট্রিং লেবেল (ক্যাটাগরি) হিসেবেও প্রয়োগ করতে পারেন।

কোডকে সংক্ষিপ্ত রাখতে, আপনি আপনার নিয়ম-ভিত্তিক এবং পরবর্তীতে প্রয়োগ করা এলএলএম বিচারক মূল্যায়নের জন্য একই টাইপস্ক্রিপ্ট টাইপ ব্যবহার করতে পারেন। একটি EvalResult টাইপ তৈরি করুন যা একটি বাইনারি EvalLabel ক্যাটাগরি এবং বিচারক মডেলের রেটিং ব্যাখ্যা করার জন্য একটি rationale ফিল্ডকে র‍্যাপ করবে।

enum EvalLabel {
    PASS = "PASS",
    FAIL = "FAIL"
}

interface EvalResult {
    label: EvalLabel;
    rationale?: string;
}

মূল্যায়নকারীদের বাস্তবায়ন করুন

Zod স্কিমা ভ্যালিডেশনের জন্য একটি চমৎকার টুল, কারণ এটি JSON স্ট্রাকচার এবং কাস্টম রুল উভয়ই পরিচালনা করে। এটি ডিক্লারেটিভ, যা ভ্যালিডেশন কোডকে পাঠযোগ্য করে তোলে। সহজে ট্রাবলশুটিং করার জন্য, নির্দিষ্ট পাথ এবং ব্যর্থতার কারণসহ বিস্তারিত এরর রিপোর্ট সংজ্ঞায়িত করুন।

import { z } from 'zod';
import { MAX_WORD_COUNT } from './app.config';

const hexColorRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;

// Reusable schema for hex colors
const HexColor = z.string().regex(hexColorRegex, { message: "Invalid hex color code" });

// zod schema definition for AppOutput
export const AppOutputSchema = z.object({
  motto: z.string().min(1, { message: "Motto is missing or empty" }).refine((val) => {
    const words = val.replace(/[^\w\s]|_/g, "").trim();
    const count = words ? words.split(/\s+/).length : 0;
    return count > 0 && count <= MAX_WORD_COUNT;
  }, { message: `Motto must be between 1 and ${MAX_WORD_COUNT} words` }),
  colorPalette: z.object({
    textColor: HexColor,
    backgroundColor: HexColor,
    primary: HexColor,
    secondary: HexColor
  }).catchall(HexColor)
});

বৈসাদৃশ্য অনুপাত

ডোমেইন লজিক, যেমন কনট্রাস্ট-রেশিও গণনা, আলাদা ইউটিলিটি ফাংশনে রাখুন।

/*
 * Input: ColorPalette {"textColor":"#333333","backgroundColor":"#000000", ...}
 * Output: EvalResult {"status":"FAIL","rationale":"Contrast ratio is 1.66:1 (must be >= 4.5:1)."}
 * minContrastRatio is an app config variable, MIN_CONTRAST_RATIO = 4.5
*/
export function evalContrastRatio(colorPalette: ColorPalette, minContrastRatio: number): EvalResult {
  if (!colorPalette || !colorPalette.textColor || !colorPalette.backgroundColor) {
    return { status: EvalLabel.FAIL, rationale: "Missing textColor or backgroundColor." };
  }
  try {
    const ratio = getContrastRatio(colorPalette.textColor, colorPalette.backgroundColor);
    const rationale = `Contrast ratio is ${ratio.toFixed(2)}:1 (must be >= ${minContrastRatio}:1).`;
    if (ratio < minContrastRatio) {
      return { status: EvalLabel.FAIL, rationale };
    }
    return { status: EvalLabel.PASS, rationale };
  } catch (e) {
    return { status: EvalLabel.FAIL, rationale: "Could not calculate contrast ratio (invalid hex?)." };
  }
}

আমাদের evalDataFormat() এবং evalContrastRatio() এর ইভ্যালুয়েটর কোডটি দেখুন।

পরীক্ষার নিয়ম-ভিত্তিক মূল্যায়ন

নিয়ম-ভিত্তিক মূল্যায়নগুলো সুনির্দিষ্ট, তাই এগুলোর আচরণ পরীক্ষা করার জন্য আপনি প্রচলিত ইউনিট টেস্ট প্রয়োগ করতে পারেন। বিভিন্ন আউটপুটকে ইভ্যালুয়েটরের মধ্য দিয়ে চালিয়ে আপনার টেস্টগুলো তৈরি করুন এবং যাচাই করুন যে সেগুলো আপনার প্রত্যাশিত PASS বা FAIL লেবেলটি ফেরত দিচ্ছে কি না।

যদি কোনো টেস্ট কেস প্রত্যাশা করে যে ইভ্যালুয়েটরটি FAIL রিটার্ন করবে এবং তা-ই করে, তাহলে টেস্টটি PASS আউটপুট দেয়, কারণ ইভ্যালুয়েটরটি উদ্দেশ্য অনুযায়ী কাজ করেছে।

import { MIN_CONTRAST_RATIO } from '../src/app.config'; // 4.5

const testCases = [
  {
  // ...
      appOutput: {
        motto: "Test motto",
        colorPalette: {
          textColor: "#333333",
          backgroundColor: "#000000",
          primary: "#FF0000",
          secondary: "#333333"
        }
      },
    expected: {
      // Dark grey on black (low contrast): FAIL
      contrast: EvalLabel.FAIL
    }
  }
  // ... more test cases
];

testCases.forEach((testCase) => {
  const result = evalContrastRatio(
    testCase.appOutput.colorPalette as any, MIN_CONTRAST_RATIO
  );
  const actualEvalLabel = result.label;
  const expectedEvalLabel = testCase.expected.contrast;
  const isSuccess = actualEvalLabel === expectedEvalLabel;
 // ...
});

চেষ্টা করে দেখুন