ارزیابی

ارزیابی نوعی آزمایش است که به شما کمک می‌کند تا پاسخ‌های LLM خود را تأیید کنید و اطمینان حاصل کنید که با نوار کیفیت شما مطابقت دارند.

Firebase Genkit از ابزارهای ارزیابی شخص ثالث از طریق افزونه‌ها، همراه با ویژگی‌های قدرتمند مشاهده‌پذیری که بینشی از وضعیت زمان اجرا برنامه‌های کاربردی LLM شما ارائه می‌دهد، پشتیبانی می‌کند. ابزار Genkit به شما کمک می کند تا به طور خودکار داده ها شامل ورودی ها، خروجی ها و اطلاعات را از مراحل میانی استخراج کنید تا کیفیت سرتاسر پاسخ های LLM را ارزیابی کنید و همچنین عملکرد بلوک های سازنده سیستم خود را درک کنید.

انواع ارزیابی

Genkit از دو نوع ارزیابی پشتیبانی می کند:

  • ارزیابی مبتنی بر استنتاج : این نوع ارزیابی با مجموعه ای از ورودی های از پیش تعیین شده اجرا می شود و خروجی های مربوطه را از نظر کیفیت ارزیابی می کند.

    این رایج ترین نوع ارزیابی است که برای اکثر موارد استفاده مناسب است. این رویکرد خروجی واقعی یک سیستم را برای هر اجرا ارزیابی می‌کند.

    می توانید ارزیابی کیفیت را به صورت دستی و با بازرسی بصری نتایج انجام دهید. از طرف دیگر، می‌توانید ارزیابی را با استفاده از معیار ارزیابی خودکار کنید.

  • ارزیابی خام : این نوع ارزیابی مستقیماً کیفیت ورودی ها را بدون هیچ استنتاجی ارزیابی می کند. این رویکرد معمولاً با ارزیابی خودکار با استفاده از معیارها استفاده می شود. تمام فیلدهای لازم برای ارزیابی (به عنوان مثال، input ، context ، output و reference ) باید در مجموعه داده ورودی وجود داشته باشد. این زمانی مفید است که داده‌هایی از یک منبع خارجی (به عنوان مثال، جمع‌آوری‌شده از آثار تولید شما) داشته باشید و می‌خواهید کیفیت داده‌های جمع‌آوری‌شده را اندازه‌گیری کنید، مفید است.

    برای اطلاعات بیشتر به بخش استفاده پیشرفته در این صفحه مراجعه کنید.

این بخش نحوه انجام ارزیابی مبتنی بر استنتاج با استفاده از Genkit را توضیح می دهد.

شروع سریع

راه اندازی

  1. از یک برنامه Genkit موجود استفاده کنید یا با دنبال کردن راهنمای [Get started] (get-started.md) ما یک برنامه جدید ایجاد کنید.
  2. کد زیر را برای تعریف یک برنامه RAG ساده برای ارزیابی اضافه کنید. برای این راهنما، ما از یک retriever ساختگی استفاده می کنیم که همیشه همان اسناد را برمی گرداند.
    import { genkit, z, Document } from "genkit";
    import {
      googleAI,
      gemini15Flash,
    } from "@genkit-ai/googleai";
    
    // Initialize Genkit
    export const ai = genkit ({
      plugins: [
        googleAI(),
      ]
    });
    
    // Dummy retriever that always returns the same docs
    export const dummyRetriever = ai.defineRetriever(
      {
        name: "dummyRetriever",
      },
      async (i) => {
        const facts = [
          "Dog is man's best friend", 
          "Dogs have evolved and were domesticated from wolves",
        ];
        // Just return facts as documents.
        return { documents: facts.map((t) => Document.fromText(t)) };
      }
    );
    
    // A simple question-answering flow
    export const qaFlow = ai.defineFlow({
        name: 'qaFlow',
        inputSchema: z.string(),
        outputSchema: z.string(),
      },
      async (query) => {
        const factDocs = await ai.retrieve({
          retriever: dummyRetriever,
          query,
        });
    
        const llmResponse = await ai.generate({
          model: gemini15Flash,
          prompt: `Answer this question with the given context ${query}`,
          docs: factDocs,
        });
        return llmResponse.text;
      }
    );
  3. (اختیاری) معیارهای ارزیابی را به برنامه خود اضافه کنید تا در حین ارزیابی از آن استفاده کنید. این راهنما از متریک MALICIOUSNESS از افزونه genkitEval استفاده می کند.
    import { genkitEval, GenkitMetric } from "@genkit-ai/evaluator";
    import { gemini15Pro } from "@genkit-ai/googleai";
    
    export const ai = genkit ({
      plugins: [
        ...
        // Add this plugin to your Genkit initialization block
        genkitEval({
          judge: gemini15Pro,
          metrics: [GenkitMetric.MALICIOUSNESS],
        }),
      ]
    });
    توجه: پیکربندی بالا نیاز به نصب بسته @genkit-ai/evaluator دارد.
    npm install @genkit-ai/evaluator
  4. برنامه Genkit خود را شروع کنید.
    genkit start -- 

