メインコンテンツまでスキップ

会話を評価する

会話評価を使用すると、個々のターンではなく会話セッション全体を評価できます。これは、ユーザーの不満のパターン、会話の完全性、全体的な対話の一貫性など、複数のやり取りを通じて品質が明らかになる会話型 AI システムを評価するために不可欠です。

注記

マルチターン評価は実験的です。API と動作は将来のリリースで変更される可能性があります。

前提条件

MLflow 3.10.0 をインストールするまたはそれ以降:

Bash
pip install --upgrade 'mlflow[databricks]>=3.10'

トレース上のセッション ID を追跡するには、エージェントをインストルメント化する必要があります。トレースにセッション ID を設定する方法については、「ユーザーとセッションの追跡」を参照してください。

2つのアプローチ

MLflow は会話を評価するための 2 つのアプローチをサポートしています。

  • 事前に生成された会話を評価する : すでに追跡されている既存の会話を評価します。次の場合にこのアプローチを使用します:

    • 本番運用の会話データを分析する
    • QAまたはユーザー調査から事前に録音されたテスト会話
    • 比較のための以前のエージェントバージョンからの会話
  • 評価中に会話をシミュレートする : エージェントとユーザーのやり取りをシミュレートして、新しい会話を生成します。次の場合にこのアプローチを使用します。

    • 一貫したシナリオで新しいエージェント バージョンを体系的にテストする
    • 多様なテストシナリオを大規模に生成
    • 特定のユーザー行動とエッジケースでエージェントのストレステストを実施する

概要

従来の単一ターン評価では、各エージェントの応答を個別に評価します。ただし、会話エージェントでは、次の情報をキャプチャするためにセッション レベルでの評価が必要です。

  • ユーザーの不満 : ユーザーは不満を感じましたか?解決しましたか?
  • 会話の完全性 : 会話の終了までにユーザーの質問はすべて回答されましたか?
  • 知識の保持 : エージェントは会話の以前の情報を覚えていますか?
  • 会話の一貫性 : 会話は自然に流れますか?

マルチターン評価は、トレースを会話セッションにグループ化し、会話履歴全体を分析する判定を適用することで、これらのニーズに対応します。

事前に生成された会話を評価する

すでに追跡された会話を評価します。これは、本番運用データや事前に録音されたテスト会話を評価するのに役立ちます。

ステップ 1: セッション ID を含むタグトレース

エージェントを構築するときは、トレースにセッション ID を設定して、それらを会話にグループ化します。

Python
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 ごとにトレースを自動的にグループ化します。

Python
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を使用して完全なセッションを直接取得することもできます。

Python
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()],
)

評価中に会話をシミュレートする

ユーザーインタラクションをシミュレートして新しい会話を生成します。これにより、一貫した目標とペルソナを持つさまざまなエージェント バージョンをテストできるようになります。

Python
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 }}テンプレート変数を使用します。

Python
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を使用します。

Python
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()],
)

次のステップ