تقييم

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

تتوافق Firebase Genkit مع أدوات التقييم التابعة لجهات خارجية من خلال الإضافات، بالإضافة إلى ميزات مراقبة فعّالة تقدّم إحصاءات عن حالة وقت التشغيل لتطبيقاتك المستندة إلى تعلُّم الآلة التوليدي. تساعدك أدوات Genkit في استخراج البيانات تلقائيًا، بما في ذلك المدخلات والنواتج والمعلومات من الخطوات الوسيطة لتقييم الجودة الشاملة لردود النماذج اللغوية الكبيرة، بالإضافة إلى فهم أداء الوحدات الأساسية لنظامك.

أنواع التقييم

تتيح Genkit نوعَين من التقييم:

  • التقييم المستنِد إلى الاستنتاج: يتم إجراء هذا النوع من التقييم على أساس مجموعة من المدخلات المحدّدة مسبقًا، مع تقييم النتائج المقابلة من حيث الجودة.

    هذا هو نوع التقييم الأكثر شيوعًا، وهو مناسب لمعظم حالات الاستخدام. يختبر هذا الأسلوب النتيجة الفعلية للنظام في كل عملية تقييم.

    يمكنك إجراء تقييم الجودة يدويًا من خلال فحص النتائج بصريًا. بدلاً من ذلك، يمكنك إجراء التقييم آليًا باستخدام أحد قياسات التقييم.

  • التقييم الأوّلي: يُقيّم هذا النوع من التقييم جودة المدخلات مباشرةً بدون أي استنتاج. ويُستخدَم هذا النهج عادةً مع التقييم المبرمَج باستخدام المقاييس. جميع الحقول المطلوبة للتقييم (مثل يجب أن تكون السمات input context وoutput وreference متوفّرة في مجموعة بيانات الإدخال. يكون ذلك مفيداً عند توفّر بيانات من مصدر خارجي (مثل البيانات التي يتم جمعها من عمليات تتبُّع الإصدار العلني) وتريد الحصول على قياس موضوعي لجودة البيانات التي تم جمعها.

    لمزيد من المعلومات، يُرجى الاطّلاع على قسم الاستخدام المتقدّم في هذه الصفحة.

يوضّح هذا القسم كيفية إجراء تقييم استنادًا إلى الاستنتاج باستخدام Genkit.

البدء السريع

الإعداد

  1. استخدِم تطبيق Genkit حاليًا أو أنشئ تطبيقًا جديدًا باتّباع دليل [البدء](get-started.md).
  2. أضِف الرمز التالي لتحديد تطبيق بسيط لتقييم حالة RAG. في هذا الدليل، نستخدم أداة استرجاع وهمية تعرض المستندات نفسها دائمًا.
    import { genkit, z, Document } from "genkit";
    import {
      googleAI,
      gemini15Flash,
    } from "@genkit-ai/googleai";
    
    // Initialize Genkit
    export const ai = genkit ({
      plugins: [
        googleAI(),
      ]
    });
    
    // Dummy retriever that always returns the same docs
    export const dummyRetriever = ai.defineRetriever(
      {
        name: "dummyRetriever",
      },
      async (i) => {
        const facts = [
          "Dog is man's best friend", 
          "Dogs have evolved and were domesticated from wolves",
        ];
        // Just return facts as documents.
        return { documents: facts.map((t) => Document.fromText(t)) };
      }
    );
    
    // A simple question-answering flow
    export const qaFlow = ai.defineFlow({
        name: 'qaFlow',
        inputSchema: z.string(),
        outputSchema: z.string(),
      },
      async (query) => {
        const factDocs = await ai.retrieve({
          retriever: dummyRetriever,
          query,
        });
    
        const llmResponse = await ai.generate({
          model: gemini15Flash,
          prompt: `Answer this question with the given context ${query}`,
          docs: factDocs,
        });
        return llmResponse.text;
      }
    );
  3. (اختياري) أضِف مقاييس التقييم إلى تطبيقك لاستخدامها أثناء التقييم. يستخدم هذا الدليل مقياس MALICIOUSNESS من المكوّن الإضافي genkitEval.
    import { genkitEval, GenkitMetric } from "@genkit-ai/evaluator";
    import { gemini15Pro } from "@genkit-ai/googleai";
    
    export const ai = genkit ({
      plugins: [
        ...
        // Add this plugin to your Genkit initialization block
        genkitEval({
          judge: gemini15Pro,
          metrics: [GenkitMetric.MALICIOUSNESS],
        }),
      ]
    });
    ملاحظة: تتطلّب الإعدادات أعلاه تثبيت الحزمة @genkit-ai/evaluator.
    npm install @genkit-ai/evaluator
  4. ابدأ تطبيق Genkit.
    genkit start -- 

إنشاء مجموعة بيانات

أنشئ مجموعة بيانات لتحديد الأمثلة التي نريد استخدامها لتقييم مسار المستخدم.

  1. انتقِل إلى واجهة مستخدم المطوّر على الرابط http://localhost:4000 وانقر على الزر مجموعات البيانات لفتح صفحة "مجموعات البيانات".

  2. انقر على الزر إنشاء مجموعة بيانات لفتح مربّع الحوار الخاص بإنشاء مجموعة البيانات.

    أ. قدِّم datasetId لمجموعة البيانات الجديدة. يستخدم هذا الدليل myFactsQaDataset.

    ب- اختَر نوع مجموعة البيانات Flow.

    ج. اترك حقل استهداف التحقّق فارغًا وانقر على حفظ.

  3. تظهر صفحة مجموعة البيانات الجديدة، وتعرض مجموعة بيانات فارغة. أضِف أمثلة إليها باتّباع الخطوات التالية:

    أ. انقر على الزر إضافة مثال لفتح لوحة محرِّر الأمثلة.

    ب- يجب ملء حقل input فقط. أدخِل "Who is man's best friend?" في حقل input، ثم انقر على حفظ لإضافة المثال إلى مجموعة data.

    ج. كرِّر الخطوتَين (أ) و (ب) مرّتين أخريين لإضافة المزيد من الأمثلة. يضيف هذا الدليل المثالَين التاليَين للبيانات إلى مجموعة البيانات:

    "Can I give milk to my cats?"
    "From which animals did dogs evolve?"
    

    بحلول نهاية هذه الخطوة، من المفترض أن تحتوي مجموعة البيانات على 3 أمثلة، مع القيم المذكورة أعلاه.

إجراء التقييم وعرض النتائج

لبدء تقييم العملية، انقر على الزر إجراء تقييم جديد في صفحة مجموعة البيانات. يمكنك أيضًا بدء تقييم جديد من علامة التبويب التقييمات.

  1. انقر على زر الاختيار Flow لتقييم مسار.

  2. اختَر qaFlow كمسار الإحالة الناجحة المستهدَف لتقييمه.

  3. اختَر myFactsQaDataset كمجموعة البيانات المستهدَفة لاستخدامها في التقييم.

  4. (اختياري) إذا كنت قد ثبّت مقياس تقييم باستخدام مكوّنات Genkit الإضافية، يمكنك الاطّلاع على هذه المقاييس في هذه الصفحة. اختَر المقاييس التي تريد استخدامها مع عملية التقييم هذه. هذه الخطوة اختيارية تمامًا: سيؤدي حذف هذه الخطوة إلى عرض النتائج في عملية التقييم، ولكن بدون أي مقاييس مرتبطة بها.

  5. أخيرًا، انقر على بدء التقييم لبدء التقييم. قد يستغرق ذلك بعض الوقت حسب عملية التحسين التي تختبرها. بعد اكتمال التقييم، تظهر رسالة تفيد بالنجاح مع رابط لعرض النتائج. انقر على الرابط للانتقال إلى صفحة تفاصيل التقييم.

يمكنك الاطّلاع على تفاصيل تقييمك في هذه الصفحة، بما في ذلك المدخلات الأصلية والسياق والمقاييس المستخرَجة (إن توفّرت).

المفاهيم الأساسية

مصطلحات

  • التقييم: التقييم هو عملية تهدف إلى تقييم أداء النظام. في Genkit، يكون هذا النظام عادةً عنصرًا أساسيًا في Genkit، مثل عملية أو نموذج. يمكن أن يكون التقييم آليًا أو يدويًا (تقييم بشري).

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

  • المقياس: مقياس التقييم هو معيار يتم وضع علامة عليه عند إجراء استنتاج. وتشمل الأمثلة الدقة، والالتزام بالمحتوى الأصلي، والمحتوى الضار، وما إذا كان الإخراج باللغة الإنجليزية، وما إلى ذلك.

  • مجموعة البيانات: هي مجموعة من الأمثلة لاستخدامها في التقييم القائم على الاستنتاج. تتألف مجموعة البيانات عادةً من حقلَي input وreference اختياريَين. لا يؤثّر الحقل reference في خطوة الاستنتاج من التقييم، ولكن يتم تمريره حرفيًا إلى أي مقاييس تقييم. في Genkit، يمكنك إنشاء مجموعة بيانات من خلال واجهة مستخدم المطوّر. هناك نوعان من مجموعات البيانات في Genkit: مجموعات بيانات المسار ومجموعات بيانات النموذج.

التحقّق من صحة المخطط

استنادًا إلى النوع، تتوفّر مجموعات البيانات مع ميزة التحقّق من المخطط في واجهة مستخدم المطوّر:

  • تتيح مجموعات بيانات "المسارات" التحقّق من صحة الحقلين input وreference في مجموعة البيانات مقابل مسار في تطبيق Genkit. إنّ التحقّق من صحة المخطط اختياري، ولا يتم فرضه إلا إذا تم تحديد مخطّط في مسار الإحالة الناجحة المستهدَف.

  • تحتوي مجموعات بيانات النماذج على مخطّط ضمني، وهي متوافقة مع نوعَي الإدخال string و GenerateRequest. توفّر ميزة التحقّق من السلسلة طريقة ملائمة لتقييم الطلبات النصية البسيطة، في حين توفّر GenerateRequest التحكّم الكامل في حالات الاستخدام المتقدّمة (مثل توفير مَعلمات النماذج وسجلّ الرسائل وغيرها من الأدوات). يمكنك العثور على المخطّط الكامل لـ GenerateRequest في مستندات مرجع واجهة برمجة التطبيقات.

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

مقيّمي Genkit

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

  • الدقّة: تقيس هذه السمة الاتساق في الحقائق للإجابة التي تم إنشاؤها مقارنةً بالسياق المحدّد.
  • مدى صلة الإجابة: لتقييم مدى صلة الإجابة التي تم إنشاؤها بالعبارة المُدخلة
  • الضرر: يقيس ما إذا كان المحتوى الذي تم إنشاؤه يهدف إلى الخداع أو الضرر أو الاستغلال

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

تتيح أداة Genkit استخدام أدوات تقييم إضافية من خلال الإضافات، مثل أدوات تقييم Vertex Rapid ، والتي يمكنك الوصول إليها من خلال مكوّن VertexAI الإضافي.

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

التقييم باستخدام واجهة سطر الأوامر

توفّر Genkit CLI واجهة برمجة تطبيقات غنية لإجراء التقييم. ويُعدّ ذلك مفيدًا بشكل خاص في البيئات التي لا تتوفّر فيها واجهة مستخدم المطوّر (مثل سير عمل التكامل المستمر/النشر المستمر).

توفّر واجهة Genkit CLI 3 أوامر تقييم رئيسية: eval:flow وeval:extractData وeval:run.

الأمر eval:flow

يُجري الأمر eval:flow تقييمًا استنادًا إلى الاستنتاج على مجموعة بيانات الإدخال. يمكن تقديم مجموعة البيانات هذه إما كملف JSON أو من خلال الإشارة إلى مجموعة بيانات حالية في وقت تشغيل Genkit.

# Referencing an existing dataset
genkit eval:flow qaFlow --input myFactsQaDataset
# or, using a dataset from a file
genkit eval:flow qaFlow --input testInputs.json

في هذه الحالة، يجب أن يكون testInputs.json صفيفًا من العناصر التي تحتوي على حقل input وحقل reference اختياري، كما هو موضّح أدناه:

[
  {
    "input": "What is the French word for Cheese?",
  },
  {
    "input": "What green vegetable looks like cauliflower?",
    "reference": "Broccoli"
  }
]

إذا كانت العملية تتطلّب المصادقة، يمكنك تحديدها باستخدام الوسيطة --context:

genkit eval:flow qaFlow --input testInputs.json --context '{"auth": {"email_verified": true}}'

بشكلٍ تلقائي، تستخدِم الأوامر eval:flow وeval:run جميع المقاييس المتاحة للتقييم. لتنفيذ التقييم على مجموعة فرعية من المقيمين الذين تم ضبطهم، استخدِم العلامة --evaluators وقدِّم قائمة بالمقيِّمين مفصولة بفواصل حسب الاسم:

genkit eval:flow qaFlow --input testInputs.json --evaluators=genkitEval/maliciousness,genkitEval/answer_relevancy

يمكنك الاطّلاع على نتائج عملية التقييم في واجهة مستخدم المطوّر على الرابط localhost:4000/evaluate.

أوامر eval:extractData وeval:run

لدعم التقييم الأوّلي، يوفّر Genkit أدوات لاستخراج البيانات من عمليات التتبّع وتشغيل مقاييس التقييم على البيانات المستخرَجة. يكون ذلك مفيدًا، على سبيل المثال، إذا كنت تستخدم إطار عمل مختلفًا للتقييم أو إذا كنت تجمع استنتاجات من بيئة مختلفة لاختبار جودة الإخراج محليًا.

يمكنك تنفيذ مسار Genkit بشكل مجمّع وإضافة تصنيف فريد إلى التنفيذ الذي يمكن استخدامه بعد ذلك لاستخراج مجموعة بيانات تقييم. مجموعة بيانات التقييم الأوّلية هي مجموعة من المدخلات لمقاييس التقييم، بدون إجراء أي عملية استنتاج سابقة.

يمكنك تنفيذ المسار على مدخلات الاختبار:

genkit flow:batchRun qaFlow testInputs.json --label firstRunSimple

استخراج بيانات التقييم:

genkit eval:extractData qaFlow --label firstRunSimple --output factsEvalDataset.json

تتضمّن البيانات التي تم تصديرها تنسيقًا مختلفًا عن تنسيق مجموعة البيانات الذي تم عرضه سابقًا. ويعود السبب في ذلك إلى أنّه من المفترض استخدام هذه البيانات مع مقاييس التقييم بشكل مباشر، بدون أي خطوة استنتاج. في ما يلي بنية البيانات المستخرَجة.

Array<{
  "testCaseId": string,
  "input": any,
  "output": any,
  "context": any[],
  "traceIds": string[],
}>;

يحدِّد مستخرج البيانات تلقائيًا أدوات الاسترجاع ويضيف المستندات التي تم إنشاؤها إلى مصفوفة السياق. يمكنك تنفيذ مقاييس التقييم على مجموعة البيانات المستخرَجة هذه باستخدام الأمر eval:run.

genkit eval:run factsEvalDataset.json

يتمّ تشغيل eval:run تلقائيًا على جميع المقيّمين الذين تمّ ضبطهم، وكما هو الحال مع eval:flow، تظهر نتائج eval:run في صفحة التقييم في Developer UI، والتي يمكن العثور عليها على الرابط localhost:4000/evaluate.

أدوات الاستخراج المخصّصة

يوفّر Genkit منطقًا تلقائيًا معقولاً لاستخراج الحقول اللازمة (input وoutput وcontext) أثناء إجراء تقييم. ومع ذلك، قد تحتاج إلى مزيد من التحكّم في منطق الاستخراج لهذه الحقول. تتيح أداة Genkit استخدام مستخلصات مخصّصة لتحقيق ذلك. يمكنك تقديم أدوات تحليل مخصّصة لاستخدامها في الأمرَين eval:extractData وeval:flow.

أولاً، كخطوة تحضيرية، أدخِل خطوة مساعدة في qaFlow المثال التالي:

export const qaFlow = ai.defineFlow({
    name: 'qaFlow',
    inputSchema: z.string(),
    outputSchema: z.string(),
  },
  async (query) => {
    const factDocs = await ai.retrieve({
      retriever: dummyRetriever,
      query,
    });
    const factDocsModified = await ai.run('factModified', async () => {
        // Let us use only facts that are considered silly. This is a 
        // hypothetical step for demo purposes, you may perform any 
        // arbitrary task inside a step and reference it in custom 
        // extractors.
        //
        // Assume you have a method that checks if a fact is silly
        return factDocs.filter(d => isSillyFact(d.text));
    });

    const llmResponse = await ai.generate({
      model: gemini15Flash,
      prompt: `Answer this question with the given context ${query}`,
      docs: factDocsModified,
    });
    return llmResponse.text;
  }
);

بعد ذلك، عليك ضبط أداة استخراج مخصّصة لاستخدام ناتج خطوة factModified عند تقييم هذه العملية.

إذا لم يكن لديك ملف إعدادات أدوات لضبط النازعات المخصّصة، أضِف ملفًا باسم genkit-tools.conf.js إلى جذر مشروعك.

cd /path/to/your/genkit/app
touch genkit-tools.conf.js

في ملف إعدادات الأدوات، أضِف الرمز التالي:

module.exports = {
  evaluators: [
    {
      actionRef: '/flow/qaFlow',
      extractors: {
        context: { outputOf: 'factModified' },
      },
    },
  ],
};

تلغي هذه الإعدادات أدوات الاستخراج التلقائية في أدوات Genkit، وعلى وجه التحديد تغيير ما يُعتبر context عند تقييم هذه العملية.

يكشف إجراء التقييم مرة أخرى أنّه تمّ الآن تعبئة السياق كنتيجة للخطوة factModified.

genkit eval:flow qaFlow --input testInputs.json

يتم تحديد مستخلصات التقييم على النحو التالي:

  • يقبل الحقل evaluators صفيفًا من عناصر EvaluatorConfig التي يتم تحديد نطاقها من خلال flowName.
  • extractors هو عنصر يحدّد عمليات إلغاء المستخرِج. مفاتيح التشفير المعتمَدة حاليًا في extractors هي [input, output, context]. يندرج ضمن أنواع القيم المقبولة ما يلي:
    • string: يجب أن يكون هذا اسم خطوة، ويتم تحديده كسلسلة. يتم استخراج الإخراج من هذه الخطوة لهذا المفتاح.
    • { inputOf: string } أو { outputOf: string }: تمثّل هذه العناصر قنوات معيّنة (إدخال أو إخراج) لخطوة معيّنة. على سبيل المثال، ستستخرج { inputOf: 'foo-step' } إدخال الخطوة foo-step ل هذا المفتاح.
    • (trace) => string; - لمزيد من المرونة، يمكنك تقديم دالة تقبل تتبع Genkit وتُعرِض قيمة من النوع any، وتحديد منطق الاستخراج داخل هذه الدالة. يُرجى الرجوع إلى genkit/genkit-tools/common/src/types/trace.ts للاطّلاع على مخطّط TraceData الدقيق.

ملاحظة: البيانات المستخرَجة من جميع هذه النازعات هي النوع المرتبط بالنازع. على سبيل المثال، إذا كنت تستخدم ‎context: { outputOf: 'foo-step' }، وكانت foo-step تعرض صفيفًا من العناصر، سيكون السياق المستخرَج أيضًا صفيفًا من العناصر.

إنشاء بيانات اختبار باستخدام نموذج لغوي كبير

في ما يلي مثال على مسار يستخدِم ملف PDF لإنشاء أسئلة محتملة للمستخدمين.

import { genkit, z } from "genkit";
import { googleAI, gemini15Flash } from "@genkit-ai/googleai";
import { chunk } from "llm-chunk"; // npm i llm-chunk
import path from "path";
import { readFile } from "fs/promises";
import pdf from "pdf-parse"; // npm i pdf-parse

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;

async function extractText(filePath: string) {
  const pdfFile = path.resolve(filePath);
  const dataBuffer = await readFile(pdfFile);
  const data = await pdf(dataBuffer);
  return data.text;
}

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.
    const pdfTxt = await ai.run("extract-text", () => extractText(filePath));

    const chunks = await ai.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