Evaluasi

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

Firebase Genkit mendukung alat evaluasi pihak ketiga melalui plugin, yang dikombinasikan dengan fitur visibilitas yang 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-langkah perantara 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 ditampilkan oleh pengambil sehingga Anda dapat mengevaluasi kualitas pengambil saat berjalan dalam konteks alur seperti yang ditunjukkan di bawah dengan metrik relevansi jawaban dan kesetiaan 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
    }),
  ],
  // ...
});

Catatan: Konfigurasi di atas memerlukan penginstalan paket genkit, @genkit-ai/googleai, @genkit-ai/evaluator, dan @genkit-ai/vertexai.

  npm install @genkit-ai/evaluator @genkit-ai/vertexai

Mulai dengan menentukan kumpulan input yang ingin Anda gunakan sebagai set data input yang disebut testInputs.json. Set data input ini mewakili kasus pengujian yang akan Anda gunakan untuk menghasilkan output untuk evaluasi.

["Cheese", "Broccoli", "Spinach and Kale"]

Jika evaluator memerlukan output referensi untuk mengevaluasi alur, Anda dapat meneruskan input dan output referensi menggunakan format ini:

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

Perhatikan bahwa Anda dapat menggunakan jenis data JSON apa pun dalam file JSON input. Genkit akan meneruskannya bersama dengan jenis data yang sama ke alur Anda.

Kemudian, Anda dapat menggunakan perintah eval:flow untuk mengevaluasi alur berdasarkan kasus pengujian yang disediakan di testInputs.json.

genkit eval:flow menuSuggestionFlow --input testInputs.json

Jika alur memerlukan autentikasi, Anda dapat menentukannya menggunakan argumen --auth:

genkit eval:flow menuSuggestionFlow --input testInputs.json --auth "{\"email_verified\": true}"

Kemudian, Anda dapat melihat hasil evaluasi di UI Developer dengan menjalankan:

genkit start

Kemudian, buka localhost:4000/evaluate.

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

genkit eval:flow menuSuggestionFlow --input testInputs.json --output eval-result.json

Catatan: Di bawah ini, Anda dapat melihat contoh cara LLM dapat membantu Anda membuat kasus pengujian.

Evaluator yang didukung

Evaluator Genkit

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

  • Kesetiaan
  • Relevansi Jawaban
  • Kejahatan

Plugin evaluator

Genkit mendukung evaluator tambahan melalui plugin seperti VertexAI Rapid Evaluators melalui Plugin VertexAI.

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 yang berbeda dan sudah memiliki beberapa output yang ingin dievaluasi. Anda dapat melakukan semua langkah yang dilakukan eval:flow secara semi-manual.

Anda dapat menjalankan flow Genkit secara massal dan menambahkan label unik ke operasi yang kemudian akan digunakan untuk mengekstrak set data evaluasi (kumpulan input, output, dan konteks).

Jalankan alur melalui 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,
  }
]

Pengekstrak data akan otomatis menemukan pengambil dan menambahkan dokumen yang dihasilkan ke array konteks. Secara default, eval:run akan berjalan pada 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.

Pengekstrak kustom

Anda juga dapat menyediakan ekstraktor kustom untuk digunakan dalam perintah eval:extractData dan eval:flow. Ekstraktor kustom memungkinkan Anda mengganti logika ekstraksi default sehingga Anda memiliki 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 jika Anda belum memilikinya.

cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js

Di file konfigurasi alat, tambahkan kode berikut:

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

Dalam contoh ini, Anda akan mengonfigurasi ekstraktor untuk alur myFlow. Konfigurasi 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 dibatasi oleh flowName
  • extractors adalah objek yang menentukan penggantian ekstraktor. Kunci yang didukung saat ini di extractors adalah [input, output, context]. Jenis nilai yang dapat diterima adalah:
    • string - ini harus berupa nama langkah, yang ditentukan sebagai string. 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.

Catatan: Data yang diekstrak untuk semua langkah ini akan berupa string JSON. Alat ini akan mengurai string JSON ini secara otomatis pada saat evaluasi. Jika menyediakan ekstraktor fungsi, pastikan outputnya adalah string JSON yang valid. Misalnya: "Hello, world!" bukan JSON yang valid; "\"Hello, world!\"" valid.

Berjalan di set data yang ada

Untuk menjalankan evaluasi pada set data yang telah diekstrak:

genkit eval:run customLabel_dataset.json

Untuk menghasilkan output ke lokasi lain, gunakan flag --output.

genkit eval:flow menuSuggestionFlow --input testInputs.json --output customLabel_evalresult.json

Untuk dijalankan pada sebagian evaluator yang dikonfigurasi, gunakan flag --evaluators dan berikan daftar evaluator yang dipisahkan koma menurut nama:

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

Mensintesis data pengujian menggunakan LLM

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

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;
  }
);

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