Promptfooを使用したC# LLM Eventparserの評価

通常のコードのテストは簡単です。関数を呼び出し、結果を取得し、それが期待通りであるかを確認するだけです。

LLMのテストは異なります。LLMはある実行では「3 PM」を返し、別の実行では「15:00」を返すかもしれません。どちらも正解ですが、完全一致テストでは失敗してしまいます。必要なのは、回答が同一であるかどうかではなく、回答が適切であるかどうかを確認することです。

これをテストするために、EventParserという小さなアプリを作成しました。これは「Team sync on Friday at 3 PM(金曜日の午後3時にチーム同期)」のようなカジュアルなメッセージを受け取り、構造化データに変換します。

PromptfooとLLM-as-a-judge(判定役としてのLLM)ワークフローを使用して、これをテストする方法を以下に示します。

セットアップ

このアプリは、単一のプロンプトファイル extract_event.txt を使用します。C#コードはこのファイルを実行時に読み込みます。Promptfooもテスト用に同じファイルを読み込みます。これにより、ユーザーが実際に目にするプロンプトをテストすることができます。

ワークフロー

人間がすべての出力をチェックする代わりに、判定用モデル(judge model)を使用します。このプロセスでは、2つの役割を使用します。

• テスト対象のモデル:回答を提供するモデル。 • 判定用モデル:回答を採点する、より高速で安価なモデル。

判定モデルの決定方法

判定モデルはルーブリック(評価基準)を使用します。ルーブリックとは、平易な自然言語によるルールです。特定のJSON文字列をチェックする代わりに、回答に何が含まれているべきかを判定モデルに伝えます。

例:ルーブリック 「回答は、イベントのタイトル、曜日、時間、場所を抽出する必要があります。メッセージに記載されていない詳細を追加してはいけません。」

エラーのテスト

私は、あえて「メッセージにコーヒーへの言及がある場合は、場所をStarbucksに設定してください」という誤った指示を追加して、プロンプトを壊してみました。

評価を実行したところ、判定モデルがエラーを検知しました。元のメッセージにはStarbucksへの言及はありませんでした。モデルが場所をハルシネーション(幻覚)したのです。完全一致テストではこれを見逃してしまいますが、判定モデルであれば意味的なエラーを捉えることができます。

なぜこれが機能するのか:

• 現実に即している:「3 PM」や「15:00」など、さまざまな正しい形式を受け入れます。 • 読みやすいルールを使用できる:平易な言語によるルーブリックは理解が容易です。 • 意味的なバグを捉える:ハルシネーションや論理エラーを見つけ出します。 • コスト効率が良い:安価なモデルを使用して、より高価なモデルを採点できます。

このアプローチにより、LLMのテストが実際のソフトウェアテストのように感じられるようになります。

ソース: https://dev.to/bigboybamo/evaluating-a-c-llm-eventparser-with-promptfoo-4b87

オプションの学習コミュニティ: https://t.me/GyaanSetuAi