評価用ハーネス
mlflow.genai.evaluate()
関数は、生成AIアプリの品質をテストデータ(評価データセット)に対して実行し、スコアラーを適用することで体系的にテストします。
クイックリファレンス
詳細については、 mlflow.genai.evaluate()
を参照してください。
パラメーター | Type | 説明 |
---|---|---|
| MLflow EvaluationDataset、List[Dict]、Pandas DataFrame、Spark DataFrame | テストデータ |
| 呼び出し | アプリ (直接評価のみ) |
| リスト[スコアラー] | Quality メトリクス |
| str | オプションのバージョン追跡 |
仕組み
前提 条件
-
MLflow と必要なパッケージをインストールします。
Bashpip install --upgrade "mlflow[databricks]>=3.1.0" openai "databricks-connect>=16.1"
-
MLflow エクスペリメントを作成するには、環境のセットアップに関するクイックスタートに従ってください。
評価モード
評価モードには、次の 2 つがあります。
直接評価(推奨)
MLflow は、生成AI アプリを直接呼び出して、トレースを生成および評価します。アプリケーションのエントリポイントを Python 関数 (predict_fn
) でラップして渡すか、アプリがDatabricksモデルサービングエンドポイントとしてデプロイされている場合は、そのエンドポイントを to_predict_fn
でラップして渡すことができます。
このモードでは、アプリを直接呼び出すことで、オフライン評価用に定義されたスコアラーを 本番運用 モニタリング で再利用できます。これは、結果のトレースが同一になるためです。
次のコードは、評価を実行する方法の例を示しています。
import mlflow
from mlflow.genai.scorers import RelevanceToQuery, Safety
# Your GenAI app with MLflow tracing
@mlflow.trace
def my_chatbot_app(question: str) -> dict:
# Your app logic here
if "MLflow" in question:
response = "MLflow is an open-source platform for managing ML and GenAI workflows."
else:
response = "I can help you with MLflow questions."
return {"response": response}
# Evaluate your app
results = mlflow.genai.evaluate(
data=[
{"inputs": {"question": "What is MLflow?"}},
{"inputs": {"question": "How do I get started?"}}
],
predict_fn=my_chatbot_app,
scorers=[RelevanceToQuery(), Safety()]
)
その後、UI で結果を表示できます。
解答用紙の評価
生成 AI アプリを直接実行できない場合は、既存のトレースまたはコンピュート前の出力を評価用に提供できます。 ユースケースの例としては、外部システムからの出力のテスト、履歴トレースの評価、異なるプラットフォーム間での出力の比較などがあります。
本番運用環境と異なるトレースを持つ解答用紙を使用している場合、 本番運用 モニタリングに利用するためには、スコアラー関数の書き換えが必要になることがあります。
入力と出力の使用例
次のコードは、評価を実行する方法の例を示しています。
import mlflow
from mlflow.genai.scorers import Safety, RelevanceToQuery
# Pre-computed results from your GenAI app
results_data = [
{
"inputs": {"question": "What is MLflow?"},
"outputs": {"response": "MLflow is an open-source platform for managing machine learning workflows, including tracking experiments, packaging code, and deploying models."},
},
{
"inputs": {"question": "How do I get started?"},
"outputs": {"response": "To get started with MLflow, install it using 'pip install mlflow' and then run 'mlflow ui' to launch the web interface."},
}
]
# Evaluate pre-computed outputs
evaluation = mlflow.genai.evaluate(
data=results_data,
scorers=[Safety(), RelevanceToQuery()]
)
その後、UI で結果を表示できます。
既存のトレースの使用例
次のコードは、既存のトレースを使用して評価を実行する方法を示しています。
import mlflow
# Retrieve traces from production
traces = mlflow.search_traces(
filter_string="trace.status = 'OK'",
)
# Evaluate problematic traces
evaluation = mlflow.genai.evaluate(
data=traces,
scorers=[Safety(), RelevanceToQuery()]
)
主要なパラメーター
def mlflow.genai.evaluate(
data: Union[pd.DataFrame, List[Dict], mlflow.genai.datasets.EvaluationDataset],
scorers: list[mlflow.genai.scorers.Scorer],
predict_fn: Optional[Callable[..., Any]] = None,
model_id: Optional[str] = None,
) -> mlflow.models.evaluation.base.EvaluationResult:
data
評価データセットは、次のいずれかの形式である必要があります。
EvaluationDataset
(推奨)。- ディクショナリ、Pandas DataFrame、または Spark DataFrame のリスト。
データ引数が DataFrame または辞書のリストとして提供される場合は、次のスキーマに従う必要があります。これは、 EvaluationDataset で使用されるスキーマと一致しています。Databricks では、各レコードのリネージを追跡することに加えて、スキーマの検証を強制する EvaluationDataset
を使用することをお勧めします。
フィールド | データ型 | 説明 | 直接評価で使用 | 解答用紙と併用 |
---|---|---|---|---|
|
| を使用して | 必須 |
|
|
| 対応する | トレースから MLflow によって生成された、指定 しないでください 。 |
|
|
| に対応するグラウンドトゥルースラベルを持つ | オプション | オプション |
|
| 要求のトレース オブジェクト。 | トレースから MLflow によって生成された、指定 しないでください 。 |
|
predict_fn
生成 AI アプリのエントリ ポイント。このパラメータは 、直接評価でのみ使用されます。 predict_fn
次の要件を満たす必要があります。
data
のinputs
ディクショナリのキーをキーワード引数として受け入れます。- JSON シリアル化可能なディクショナリを返します。
- MLflow Tracingでインストルメント化されています。
- 呼び出しごとに 1 つのトレースを出力します。
scorers
適用する品質メトリクスの一覧です。 次のものを提供できます。
詳細は スコアラー をご覧ください。
model_id
結果をアプリのバージョンにリンクするためのオプションのモデル識別子(例: "models:/my-app/1"
)。詳細については、「 バージョン追跡」 を参照してください。
データ形式
直接評価の場合
フィールド | 必須 | 説明 |
---|---|---|
| ✅ | 辞書があなたに渡されます |
| オプション | スコアラーのためのオプションのグラウンドトゥルース |
解答用紙の評価に
オプション A - 入力と出力を提供します。
フィールド | 必須 | 説明 |
---|---|---|
| ✅ | 生成AI アプリへの元の入力 |
| ✅ | アプリからのプレコンピュート出力 |
| オプション | スコアラーのためのオプションのグラウンドトゥルース |
オプション B - 既存のトレースを提供します。
フィールド | 必須 | 説明 |
---|---|---|
| ✅ | MLflow Trace オブジェクトと入力/出力 |
| オプション | スコアラーのためのオプションのグラウンドトゥルース |
一般的なデータ入力パターン
MLflow 評価データセットを使用して評価する (推奨)
MLflow 評価データセットは、バージョン管理、リネージ追跡、および本番運用対応評価のための Unity Catalog との統合を提供します。 これらは、評価データのバージョン管理とリネージ追跡が必要な場合や、トレースを評価レコードに変換する必要がある場合に役立ちます。
import mlflow
from mlflow.genai.scorers import Correctness, Safety
from my_app import agent # Your GenAI app with tracing
# Load versioned evaluation dataset
dataset = mlflow.genai.datasets.get_dataset("catalog.schema.eval_dataset_name")
# Run evaluation
results = mlflow.genai.evaluate(
data=dataset,
predict_fn=agent,
scorers=[Correctness(), Safety()],
)
トレースまたはゼロからデータセットを作成するには、「 評価データセットの構築」を参照してください。
辞書のリストを使用して評価する
辞書の単純なリストを使用して、正式な評価データセットを作成せずに迅速なプロトタイピングを行います。これは、迅速なプロトタイポ作成、小規模なデータセット (100 例未満)、および非公式の開発テストに役立ちます。
import mlflow
from mlflow.genai.scorers import Correctness, RelevanceToQuery
from my_app import agent # Your GenAI app with tracing
# Define test data as a list of dictionaries
eval_data = [
{
"inputs": {"question": "What is MLflow?"},
"expectations": {"expected_facts": ["open-source platform", "ML lifecycle management"]}
},
{
"inputs": {"question": "How do I track experiments?"},
"expectations": {"expected_facts": ["mlflow.start_run()", "log metrics", "log parameters"]}
},
{
"inputs": {"question": "What are MLflow's main components?"},
"expectations": {"expected_facts": ["Tracking", "Projects", "Models", "Registry"]}
}
]
# Run evaluation
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=agent,
scorers=[Correctness(), RelevanceToQuery()],
)
本番運用の場合は、 MLflow 評価 データセットに変換します。
Pandas DataFrame を使用した評価
CSV ファイルまたは既存のデータサイエンスワークフローを操作する場合の評価に Pandas DataFrames を使用します。これは、迅速なプロトタイポ作成、小規模なデータセット (100 例未満)、および非公式の開発テストに役立ちます。
import mlflow
import pandas as pd
from mlflow.genai.scorers import Correctness, Safety
from my_app import agent # Your GenAI app with tracing
# Create evaluation data as a Pandas DataFrame
eval_df = pd.DataFrame([
{
"inputs": {"question": "What is MLflow?"},
"expectations": {"expected_response": "MLflow is an open-source platform for ML lifecycle management"}
},
{
"inputs": {"question": "How do I log metrics?"},
"expectations": {"expected_response": "Use mlflow.log_metric() to log metrics"}
}
])
# Run evaluation
results = mlflow.genai.evaluate(
data=eval_df,
predict_fn=agent,
scorers=[Correctness(), Safety()],
)
Spark DataFrame を使用した評価
Spark DataFrames は、大規模な評価や、データが既に Delta Lake または Unity Catalog にある場合に使用します。これは、データが Delta Lake または Unity Catalog に既に存在する場合、または評価を実行する前に MLflow 評価データセット内のレコードをフィルター処理する必要がある場合に便利です。
DataFrame は、 評価データセット スキーマに準拠する必要があります。
import mlflow
from mlflow.genai.scorers import Safety, RelevanceToQuery
from my_app import agent # Your GenAI app with tracing
# Load evaluation data from a Delta table in Unity Catalog
eval_df = spark.table("catalog.schema.evaluation_data")
# Or load from any Spark-compatible source
# eval_df = spark.read.parquet("path/to/evaluation/data")
# Run evaluation
results = mlflow.genai.evaluate(
data=eval_df,
predict_fn=agent,
scorers=[Safety(), RelevanceToQuery()],
)
一般的な predict_fn
パターン
アプリを直接呼び出す
パラメーター名が評価データセットのキーと一致する場合に、 predict_fn
としてアプリを直接渡します。これは、評価データセットの inputs
と一致するパラメーター名を持つアプリに役立ちます。
import mlflow
from mlflow.genai.scorers import RelevanceToQuery, Safety
# Your GenAI app that accepts 'question' as a parameter
@mlflow.trace
def my_chatbot_app(question: str) -> dict:
# Your app logic here
response = f"I can help you with: {question}"
return {"response": response}
# Evaluation data with 'question' key matching the function parameter
eval_data = [
{"inputs": {"question": "What is MLflow?"}},
{"inputs": {"question": "How do I track experiments?"}}
]
# Pass your app directly since parameter names match
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=my_chatbot_app, # Direct reference, no wrapper needed
scorers=[RelevanceToQuery(), Safety()]
)
アプリを callable でラップする
アプリで評価データセットの inputs
とは異なるパラメーター名またはデータ構造が想定されている場合は、呼び出し可能な関数でラップします。 これは、アプリのパラメーターと評価データセットの input
キーの間にパラメーター名の不一致がある場合 (例: user_input
vs question
)、またはデータ形式の変換が必要な場合 (例: 文字列からリストまたは JSON 解析へ)。
import mlflow
from mlflow.genai.scorers import RelevanceToQuery, Safety
# Your existing GenAI app with different parameter names
@mlflow.trace
def customer_support_bot(user_message: str, chat_history: list = None) -> dict:
# Your app logic here
context = f"History: {chat_history}" if chat_history else "New conversation"
return {
"bot_response": f"Helping with: {user_message}. {context}",
"confidence": 0.95
}
# Wrapper function to translate evaluation data to your app's interface
def evaluate_support_bot(question: str, history: str = None) -> dict:
# Convert evaluation dataset format to your app's expected format
chat_history = history.split("|") if history else []
# Call your app with the translated parameters
result = customer_support_bot(
user_message=question,
chat_history=chat_history
)
# Translate output to standard format if needed
return {
"response": result["bot_response"],
"confidence_score": result["confidence"]
}
# Evaluation data with different key names
eval_data = [
{"inputs": {"question": "Reset password", "history": "logged in|forgot email"}},
{"inputs": {"question": "Track my order"}}
]
# Use the wrapper function for evaluation
results = mlflow.genai.evaluate(
data=eval_data,
predict_fn=evaluate_support_bot, # Wrapper handles translation
scorers=[RelevanceToQuery(), Safety()]
)
デプロイされたエンドポイントの評価
to_predict_fn
関数を使用して、エージェント フレームワーク、モデルサービング チャット エンドポイント、およびカスタム エンドポイントMosaic AI評価します。
この関数は、これらのエンドポイントと互換性のある予測関数を作成し、完全な可観測性のためにトレースが有効なエンドポイントからトレースを自動的に抽出します。
to_predict_fn
関数は、エンドポイントへのkwargs
パススルーを直接実行します。評価データは、エンドポイントが想定する入力形式と一致する必要があります。形式が一致しない場合、評価は失敗し、認識されない入力キーに関するエラー メッセージが表示されます。
- Model Serving chat
- Agent Framework
- Custom endpoint
モデルサービング チャット エンドポイントには、 messages
キーでフォーマットされたデータが必要です。
import mlflow
from mlflow.genai.scorers import RelevanceToQuery
# Create predict function for a chat endpoint
predict_fn = mlflow.genai.to_predict_fn("endpoints:/my-chatbot-endpoint")
# Evaluate the chat endpoint
results = mlflow.genai.evaluate(
data=[{"inputs": {"messages": [{"role": "user", "content": "How does MLflow work?"}]}}],
predict_fn=predict_fn,
scorers=[RelevanceToQuery()]
)
Agent Framework エンドポイントは、異なる入力インターフェイスを持つことができます。次の例は、 input
キーを示しています。
import mlflow
from mlflow.genai.scorers import RelevanceToQuery
# Create a predict function for a Knowledge Assistant agent endpoint
predict_fn = mlflow.genai.to_predict_fn("endpoints:/ka-56a301ab-endpoint")
# Evaluate the agent endpoint
results = mlflow.genai.evaluate(
data=[{"inputs": {"input": [{"role": "user", "content": "How do I use the Models from Code feature in MLflow?"}]}}],
predict_fn=predict_fn,
scorers=[RelevanceToQuery()]
)
カスタムエンドポイントは、データを送信するためのアクセスパターンがまったく異なる場合があります。data
入力形式が評価に使用されているエンドポイントと互換性があることを確認してください。
評価データ形式がエンドポイントと互換性がない場合は、モデルのインターフェイスをラップします。変換レイヤーは、正しいペイロードが評価エンドポイントに送信されるようにすることができます。
import mlflow
from mlflow.genai.scorers import RelevanceToQuery
def custom_predict_fn(inputs):
# Transform inputs to match your endpoint's expected format
# For example, if your endpoint expects a 'query' key instead of 'messages'
transformed_inputs = {
"query": inputs["messages"][0]["content"],
"context": inputs.get("context", "")
}
# Call your endpoint with the transformed data
original_predict_fn = mlflow.genai.to_predict_fn("endpoints:/my-custom-endpoint")
return original_predict_fn(transformed_inputs)
# Use your wrapper function for evaluation
results = mlflow.genai.evaluate(
data=[{"inputs": {"messages": [{"role": "user", "content": "What is machine learning?"}], "context": "technical documentation"}}],
predict_fn=custom_predict_fn,
scorers=[RelevanceToQuery()]
)
記録済みモデルの評価
ログに記録された MLflow モデルをラップして、評価の名前付きパラメーターとモデルの単一パラメーター インターフェイスの間で変換します。
ほとんどの記録済みモデル (PyFunc を使用するモデルや LangChainなどのロギングフレーバーなど) は 1 つの入力パラメーター (PyFunc の場合は model_inputs
など) を受け入れますが、 predict_fn
は評価データセットのキーに対応する名前付きパラメーターを想定しています。
import mlflow
from mlflow.genai.scorers import Safety
# Make sure to load your logged model outside of the predict_fn so MLflow only loads it once!
model = mlflow.pyfunc.load_model("models:/chatbot/staging")
def evaluate_model(question: str) -> dict:
return model.predict({"question": question})
results = mlflow.genai.evaluate(
data=[{"inputs": {"question": "Tell me about MLflow"}}],
predict_fn=evaluate_model,
scorers=[Safety()]
)
次のステップ
- アプリを評価する - 最初の評価を実行するためのステップバイステップガイド。
- Build evaluation データセット - 本番運用ログまたはスクラッチから構造化テスト データを作成します。
- カスタムスコアラーの定義 - ビルド メトリクス 特定のユースケースに合わせたもの。