評価

評価は、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 はプラグインを介して追加のエバリュエータをサポートしています。

高度な使用方法

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