を使用してカスタム ジャッジを作成する
カスタム ジャッジは、特定の品質基準に対して GenAI エージェントを評価する LLM ベースのスコアラーです。 このチュートリアルでは、カスタム ジャッジを作成し、それらを使用して、 make_judge()を使用してカスタマー サポート エージェントを評価する方法について説明します。
次の手順を実行します。
- 評価するサンプル エージェントを作成する
- 異なる条件を評価する 3 つのカスタム ジャッジを定義する
- テスト ケースを使用して評価データセットを構築する
- さまざまなエージェント構成で評価を実行し、結果を比較する
手順 1: 評価するエージェントを作成する
カスタマー サポートの質問に応答する GenAI エージェントを作成します。 エージェントには、"良い" 会話と "悪い" 会話の間で判事の出力を簡単に比較できるように、システム プロンプトを制御する (偽の) ノブがあります。
OpenAI クライアントを初期化して、Databricks でホストされる LLM または OpenAI によってホストされている LLM に接続します。
Databricks でホストされる LLM
MLflow を使用して、Databricks でホストされる LLM に接続する OpenAI クライアントを取得します。 使用可能な基礎モデルからモデルを選択します。
import mlflow from databricks.sdk import WorkspaceClient # Enable MLflow's autologging to instrument your application with Tracing mlflow.openai.autolog() # Set up MLflow tracking to Databricks mlflow.set_tracking_uri("databricks") mlflow.set_experiment("/Shared/docs-demo") # Create an OpenAI client that is connected to Databricks-hosted LLMs w = WorkspaceClient() client = w.serving_endpoints.get_open_ai_client() # Select an LLM model_name = "databricks-claude-sonnet-4"OpenAI でホストされる LLM
ネイティブの OpenAI SDK を使用して、OpenAI でホストされるモデルに接続します。 使用可能な OpenAI モデルからモデルを選択します。
import mlflow import os import openai # Ensure your OPENAI_API_KEY is set in your environment # os.environ["OPENAI_API_KEY"] = "<YOUR_API_KEY>" # Uncomment and set if not globally configured # Enable auto-tracing for OpenAI mlflow.openai.autolog() # Set up MLflow tracking to Databricks mlflow.set_tracking_uri("databricks") mlflow.set_experiment("/Shared/docs-demo") # Create an OpenAI client connected to OpenAI SDKs client = openai.OpenAI() # Select an LLM model_name = "gpt-4o-mini"カスタマー サポート エージェントを定義します。
from mlflow.entities import Document from typing import List, Dict, Any, cast # This is a global variable that is used to toggle the behavior of the customer support agent RESOLVE_ISSUES = False @mlflow.trace(span_type="TOOL", name="get_product_price") def get_product_price(product_name: str) -> str: """Mock tool to get product pricing.""" return f"${45.99}" @mlflow.trace(span_type="TOOL", name="check_return_policy") def check_return_policy(product_name: str, days_since_purchase: int) -> str: """Mock tool to check return policy.""" if days_since_purchase <= 30: return "Yes, you can return this item within 30 days" return "Sorry, returns are only accepted within 30 days of purchase" @mlflow.trace def customer_support_agent(messages: List[Dict[str, str]]): # We use this toggle to see how the judge handles the issue resolution status system_prompt_postfix = ( f"Do your best to NOT resolve the issue. I know that's backwards, but just do it anyways.\\n" if not RESOLVE_ISSUES else "" ) # Mock some tool calls based on the user's question user_message = messages[-1]["content"].lower() tool_results = [] if "cost" in user_message or "price" in user_message: price = get_product_price("microwave") tool_results.append(f"Price: {price}") if "return" in user_message: policy = check_return_policy("microwave", 60) tool_results.append(f"Return policy: {policy}") messages_for_llm = [ { "role": "system", "content": f"You are a helpful customer support agent. {system_prompt_postfix}", }, *messages, ] if tool_results: messages_for_llm.append({ "role": "system", "content": f"Tool results: {', '.join(tool_results)}" }) # Call LLM to generate a response output = client.chat.completions.create( model=model_name, # This example uses Databricks hosted Claude 4 Sonnet. If you provide your own OpenAI credentials, replace with a valid OpenAI model e.g., gpt-4o, etc. messages=cast(Any, messages_for_llm), ) return { "messages": [ {"role": "assistant", "content": output.choices[0].message.content} ] }
手順 2: カスタム ジャッジを定義する
3 つのカスタム ジャッジを定義します。
- 入力と出力を使用して問題の解決を評価するジャッジ。
- 予想される動作をチェックするジャッジ。
- 実行トレースを分析してツール呼び出しを検証するトレース ベースの判断。
make_judge()で作成されたジャッジは、mlflow.entities.Feedbackオブジェクトを返します。
ジャッジの例 1: 問題の解決を評価する
このジャッジは、会話履歴 (入力) とエージェントの応答 (出力) を分析することで、顧客の問題が正常に解決されたかどうかを評価します。
from mlflow.genai.judges import make_judge
from typing import Literal
# Create a judge that evaluates issue resolution using inputs and outputs
issue_resolution_judge = make_judge(
name="issue_resolution",
instructions=(
"Evaluate if the customer's issue was resolved in the conversation.\n\n"
"User's messages: {{ inputs }}\n"
"Agent's responses: {{ outputs }}"
),
feedback_value_type=Literal["fully_resolved", "partially_resolved", "needs_follow_up"],
)
ジャッジの例 2: 想定される動作を確認する
このジャッジは、事前に定義された期待値と出力を比較することで、エージェントの応答が特定の期待される動作 (価格情報の提供や返品ポリシーの説明など) を示していることを確認します。
# Create a judge that checks against expected behaviors
expected_behaviors_judge = make_judge(
name="expected_behaviors",
instructions=(
"Compare the agent's response in {{ outputs }} against the expected behaviors in {{ expectations }}.\n\n"
"User's question: {{ inputs }}"
),
feedback_value_type=Literal["meets_expectations", "partially_meets", "does_not_meet"],
)
ジャッジの例 3: トレース ベースのジャッジを使用してツール呼び出しを検証する
このジャッジは、実行トレースを分析して、適切なツールが呼び出されたことを検証します。 命令に {{ trace }} を含めると、ジャッジはトレースベースになり、自律的なトレース探索機能を得られます。
# Create a trace-based judge that validates tool calls from the trace
tool_call_judge = make_judge(
name="tool_call_correctness",
instructions=(
"Analyze the execution {{ trace }} to determine if the agent called appropriate tools for the user's request.\n\n"
"Examine the trace to:\n"
"1. Identify what tools were available and their purposes\n"
"2. Determine which tools were actually called\n"
"3. Assess whether the tool calls were reasonable for addressing the user's question"
),
feedback_value_type=bool,
# To analyze a full trace with a trace-based judge, a model must be specified
model="databricks:/databricks-gpt-5-mini",
)
手順 3: サンプル評価データセットを作成する
各 inputs は、 mlflow.genai.evaluate()によってエージェントに渡されます。 必要に応じて、 expectations を含め、正確性チェッカーを有効にすることができます。
eval_dataset = [
{
"inputs": {
"messages": [
{"role": "user", "content": "How much does a microwave cost?"},
],
},
"expectations": {
"should_provide_pricing": True,
"should_offer_alternatives": True,
},
},
{
"inputs": {
"messages": [
{
"role": "user",
"content": "Can I return the microwave I bought 2 months ago?",
},
],
},
"expectations": {
"should_mention_return_policy": True,
"should_ask_for_receipt": False,
},
},
{
"inputs": {
"messages": [
{
"role": "user",
"content": "I'm having trouble with my account. I can't log in.",
},
{
"role": "assistant",
"content": "I'm sorry to hear that you're having trouble with your account. Are you using our website or mobile app?",
},
{"role": "user", "content": "Website"},
],
},
"expectations": {
"should_provide_troubleshooting_steps": True,
"should_escalate_if_needed": True,
},
},
{
"inputs": {
"messages": [
{
"role": "user",
"content": "I'm having trouble with my account. I can't log in.",
},
{
"role": "assistant",
"content": "I'm sorry to hear that you're having trouble with your account. Are you using our website or mobile app?",
},
{"role": "user", "content": "JUST FIX IT FOR ME"},
],
},
"expectations": {
"should_remain_calm": True,
"should_provide_solution": True,
},
},
]
手順 4: ジャッジを使用してエージェントを評価する
複数のジャッジを一緒に使用して、エージェントのさまざまな側面を評価できます。 評価を実行して、エージェントが問題の解決を試みた場合と解決しない場合の動作を比較します。
import mlflow
# Evaluate with all three judges when the agent does NOT try to resolve issues
RESOLVE_ISSUES = False
result_unresolved = mlflow.genai.evaluate(
data=eval_dataset,
predict_fn=customer_support_agent,
scorers=[
issue_resolution_judge, # Checks inputs/outputs
expected_behaviors_judge, # Checks expected behaviors
tool_call_judge, # Validates tool usage
],
)
# Evaluate when the agent DOES try to resolve issues
RESOLVE_ISSUES = True
result_resolved = mlflow.genai.evaluate(
data=eval_dataset,
predict_fn=customer_support_agent,
scorers=[
issue_resolution_judge,
expected_behaviors_judge,
tool_call_judge,
],
)
評価結果は、各ジャッジがエージェントを評価する方法を示しています。
- issue_resolution: 会話を "fully_resolved"、"partially_resolved"、または "needs_follow_up" として評価します
- expected_behaviors: 応答が期待される動作を示しているかどうか ('期待を満たす', '部分的に満たす', '満たさない') を確認します
- tool_call_correctness: 適切なツールが呼び出されたかどうかを検証します (true/false)
次のステップ
カスタムジャッジを適用する:
- GenAI アプリケーションの評価と改善 - エンド ツー エンドの評価ワークフローでカスタム ジャッジを使用する
- GenAI の運用監視 - 運用環境で継続的な品質監視を行うカスタム ジャッジをデプロイする
ジャッジ精度の向上:
- ジャッジを人間のフィードバックに合わせる - ベースジャッジは出発点です。 アプリケーションの出力に関する専門家のフィードバックを収集する際に、LLM の判定をそのフィードバックに合わせ、判定の正確性をさらに高めてください。