یک مجموعه داده ایجاد کنید

یک مجموعه داده برای تعریف نمونه هایی که می خواهیم برای ارزیابی جریان خود استفاده کنیم ایجاد کنید.

  1. به Dev UI در http://localhost:4000 بروید و روی دکمه Datasets کلیک کنید تا صفحه Datasets باز شود.

  2. روی دکمه Create Dataset کلیک کنید تا گفتگوی ایجاد مجموعه داده باز شود.

    الف یک datasetId برای مجموعه داده جدید خود ارائه دهید. این راهنما از myFactsQaDataset استفاده می کند.

    ب نوع مجموعه داده Flow را انتخاب کنید.

    ج فیلد هدف اعتبارسنجی را خالی بگذارید و روی ذخیره کلیک کنید

  3. صفحه مجموعه داده جدید شما ظاهر می شود که مجموعه داده خالی را نشان می دهد. با دنبال کردن مراحل زیر نمونه هایی را به آن اضافه کنید:

    الف روی دکمه افزودن مثال کلیک کنید تا پنل ویرایشگر نمونه باز شود.

    ب فقط فیلد input مورد نیاز است. "Who is man's best friend?" را وارد کنید. در قسمت input ، روی Save کلیک کنید تا نمونه مورد نظر به مجموعه داده شما اضافه شود.

    ج مراحل (الف) و (ب) را چند بار دیگر تکرار کنید تا مثال‌های بیشتری اضافه کنید. این راهنما ورودی های نمونه زیر را به مجموعه داده اضافه می کند:

    "Can I give milk to my cats?"
    "From which animals did dogs evolve?"
    

    در پایان این مرحله، مجموعه داده شما باید دارای 3 نمونه با مقادیر ذکر شده در بالا باشد.

ارزیابی را اجرا کنید و نتایج را مشاهده کنید

برای شروع ارزیابی جریان، روی دکمه اجرای ارزیابی جدید در صفحه مجموعه داده خود کلیک کنید. همچنین می توانید یک ارزیابی جدید را از برگه ارزیابی ها شروع کنید.

  1. برای ارزیابی یک جریان، دکمه رادیویی Flow را انتخاب کنید.

  2. qaFlow به عنوان جریان هدف برای ارزیابی انتخاب کنید.

  3. myFactsQaDataset به عنوان مجموعه داده هدف برای ارزیابی انتخاب کنید.

  4. (اختیاری) اگر متریک ارزیابی کننده را با استفاده از افزونه های Genkit نصب کرده اید، می توانید این معیارها را در این صفحه مشاهده کنید. معیارهایی را که می‌خواهید با اجرای این ارزیابی استفاده کنید، انتخاب کنید. این کاملاً اختیاری است: حذف این مرحله همچنان نتایج را در اجرای ارزیابی بازمی‌گرداند، اما بدون هیچ معیار مرتبط.

  5. در نهایت روی اجرای ارزیابی کلیک کنید تا ارزیابی شروع شود. بسته به جریانی که آزمایش می کنید، ممکن است مدتی طول بکشد. پس از تکمیل ارزیابی، یک پیام موفقیت آمیز با پیوندی برای مشاهده نتایج ظاهر می شود. برای رفتن به صفحه جزئیات ارزیابی روی لینک کلیک کنید.

شما می توانید جزئیات ارزیابی خود را در این صفحه مشاهده کنید، از جمله ورودی اصلی، زمینه استخراج شده و معیارها (در صورت وجود).

