تقييم

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

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