মূল্যায়ন

মূল্যায়ন হল পরীক্ষার একটি ফর্ম যা আপনাকে আপনার LLM-এর প্রতিক্রিয়াগুলিকে যাচাই করতে এবং সেগুলি আপনার মানের বারের সাথে মিলছে তা নিশ্চিত করতে সহায়তা করে৷

Firebase Genkit প্লাগইনগুলির মাধ্যমে তৃতীয় পক্ষের মূল্যায়ন সরঞ্জামগুলিকে সমর্থন করে, শক্তিশালী পর্যবেক্ষণ বৈশিষ্ট্যগুলির সাথে যুক্ত যা আপনার LLM-চালিত অ্যাপ্লিকেশনগুলির রানটাইম অবস্থার অন্তর্দৃষ্টি প্রদান করে৷ জেনকিট টুলিং আপনাকে স্বয়ংক্রিয়ভাবে ইনপুট, আউটপুট এবং LLM প্রতিক্রিয়াগুলির এন্ড-টু-এন্ড মানের মূল্যায়নের পাশাপাশি আপনার সিস্টেমের বিল্ডিং ব্লকগুলির কার্যকারিতা বোঝার জন্য মধ্যবর্তী পদক্ষেপগুলি থেকে তথ্য সহ ডেটা বের করতে সহায়তা করে।

উদাহরণস্বরূপ, যদি আপনার একটি RAG ফ্লো থাকে, Genkit নথির সেটগুলি বের করবে যা পুনরুদ্ধারকারী দ্বারা ফেরত দেওয়া হয়েছিল যাতে আপনি আপনার পুনরুদ্ধারের গুণমান মূল্যায়ন করতে পারেন যখন এটি Genkit বিশ্বস্ততার সাথে নীচে দেখানো হিসাবে প্রবাহের প্রেক্ষাপটে চলে। উত্তর প্রাসঙ্গিকতা মেট্রিক্স:

import { genkit } from 'genkit';
import { genkitEval, GenkitMetric } from '@genkit-ai/evaluator';
import { vertexAI, textEmbedding004, gemini15Flash } from '@genkit-ai/vertexai';

const ai = genkit({
  plugins: [
    vertexAI(),
    genkitEval({
      judge: gemini15Flash,
      metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
      embedder: textEmbedding004, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
    }),
  ],
  // ...
});

দ্রষ্টব্য: উপরের কনফিগারেশনের জন্য genkit , @genkit-ai/googleai , @genkit-ai/evaluator এবং @genkit-ai/vertexai প্যাকেজ ইনস্টল করতে হবে।

  npm install @genkit-ai/evaluator @genkit-ai/vertexai

আপনি testInputs.json নামে একটি ইনপুট ডেটাসেট হিসাবে ব্যবহার করতে চান এমন ইনপুটগুলির একটি সেট সংজ্ঞায়িত করে শুরু করুন। এই ইনপুট ডেটাসেটটি পরীক্ষার ক্ষেত্রে উপস্থাপন করে যা আপনি মূল্যায়নের জন্য আউটপুট তৈরি করতে ব্যবহার করবেন।

["Cheese", "Broccoli", "Spinach and Kale"]

যদি মূল্যায়নকারীর একটি প্রবাহ মূল্যায়নের জন্য একটি রেফারেন্স আউটপুট প্রয়োজন হয়, তাহলে আপনি পরিবর্তে এই বিন্যাসটি ব্যবহার করে ইনপুট এবং রেফারেন্স আউটপুট উভয়ই পাস করতে পারেন:

{
  "samples": [
    {
      "input": "What is the French word for Cheese?",
      "reference": "Fromage"
    },
    {
      "input": "What green vegetable looks like cauliflower?",
      "reference": "Broccoli"
    }
  ]
}

মনে রাখবেন যে আপনি ইনপুট JSON ফাইলে যেকোনো JSON ডেটা টাইপ ব্যবহার করতে পারেন। Genkit আপনার প্রবাহে একই ডেটা টাইপ সহ সেগুলিকে পাস করবে।

তারপর আপনি testInputs.json এ প্রদত্ত পরীক্ষার ক্ষেত্রে আপনার প্রবাহের মূল্যায়ন করতে eval:flow কমান্ডটি ব্যবহার করতে পারেন।

genkit eval:flow menuSuggestionFlow --input testInputs.json

যদি আপনার প্রবাহের জন্য অনুমোদনের প্রয়োজন হয়, আপনি --auth যুক্তি ব্যবহার করে এটি নির্দিষ্ট করতে পারেন:

genkit eval:flow menuSuggestionFlow --input testInputs.json --auth "{\"email_verified\": true}"

তারপরে আপনি বিকাশকারী UI তে মূল্যায়নের ফলাফলগুলি চালিয়ে দেখতে পারেন:

genkit start

তারপর localhost:4000/evaluate

বিকল্পভাবে, আপনি একটি JSON ফাইলে আউটপুট পরিদর্শন করার জন্য একটি আউটপুট ফাইল প্রদান করতে পারেন।

genkit eval:flow menuSuggestionFlow --input testInputs.json --output eval-result.json

