GenAIのMLflow評価例
このページでは、データ パターンやpredict_fnパターンなど、評価ハーネスの一般的な使用パターンをいくつか紹介します。
一般的なデータ入力パターン
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を使用して評価する
大規模な評価を行う場合や、データがすでに Delta Lake または Unity Catalog にある場合は、Spark DataFrames を使用します。これは、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()]
)
アプリを呼び出し可能なものにラップする
アプリが評価データセットのinputsとは異なる名前またはデータ構造を予期している場合は、呼び出し可能な関数でラップします。 これは、アプリの問題キーと評価データセットinputキーの間に名前の不一致がある場合 (たとえば、 user_inputと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()]
)
エージェント フレームワークのエンドポイントには、異なる入力インターフェースを設定できます。次の例は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などのロギング フレーバーなど) は単一の入力問題 (たとえば、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()]
)