مفاهیم اصلی

اصطلاحات

  • ارزیابی : ارزیابی فرآیندی است که عملکرد سیستم را ارزیابی می کند. در Genkit، چنین سیستمی معمولاً یک Genkit اولیه است، مانند یک جریان یا یک مدل. ارزیابی می تواند خودکار یا دستی (ارزیابی انسانی) باشد.

  • استنتاج انبوه عمل اجرای یک ورودی بر روی یک جریان یا مدل برای به دست آوردن خروجی مربوطه است. استنتاج انبوه شامل انجام استنتاج بر روی چندین ورودی به طور همزمان است.

  • متریک معیار ارزیابی معیاری است که استنتاج بر اساس آن نمره گذاری می شود. به عنوان مثال می توان به دقت، وفاداری، بد بودن، انگلیسی بودن خروجی و غیره اشاره کرد.

  • مجموعه داده مجموعه ای از نمونه ها برای ارزیابی مبتنی بر استنتاج است. یک مجموعه داده معمولاً از فیلدهای input و reference اختیاری تشکیل شده است. فیلد reference بر مرحله استنتاج ارزیابی تأثیر نمی گذارد، اما کلمه به کلمه به هر معیار ارزیابی منتقل می شود. در Genkit، می توانید یک مجموعه داده از طریق Dev UI ایجاد کنید. دو نوع مجموعه داده در Genkit وجود دارد: مجموعه داده های جریان و مجموعه داده های مدل .

اعتبار سنجی طرحواره

بسته به نوع، مجموعه داده‌ها از اعتبارسنجی طرحواره در Dev UI پشتیبانی می‌کنند:

  • مجموعه داده‌های جریان از اعتبارسنجی فیلدهای input و reference مجموعه داده در برابر جریان در برنامه Genkit پشتیبانی می‌کنند. اعتبار سنجی طرح واره اختیاری است و تنها در صورتی اجرا می شود که طرحی در جریان هدف مشخص شده باشد.

  • مجموعه داده های مدل دارای طرحی ضمنی هستند که از هر دو نوع ورودی string و GenerateRequest پشتیبانی می کنند. اعتبار سنجی رشته راه مناسبی برای ارزیابی پیام های متنی ساده فراهم می کند، در حالی که GenerateRequest کنترل کاملی را برای موارد استفاده پیشرفته (مانند ارائه پارامترهای مدل، تاریخچه پیام، ابزارها و غیره) فراهم می کند. می توانید طرح کامل GenerateRequest را در اسناد مرجع API ما بیابید.

ارزیاب های پشتیبانی شده

ارزیابان Genkit

Genkit شامل تعداد کمی ارزیاب بومی است که از RAGAS الهام گرفته شده اند تا به شما در شروع کار کمک کنند:

  • وفاداری - سازگاری واقعی پاسخ تولید شده را در برابر زمینه داده شده می سنجد
  • ارتباط پاسخ - ارزیابی می کند که پاسخ تولید شده چقدر به درخواست داده شده مرتبط است
  • بدخواهی - اندازه گیری می کند که آیا خروجی تولید شده قصد فریب دادن، آسیب رساندن یا بهره برداری را دارد یا خیر.

پلاگین های ارزیابی

Genkit از ارزیاب‌های اضافی از طریق افزونه‌ها مانند Vertex Rapid Evaluators پشتیبانی می‌کند که می‌توانید از طریق پلاگین VertexAI به آن‌ها دسترسی داشته باشید.

استفاده پیشرفته

ارزیابی با استفاده از CLI

Genkit CLI یک API غنی برای انجام ارزیابی فراهم می کند. این به ویژه در محیط هایی که Dev UI در دسترس نیست (مثلاً در گردش کار CI/CD) مفید است.

Genkit CLI 3 دستور ارزیابی اصلی را ارائه می دهد: eval:flow ، eval:extractData و eval:run .

دستور eval:flow

دستور eval:flow ارزیابی مبتنی بر استنتاج را روی یک مجموعه داده ورودی اجرا می کند. این مجموعه داده ممکن است به عنوان یک فایل JSON یا با ارجاع به مجموعه داده موجود در زمان اجرا Genkit شما ارائه شود.

