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 olehflowName
extractors
adalah objek yang menentukan penggantian ekstraktor. Kunci yang didukung saat ini diextractors
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 langkahfoo-step
untuk kunci ini.(trace) => string;
- Untuk fleksibilitas lebih lanjut, Anda dapat menyediakan fungsi yang menerima rekaman aktivitas Genkit dan menampilkanstring
, serta menentukan logika ekstraksi di dalam fungsi ini. Lihatgenkit/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