評価指標を定義する

評価データセットを作成したら、次はモデルのパフォーマンスの測定に使用する指標を定義します。生成 AI モデルは幅広いタスク向けのアプリケーションを作成できます。Gen AI Evaluation Service は、主観的な評価を客観的で実用的な結果に変換するテスト駆動型フレームワークを使用します。

評価指標に関連する主なコンセプトは次のとおりです。

  • ルーブリック: LLM モデルまたはアプリケーションのレスポンスを評価する方法の基準。

  • 指標: 評価基準と照らし合わせてモデル出力を測定するスコア。

Gen AI Evaluation Service には、次のカテゴリの指標が用意されています。

  • ルーブリック ベースの指標: LLM を評価ワークフローに組み込みます。

    • アダプティブ ルーブリック(推奨): 各プロンプトに対してルーブリックが動的に生成されます。回答は、プロンプトに固有の合格または不合格のフィードバックで評価されます。

    • 静的ルーブリック: ルーブリックが明示的に定義され、すべてのプロンプトに同じルーブリックが適用されます。レスポンスは、同じ一連の数値スコアリング ベースの評価ツールで評価されます。プロンプトごとに 1 つの数値スコア(1 ~ 5 など)。非常に特定のディメンションで評価が必要な場合、またはすべてのプロンプトでまったく同じルーブリックが必要な場合。

  • 計算ベースの指標: 通常はグラウンド トゥルースを使用して、決定論的アルゴリズムでレスポンスを評価します。プロンプトごとの数値スコア(0.0 ~ 1.0 など)。グラウンド トゥルースが利用可能で、確定的手法と照合できる場合。

  • カスタム関数指標: Python 関数を使用して独自の指標を定義します。

ルーブリックベースの指標

ルーブリック ベースの指標は、ワークフロー内に大規模言語モデルを組み込んで、モデル レスポンスの品質を評価します。ルーブリック ベースの評価は、さまざまなタスクに適しています。特に、決定論的アルゴリズムでは評価が難しいことが多い、文章の品質、安全性、指示の実行に適しています。

適応型ルーブリック

適応型ルーブリックは、モデルの単体テストのように機能します。適応型ルーブリックでは、データセット内の個々のプロンプトごとに、合格または不合格のテストの一意のセットが動的に生成されます。ルーブリックは、評価をリクエストされたタスクに関連付け、客観的で説明可能かつ一貫性のある結果を提供することを目的としています。

次の例は、一連のプロンプトに対して適応型ルーブリックが生成される仕組みを示しています。

プロンプト 適応型ルーブリック
「太陽光発電のメリットに関する次の記事を 100 語以内で要約してください…」
  • 要約は 100 語以内ですか?
  • サマリーに太陽光発電のメリットが記載されていますか?
  • 回答に記事に記載されていない情報が含まれているか
「従業員を会社の年次ピクニックに誘う、短く親しみやすいメールを作成してください。9 月 15 日にベジタリアン向けのオプションが利用可能になることを伝えてください。」
  • メールのトーンは親しみやすく、魅力的ですか?
  • メールに 9 月 15 日という日付が記載されていますか?
  • ベジタリアン メニューが用意されることがメールに記載されていますか?

アダプティブ ルーブリックには SDK を通じてアクセスできます。デフォルトとして GENERAL_QUALITY から始めることをおすすめします。

一般的な品質指標

GENERAL_QUALITY は、入力プロンプトに応じて、指示の遵守、書式設定、トーン、スタイルなど、さまざまなタスクをカバーする一連のルーブリックを生成します。次のコード行で、ルーブリックの生成と検証を組み合わせることができます。

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.GENERAL_QUALITY,
    ],
)

ルーブリックを個別に生成し(モデルとエージェント間で確認または再利用するため)、モデルのレスポンスの評価に使用できます。

from vertexai import types

# Use GENERAL_QUALITY recipe to generate rubrics, and store them
# as a rubric group named "general_quality_rubrics".
data_with_rubrics = client.evals.generate_rubrics(
    src=eval_dataset_df,
    rubric_group_name="general_quality_rubrics",
    predefined_spec_name=types.RubricMetric.GENERAL_QUALITY,
)

# Specify the group of rubrics to use for the evaluation.
eval_result = client.evals.evaluate(
    dataset=data_with_rubrics,
    metrics=[types.RubricMetric.GENERAL_QUALITY(
      rubric_group_name="general_quality_rubrics",
    )],
)

自然言語の guidelines を使用して GENERAL_QUALITY に指示し、最も重要な基準にルーブリックの生成を集中させることもできます。Gen AI Evaluation Service は、デフォルトのタスクと指定したガイドラインの両方をカバーするルーブリックを生成します。

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.GENERAL_QUALITY(
            metric_spec_parameters={
                "guidelines": "The response must maintain a professional tone and must not provide financial advice."
            }
        )
    ],
)

ターゲティングに関する品質指標

モデルの品質のより的を絞った側面を評価する必要がある場合は、特定の領域に焦点を当てたルーブリックを生成する指標を使用できます。次に例を示します。

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.TEXT_QUALITY,
        types.RubricMetric.INSTRUCTION_FOLLOWING,
    ],
)

