একটি জেনকিট মূল্যায়নকারী লেখা

ফায়ারবেস জেনকিট পরীক্ষা কেস আউটপুট কাস্টম মূল্যায়ন সমর্থন করার জন্য প্রসারিত করা যেতে পারে, হয় একজন বিচারক হিসাবে একজন এলএলএম ব্যবহার করে, বা সম্পূর্ণরূপে প্রোগ্রাম্যাটিকভাবে।

মূল্যায়নকারীর সংজ্ঞা

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

এলএলএম ভিত্তিক মূল্যায়নকারী

একটি LLM-ভিত্তিক মূল্যায়নকারী আপনার জেনারেটিভ AI বৈশিষ্ট্যের ইনপুট, প্রসঙ্গ বা আউটপুট মূল্যায়ন করতে একটি LLM-এর সাহায্য করে।

জেনকিটে এলএলএম-ভিত্তিক মূল্যায়নকারীরা 3টি উপাদান নিয়ে গঠিত:

  • একটি প্রম্পট
  • একটি স্কোরিং ফাংশন
  • একটি মূল্যায়নকারী কর্ম

প্রম্পট সংজ্ঞায়িত করুন

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

Genkit এর definePrompt ইউটিলিটি ইনপুট এবং আউটপুট বৈধতা সহ প্রম্পট সংজ্ঞায়িত করার একটি সহজ উপায় প্রদান করে। এখানে আপনি কিভাবে definePrompt এর সাথে একটি মূল্যায়ন প্রম্পট সেট আপ করতে পারেন।

const DELICIOUSNESS_VALUES = ['yes', 'no', 'maybe'] as const;

const DeliciousnessDetectionResponseSchema = z.object({
  reason: z.string(),
  verdict: z.enum(DELICIOUSNESS_VALUES),
});
type DeliciousnessDetectionResponse = z.infer<typeof DeliciousnessDetectionResponseSchema>;

const DELICIOUSNESS_PROMPT = ai.definePrompt(
  {
    name: 'deliciousnessPrompt',
    inputSchema: z.object({
      output: z.string(),
    }),
    outputSchema: DeliciousnessDetectionResponseSchema,
  },
  `You are a food critic. Assess whether the provided output sounds delicious, giving only "yes" (delicious), "no" (not delicious), or "maybe" (undecided) as the verdict.

  Examples:
  Output: Chicken parm sandwich
  Response: { "reason": "A classic and beloved dish.", "verdict": "yes" }

  Output: Boston Logan Airport tarmac
  Response: { "reason": "Not edible.", "verdict": "no" }

  Output: A juicy piece of gossip
  Response: { "reason": "Metaphorically 'tasty' but not food.", "verdict": "maybe" }

  New Output:
  {{output}}
  Response:
  `
);

স্কোরিং ফাংশন সংজ্ঞায়িত করুন

এখন, ফাংশনটি সংজ্ঞায়িত করুন যা একটি উদাহরণ নেবে যা প্রম্পটের দ্বারা প্রয়োজনীয় output অন্তর্ভুক্ত করবে এবং ফলাফলটি স্কোর করবে। Genkit পরীক্ষার ক্ষেত্রে output এবং context জন্য ঐচ্ছিক ক্ষেত্র সহ একটি প্রয়োজনীয় ক্ষেত্র প্রয়োজনীয় input অন্তর্ভুক্ত। মূল্যায়নের জন্য প্রয়োজনীয় সমস্ত ক্ষেত্র উপস্থিত রয়েছে তা যাচাই করা মূল্যায়নকারীর দায়িত্ব।

import { BaseEvalDataPoint, Score } from 'genkit/evaluator';

/**
 * Score an individual test case for delciousness.
 */
export async function deliciousnessScore<
  CustomModelOptions extends z.ZodTypeAny,
>(
  judgeLlm: ModelArgument<CustomModelOptions>,
  dataPoint: BaseEvalDataPoint,
  judgeConfig?: CustomModelOptions
): Promise<Score> {
  const d = dataPoint;
  // Validate the input has required fields
  if (!d.output) {
    throw new Error('Output is required for Deliciousness detection');
  }

  //Hydrate the prompt
  const finalPrompt = DELICIOUSNESS_PROMPT.renderText({
    output: d.output as string,
  });

  // Call the LLM to generate an evaluation result
  const response = await generate({
    model: judgeLlm,
    prompt: finalPrompt,
    config: judgeConfig,
  });

  // Parse the output
  const parsedResponse = response.output;
  if (!parsedResponse) {
    throw new Error(`Unable to parse evaluator response: ${response.text}`);
  }

  // Return a scored response
  return {
    score: parsedResponse.verdict,
    details: { reasoning: parsedResponse.reason },
  };
}

মূল্যায়নকারী কর্ম সংজ্ঞায়িত করুন

