הערכה

הערכות הן סוג של בדיקה שעוזרת לכם לאמת את התשובות של ה-LLM ולוודא שהן עומדות בסטנדרט האיכות שלכם.

Firebase Genkit תומך בכלי הערכה של צד שלישי באמצעות יישומי פלאגין, בשילוב עם תכונות מתקדמות של יכולת תצפית שמספקות תובנות לגבי מצב זמן הריצה של האפליקציות שמבוססות על LLM. כלי Genkit עוזרים לחלץ באופן אוטומטי נתונים, כולל קלט, פלט ומידע משלב ביניים, כדי להעריך את האיכות מקצה לקצה של התשובות של ה-LLM, וגם כדי להבין את הביצועים של אבני הבניין של המערכת.

לדוגמה, אם יש לכם תהליך RAG, Genkit יאחזר את קבוצת המסמכים שהוחזרו על ידי ה-Retriever כדי שתוכלו להעריך את האיכות של ה-Retriever בזמן שהוא פועל בהקשר של התהליך, כפי שמוצג בהמשך באמצעות מדדי האמינות והרלוונטיות של התשובות של 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/google-ai,‏ @genkit-ai/evaluator ו-@genkit-ai/vertexai.

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

מתחילים בהגדרת קבוצת משתני קלט שבהם רוצים להשתמש כמערך נתוני קלט בשם testInputs.json. מערך הנתונים הזה מייצג את תרחישי הבדיקה שבהם תשתמשו כדי ליצור פלט לצורך הערכה.

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

לאחר מכן תוכלו להשתמש בפקודה eval:flow כדי לבדוק את התהליך בהתאם לתרחישי הבדיקה שסופקו בקובץ testInputs.json.

genkit eval:flow menuSuggestionFlow --input testInputs.json

לאחר מכן תוכלו לראות את תוצאות הבדיקה בממשק המשתמש למפתחים על ידי הפעלת הפקודה הבאה:

genkit start

לאחר מכן, עוברים אל localhost:4000/evaluate.

לחלופין, אפשר לספק קובץ פלט כדי לבדוק את הפלט בקובץ JSON.

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

הערה: בהמשך מופיעה דוגמה לאופן שבו LLM יכול לעזור לכם ליצור את תרחישי הבדיקה.

גורמי הערכה נתמכים

בודקי Genkit

כדי לעזור לכם להתחיל, Genkit כולל מספר קטן של מודדים מקומיים בהשראת RAGAS:

  • נאמנות
  • רלוונטיות התשובה
  • זדון

פלאגינים של כלי הערכה

Genkit תומך בגורמי הערכה נוספים באמצעות פלאגינים כמו VertexAI Rapid Evaluators דרך פלאגין VertexAI.

שימוש מתקדם

eval:flow היא דרך נוחה להעריך במהירות את התהליך, אבל לפעמים ייתכן שתצטרכו יותר שליטה על שלבי ההערכה. המצב הזה יכול לקרות אם אתם משתמשים ב-framework אחר ויש לכם כבר פלט מסוים שאתם רוצים להעריך. אתם יכולים לבצע באופן ידני חלק מהשלבים שהקוד eval:flow מבצע.

אתם יכולים להריץ את תהליך ה-Genkit באצווה ולהוסיף תווית ייחודית להרצה, שתשמש לאחר מכן לחילוץ של מערך נתונים להערכה (קבוצה של קלט, פלט והקשרים).

מריצים את התהליך על קלט הבדיקה:

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

חילוץ נתוני הבדיקה:

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

הנתונים שיוצאו יוצגו כקובץ JSON, וכל בדיקת testCase תופיע בפורמט הבא:

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

מחלץ הנתונים יזהה באופן אוטומטי את הגורמים לאחזור ויוסיף את המסמכים שנוצרו למערך ההקשר. כברירת מחדל, הפקודה eval:run תפעל כנגד כל הבודקים שהוגדרו, וכמו eval:flow, התוצאות של eval:run יופיעו בדף הבדיקה של ממשק המשתמש למפתחים, שנמצא בכתובת 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. ההגדרה מבטלת את ה-extractors של השדות context ו-output ומשתמשת בלוגיקה שמוגדרת כברירת מחדל בשדה input.

המפרט של מחלצי ההערכה הוא:

  • השדה evaluators מקבל מערך של אובייקטים מסוג EvaluatorConfig, שמסונכרנים לפי ההיקף של flowName
  • extractors הוא אובייקט שמציין את ההחרגות של מחלץ הנתונים. המפתחות הנתמכים הנוכחיים ב-extractors הם [input, output, context]. סוגי הערכים הקבילים הם:
    • string – זה צריך להיות שם של שלב, שמצוין כמחרוזת. הפלט של השלב הזה מחובר למפתח הזה.
    • { inputOf: string } או { outputOf: string } – האובייקטים האלה מייצגים ערוצים ספציפיים (קלט או פלט) של שלב. לדוגמה, { inputOf: 'foo-step' } יאחזר את הקלט של שלב foo-step למפתח הזה.
    • (trace) => string; – כדי לקבל גמישות נוספת, אפשר לספק פונקציה שמקבלת מעקב Genkit ומחזירה string, ולציין את לוגיקה החילוץ בתוך הפונקציה הזו. הסכימה המדויקת של TraceData מפורטת במאמר 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

סינתזה של נתוני בדיקה באמצעות LLM

לפניכם תהליך לדוגמה שבו נעשה שימוש בקובץ PDF כדי ליצור שאלות אפשריות שהמשתמשים עשויים לשאול לגבי הקובץ.

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

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

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);
    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