দ্রষ্টব্য: নীচে আপনি একটি উদাহরণ দেখতে পারেন যে কীভাবে একটি এলএলএম আপনাকে পরীক্ষার কেস তৈরি করতে সহায়তা করতে পারে।

সমর্থিত মূল্যায়নকারীদের

Genkit মূল্যায়নকারী

আপনাকে শুরু করতে সাহায্য করতে জেনকিটে RAGAS দ্বারা অনুপ্রাণিত স্বল্প সংখ্যক দেশীয় মূল্যায়নকারী অন্তর্ভুক্ত রয়েছে:

  • বিশ্বস্ততা
  • উত্তর প্রাসঙ্গিকতা
  • বিদ্বেষ

মূল্যায়নকারী প্লাগইন

Genkit VertexAI প্লাগইনের মাধ্যমে VertexAI Rapid Evaluators এর মতো প্লাগইনগুলির মাধ্যমে অতিরিক্ত মূল্যায়নকারীদের সমর্থন করে।

উন্নত ব্যবহার

eval:flow দ্রুত প্রবাহের মূল্যায়ন করার একটি সুবিধাজনক উপায়, কিন্তু কখনও কখনও আপনার মূল্যায়ন পদক্ষেপের উপর আরও নিয়ন্ত্রণের প্রয়োজন হতে পারে। এটি ঘটতে পারে যদি আপনি একটি ভিন্ন ফ্রেমওয়ার্ক ব্যবহার করেন এবং ইতিমধ্যেই কিছু আউটপুট থাকে যা আপনি মূল্যায়ন করতে চান। আপনি সমস্ত পদক্ষেপগুলি সম্পাদন করতে পারেন যা eval:flow আধা-ম্যানুয়ালি সম্পাদন করে।

আপনি ব্যাচ আপনার জেনকিট ফ্লো চালাতে পারেন এবং রানে একটি অনন্য লেবেল যোগ করতে পারেন যা তারপর একটি মূল্যায়ন ডেটাসেট (ইনপুট, আউটপুট এবং প্রসঙ্গগুলির একটি সেট) বের করতে ব্যবহার করা হবে।

আপনার পরীক্ষার ইনপুটগুলির উপর প্রবাহ চালান:

genkit flow:batchRun myRagFlow test_inputs.json --output flow_outputs.json --label customLabel

মূল্যায়ন ডেটা বের করুন:

genkit eval:extractData myRagFlow --label customLabel --output customLabel_dataset.json

রপ্তানি করা ডেটা নিম্নলিখিত বিন্যাসে প্রতিটি testCase সহ একটি JSON ফাইল হিসাবে আউটপুট হবে:

[
  {
    "testCaseId": string,
    "input": string,
    "output": string,
    "context": array of strings,
    "traceIds": array of strings,
  }
]

ডেটা এক্সট্র্যাক্টর স্বয়ংক্রিয়ভাবে পুনরুদ্ধারকারীদের সনাক্ত করবে এবং প্রসঙ্গ অ্যারেতে উত্পাদিত ডক্স যুক্ত করবে। ডিফল্টরূপে, eval:run সমস্ত কনফিগার করা মূল্যায়নকারীদের বিরুদ্ধে চলবে, এবং eval:flow এর মতো, eval:run এর ফলাফল বিকাশকারী UI-এর মূল্যায়ন পৃষ্ঠায় প্রদর্শিত হবে, যা localhost:4000/evaluate এ অবস্থিত।

কাস্টম এক্সট্র্যাক্টর

আপনি eval:extractData এবং eval:flow কমান্ডে ব্যবহার করার জন্য কাস্টম এক্সট্র্যাক্টর প্রদান করতে পারেন। কাস্টম এক্সট্র্যাক্টরগুলি আপনাকে ডিফল্ট নিষ্কাশন যুক্তিকে ওভাররাইড করার অনুমতি দেয় যা আপনাকে ডেটাসেট তৈরি করতে এবং তাদের মূল্যায়নে আরও শক্তি দেয়।

কাস্টম এক্সট্র্যাক্টর কনফিগার করতে, আপনার প্রোজেক্ট রুটে genkit-tools.conf.js নামে একটি টুল কনফিগার ফাইল যোগ করুন যদি আপনার কাছে আগে থেকে না থাকে।

cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js

টুল কনফিগার ফাইলে, নিম্নলিখিত কোড যোগ করুন:

module.exports = {
  evaluators: [
    {
      actionRef: '/flow/myFlow',
      extractors: {
        context: { outputOf: 'foo-step' },
        output: 'bar-step',
      },
    },
  ],
};

এই নমুনায়, আপনি myFlow প্রবাহের জন্য একটি এক্সট্র্যাক্টর কনফিগার করেন। কনফিগারেশন context এবং output ক্ষেত্রের জন্য এক্সট্রাক্টরকে ওভাররাইড করে এবং input ক্ষেত্রের জন্য ডিফল্ট লজিক ব্যবহার করে।

