评估对话
对话评估使您能够评估整个对话会话,而不仅仅是单个轮次。这对于评估对话式 AI 系统至关重要,因为质量是在多次交互中体现出来的,例如用户沮丧模式、对话完整性或整体对话连贯性。

多轮评估在 MLflow 3.10.0 中处于实验阶段。API 和行为可能会在未来的版本中发生变化。
两种方法
MLflow 支持两种评估对话的方法
- 评估预生成的对话
- 在评估过程中模拟对话
评估现有的已经过追踪(traced)的对话。
当您拥有以下内容时,请使用此方法:
- 需要分析的生产环境对话数据
- 预先录制的测试对话
- 来自先前代理版本的对话
import os
import mlflow
from mlflow.genai.scorers import ConversationCompleteness, UserFrustration
os.environ["OPENAI_API_KEY"] = "your-api-key-here" # Replace with your API key
# Get existing traces grouped by session
traces = mlflow.search_traces(
experiment_ids=["<your-experiment-id>"],
return_type="list",
)
# Evaluate the conversations
results = mlflow.genai.evaluate(
data=traces,
scorers=[ConversationCompleteness(), UserFrustration()],
)
通过模拟用户与您的代理进行交互来生成新的对话。
当您想要实现以下目的时,请使用此方法:
- 系统地测试新的代理版本
- 大规模生成多样化的测试场景
- 通过特定的用户行为对您的代理进行压力测试
import os
import mlflow
from mlflow.genai.simulators import ConversationSimulator
from mlflow.genai.scorers import ConversationCompleteness, UserFrustration
os.environ["OPENAI_API_KEY"] = "your-api-key-here" # Replace with your API key
# Define test scenarios
simulator = ConversationSimulator(
test_cases=[
{"goal": "Learn about MLflow tracking"},
{"goal": "Debug deployment issue", "persona": "Frustrated engineer"},
],
max_turns=5,
)
# Simulate and evaluate conversations
results = mlflow.genai.evaluate(
data=simulator,
predict_fn=your_agent_fn,
scorers=[ConversationCompleteness(), UserFrustration()],
)
概述
传统的单轮评估独立地评估每个代理的响应。然而,许多重要的质量指标只能通过检查完整的对话来评估:
- 用户沮丧度:用户是否感到沮丧?问题是否得到了解决?
- 对话完整性:在对话结束时,用户的所有问题是否都得到了回答?
- 知识留存:代理是否记得对话早期的信息?
- 对话连贯性:对话流程是否自然?
多轮评估通过将追踪记录分组为对话会话并应用评估器来分析整个对话历史,从而满足了这些需求。
前提条件
首先,通过运行以下命令安装所需包
pip install --upgrade 'mlflow>=3.10'
MLflow 将评估结果存储在跟踪服务器中。通过以下任一方法将您的本地环境连接到跟踪服务器。
- 本地 (uv)
- 本地 (pip)
- 本地 (docker)
安装 Python 包管理器 uv(该管理器还将安装 uvx 命令,以便在不安装的情况下调用 Python 工具)。
在本地启动 MLflow 服务器。
uvx mlflow server
请参阅 安全安装 (Secure Installs),了解如何使用哈希检查和上传时过滤功能将依赖项固定到已知良好版本。
Python 环境:Python 3.10+
通过 pip 安装 mlflow Python 包并在本地启动 MLflow 服务器。
pip install --upgrade mlflow
mlflow server
请参阅 安全安装 (Secure Installs),了解如何使用哈希检查和上传时过滤功能将依赖项固定到已知良好版本。
MLflow 提供了一个 Docker Compose 文件,用于启动一个带有 PostgreSQL 数据库和 MinIO 服务器的本地 MLflow 服务器。
git clone --depth 1 --filter=blob:none --sparse https://github.com/mlflow/mlflow.git
cd mlflow
git sparse-checkout set docker-compose
cd docker-compose
cp .env.dev.example .env
docker compose up -d
有关更多详细信息(例如,覆盖默认环境变量),请参考 说明。
最后,配置您的 LLM 提供商凭证。内置的多轮评分器默认使用 OpenAI。
import os
os.environ["OPENAI_API_KEY"] = "your-api-key-here" # Replace with your API key
评估预生成的对话
评估已经过追踪的对话。这对于评估生产数据或预录制的测试对话非常有用。
第一步:用会话 ID 标记追踪记录
在构建代理时,请在追踪记录上设置会话 ID,以便将它们归入同一个对话中。
import mlflow
@mlflow.trace
def my_chatbot(question, session_id):
mlflow.update_current_trace(metadata={"mlflow.trace.session": session_id})
return generate_response(question)

第二步:检索并评估会话
从您的实验中获取追踪记录,并将它们传递给 mlflow.genai.evaluate。MLflow 会自动按会话 ID 对追踪记录进行分组。
from mlflow.genai.scorers import ConversationCompleteness, UserFrustration
# Get all traces
traces = mlflow.search_traces(
experiment_ids=["<your-experiment-id>"],
return_type="list",
)
# Evaluate all sessions - MLflow automatically groups by session ID
results = mlflow.genai.evaluate(
data=traces,
scorers=[
ConversationCompleteness(),
UserFrustration(),
],
)
您还可以使用 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": "Get help setting up experiment tracking"},
{"goal": "Troubleshoot a model deployment error"},
{
"goal": "Learn about 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 提供内置的多轮评估器,包括 ConversationCompleteness、UserFrustration、KnowledgeRetention 等。请参阅内置评估器页面以获取完整列表、使用示例和 API 文档。
自定义评估器
您可以使用 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="conversation_politeness",
instructions=(
"Analyze the {{ conversation }} and determine if the agent maintains "
"a polite and professional tone throughout all interactions. "
"Rate as 'consistently_polite', 'mostly_polite', or 'impolite'."
),
feedback_value_type=Literal["consistently_polite", "mostly_polite", "impolite"],
model="openai:/gpt-5-mini",
)
# Use in evaluation
results = mlflow.genai.evaluate(
data=traces,
scorers=[politeness_judge],
)
{{ 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(
experiment_ids=["<your-experiment-id>"],
filter_string="metadata.`mlflow.trace.session` = '<your-session-id>'",
return_type="list",
)
# Evaluate the session
results = mlflow.genai.evaluate(
data=traces,
scorers=[ConversationCompleteness(), UserFrustration()],
)