চূড়ান্ত ধাপ হল একটি ফাংশন লিখতে যা মূল্যায়নকারীর ক্রিয়াকে নিজেই সংজ্ঞায়িত করে।

import { BaseEvalDataPoint, EvaluatorAction } from 'genkit/evaluator';

/**
 * Create the Deliciousness evaluator action.
 */
export function createDeliciousnessEvaluator<
  ModelCustomOptions extends z.ZodTypeAny,
>(
  judge: ModelReference<ModelCustomOptions>,
  judgeConfig: z.infer<ModelCustomOptions>
): EvaluatorAction {
  return defineEvaluator(
    {
      name: `myAwesomeEval/deliciousness`,
      displayName: 'Deliciousness',
      definition: 'Determines if output is considered delicous.',
    },
    async (datapoint: BaseEvalDataPoint) => {
      const score = await deliciousnessScore(judge, datapoint, judgeConfig);
      return {
        testCaseId: datapoint.testCaseId,
        evaluation: score,
      };
    }
  );
}

হিউরিস্টিক মূল্যায়নকারী

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

জেনকিটে হিউরিস্টিক মূল্যায়নকারী 2টি উপাদান নিয়ে গঠিত:

  • একটি স্কোরিং ফাংশন
  • একটি মূল্যায়নকারী কর্ম

স্কোরিং ফাংশন সংজ্ঞায়িত করুন

এলএলএম-ভিত্তিক মূল্যায়নকারীর মতো, স্কোরিং ফাংশনটি সংজ্ঞায়িত করুন। এই ক্ষেত্রে, স্কোরিং ফাংশন বিচারকের এলএলএম বা তার কনফিগারেশন সম্পর্কে জানতে হবে না।

import { BaseEvalDataPoint, Score } from 'genkit/evaluator';

const US_PHONE_REGEX =
  /^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4}$/i;

/**
 * Scores whether an individual datapoint matches a US Phone Regex.
 */
export async function usPhoneRegexScore(
  dataPoint: BaseEvalDataPoint
): Promise<Score> {
  const d = dataPoint;
  if (!d.output || typeof d.output !== 'string') {
    throw new Error('String output is required for regex matching');
  }
  const matches = US_PHONE_REGEX.test(d.output as string);
  const reasoning = matches
    ? `Output matched regex ${regex.source}`
    : `Output did not match regex ${regex.source}`;
  return {
    score: matches,
    details: { reasoning },
  };
}

মূল্যায়নকারী কর্ম সংজ্ঞায়িত করুন

import { BaseEvalDataPoint, EvaluatorAction } from 'genkit/evaluator';

/**
 * Configures a regex evaluator to match a US phone number.
 */
export function createUSPhoneRegexEvaluator(
  metrics: RegexMetric[]
): EvaluatorAction[] {
  return metrics.map((metric) => {
    const regexMetric = metric as RegexMetric;
    return defineEvaluator(
      {
        name: `myAwesomeEval/${metric.name.toLocaleLowerCase()}`,
        displayName: 'Regex Match',
        definition:
          'Runs the output against a regex and responds with 1 if a match is found and 0 otherwise.',
        isBilled: false,
      },
      async (datapoint: BaseEvalDataPoint) => {
        const score = await regexMatchScore(datapoint, regexMetric.regex);
        return fillScores(datapoint, score);
      }
    );
  });
}

কনফিগারেশন

প্লাগইন অপশন

কাস্টম মূল্যায়নকারী প্লাগইন ব্যবহার করবে এমন PluginOptions সংজ্ঞায়িত করুন। এই বস্তুর কোন কঠোর প্রয়োজনীয়তা নেই এবং এটি সংজ্ঞায়িত মূল্যায়নকারীদের প্রকারের উপর নির্ভরশীল।

ন্যূনতম কোন মেট্রিক্স নিবন্ধন করতে হবে তার সংজ্ঞা নিতে হবে।

export enum MyAwesomeMetric {
  WORD_COUNT = 'WORD_COUNT',
  US_PHONE_REGEX_MATCH = 'US_PHONE_REGEX_MATCH',
}

export interface PluginOptions {
  metrics?: Array<MyAwesomeMetric>;
}

যদি এই নতুন প্লাগইনটি বিচারক হিসাবে একটি LLM ব্যবহার করে এবং প্লাগইনটি কোন LLM ব্যবহার করতে হবে তা অদলবদল করতে সমর্থন করে, PluginOptions অবজেক্টে অতিরিক্ত প্যারামিটারগুলি সংজ্ঞায়িত করুন৷

export enum MyAwesomeMetric {
  DELICIOUSNESS = 'DELICIOUSNESS',
  US_PHONE_REGEX_MATCH = 'US_PHONE_REGEX_MATCH',
}

export interface PluginOptions<ModelCustomOptions extends z.ZodTypeAny> {
  judge: ModelReference<ModelCustomOptions>;
  judgeConfig?: z.infer<ModelCustomOptions>;
  metrics?: Array<MyAwesomeMetric>;
}

