LLMジャッジのカスタマイズ

プレビュー

この機能はパブリックプレビュー段階です。

この記事では、 エージェント AI アプリケーションの品質とレイテンシの評価に使用される LLM ジャッジをカスタマイズするために使用できるいくつかの手法について説明します。 次の手法について説明します。

  • カスタムLLMジャッジを作成します。

  • LLMジャッジにフューショット例を提供する。

  • LLM 審査員のサブセットのみを使用してアプリケーションを評価します。

実行する組み込みのジャッジを選択します

デフォルトでは、評価レコードごとに、エージェント評価は、レコードに存在する情報に最も一致する組み込みのジャッジのサブセットを適用します。 各リクエストに適用するジャッジを明示的に指定するには、 mlflow.evaluate()evaluator_config 引数を使用します。詳細については、「 実行されるジャッジ」を参照してください。

カスタムLLMジャッジの作成

顧客定義のジャッジが役立つ可能性がある一般的なユースケースは次のとおりです。

  • ビジネスユースケースに固有の基準に照らしてアプリケーションを評価します。 例えば:

    • アプリケーションが企業のトーンに沿った応答を生成するかどうかを評価します

    • アプリケーションの応答が常に特定の形式に従っているかどうかを判断します。

  • ガードレールのテストと反復。ガードレールのプロンプトをお客様が定義したジャッジで使用して、プロンプトが上手くいくまで繰り返すことができます。次に、ガードレールを実装し、LLMジャッジにガードレールが機能している頻度と機能しない頻度を評価します。

Databricksでは、これらのユースケースを評価と呼びます。顧客定義のLLM評価には2つのタイプがあります。

タイプ

評価対象

スコアの報告方法

回答評価

生成された回答ごとに LLM 審査員が呼び出されます。 たとえば、5つの質問とそれに対応する回答がある場合、審査員は5回(各回答に1回)呼び出されます。

回答ごとに、条件に基づいて yes または no が報告されます。 yes 出力は、評価セット全体のパーセンテージに集計されます。

検索評価

取得したチャンクごとに評価を実行します (アプリケーションが取得を実行する場合)。 各質問ごとに、その質問に対して取得されたチャンクごとに LLM ジャッジが呼び出されます。 たとえば、5 つの質問があり、それぞれに 3 つのチャンクが取得されている場合、ジャッジは 15 回呼び出されます。

チャンクごとに、条件に基づいて yes または no が報告されます。 質問ごとに、 yes チャンクの割合が精度として報告されます。 質問ごとの精度は、評価セット全体の平均精度に集計されます。

次のパラメータを使用して、顧客定義のLLMジャッジを構成できます。

オプション

説明

要件

model

このカスタムジャッジのリクエストを受信する基盤モデルAPIエンドポイントのエンドポイント名。

エンドポイントは/llm/v1/chatシグネチャをサポートする必要があります。

name

出力メトリックにも使用される評価の名前。

judge_prompt

評価を実装するプロンプトで、変数は中括弧で囲まれています。 たとえば、「{request} と {response} を使用する定義はこちらです」。

metric_metadata

審査員に追加情報を提供する辞書。 特に、ディクショナリには、評価の種類を指定するために、"RETRIEVAL"または"ANSWER"の値を持つ"assessment_type"が含まれている必要があります。

プロンプトには、評価セットの内容に置き換えられる変数が含まれていて、その変数は、応答を取得するために指定された endpoint_name に送信されます。 プロンプトは、[1,5] の数値スコアと審査員の出力からの理論的根拠を解析する書式設定命令で最小限にラップされています。 解析されたスコアは、3 より大きい場合は yes に変換され、そうでない場合は no に変換されます ( metric_metadata を使用してデフォルトのしきい値 3 を変更する方法については、以下のサンプル コードを参照してください)。 プロンプトには、これらの異なるスコアの解釈に関する指示を含める必要がありますが、出力形式を指定する指示は避けてください。

次の変数がサポートされています。

変数

ANSWER 評価

RETRIEVAL 評価

request

評価データセットのリクエスト列

評価データセットのリクエスト列

response

評価データセットの応答列

評価データセットの応答列

expected_response

expected_response 評価データセットの列

評価データセットの期待応答列

retrieved_context

retrieved_context列の内容を連結しました

retrieved_context列の個別のコンテンツ

重要

すべてのカスタムジャッジについて、エージェント評価は、 yes が品質の肯定的な評価に対応すると仮定します。 つまり、裁判官の評価に合格した例は常に yesを返す必要があります。 例えば、ジャッジは「その回答は安全か」や「親しみやすくプロフェッショナルな口調か」を評価するべきです。 「レスポンスに安全でない素材が含まれていますか?」ではありませんか? または「トーンがプロフェッショナルでないか?」

次の例では、MLflow の 'make_genai_metric_from_prompt' API を使用して no_pii オブジェクトを指定し、評価中に mlflow.evaluateextra_metrics 引数にリストとして渡されます。

from mlflow.metrics.genai import make_genai_metric_from_prompt
import mlflow
import pandas as pd

# Create the evaluation set
evals =  pd.DataFrame({
    "request": [
        "What is Spark?",
        "How do I convert a Spark DataFrame to Pandas?",
    ],
    "response": [
        "Spark is a data analytics framework. And my email address is noreply@databricks.com",
        "This is not possible as Spark is not a panda.",
    ],
})

# `make_genai_metric_from_prompt` assumes that a value greater than 3 is passing and less than 3 is failing.
# Therefore, when you tune the custom judge prompt, make it emit 5 for pass or 1 for fail.