Gen AI Evaluation Service には、次のタイプのアダプティブ ルーブリックが用意されています。

  • INSTRUCTION_FOLLOWING: プロンプトの特定の制約と指示にレスポンスがどの程度準拠しているかを測定します。

  • TEXT_QUALITY: 回答の言語品質に特に重点を置き、流暢さ、一貫性、文法を評価します。

マルチターンの会話

  • multi_turn_general_quality: マルチターンのダイアログで会話全体の品質を評価します。

  • multi_turn_text_quality: マルチターンのダイアログ内のレスポンスのテキストの品質を評価します。

エージェントの評価

  • final_response_reference_free: 参照回答を必要とせずに、エージェントの最終回答の品質を評価します。

対象を絞ったアダプティブ ルーブリックの詳細については、アダプティブ ルーブリックの詳細をご覧ください。

静的ルーブリック

静的ルーブリックでは、データセット内のすべての例に単一の固定されたスコアリング ガイドラインが適用されます。このスコア駆動型のアプローチは、すべてのプロンプトで一貫したベンチマークに対してパフォーマンスを測定する必要がある場合に便利です。

たとえば、次の静的評価基準は、テキストの品質を 1 ~ 5 のスケールで評価します。

5: (Very good). Exceptionally clear, coherent, fluent, and concise. Fully adheres to instructions and stays grounded.
4: (Good). Well-written, coherent, and fluent. Mostly adheres to instructions and stays grounded. Minor room for improvement.
3: (Ok). Adequate writing with decent coherence and fluency. Partially fulfills instructions and may contain minor ungrounded information. Could be more concise.
2: (Bad). Poorly written, lacking coherence and fluency. Struggles to adhere to instructions and may include ungrounded information. Issues with conciseness.
1: (Very bad). Very poorly written, incoherent, and non-fluent. Fails to follow instructions and contains substantial ungrounded information. Severely lacking in conciseness.

Gen AI Evaluation Service には、次の静的ルーブリック指標が用意されています。

  • GROUNDING: 提供されたソーステキスト(グラウンド トゥルース)に対して、事実性と一貫性をチェックします。この指標は RAG システムにとって重要です。

  • SAFETY: ヘイトスピーチや危険なコンテンツなど、安全に関するポリシーの違反についてモデルのレスポンスを評価します。

FLUENCY などの指標プロンプト テンプレートを使用することもできます。

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.RubricMetric.SAFETY,
        types.RubricMetric.GROUNDING,
        types.RubricMetric.FLUENCY,
    ],
)

静的ルーブリックをカスタマイズする

特殊なニーズがある場合は、独自の静的ルーブリックを作成できます。この方法では、最大限の制御が可能ですが、一貫性のある信頼性の高い結果を得るには、評価プロンプトを慎重に設計する必要があります。静的ルーブリックをカスタマイズする前に、GENERAL_QUALITY のガイドラインを使用することをおすすめします。

# Define a custom metric to evaluate language simplicity
simplicity_metric = types.LLMMetric(
    name='language_simplicity',
    prompt_template=types.MetricPromptBuilder(
        instruction="Evaluate the story's simplicity for a 5-year-old.",
        criteria={
            "Vocabulary": "Uses simple words.",
            "Sentences": "Uses short sentences.",
        },
        rating_scores={
            "5": "Excellent: Very simple, ideal for a 5-year-old.",
            "4": "Good: Mostly simple, with minor complex parts.",
            "3": "Fair: Mix of simple and complex; may be challenging for a 5-year-old.",
            "2": "Poor: Largely too complex, with difficult words/sentences.",
            "1": "Very Poor: Very complex, unsuitable for a 5-year-old."
        }
    )
)

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        simplicity_metric
    ],
)

計算ベースの指標

計算ベースの指標は、決定論的アルゴリズムを使用して、モデルのレスポンスを基準となる回答と比較してスコアを付けます。データセットにグラウンド トゥルースが必要であり、「正しい」回答が明確に定義されているタスクに最適です。

  • Recall-Oriented Understudy for Gisting Evaluation(rouge_l、rouge_1): モデルのレスポンスと参照テキストの間の n グラム(連続する単語のシーケンス)の適合率を測定します。通常は、テキスト要約の評価に使用されます。

  • Bilingual Evaluation Understudy(bleu): 一致する n グラムをカウントして、回答と高品質の参照テキストの類似度を測定します。これは翻訳の品質の標準的な指標ですが、他のテキスト生成タスクにも使用できます。

  • 完全一致(exact_match): 参照回答と完全に一致する回答の割合を測定します。これは、事実に基づく質問応答や、正しい回答が 1 つしかないタスクに役立ちます。

from vertexai import types

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[
        types.Metric(name='bleu'),
        types.Metric(name='rouge_l'),
        types.Metric(name='exact_match')
    ],
)

カスタム関数指標

カスタム Python 関数を custom_function パラメータに渡すことで、カスタム評価ロジックを実装することもできます。Gen AI 評価サービスは、データセットの各行に対してこの関数を実行します。

# Define a custom function to check for the presence of a keyword
def contains_keyword(instance: dict) -> dict:
    keyword = "magic"
    response_text = instance.get("response", "")
    score = 1.0 if keyword in response_text.lower() else 0.0
    return {"score": score}

keyword_metric = types.Metric(
    name="keyword_check",
    custom_function=contains_keyword
)

eval_result = client.evals.evaluate(
    dataset=eval_dataset,
    metrics=[keyword_metric]
)

次のステップ