প্লাগইন সংজ্ঞা

প্লাগইনগুলি একটি প্রকল্পে genkit.config.ts ফাইলের মাধ্যমে ফ্রেমওয়ার্কের সাথে নিবন্ধিত হয়। একটি নতুন প্লাগইন কনফিগার করতে সক্ষম হতে, একটি ফাংশন সংজ্ঞায়িত করুন যা একটি GenkitPlugin সংজ্ঞায়িত করে এবং উপরে সংজ্ঞায়িত PluginOptions সাথে এটি কনফিগার করে৷

এই ক্ষেত্রে আমাদের দুটি মূল্যায়নকারী রয়েছে DELICIOUSNESS এবং US_PHONE_REGEX_MATCH । এখানেই সেই মূল্যায়নকারীদের প্লাগইন এবং Firebase Genkit-এর সাথে নিবন্ধিত করা হয়েছে।

export function myAwesomeEval<ModelCustomOptions extends z.ZodTypeAny>(
  options: PluginOptions<ModelCustomOptions>
): PluginProvider {
  // Define the new plugin
  const plugin = (options?: MyPluginOptions<ModelCustomOptions>) => {
    return genkitPlugin(
    'myAwesomeEval',
    async (ai: Genkit) => {
      const { judge, judgeConfig, metrics } = options;
      const evaluators: EvaluatorAction[] = metrics.map((metric) => {
        switch (metric) {
          case DELICIOUSNESS:
            // This evaluator requires an LLM as judge
            return createDeliciousnessEvaluator(ai, judge, judgeConfig);
          case US_PHONE_REGEX_MATCH:
            // This evaluator does not require an LLM
            return createUSPhoneRegexEvaluator();
        }
      });
      return { evaluators };
    })
  }
  // Create the plugin with the passed options
  return plugin(options);
}
export default myAwesomeEval;

Genkit কনফিগার করুন

আপনার Genkit কনফিগারেশনে নতুন সংজ্ঞায়িত প্লাগইন যোগ করুন।

মিথুনের সাথে মূল্যায়নের জন্য, নিরাপত্তা সেটিংস অক্ষম করুন যাতে মূল্যায়নকারী সম্ভাব্য ক্ষতিকারক সামগ্রী গ্রহণ করতে, সনাক্ত করতে এবং স্কোর করতে পারে৷

import { gemini15Flash } from '@genkit-ai/googleai';

const ai = genkit({
  plugins: [
    ...
    myAwesomeEval({
      judge: gemini15Flash,
      judgeConfig: {
        safetySettings: [
          {
            category: 'HARM_CATEGORY_HATE_SPEECH',
            threshold: 'BLOCK_NONE',
          },
          {
            category: 'HARM_CATEGORY_DANGEROUS_CONTENT',
            threshold: 'BLOCK_NONE',
          },
          {
            category: 'HARM_CATEGORY_HARASSMENT',
            threshold: 'BLOCK_NONE',
          },
          {
            category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT',
            threshold: 'BLOCK_NONE',
          },
        ],
      },
      metrics: [
        MyAwesomeMetric.DELICIOUSNESS,
        MyAwesomeMetric.US_PHONE_REGEX_MATCH
      ],
    }),
  ],
  ...
});

টেস্টিং

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

কাস্টম মূল্যায়নকারী প্রত্যাশিত স্তরে পারফর্ম করে কিনা তা বোঝার জন্য, পরীক্ষার ক্ষেত্রে একটি সেট তৈরি করুন যাতে একটি পরিষ্কার সঠিক এবং ভুল উত্তর রয়েছে।

সুস্বাদুতার উদাহরণ হিসাবে, এটি একটি json ফাইলের মতো দেখতে হতে পারে deliciousness_dataset.json :

[
  {
    "testCaseId": "delicous_mango",
    "input": "What is a super delicious fruit",
    "output": "A perfectly ripe mango – sweet, juicy, and with a hint of tropical sunshine."
  },
  {
    "testCaseId": "disgusting_soggy_cereal",
    "input": "What is something that is tasty when fresh but less tasty after some time?",
    "output": "Stale, flavorless cereal that's been sitting in the box too long."
  }
]

এই উদাহরণগুলি মানুষের তৈরি হতে পারে বা আপনি একটি LLM-এর কাছে একটি সেট কেস তৈরি করতে সাহায্য করতে পারেন যা কিউরেট করা যেতে পারে। অনেকগুলি উপলব্ধ বেঞ্চমার্ক ডেটাসেট রয়েছে যা ব্যবহার করা যেতে পারে।

তারপর এই পরীক্ষার ক্ষেত্রে মূল্যায়নকারী চালানোর জন্য Genkit CLI ব্যবহার করুন।

genkit eval:run deliciousness_dataset.json

Genkit UI এ আপনার ফলাফল দেখুন।

genkit start

localhost:4000/evaluate