評価はテストの一種であり、LLM の回答を検証し、品質基準を満たしていることを確認できます。
Firebase Genkit は、プラグインを介してサードパーティの評価ツールをサポートし、LLM を利用したアプリケーションのランタイム状態に関する分析情報を提供する強力なオブザーバビリティ機能と組み合わせます。Genkit ツールを使用すると、入力、出力、情報などのデータを中間ステップから自動的に抽出して、LLM レスポンスのエンドツーエンドの品質を評価し、システムの構成要素のパフォーマンスを把握できます。
たとえば、RAG フローがある場合、Genkit はリトリーバーから返された一連のドキュメントを抽出するため、以下のように、Genkit の信憑性と回答の関連性の指標を使用して、フローのコンテキストで実行中にリトリーバーの品質を評価できます。
import { GenkitMetric, genkitEval } from '@genkit-ai/evaluator';
import { textEmbeddingGecko } from '@genkit-ai/vertexai';
export default configureGenkit({
plugins: [
genkitEval({
judge: gemini15Flash,
metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
embedder: textEmbeddingGecko, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
}),
],
// ...
});
npm install @genkit-ai/evaluator @genkit-ai/vertexai
まず、testInputs.json
という入力データセットとして使用する入力のセットを定義します。この入力データセットは、評価用の出力の生成に使用するテストケースを表します。
["Cheese", "Broccoli", "Spinach and Kale"]
その後、eval:flow
コマンドを使用して、testInputs.json
で提供されるテストケースに対してフローを評価できます。
genkit eval:flow menuSuggestionFlow --input testInputs.json
次のコマンドを実行して、デベロッパー UI で評価結果を確認できます。
genkit start
次に、localhost:4000/evaluate
に移動します。
または、出力ファイルを指定して、json ファイルの出力を調べることもできます。
genkit eval:flow menuSuggestionFlow --input testInputs.json --output eval-result.json
サポートされているエバリュエータ
Genkit 評価者
Genkit には、RAGAS にヒントを得た少数のネイティブ エバリュエータが含まれており、これを使用して作業を開始することができます。
- 誠実さ
- 回答の関連性
- 悪意
Evaluator プラグイン
Genkit はプラグインを介して追加のエバリュエータをサポートしています。
- VertexAI プラグインを介した VertexAI Rapid Evaluators。
- LangChain プラグインを介した LangChain 基準評価。
高度な使用方法
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
エクスポートされたデータは、各 testCase を含む JSON ファイルとして次の形式で出力されます。
[
{
"testCaseId": string,
"input": string,
"output": string,
"context": array of strings,
"traceIds": array of strings,
}
]
データ エクストラクタは、自動的にリトリーバーを特定し、生成されたドキュメントをコンテキスト配列に追加します。デフォルトでは、eval:run
は構成済みのすべてのエバリュエータに対して実行されます。eval:flow
と同様に、eval:run
の結果はデベロッパー UI の評価ページ(localhost:4000/evaluate
)に表示されます。
カスタム エクストラクタ
eval:extractData
コマンドと eval:flow
コマンドで使用するカスタム エクストラクタを指定することもできます。カスタムのエクストラクタを使用すると、デフォルトの抽出ロジックをオーバーライドして、データセットの作成と評価をより効率的に行うことができます。
カスタム エクストラクタを構成するには、genkit-tools.conf.js
という名前のツール構成ファイルをプロジェクトのルートに追加します(まだ行っていない場合)。
cd $GENKIT_PROJECT_HOME
touch genkit-tools.conf.js
ツールの構成ファイルに次のコードを追加します。
module.exports = {
evaluators: [
{
flowName: 'myFlow',
extractors: {
context: { outputOf: 'foo-step' },
output: 'bar-step',
},
},
],
};
このサンプルでは、myFlow
フローのエクストラクタを構成します。この構成ファイルは、context
フィールドと output
フィールドのエクストラクタをオーバーライドし、input
フィールドにデフォルトのロジックを使用しています。
評価エクストラクタの仕様は次のとおりです。
evaluators
フィールドには、flowName
をスコープとする EvaluatorConfig オブジェクトの配列を指定します。extractors
は、Extractor のオーバーライドを指定するオブジェクトです。現在extractors
でサポートされているキーは[input, output, context]
です。使用できる値の型は次のとおりです。string
- これはステップ名にし、stirng として指定します。このステップの出力は、このキーから抽出されます。{ inputOf: string }
または{ outputOf: string }
- これらのオブジェクトはステップの特定のチャネル(入力または出力)を表します。たとえば、{ inputOf: 'foo-step' }
は、このキーのステップfoo-step
の入力を抽出します。(trace) => string;
- 柔軟性をさらに高めるために、Genkit トレースを受け取ってstring
を返す関数を用意し、この関数内で抽出ロジックを指定できます。正確な TraceData スキーマについては、genkit/genkit-tools/common/src/types/trace.ts
をご覧ください。
既存のデータセットでの実行
すでに抽出したデータセットに対して評価を実行するには:
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
LLM を使用したテストデータの合成
PDF ファイルを使用して、ユーザーから尋ねられる可能性のある質問を生成するフローの例を次に示します。
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: 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