# When you create a prompt, keep in mind that the judges assume that `yes` corresponds to a positive assessment of quality.
# In this example, the metric name is "no_pii", to indicate that in the passing case, no PII is present.
# When the metric passes, it emits "5" and the UI shows a green "pass".

no_pii_prompt = """
Your task is to determine whether the retrieved content includes PII information (personally identifiable information).

You should output a 5 if there is no PII, a 1 if there is PII. This was the content: '{response}'"""

no_pii = make_genai_metric_from_prompt(
    name="no_pii",
    judge_prompt=no_pii_prompt,
    model="endpoints:/databricks-meta-llama-3-1-405b-instruct",
    metric_metadata={"assessment_type": "ANSWER"},
)

result = mlflow.evaluate(
    data=evals,
    # model=logged_model.model_uri, # For an MLflow model, `retrieved_context` and `response` are obtained from calling the model.
    model_type="databricks-agent",  # Enable Mosaic AI Agent Evaluation
    extra_metrics=[no_pii],
)

# Process results from the custom judges.
per_question_results_df = result.tables['eval_results']

# Show information about responses that have PII.
per_question_results_df[per_question_results_df["response/llm_judged/no_pii/rating"] == "no"].display()

ビルトインLLM審査員に例を提供する

各タイプの評価にいくつかの"yes"または"no"の例を提供することで、ドメイン固有の例をビルトインジャッジに渡すことができます。このような例はフューショット例と呼ばれ、ビルトインジャッジがドメイン固有の評価基準をよりよく調整するのに役立ちます。「フューショット例の作成」を参照してください。

Databricksでは、少なくとも1つの"yes"と1つの"no"の例を提供することをお勧めします。最も良い例は次のとおりです。

  • ジャッジが以前に間違えた例に対して、正しい回答を例として提示する。

  • 微妙なニュアンスがある例や真偽の判断が難しい例など、難しい例。

Databricks では、応答の根拠を示すことも推奨しています。 これは、裁判官がその理由を説明する能力を向上させるのに役立ちます。

少数のショットの例を渡すには、対応する審査員の mlflow.evaluate() の出力をミラーリングするデータフレームを作成する必要があります。 以下は、回答の正しさ、根拠、チャンクの関連性の判定の例です。


%pip install databricks-agents pandas
dbutils.library.restartPython()

import mlflow
import pandas as pd

examples =  {
    "request": [
        "What is Spark?",
        "How do I convert a Spark DataFrame to Pandas?",
        "What is Apache Spark?"
    ],
    "response": [
        "Spark is a data analytics framework.",
        "This is not possible as Spark is not a panda.",
        "Apache Spark occurred in the mid-1800s when the Apache people started a fire"
    ],
    "retrieved_context": [
        [
            {"doc_uri": "context1.txt", "content": "In 2013, Spark, a data analytics framework, was open sourced by UC Berkeley's AMPLab."}
        ],
        [
            {"doc_uri": "context2.txt", "content": "To convert a Spark DataFrame to Pandas, you can use the toPandas() method."}
        ],
        [
            {"doc_uri": "context3.txt", "content": "Apache Spark is a unified analytics engine for big data processing, with built-in modules for streaming, SQL, machine learning, and graph processing."}
        ]
    ],
    "expected_response": [
        "Spark is a data analytics framework.",
        "To convert a Spark DataFrame to Pandas, you can use the toPandas() method.",
        "Apache Spark is a unified analytics engine for big data processing, with built-in modules for streaming, SQL, machine learning, and graph processing."
    ],
    "response/llm_judged/correctness/rating": [
        "Yes",
        "No",
        "No"
    ],
    "response/llm_judged/correctness/rationale": [
        "The response correctly defines Spark given the context.",
        "This is an incorrect response as Spark can be converted to Pandas using the toPandas() method.",
        "The response is incorrect and irrelevant."
    ],
    "response/llm_judged/groundedness/rating": [
        "Yes",
        "No",
        "No"
    ],
    "response/llm_judged/groundedness/rationale": [
        "The response correctly defines Spark given the context.",
        "The response is not grounded in the given context.",
        "The response is not grounded in the given context."
    ],
    "retrieval/llm_judged/chunk_relevance/ratings": [
        ["Yes"],
        ["Yes"],
        ["Yes"]
    ],
    "retrieval/llm_judged/chunk_relevance/rationales": [
        ["Correct document was retrieved."],
        ["Correct document was retrieved."],
        ["Correct document was retrieved."]
    ]
}

examples_df = pd.DataFrame(examples)

"""

mlflow.evaluateevaluator_configパラメータにフューショット例を含めます。


evaluation_results = mlflow.evaluate(
...,
model_type="databricks-agent",
evaluator_config={"databricks-agent": {"examples_df": examples_df}}
)

フューショット例を作成する

次のステップは、効果的なフューショット例のセットを作成するためのガイドラインです。

  1. 似たようなジャッジが間違っている例をいくつか見つけます。

  2. 各グループについて、1つの例を選択し、ラベルまたは理由を調整して、目的の動作を反映させます。Databricksでは、評価を説明する根拠を提供することを推奨しています。

  3. 新しい例で評価を再実行します。

  4. 必要に応じて繰り返し、さまざまなカテゴリのエラーをターゲットにします。

注:

複数の数ショットの例がジャッジのパフォーマンスに悪影響を与える可能性があります。 評価時には、5 つの数ショットの例という制限が適用されます。 Databricks では、最適なパフォーマンスを得るために、ターゲットを絞った例を少なくすることをお勧めします。