다음을 통해 공유

评估对话

对话评估使你能够评估整个会话,而不是单个轮次。 这对于评估对话式 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()],
)

后续步骤