הערכות הן סוג של בדיקה שעוזרת לכם לאמת את התשובות של ה-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.
- הערכת הקריטריונים של LangChain באמצעות הפלאגין LangChain.
שימוש מתקדם
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