تقييم

التقييمات هي شكل من أشكال الاختبار يساعدك في التحقّق من صحة ردود نموذج اللغة الضخمة والتأكّد من أنّها تستوفي معايير الجودة.

تتوافق 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/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

ملاحظة: يمكنك الاطّلاع أدناه على مثال على كيفية مساعدة النموذج اللغوي الكبير في إنشاء حالات الاختبار.

الجهات المُقيِّمة المتوافقة

مقيّمو Genkit

تتضمّن أداة Genkit عددًا صغيرًا من التقييمات الأصلية المستوحاة من RAGAS لمساعدتك في البدء:

  • الإخلاص
  • مدى صلة الإجابة بالسؤال
  • المحتوى الضار

المكوّنات الإضافية للمقيّم

تتيح أداة Genkit أدوات تقييم إضافية من خلال الإضافات:

الاستخدام المتقدّم

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

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