評価は、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: geminiPro,
metrics: [GenkitMetric.FAITHFULNESS, GenkitMetric.ANSWER_RELEVANCY],
embedder: textEmbeddingGecko, // GenkitMetric.ANSWER_RELEVANCY requires an embedder
}),
],
// ...
});
npm install @genkit-ai/evaluator @genkit-ai/vertexai
まず、testQuestions.json
という入力データセットとして使用する入力のセットを定義します。この入力データセットは、評価用の出力を生成するために使用するテストケースを表します。
[
"What is on the menu?",
"Does the restaurant have clams?",
"What is the special of the day?"
]
その後、eval:flow
コマンドを使用して、testQuestions.json
で提供されたテストケースに照らしてフローを評価できます。
genkit eval:flow menuQA --input testQuestions.json
次のコマンドを実行して、デベロッパー UI で評価結果を確認できます。
genkit start
localhost:4000/evaluate
に移動します。
または、出力ファイルを指定して json ファイルで出力を検査することもできます。
genkit eval:flow menuQA --input testQuestions.json --output eval-result.json
サポートされているエバリュエータ
Genkit の評価者
Genkit には、RAGAS に着想を得た少数のネイティブ エバリュエータが用意されており、簡単に始めることができます。
- 誠実さ
- 回答の関連性
- 悪意
Evaluator プラグイン
Genkit はプラグインを介して追加のエバリュエータをサポートしています。
- Vertex AI Rapid Evaluators(VertexAI Plugin を使用)。
- 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
コマンドで使用するカスタムの extractor を指定することもできます。カスタム エクストラクタを使用すると、デフォルトの抽出ロジックをオーバーライドできるため、データセットの作成と評価の効率が向上します。
カスタムの extractor を構成するには、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
フローの extractor を構成します。この構成は、context
フィールドと output
フィールドのエクストラクタをオーバーライドし、input
フィールドにデフォルトのロジックを使用しています。
評価エクストラクタの仕様は次のとおりです。
evaluators
フィールドには、flowName
をスコープとする EvaluatorConfig オブジェクトの配列を指定できますextractors
は、エクストラクタのオーバーライドを指定するオブジェクトです。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 menuQA --input testQuestions.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: geminiPro,
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