Evaluasi

Evaluasi adalah bentuk pengujian yang membantu Anda memvalidasi respons LLM dan memastikannya memenuhi standar kualitas Anda.

Firebase Genkit mendukung alat evaluasi pihak ketiga melalui plugin, yang dipasangkan dengan fitur kemampuan observasi canggih yang memberikan insight tentang status runtime aplikasi yang didukung LLM. Alat Genkit membantu Anda mengekstrak data secara otomatis termasuk input, output, dan informasi dari langkah menengah untuk mengevaluasi kualitas respons LLM secara menyeluruh, serta memahami performa elemen penyusun sistem Anda.

Misalnya, jika Anda memiliki alur RAG, Genkit akan mengekstrak kumpulan dokumen yang dikembalikan oleh retriever sehingga Anda dapat mengevaluasi kualitas retriever saat dijalankan dalam konteks flow seperti yang ditunjukkan di bawah dengan metrik loyalitas Genkit dan relevansi jawaban:

import { GenkitMetric, genkitEval } from '@genkit-ai/evaluator';
import { textEmbeddingGecko } from '@genkit-ai/vertexai';

export default configureGenkit({
  plugins: [
    genkitEval({
      judge: geminiPro,
      metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
      embedder: textEmbeddingGecko, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
    }),
  ],
  // ...
});
  npm install @genkit-ai/evaluator @genkit-ai/vertexai

Mulailah dengan menentukan satu set input yang ingin Anda gunakan sebagai set data input bernama testQuestions.json. Set data input ini mewakili kasus pengujian yang akan Anda gunakan untuk menghasilkan output yang akan dievaluasi.

[
  "What is on the menu?",
  "Does the restaurant have clams?",
  "What is the special of the day?"
]

Anda kemudian dapat menggunakan perintah eval:flow untuk mengevaluasi flow terhadap kasus pengujian yang diberikan di testQuestions.json.

genkit eval:flow menuQA --input testQuestions.json

Anda kemudian dapat melihat hasil evaluasi di UI Developer dengan menjalankan:

genkit start

Lalu buka localhost:4000/evaluate.

Atau, Anda dapat memberikan file output untuk memeriksa output dalam file JSON.

genkit eval:flow menuQA --input testQuestions.json --output eval-result.json

Evaluator yang didukung

Evaluator Genkit

Genkit mencakup sejumlah kecil evaluator native, yang terinspirasi oleh RAGAS, untuk membantu Anda memulai:

  • Kesetiaan
  • Relevansi Jawaban
  • Kejahatan

Plugin Evaluator

Genkit mendukung evaluator tambahan melalui plugin:

Penggunaan lanjutan

eval:flow adalah cara yang mudah untuk mengevaluasi alur dengan cepat, tetapi terkadang Anda mungkin memerlukan kontrol lebih besar atas langkah-langkah evaluasi. Hal ini dapat terjadi jika Anda menggunakan framework lain dan sudah memiliki beberapa output yang ingin dievaluasi. Anda dapat melakukan semua langkah yang dijalankan eval:flow semi-manual.

Anda dapat menjalankan alur Genkit dalam batch dan menambahkan label unik ke operasi tersebut, yang kemudian akan digunakan untuk mengekstrak set data evaluasi (kumpulan input, output, dan konteks).

Jalankan alur pada input pengujian Anda:

genkit flow:batchRun myRagFlow test_inputs.json --output flow_outputs.json --label customLabel

Ekstrak data evaluasi:

genkit eval:extractData myRagFlow --label customLabel --output customLabel_dataset.json

Data yang diekspor akan dihasilkan sebagai file json dengan setiap testCase dalam format berikut:

[
  {
    "testCaseId": string,
    "input": string,
    "output": string,
    "context": array of strings,
    "traceIds": array of strings,
  }
]

Ekstraktor data akan otomatis menemukan retriever dan menambahkan dokumen yang dihasilkan ke array konteks. Secara default, eval:run akan dijalankan terhadap semua evaluator yang dikonfigurasi, dan seperti eval:flow, hasil untuk eval:run akan muncul di halaman evaluasi UI Developer, yang terletak di localhost:4000/evaluate.

Ekstraktor kustom

Anda juga dapat menyediakan ekstraktor kustom untuk digunakan dalam perintah eval:extractData dan eval:flow. Ekstraktor kustom memungkinkan Anda mengganti logika ekstraksi default yang memberi Anda lebih banyak kemampuan dalam membuat set data dan mengevaluasinya.

Untuk mengonfigurasi ekstraktor kustom, tambahkan file konfigurasi alat bernama genkit-tools.conf.js ke root project Anda, jika Anda belum memilikinya.

cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js

Di file konfigurasi alat, tambahkan kode berikut:

module.exports = {
  evaluators: [
    {
      flowName: 'myFlow',
      extractors: {
        context: { outputOf: 'foo-step' },
        output: 'bar-step',
      },
    },
  ],
};

Dalam contoh ini, Anda mengonfigurasi ekstraktor untuk alur myFlow. Konfigurasi ini mengganti ekstraktor untuk kolom context dan output, serta menggunakan logika default untuk kolom input.

Spesifikasi ekstraktor evaluasi adalah sebagai berikut:

  • Kolom evaluators menerima array objek EvaluatorConfig, yang dicakup oleh flowName
  • extractors adalah objek yang menentukan penggantian ekstraktor. Kunci yang saat ini didukung di extractors adalah [input, output, context]. Jenis nilai yang dapat diterima adalah:
    • string - ini harus berupa nama langkah, yang ditetapkan sebagai pengaduk. Output langkah ini diekstrak untuk kunci ini.
    • { inputOf: string } atau { outputOf: string } - Objek ini mewakili saluran tertentu (input atau output) dari suatu langkah. Misalnya, { inputOf: 'foo-step' } akan mengekstrak input langkah foo-step untuk kunci ini.
    • (trace) => string; - Untuk fleksibilitas lebih lanjut, Anda dapat menyediakan fungsi yang menerima rekaman aktivitas Genkit dan menampilkan string, serta menentukan logika ekstraksi di dalam fungsi ini. Lihat genkit/genkit-tools/common/src/types/trace.ts untuk mengetahui skema TraceData yang tepat.

Menjalankan pada set data yang ada

Untuk menjalankan evaluasi pada set data yang sudah diekstrak:

genkit eval:run customLabel_dataset.json

Untuk menghasilkan output ke lokasi yang berbeda, gunakan flag --output.

genkit eval:flow menuQA --input testQuestions.json --output customLabel_evalresult.json

Untuk menjalankannya di subset evaluator yang dikonfigurasi, gunakan tanda --evaluators dan berikan daftar evaluator yang dipisahkan koma berdasarkan nama:

genkit eval:run customLabel_dataset.json --evaluators=genkit/faithfulness,genkit/answer_relevancy

Melakukan sintesis data uji menggunakan LLM

Berikut adalah contoh alur yang menggunakan file PDF untuk menghasilkan kemungkinan pertanyaan yang mungkin akan diajukan pengguna tentangnya.

export const synthesizeQuestions = 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 generate({
        model: geminiPro,
        prompt: {
          text: `Generate one question about the text below: ${chunks[i]}`,
        },
      });
      questions.push(qResponse.text());
    }
    return questions;
  }
);

Kemudian, Anda dapat menggunakan perintah ini untuk mengekspor data ke dalam file dan menggunakannya untuk evaluasi.

genkit flow:run synthesizeQuestions '"my_input.pdf"' --output synthesizedQuestions.json