التقييمات هي شكل من أشكال الاختبار يساعدك في التحقّق من صحة ردود نموذج اللغة الضخمة والتأكّد من أنّها تستوفي معايير الجودة.
تتوافق Firebase Genkit مع أدوات التقييم التابعة لجهات خارجية من خلال الإضافات، بالإضافة إلى ميزات مراقبة فعّالة توفّر إحصاءات حول حالة وقت التشغيل لتطبيقاتك المستندة إلى تعلُّم الآلة التوليدي. تساعدك أدوات Genkit في استخراج البيانات تلقائيًا، بما في ذلك المدخلات والنواتج والمعلومات من الخطوات الوسيطة بهدف تقييم الجودة الشاملة لردود النماذج اللغوية الكبيرة، بالإضافة إلى فهم أداء الوحدات الأساسية لنظامك.
على سبيل المثال، إذا كانت لديك عملية بحث مستندة إلى تصنيف 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 إلى مسار الإحالة الناجحة مع نوع البيانات نفسه.
يمكنك بعد ذلك استخدام الأمر eval:flow
لتقييم سير عملك وفقًا لحالات الاختبار
المقدَّمة في testInputs.json
.
genkit eval:flow menuSuggestionFlow --input testInputs.json
إذا كانت العملية تتطلّب المصادقة، يمكنك تحديدها باستخدام الوسيطة --auth
:
genkit eval:flow menuSuggestionFlow --input testInputs.json --auth "{\"email_verified\": true}"
يمكنك بعد ذلك الاطّلاع على نتائج التقييم في واجهة مستخدِم المطوّر من خلال تنفيذ:
genkit start
بعد ذلك، انتقِل إلى localhost:4000/evaluate
.
بدلاً من ذلك، يمكنك تقديم ملف إخراج لفحص الإخراج في ملف JSON.
genkit eval:flow menuSuggestionFlow --input testInputs.json --output eval-result.json
ملاحظة: يمكنك الاطّلاع أدناه على مثال على كيفية مساعدة النموذج اللغوي الكبير في إنشاء حالات الاختبار.
الجهات المُقيِّمة المتوافقة
مقيّمي Genkit
تتضمّن أداة Genkit عددًا صغيرًا من التقييمات الأصلية المستوحاة من RAGAS لمساعدتك في البدء:
- الإخلاص
- مدى صلة الإجابة بالسؤال
- المحتوى الضار
المكوّنات الإضافية للمقيّم
تتيح أداة Genkit استخدام أدوات تقييم إضافية من خلال مكونات إضافية، مثل أدوات التقييم السريع في VertexAI من خلال مكوّن VertexAI الإضافي.
الاستخدام المتقدّم
eval:flow
هي طريقة ملائمة لتقييم المسار بسرعة، ولكن قد تحتاج أحيانًا
إلى مزيد من التحكّم في خطوات التقييم. قد يحدث ذلك إذا كنت تستخدم إطار عمل مختلفًا ولديك بعض النتائج التي تريد تقييمها. يمكنك
تنفيذ جميع الخطوات التي ينفّذها 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
. تلغي config
أدوات الاستخراج لحقول 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
، وتحديد منطق الاستخراج داخل هذه الدالة. يُرجى الرجوع إلىgenkit/genkit-tools/common/src/types/trace.ts
للاطّلاع على مخطّط TraceData الدقيق.
ملاحظة: ستكون البيانات المستخرَجة لجميع هذه الخطوات سلسلة 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