对话评估使你能够评估整个会话,而不是单个轮次。 这对于评估对话式 AI 系统至关重要,在这些系统中,在多个交互(例如用户挫折模式、对话完整性或整体对话一致性)上出现质量。
多轮次评判器可用于开发期间的脱机评估(如本页所述)和生产中持续监视。
注释
多轮次评估是 实验性的。 API 和行为可能会在将来的版本中更改。
先决条件
安装 MLflow 3.10.0 或更高版本:
pip install --upgrade 'mlflow[databricks]>=3.10'
必须配置代理以在跟踪中追踪会话 ID。 请参阅 跟踪用户和会话 ,了解如何在跟踪上设置会话 ID。
两种方法
MLflow 支持两种方法来评估对话:
评估预生成的对话:评估已跟踪的现有对话。 在以下情况下,请使用这种方法:
- 要分析的生产对话数据
- 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",
instructions=(
"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()],
)