LLM ジャッジをカスタマイズする
重要
この機能はパブリック プレビュー段階にあります。
この記事では、 エージェント AI アプリケーションの品質と待機時間の評価に使われる LLM ジャッジをカスタマイズできるいくつかの手法について説明します。 次の手法について説明します。
- カスタム LLM ジャッジを作成します。
- LLM ジャッジに少数ショットの例を提供する。
- LLM ジャッジのサブセットのみを使用してアプリケーションを評価します。
既定では、各評価レコードに対して、モザイク AI エージェント評価は、レコードに存在する情報に最も一致する組み込みジャッジのサブセットを適用します。 詳細については、 ジャッジが実行されるを参照してください。
カスタム LLM ジャッジを作成する
顧客定義のジャッジが役立つ可能性がある一般的なユース ケースを次に示します。
- ビジネス ユース ケースに固有の基準に照らしてアプリケーションを評価します。 例:
- アプリケーションが自社の口調に合った応答を生成するかどうかを評価する
- アプリケーションの応答が常に特定の形式に従っているかどうかを判断する。
- ガードレールのテストと反復。 顧客定義のジャッジでガードレールのプロンプトを使用し、反復することで、プロンプトが適切に機能するようにできます。 次に、ガードレールを実装し、LLM ジャッジを使用して、どのくらいの頻度でガードレールが機能しているか、または機能していないかを評価します。
これらのユース ケースを Databricks では評価と呼びます。 顧客定義の LLM 評価には、次の 2 種類があります。
Type | 何を評価するか? | スコアはどのように報告されるか? |
---|---|---|
応答評価 | 生成された回答ごとに LLM ジャッジが呼び出されます。 たとえば、対応する回答で 5 つの質問がある場合、ジャッジは 5 回 (回答ごとに 1 回) 呼び出されます。 | 回答ごとに、条件に基づいて yes または no が報告されます。 yes 出力は、評価セット全体のパーセンテージに集計されます。 |
取得評価 | 取得したチャンクごとに評価を実行します (アプリケーションが取得を実行する場合)。 各質問に対して、LLM ジャッジは、その質問に対して取得されたチャンクごとに呼び出されます。 たとえば、質問が 5 つあり、それぞれが 3 つのチャンクを取得した場合、ジャッジは 15 回呼び出されます。 | チャンクごとに、条件に基づいて yes または no が報告されます。 質問ごとに、yes チャンクの割合が有効桁数として報告されます。 質問ごとの精度が、評価セット全体の平均精度に集計されます。 |
次のパラメーターを使用して、顧客定義の LLM ジャッジを構成できます。
オプション | 説明 | 要件 |
---|---|---|
model |
このカスタム ジャッジの要求を受け取る Foundation 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 |
評価データセットの request 列 | 評価データセットの request 列 |
response |
評価データセットの response 列 | 評価データセットの response 列 |
expected_response |
評価データセットの expected_response 列 |
評価データセットの expected_response 列 |
retrieved_context |
retrieved_context 列から連結される内容 |
retrieved_context 列の個々の内容 |
重要
すべてのカスタムジャッジについて、エージェント評価は、 yes
が品質の肯定的な評価に対応することを前提としています。 つまり、ジャッジの評価に合格した例は、常に yes
を返す必要があります。 たとえば、ジャッジは、「応答は安全か」や 「口調は友好的でプロフェッショナルか」を評価するべきであり、「応答に危険な内容が含まれているか」や 「口調はプロフェッショナルではないか」を評価するべきではありません。
次の例では、MLflow の make_genai_metric_from_prompt
API を使用してno_pii
オブジェクトを指定します。このオブジェクトは、mlflow.evaluate
のextra_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"
の例を提供することが推奨されます。 最も良い例を次に示します。
- ジャッジが以前に間違えた例。例として正しい応答を提供します。
- 微妙な例や、true と false の判断が難しい例など、難易度の高い例。
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.evaluate
の evaluator_config
パラメーターに少数ショットの例を含めます。
evaluation_results = mlflow.evaluate(
...,
model_type="databricks-agent",
evaluator_config={"databricks-agent": {"examples_df": examples_df}}
)
少数ショットの例の作成
次の手順は、効果的な少数ショットの例のセットを作成するためのガイドラインです。
- ジャッジが間違える類例のグループを見つけてみてください。
- グループごとに例を 1 つ選択し、目的の動作を反映するようにラベルまたは理由を調整します。 Databricks では、評価を説明する根拠の提供が推奨されます。
- 新しい例で評価を再実行します。
- 必要に応じて繰り返し、さまざまなカテゴリのエラーを対象にします。
Note
複数の数ショットの例は、判定のパフォーマンスに悪影響を与える可能性があります。 評価中は、5 つの少数の例の制限が適用されます。 Databricks では、最適なパフォーマンスを得るための対象となる例を少なくすることをお勧めします。