エージェント向けの高度な評価を設定する

プレビュー

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

この記事では、エージェント アプリケーション用に次の高度な評価手法を構成する方法について説明し、示します。

  • 顧客定義のLLMジャッジを設定する。

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

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

顧客定義の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に変換されます (デフォルトのしきい値 3 を変更するためにmetric_metadataを使用する方法については、以下のサンプル コードを参照してください)。 プロンプトには、これらの異なるスコアの解釈に関する指示を含める必要がありますが、出力形式を指定する指示は避ける必要があります。

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

変数

ANSWER 評価

RETRIEVAL 評価

request

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

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

response

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

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

expected_response

expected_response 評価データセットの列

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

retrieved_context

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

retrieved_context列の個別のコンテンツ

次の例では、MLflowの「make_genai_metric_from_prompt」APIを使ってhas_piiprofessionalのオブジェクトを指定しています。これらは評価時にmlflow.evaluateextra_metrics引数にリストとして渡されます。


from mlflow.metrics.genai import make_genai_metric_from_prompt

# Define a custom assessment to detect PII in the retrieved chunks. The default threshold of 3 will be used to convert the output numerical
# score to "yes" or "no".

has_pii_prompt = "Your task is to determine whether the retrieved content has any PII information. This was the content: '{retrieved_context}'"

has_pii = make_genai_metric_from_prompt(
    name="has_pii",
    judge_prompt=has_pii_prompt,
    model="endpoints:/ep-gpt-4-turbo-2024-04-09",
    metric_metadata={"assessment_type": "RETRIEVAL"},
)

# Define a custom assessment to determine if the tone of the answer is professional. The numerical threshold for conversion to "yes"/"no"
# is set to 2.

professional_prompt = "Your task is to determine if the response has a professional tone. The response is: '{response}'"

professional = make_genai_metric_from_prompt(
    name="professional",
    judge_prompt=professional_prompt,
    model="endpoints:/ep-gpt-4-turbo-2024-04-09",
    metric_metadata={"assessment_type": "ANSWER", "score_threshold": "2"},
)
# Use the custom judges in evaluation
results = mlflow.evaluate(..., model_type="databricks-agent", extra_metrics=[has_pii, professional])

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

# Show information about responses that are not professional
per_question_results_df[per_question_results_df["response/llm_judged/professional/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. 必要に応じて繰り返し、さまざまなカテゴリのエラーをターゲットにします。

注:

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

LLMジャッジのサブセットを使用してエージェントを評価する

デフォルトでは、評価は利用可能なすべてのLLMジャッジによって実行されます。LLMジャッジのサブセットのみを実行するには、カスタム構成を作成します。

注:

チャンクの取得、チェーントークンの数、またはレイテンシのLLMジャッジ以外のメトリクスを無効にすることはできません。

以下は、グラウンドトゥルースを必要としないLLMジャッジを使用するか、LLMジャッジをまったく使用しないかのいずれかを使用して評価するための設定オプションを示しています。

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

import mlflow
import pandas as pd

# Run only LLM judges that don't require ground-truth
config = {
   "metrics": ["groundedness", "relevance_to_query", "chunk_relevance"]
}
# Run no LLM judges
config = {
   "metrics": []
}

設定を定義したら、mlflow.evaluateevaluator_configパラメータでそれを指定できます。


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