評価フローとメトリック
評価フローは特別な種類のプロンプト フローであり、実行の出力が特定の条件および目標とどの程度よく一致しているかを評価するためのメトリックを計算します。 タスクと目標に合わせて評価フローとメトリックを作成またはカスタマイズし、それを使って他のプロンプト フローを評価するのに使用できます。 この記事では、評価フロー、その開発およびカスタマイズ方法、プロンプト フローのバッチ実行で評価フローを使用してフローのパフォーマンスを評価する方法について説明します。
評価フローを理解する
プロンプト フローは、入力を処理して出力を生成するノードのシーケンスです。 また、評価フローは、必要な入力を消費し、多くの場合スコアまたはメトリックである対応する出力を生成します。 評価フローは、作成のエクスペリエンスや使用方法において、標準フローとは異なります。
評価フローは通常、テスト中の実行に続いて実行され、その出力を使用してスコアやメトリックを計算します。 評価フローは、プロンプト フロー SDK log_metric()
関数を使用してメトリクスをログに記録します。
評価フローの出力は、テスト対象のフローのパフォーマンスの測定結果です。 評価フローには、テスト対象のフローの、テスト データセットに対する全体的なパフォーマンスを計算する集計ノードが存在する場合があります。
次のセクションでは、評価フローにおける入力と出力の定義方法について説明します。
入力
評価フローは、テス中の実行の出力を取り込んで、バッチ実行のメトリックまたはスコアを計算します。 たとえば、テスト対象のフローが質問に基づいて回答を生成する QnA フローである場合は、評価の入力に answer
のような名前を付けることができます。 テスト対象のフローが、テキストをカテゴリに分類する分類フローである場合は、評価の入力に category
のような名前を付けることができます。
実測値として他の入力が必要な場合があります。 たとえば、分類フローの正確性を計算する場合は、実測値としてデータセットで category
列を提供する必要があります。 QnA フローの正確性を計算する場合は、実測値としてデータセットの answer
列を提供する必要があります。 QnA や取得拡張生成 (RAG) のシナリオでは、question
や context
など、メトリックを計算するために他の入力が必要になる場合があります。
評価フローの入力は、標準フローの入力を定義するのと同じ方法で定義します。 既定では、評価ではテストされる実行と同じデータセットが使用されます。 ただし、対応するラベルまたはターゲットの実測値が別のデータセット内にある場合は、そのデータセットに簡単に切り替えることができます。
入力の説明
メトリックの計算に必要な入力を説明するために、説明を追加できます。 説明は、バッチ実行送信で入力ソースをマッピングする場合に表示されます。
各入力の説明を追加するには、評価方法を開発するときに、入力セクションで [説明の表示] を選択し、説明を入力します。
入力フォームから説明を非表示にするには、[説明を非表示にする] を選択します。
出力とメトリック
評価の出力は、テスト対象のフローのパフォーマンスを示す結果です。 出力には、通常、スコアなどのメトリックが含まれており、推論や提案のテキストが含まれることもできます。
出力スコア
プロンプト フローでは、一度に 1 つのデータ行が処理されて、出力レコードが生成されます。 評価フローも同様に、データ行ごとにスコアを計算できるため、各データ ポイントに対するフローのパフォーマンスを確認できます。
評価フローの出力セクションで指定すると、各データ インスタンスのスコアを評価フロー出力として記録できます。 作成エクスペリエンスは、標準的なフローの出力の定義と同じです。
[出力の表示] を選択すると、[出力] タブで個々のスコアを表示できます。標準フローのバッチ実行の出力をチェックするのと同じです。 これらのインスタンスレベルのスコアを、テストしたフローの出力に追加できます。
集計とメトリックのログ
評価フローでは、実行の全体的な評価も提供されます。 全体的な結果を個別の出力スコアと区別するために、これらの全体的な実行パフォーマンス値はメトリックと呼ばれます。
個々のスコアに基づいて全体的な評価値を計算するには、評価フロー内の Python ノードで [集計] チェックボックスを選択して reduce ノードに切り替えます。 その後、ノードは入力を一覧として受け取り、バッチとして処理します。
集計を使用して、各フロー出力のすべてのスコアを計算して処理し、各スコアを使用することで全体的な結果を計算できます。 たとえば、分類フローの正確性を計算するには、各スコア出力の正確性を計算してから、すべてのスコア出力の平均の正確性を計算できます。 次に、promptflow_sdk.log_metric()
を使って、平均の正確性をメトリックとしてログできます。 メトリックは float
や int
などの数値にする必要があります。 文字列型メトリックのログはサポートされていません。
次のコード スニペットは、すべてのデータ ポイントの正確性スコア (grades
) を平均して全体的な正確性を計算する例です。 全体的な正確性は promptflow_sdk.log_metric()
を使用してメトリックとしてログに記録されます。
from typing import List
from promptflow import tool, log_metric
@tool
def calculate_accuracy(grades: List[str]): # Receive a list of grades from a previous node
# calculate accuracy
accuracy = round((grades.count("Correct") / len(grades)), 2)
log_metric("accuracy", accuracy)
return accuracy
この関数は Python ノードで呼び出したため、他の場所に割り当てる必要はありません。後でメトリックを見ることができます。 バッチ実行でこの評価方法を使用した後、出力を表示するときに [メトリック] タブを選択することで、全体的なパフォーマンスを示すメトリックを表示できます。
評価フローを開発する
独自の評価フローを開発するには、Azure Machine Learning スタジオの [Prompt flow]\(プロンプト フロー\) ページで、[作成] を選択します。 [新しいフローの作成] ページでは、次のいずれかを実行できます。
[種類別に作成する] の下の [評価フロー] カードで [作成] を選択します。 この選択で、新しい評価方法を開発するためのテンプレートが提供されます。
[ギャラリーを詳しく見る] で [評価フロー] を選択し、使用可能な組み込みフローから 1 つを選択します。 [詳細を表示] を選択して各フローの概要を入手し、[クローン] を選択してフローを開いてカスタマイズします。 フロー作成ウィザードを使用すると、独自のシナリオに合わせてフローを変更できます。
各データ ポイントのスコアを計算する
評価フローは、データセット上で実行されるフローのスコアとメトリックを計算します。 評価フローの最初のステップは、各個別データ出力のスコアを計算することです。
たとえば、組み込みの分類の精度の評価フローでは、対応する実測値に対してフローが生成する各出力の正確性を測定する grade
が、grade Python ノードで計算されます。
評価フロー テンプレートを使用する場合、line_process Python ノードでこのスコアを計算します。 line_process Python ノードを大規模言語モデル (LLM) ノードに置き換え、LLM を使ってスコアを計算することも、複数のノードを使って計算を実行することもできます。
評価フローの出力としてノードの出力を指定します。これは、各データ サンプルに対して計算されたスコアが出力であることを示します。 また、詳細情報として根拠を出力することもでき、これは標準フローで出力を定義する場合と同じエクスペリエンスです。
メトリックを計算してログする
評価の次のステップは、実行を評価するための全体的なメトリックを計算することです。 [集計] オプションが選択された Python ノードでメトリックを計算します。 このノードは、前の計算ノードからスコアを受け取って一覧に整理し、全体の値を計算します。
評価テンプレートを使用する場合、このスコアは aggregate ノードで計算されます。 次のコード スニペットは、集計ノードのテンプレートを示しています。
from typing import List
from promptflow import tool
@tool
def aggregate(processed_results: List[str]):
"""
This tool aggregates the processed result of all lines and log metric.
:param processed_results: List of the output of line_process node.
"""
# Add your aggregation logic here
aggregated_results = {}
# Log metric
# from promptflow import log_metric
# log_metric(key="<my-metric-name>", value=aggregated_results["<my-metric-name>"])
return aggregated_results
スコアの平均値、中央値、標準偏差の計算など、独自の集計ロジックを使用できます。
promptflow.log_metric()
関数を使用してメトリックをログに記録します。 1 つの評価フローで複数のメトリックをログできます。 メトリックは数値 (float
/int
) でなければなりません。
評価フローを使用する
独自の評価フローとメトリックを作成した後は、このフローを使って、標準フローのパフォーマンスを評価できます。 たとえば、QnA フローを評価し、大規模なデータセットでのパフォーマンスをテストできます。
Azure Machine Learning スタジオで、評価するフローを開き、上部のメニュー バーで [評価] を選択します。
[Batch run & Evaluate] (バッチ実行と評価) ウィザードで、[基本設定] と [バッチ実行設定] を完了し、テスト用のデータセットを読み込んで入力マッピングを構成します。 詳細については、「バッチ実行を送信してフローを評価する」を参照してください。
[Select evaluation]\(評価の選択\) の手順で、実行する 1 つ以上のカスタマイズされた評価または組み込みの評価を選択できます。 [カスタマイズされた評価] により、作成、複製、またはカスタマイズした評価フローの一覧が表示されます。 同じプロジェクトで作業する他のユーザーが作成した評価フローは、このセクションには表示されません。
[Configure evaluation]\(評価の構成\) 画面で、評価方法に必要な入力データのソースを指定します。 たとえば、グラウンド トゥルース列はデータセットから取得できます。 評価方法にデータセットからのデータが必要ない場合は、データセットを選択する、または入力マッピング セクションでデータセット列を参照する必要はありません。
[Evaluation input mapping]\(評価入力のマッピング\) セクションで、評価に必要な入力のソースを指定できます。 データ ソースが実行の出力の場合は、ソースを
${run.outputs.[OutputName]}
として設定します。 データがテスト データセットからのデータの場合は、ソースを${data.[ColumnName]}
として設定します。 データ入力に設定した説明もここに表示されます。 詳細については、「バッチ実行を送信してフローを評価する」を参照してください。重要
評価フローに LLM ノードがある場合、または資格情報やその他のキーを使用するために接続が必要な場合は、この画面の [接続] セクションに接続データを入力して評価フローを使用できるようにする必要があります。
[確認と送信] を選択し、[送信] を選択して、評価フローを実行します。
評価フロー完了後、評価したフローの上部にある [バッチ実行を表示]>[最新のバッチ実行出力を表示] を選択すると、インスタンスレベルのスコアが表示されます。 [関連する結果を追加] ドロップダウン リストから評価実行を選択すると、各データ行のグレードが表示されます。