会話を評価する
会話評価を使用すると、個々のターンではなく会話セッション全体を評価できます。これは、ユーザーの不満のパターン、会話の完全性、全体的な対話の一貫性など、複数のやり取りを通じて品質が明らかになる会話型 AI システムを評価するために不可欠です。
マルチターン評価は実験的です。API と動作は将来のリリースで変更される可能性があります。
前提条件
MLflow 3.10.0 をインストールするまたはそれ以降:
pip install --upgrade 'mlflow[databricks]>=3.10'
トレース上のセッション ID を追跡するには、エージェントをインストルメント化する必要があります。トレースにセッション ID を設定する方法については、「ユーザーとセッションの追跡」を参照してください。
2つのアプローチ
MLflow は会話を評価するための 2 つのアプローチをサポートしています。
-
事前に生成された会話を評価する : すでに追跡されている既存の会話を評価します。次の場合にこのアプローチを使用します:
- 本番運用の会話データを分析する
- QAまたはユーザー調査から事前に録音されたテスト会話
- 比較のための以前のエージェントバージョンからの会話
-
評価中に会話をシミュレートする : エージェントとユーザーのやり取りをシミュレートして、新しい会話を生成します。次の場合にこのアプローチを使用します。
- 一貫したシナリオで新しいエージェント バージョンを体系的にテストする
- 多様なテストシナリオを大規模に生成
- 特定のユーザー行動とエッジケースでエージェントのストレステストを実施する
概要
従来の単一ターン評価では、各エージェントの応答を個別に評価します。ただし、会話エージェントでは、次の情報をキャプチャするためにセッション レベルでの評価が必要です。
- ユーザーの不満 : ユーザーは不満を感じましたか?解決しましたか?
- 会話の完全性 : 会話の終了までにユーザーの質問はすべて回答されましたか?
- 知識の保持 : エージェントは会話の以前の情報を覚えていますか?
- 会話の一貫性 : 会話は自然に流れますか?
マルチターン評価は、トレースを会話セッションにグループ化し、会話履歴全体を分析する判定を適用することで、これらのニーズに対応します。
事前に生成された会話を評価する
すでに追跡された会話を評価します。これは、本番運用データや事前に録音されたテスト会話を評価するのに役立ちます。
ステップ 1: セッション ID を含むタグトレース
エージェントを構築するときは、トレースにセッション ID を設定して、それらを会話にグループ化します。
import mlflow
@mlflow.trace
def my_chatbot(question, session_id):
mlflow.update_current_trace(
tags={"mlflow.trace.session": session_id}
)
# ... your chatbot logic
セッションの追跡に関する完全なドキュメントについては、 「ユーザーとセッションの追跡」を参照してください。
ステップ 2: セッションを取得して評価する
エクスペリメントからトレースを取得し、それをmlflow.genai.evaluateに渡します。 MLflow はセッション ID ごとにトレースを自動的にグループ化します。
from mlflow.genai.scorers import ConversationCompleteness, UserFrustration
# Get traces from your experiment
traces = mlflow.search_traces(
filter_string="attributes.status = 'OK'",
return_type="list",
)
# Evaluate the conversations
# MLflow automatically groups traces by their session ID tag
results = mlflow.genai.evaluate(
data=traces,
scorers=[
ConversationCompleteness(), # Did the agent answer all questions?
UserFrustration(), # Did the user become frustrated?
],
)
mlflow.search_sessionsを使用して完全なセッションを直接取得することもできます。
import mlflow
# Get complete sessions (each session is a list of traces)
sessions = mlflow.search_sessions(
locations=["<your-experiment-id>"],
max_results=50,
)
# Flatten for evaluation
all_traces = [trace for session in sessions for trace in session]
results = mlflow.genai.evaluate(
data=all_traces,
scorers=[ConversationCompleteness(), UserFrustration()],
)
評価中に会話をシミュレートする
ユーザーインタラクションをシミュレートして新しい会話を生成します。これにより、一貫した目標とペルソナを持つさまざまなエージェント バージョンをテストできるようになります。
import mlflow
from mlflow.genai.simulators import ConversationSimulator
from mlflow.genai.scorers import ConversationCompleteness, Safety
# Define test scenarios
simulator = ConversationSimulator(
test_cases=[
{"goal": "Successfully set up experiment tracking"},
{"goal": "Identify the root cause of a deployment error"},
{
"goal": "Understand how to implement model versioning",
"persona": "You are a beginner who needs detailed explanations",
},
],
max_turns=5,
)
# Your agent's predict function
def predict_fn(input: list[dict], **kwargs) -> str:
# input is the conversation history
response = your_agent.chat(input)
return response
# Simulate conversations and evaluate
results = mlflow.genai.evaluate(
data=simulator,
predict_fn=predict_fn,
scorers=[
ConversationCompleteness(),
Safety(),
],
)
テスト ケースの定義、予測関数のインターフェース、構成オプションなど、会話シミュレーションの完全なドキュメントについては、 「会話シミュレーション」を参照してください。
マルチターンジャッジ
審査員を組み込む
MLflow には、会話の品質を評価するための組み込みのマルチターン ジャッジが用意されています。完全なリストと詳細なドキュメントについては、 MLflow の定義済みスコアラーのドキュメントと、スコアラーと LLM 審査員のページを参照してください。
カスタムジャッジ
make_judgeを使用してカスタムのマルチターン ジャッジを作成します。完全な会話履歴にアクセスするには、 {{ conversation }}テンプレート変数を使用します。
from mlflow.genai.judges import make_judge
from typing import Literal
# Create a custom multi-turn judge
politeness_judge = make_judge(
name="politeness",
judge_prompt=(
"Evaluate whether the assistant maintained a polite and professional "
"tone throughout this conversation:\n\n{{ conversation }}\n\n"
"Rate as 'consistently_polite', 'mostly_polite', or 'impolite'."
),
feedback_value_type=Literal["consistently_polite", "mostly_polite", "impolite"],
)
# Get traces from your experiment
traces = mlflow.search_traces(
filter_string="attributes.status = 'OK'",
return_type="list",
)
# Use in evaluation
results = mlflow.genai.evaluate(
data=traces,
scorers=[politeness_judge],
)
{{ conversation }}変数は、審査員が分析できるように、完全な会話履歴を読み取り可能な形式で挿入します。
{{ conversation }}変数は{{ expectations }}でのみ使用でき、 {{ inputs }} 、 {{ outputs }} 、または{{ trace }}では使用できません。
評価の保存方法
マルチターン評価は、各セッションの 最初のトレース に (時系列で) 保存されます。この設計により、次のことが保証されます。
- 会話に新たな展開が加わっても評価は安定している
- セッション開始のトレースを見ると、会話レベルの評価を簡単に見つけることができます。
- セッション UI は会話を効率的に表示できます メトリクス
評価には、会話レベルであることを識別するメタデータが含まれます。
session_id: 評価と完全な会話をリンクするセッションID
特定のセッションの操作
特定のセッションを評価するには、フィルター文字列とともにmlflow.search_tracesを使用します。
import mlflow
from mlflow.genai.scorers import ConversationCompleteness, UserFrustration
# Get traces for a specific session using filter
traces = mlflow.search_traces(
filter_string="tags.`mlflow.trace.session` = '<your-session-id>'",
return_type="list",
)
# Evaluate the session
results = mlflow.genai.evaluate(
data=traces,
scorers=[ConversationCompleteness(), UserFrustration()],
)
次のステップ
- 会話シミュレーション- さまざまなシナリオとユーザーの行動でエージェントをテストするための合成会話を生成します。
- 定義済みスコアラー- すべての組み込みシングルターンおよびマルチターン スコアラーの完全なリファレンス。
- カスタム審査員- 会話固有の基準を評価するために、
make_judgeを使用してカスタム LLM 審査員を構築します。 - ユーザーとセッションを追跡する- セッション ID を使用してエージェントを計測する方法を学びます。