# Referencing an existing dataset
genkit eval:flow qaFlow --input myFactsQaDataset
# or, using a dataset from a file
genkit eval:flow qaFlow --input testInputs.json

در اینجا، testInputs.json باید آرایه ای از اشیاء حاوی یک فیلد input و یک فیلد reference اختیاری باشد، مانند زیر:

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

اگر جریان شما به تأیید اعتبار نیاز دارد، می توانید آن را با استفاده از آرگومان --context مشخص کنید:

genkit eval:flow qaFlow --input testInputs.json --context '{"auth": {"email_verified": true}}'

به طور پیش فرض، دستورات eval:flow و eval:run از تمام معیارهای موجود برای ارزیابی استفاده می کنند. برای اجرا بر روی زیرمجموعه ای از ارزیاب های پیکربندی شده، از پرچم --evaluators استفاده کنید و فهرستی از ارزیابان جدا شده با کاما را با نام ارائه کنید:

genkit eval:flow qaFlow --input testInputs.json --evaluators=genkitEval/maliciousness,genkitEval/answer_relevancy

می توانید نتایج ارزیابی خود را در Dev UI در localhost:4000/evaluate مشاهده کنید.

دستورات eval:extractData و eval:run

برای پشتیبانی از ارزیابی خام ، Genkit ابزارهایی را برای استخراج داده ها از ردیابی ها و اجرای معیارهای ارزیابی روی داده های استخراج شده ارائه می دهد. برای مثال، اگر از چارچوب متفاوتی برای ارزیابی استفاده می‌کنید یا اگر در حال جمع‌آوری استنباط از محیط دیگری برای آزمایش محلی برای کیفیت خروجی هستید، این کار مفید است.

می توانید جریان Genkit خود را به صورت دسته ای اجرا کنید و یک برچسب منحصر به فرد به اجرا اضافه کنید که سپس می تواند برای استخراج مجموعه داده ارزیابی استفاده شود. مجموعه داده‌های ارزیابی خام مجموعه‌ای از ورودی‌ها برای معیارهای ارزیابی، بدون اجرای هرگونه استنتاج قبلی است.

جریان خود را روی ورودی های آزمایشی خود اجرا کنید:

genkit flow:batchRun qaFlow testInputs.json --label firstRunSimple

استخراج داده های ارزیابی:

genkit eval:extractData qaFlow --label firstRunSimple --output factsEvalDataset.json

داده‌های صادر شده دارای قالبی متفاوت از قالب داده‌ای است که قبلاً ارائه شد. این به این دلیل است که این داده ها برای استفاده مستقیم با معیارهای ارزیابی بدون هیچ مرحله استنتاج در نظر گرفته شده است. در اینجا نحو داده های استخراج شده است.

Array<{
  "testCaseId": string,
  "input": any,
  "output": any,
  "context": any[],
  "traceIds": string[],
}>;

استخراج کننده داده به طور خودکار مکان یابی را پیدا می کند و اسناد تولید شده را به آرایه زمینه اضافه می کند. شما می توانید معیارهای ارزیابی را روی این مجموعه داده استخراج شده با استفاده از دستور eval:run اجرا کنید.

genkit eval:run factsEvalDataset.json

به‌طور پیش‌فرض، eval:run در برابر همه ارزیاب‌های پیکربندی شده اجرا می‌شود، و مانند eval:flow ، نتایج برای eval:run در صفحه ارزیابی Developer UI، واقع در localhost:4000/evaluate ظاهر می‌شود.

استخراج کننده های سفارشی

Genkit منطق پیش فرض معقولی را برای استخراج فیلدهای لازم ( input ، output و context ) در حین انجام ارزیابی فراهم می کند. با این حال، ممکن است متوجه شوید که به کنترل بیشتری روی منطق استخراج برای این فیلدها نیاز دارید. Genkit از استخراج کنندگان گمرک برای رسیدن به این هدف پشتیبانی می کند. شما می توانید استخراج کننده های سفارشی را برای استفاده در دستورات eval:extractData و eval:flow ارائه دهید.

ابتدا، به عنوان یک مرحله مقدماتی، یک مرحله کمکی را در مثال qaFlow معرفی کنید:

export const qaFlow = ai.defineFlow({
    name: 'qaFlow',
    inputSchema: z.string(),
    outputSchema: z.string(),
  },
  async (query) => {
    const factDocs = await ai.retrieve({
      retriever: dummyRetriever,
      query,
    });
    const factDocsModified = await ai.run('factModified', async () => {
        // Let us use only facts that are considered silly. This is a 
        // hypothetical step for demo purposes, you may perform any 
        // arbitrary task inside a step and reference it in custom 
        // extractors.
        //
        // Assume you have a method that checks if a fact is silly
        return factDocs.filter(d => isSillyFact(d.text));
    });

    const llmResponse = await ai.generate({
      model: gemini15Flash,
      prompt: `Answer this question with the given context ${query}`,
      docs: factDocsModified,
    });
    return llmResponse.text;
  }
);

سپس، یک استخراج کننده سفارشی را برای استفاده از خروجی مرحله factModified هنگام ارزیابی این جریان پیکربندی کنید.

اگر یک فایل tools-config برای پیکربندی استخراج کننده های سفارشی ندارید، یکی به نام genkit-tools.conf.js را به ریشه پروژه خود اضافه کنید.

cd /path/to/your/genkit/app
touch genkit-tools.conf.js

در فایل کانفیگ tools کد زیر را اضافه کنید:

module.exports = {
  evaluators: [
    {
      actionRef: '/flow/qaFlow',
      extractors: {
        context: { outputOf: 'factModified' },
      },
    },
  ],
};

این پیکربندی استخراج‌کننده‌های پیش‌فرض ابزار Genkit را لغو می‌کند، به‌ویژه آنچه را که به عنوان context در نظر گرفته می‌شود در هنگام ارزیابی این جریان تغییر می‌دهد.

اجرای ارزیابی مجدد نشان می دهد که زمینه اکنون به عنوان خروجی مرحله factModified پر شده است.

genkit eval:flow qaFlow --input testInputs.json

استخراج کننده های ارزیابی به شرح زیر مشخص می شوند:

  • فیلد evaluators آرایه‌ای از اشیاء EvaluatorConfig را می‌پذیرد که با flowName محدوده می‌شوند.
  • extractors شی‌ای است که حذف‌کننده‌های استخراج‌کننده را مشخص می‌کند. کلیدهای فعلی پشتیبانی شده در extractors [input, output, context] هستند. انواع مقادیر قابل قبول عبارتند از:
    • string - این باید یک نام مرحله باشد که به عنوان یک رشته مشخص شده است. خروجی این مرحله برای این کلید استخراج می شود.
    • { inputOf: string } or { outputOf: string } - این اشیاء کانال های خاصی (ورودی یا خروجی) یک مرحله را نشان می دهند. برای مثال، { inputOf: 'foo-step' } ورودی step foo-step را برای این کلید استخراج می کند.
    • (trace) => string; - برای انعطاف بیشتر، می توانید تابعی را ارائه کنید که یک ردیابی Genkit را می پذیرد و any مقدار -type را برمی گرداند و منطق استخراج را در داخل این تابع مشخص می کنید. برای طرح دقیق TraceData به genkit/genkit-tools/common/src/types/trace.ts مراجعه کنید.

نکته: داده های استخراج شده برای همه این استخراج کننده ها از نوع استخراج کننده است. به عنوان مثال، اگر از context: { outputOf: 'foo-step' } استفاده می کنید، و foo-step آرایه ای از اشیاء را برمی گرداند، زمینه استخراج شده نیز آرایه ای از اشیاء است.

سنتز داده های آزمون با استفاده از LLM

در اینجا یک جریان نمونه است که از یک فایل PDF برای ایجاد سؤالات احتمالی کاربر استفاده می کند.

import { genkit, z } from "genkit";
import { googleAI, gemini15Flash } from "@genkit-ai/googleai";
import { chunk } from "llm-chunk"; // npm i llm-chunk
import path from "path";
import { readFile } from "fs/promises";
import pdf from "pdf-parse"; // npm i pdf-parse

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;

async function extractText(filePath: string) {
  const pdfFile = path.resolve(filePath);
  const dataBuffer = await readFile(pdfFile);
  const data = await pdf(dataBuffer);
  return data.text;
}

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.
    const pdfTxt = await ai.run("extract-text", () => extractText(filePath));

    const chunks = await ai.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