মূল্যায়ন নিষ্কাশনকারীদের স্পেসিফিকেশন নিম্নরূপ:

  • evaluators ক্ষেত্র EvaluatorConfig অবজেক্টের একটি অ্যারে গ্রহণ করে, যা flowName দ্বারা স্কোপ করা হয়
  • extractors হল একটি বস্তু যা এক্সট্র্যাক্টর ওভাররাইড নির্দিষ্ট করে। extractors বর্তমান সমর্থিত কীগুলি হল [input, output, context] । গ্রহণযোগ্য মান প্রকারগুলি হল:
    • string - এটি একটি ধাপের নাম হওয়া উচিত, একটি স্ট্রিং হিসাবে নির্দিষ্ট করা। এই ধাপের আউটপুট এই কীটির জন্য বের করা হয়।
    • { inputOf: string } বা { outputOf: string } - এই বস্তুগুলি একটি ধাপের নির্দিষ্ট চ্যানেল (ইনপুট বা আউটপুট) উপস্থাপন করে। উদাহরণস্বরূপ, { inputOf: 'foo-step' } এই কীটির জন্য পদক্ষেপ foo-step ইনপুট বের করবে।
    • (trace) => string; - আরও নমনীয়তার জন্য, আপনি একটি ফাংশন প্রদান করতে পারেন যা একটি জেনকিট ট্রেস গ্রহণ করে এবং একটি string প্রদান করে এবং এই ফাংশনের ভিতরে নিষ্কাশন যুক্তি নির্দিষ্ট করে। সঠিক ট্রেসডেটা স্কিমার জন্য genkit/genkit-tools/common/src/types/trace.ts পড়ুন।

দ্রষ্টব্য: এই সমস্ত পদক্ষেপের জন্য নিষ্কাশিত ডেটা একটি JSON স্ট্রিং হবে। টুলিং স্বয়ংক্রিয়ভাবে মূল্যায়নের সময় এই JSON স্ট্রিংকে পার্স করবে। একটি ফাংশন এক্সট্র্যাক্টর প্রদান করলে, নিশ্চিত করুন যে আউটপুটটি একটি বৈধ JSON স্ট্রিং। উদাহরণস্বরূপ: "Hello, world!" বৈধ JSON নয়; "\"Hello, world!\"" বৈধ৷

বিদ্যমান ডেটাসেটে চলছে

ইতিমধ্যে নিষ্কাশিত ডেটাসেটের উপর মূল্যায়ন চালানোর জন্য:

genkit eval:run customLabel_dataset.json

একটি ভিন্ন অবস্থানে আউটপুট করতে, --output পতাকা ব্যবহার করুন।

genkit eval:flow menuSuggestionFlow --input testInputs.json --output customLabel_evalresult.json

কনফিগার করা মূল্যায়নকারীদের একটি উপসেটে চালানোর জন্য, --evaluators পতাকা ব্যবহার করুন এবং নাম অনুসারে মূল্যায়নকারীদের একটি কমা-বিচ্ছিন্ন তালিকা প্রদান করুন:

genkit eval:run customLabel_dataset.json --evaluators=genkit/faithfulness,genkit/answer_relevancy

একটি এলএলএম ব্যবহার করে পরীক্ষার ডেটা সংশ্লেষণ করা

এখানে একটি উদাহরণ প্রবাহ যা ব্যবহারকারীরা এটি সম্পর্কে জিজ্ঞাসা করতে পারে এমন সম্ভাব্য প্রশ্ন তৈরি করতে একটি PDF ফাইল ব্যবহার করে।

import { genkit, run, z } from "genkit";
import { googleAI, gemini15Flash } from "@genkit-ai/googleai";
import { chunk } from "llm-chunk";
import path from 'path';

const ai = genkit({ plugins: [googleAI()] });

const chunkingConfig = {
  minLength: 1000, // number of minimum characters into chunk
  maxLength: 2000, // number of maximum characters into chunk
  splitter: 'sentence', // paragraph | sentence
  overlap: 100, // number of overlap chracters
  delimiters: '', // regex for base split method
} as any;

export const synthesizeQuestions = ai.defineFlow(
  {
    name: "synthesizeQuestions",
    inputSchema: z.string().describe("PDF file path"),
    outputSchema: z.array(z.string()),
  },
  async (filePath) => {
    filePath = path.resolve(filePath);
    // `extractText` loads the PDF and extracts its contents as text.
    // See our RAG documentation for more details. 
    const pdfTxt = await run("extract-text", () => extractText(filePath));

    const chunks = await run("chunk-it", async () =>
      chunk(pdfTxt, chunkingConfig)
    );

    const questions: string[] = [];
    for (var i = 0; i < chunks.length; i++) {
      const qResponse = await ai.generate({
        model: gemini15Flash,
        prompt: {
          text: `Generate one question about the text below: ${chunks[i]}`,
        },
      });
      questions.push(qResponse.text);
    }
    return questions;
  }
);

তারপরে আপনি এই কমান্ডটি একটি ফাইলে ডেটা রপ্তানি করতে এবং মূল্যায়নের জন্য ব্যবহার করতে পারেন।

genkit flow:run synthesizeQuestions '"my_input.pdf"' --output synthesizedQuestions.json