AgentDepthAgent 工程学习指南
输入概念或问题,检索正文和待编写目录。
第一次学习?从 L0 总览开始 →

多模态质量与实时体验评测

我的学习 →

正在读取学习记录…

多模态质量评测回答“结果是否正确”,实时体验评测回答“结果什么时候到”。一个提醒系统即使300毫秒就响应,也可能认错画面;另一个虽然正确,却在用户错过操作窗口后才回答。两项都要测,而且要用同一批输入与明确答案。

本例有四条人工标注记录,每条给出应该提醒与否、系统预测、判定完成耗时和输入模态。预测“提醒”与“不提醒”都需要完成一次判断,因此四条记录都具有判定完成时刻;这些数值没有表示播放声音的时间。混淆矩阵把四种情况分开:该提醒且提醒是命中,该提醒却没提醒是漏报,不该提醒却提醒是误报,不该提醒且没提醒是正确不报。像检查烟雾报警器,漏报与误报会导致不同问题,把它们合成一个正确率容易掩盖风险。

从输入到可核对结果

四条固定预测记录与耗时是教学材料,程序真实计算矩阵、正确率、判定及时率和按模态拆分的结果。矩阵依次为[命中,漏报,误报,正确不报],每种恰好一条,正确率为(1+1)÷4=50%。判定完成耗时不超过500ms的记录有三条,及时率为3÷4=75%。

图像与音频分别有两条,正确率都为50%,但应继续查看它们的错误类型:图像出现漏报,音频出现误报。测试空样本返回None,表示没有可计算的比例;把空样本写成0%会把“没有证据”误读成“全部失败”。MMMU原论文提供跨学科多模态理解评测;MMMU-Pro讨论更稳健的任务设计。课堂四条样本与这些基准的数据集不同。

材料应提醒预测判定完成分类
图像1是是300ms命中
图像2是否700ms漏报
音频1否是400ms误报
音频2否否450ms正确不报
四条人工标注构成混淆矩阵,判定完成耗时按同一门限计算及时率
矩阵衡量提醒判断;四条判定完成耗时按同一500ms门限计算时效。

保存并运行这两个文件

在 PowerShell 创建练习目录:

PowerShell
New-Item -ItemType Directory -Force l9-multimodal-eval
cd l9-multimodal-eval

macOS 终端:

Bash
mkdir -p l9-multimodal-eval
cd l9-multimodal-eval

把下面第一段完整代码保存为 eval_lab.py,第二段保存为 test_eval_lab.py,两份文件放在这个目录。

Python
LATENCY_LIMIT = 500
# 固定人工标注材料:应当提醒、预测提醒、判定完成耗时毫秒、输入模态。
# 提醒与不提醒都产出一个判定;时效统一记录判定完成,不依赖是否播放声音。
SAMPLES = [
    (True, True, 300, "图像"), (True, False, 700, "图像"),
    (False, True, 400, "音频"), (False, False, 450, "音频"),
]

def evaluate(samples, limit):
    if limit < 0:
        raise ValueError("延迟门限不能为负数")
    if not samples:
        return {"matrix": [0, 0, 0, 0], "accuracy": None, "timely": None}
    tp = fn = fp = tn = timely = 0
    for truth, prediction, latency, modality in samples:
        if type(truth) is not bool or type(prediction) is not bool or latency < 0:
            raise ValueError("标注必须为布尔值,耗时不能为负数")
        tp += truth and prediction
        fn += truth and not prediction
        fp += not truth and prediction
        tn += not truth and not prediction
        timely += latency <= limit
    # 矩阵顺序:命中、漏报、误报、正确不报;及时率单独计算。
    count = len(samples)
    return {"matrix": [tp, fn, fp, tn],
            "accuracy": (tp + tn) / count, "timely": timely / count}

if __name__ == "__main__":
    result = evaluate(SAMPLES, LATENCY_LIMIT)
    print("混淆矩阵[命中,漏报,误报,正确不报]:" + str(result["matrix"]))
    print("正确率:" + format(result["accuracy"], ".0%"))
    print("判定及时率:" + format(result["timely"], ".0%"))
    for modality in ("图像", "音频"):
        subset = [row for row in SAMPLES if row[3] == modality]
        print(modality + "正确率:" + format(evaluate(subset, LATENCY_LIMIT)["accuracy"], ".0%"))
Python
import unittest
import eval_lab as lab


class MechanismTests(unittest.TestCase):
    # 正常、边界和失败输入都由这里提供,直接运行即可。

    def test_normal(self):
        result = lab.evaluate(lab.SAMPLES, 500)
        self.assertEqual(result["matrix"], [1, 1, 1, 1])
        self.assertEqual(result["timely"], 0.75)

    def test_boundary_empty_and_deadline(self):
        self.assertIsNone(lab.evaluate([], 500)["accuracy"])
        self.assertEqual(lab.evaluate([(True, True, 500, "音频")], 500)["timely"], 1)
        # 不提醒也有判定完成时刻,边界耗时应计入同一分母。
        self.assertEqual(lab.evaluate([(False, False, 500, "图像")], 500)["timely"], 1)
        self.assertEqual(lab.evaluate([(True, False, 501, "图像")], 500)["timely"], 0)

    def test_failure_bad_label(self):
        with self.assertRaises(ValueError):
            lab.evaluate([("yes", True, 3, "音频")], 500)


if __name__ == "__main__":
    unittest.main()

打开 PowerShell,逐行输入下列命令。cd 是进入文件夹,dir 是列出文件;确认列表里有刚保存的两个 .py 文件,再运行 Python。

Bash
# 在刚才创建的练习目录检查文件,再运行程序。
ls
python -X utf8 eval_lab.py
python -X utf8 -m unittest -v test_eval_lab.py

程序输出:

TXT
混淆矩阵[命中,漏报,误报,正确不报]:[1, 1, 1, 1]
正确率:50%
判定及时率:75%
图像正确率:50%
音频正确率:50%

测试末尾应显示 Ran 3 tests 与 OK。若找不到文件,检查当前目录与扩展名;若导入失败,确认测试和主程序在同一文件夹。测试描述的三组材料就在上方代码,不需要另外准备输入。

改一处,再看结果

输出同时展示质量与时效,避免把及时率75%理解成正确率75%。数据量只有四条,百分比只描述这组材料,不能直接推断真实用户表现。

把 LATENCY_LIMIT = 500 改成 LATENCY_LIMIT = 400,保存并重跑。矩阵与正确率不变,及时率从75%变成50%。正好400ms的记录仍计为及时,因为条件是小于等于。恢复为500后重跑。

真实评测先冻结测试集,按用户来源或时间拆分训练、调参和测试材料,避免同一段录音或同一张截图重复出现。语音转写还可计算词错误率:插入、删除、替换词的总数除以参考词数;声音自然度则通常需要人工听评。把主观评分和自动指标分列,才能知道下一次优化该改识别、回答还是播放。若另行统计真实语音首音,应对无音频响应保存None,并单独报告产生音频的样本数量与首音分布,不能把无音频判定耗时充当首音。

改动后仍在刚才的 PowerShell 目录运行:

Bash
python -X utf8 eval_lab.py

确认上述变化后,把参数恢复成原值,保存并再次执行这条命令。

把机制接回 Agent

评测应保存输入ID、人工答案、模型回答、模态、首音时间与最终响应时间。先按同一规则计分,再按任务、模态、噪声和用户群分组检查。质量不足时查感知与推理,延迟不足时查端点、网络、生成和播放,下一次实验才有明确改动点。

课后练习展开习题收起习题

4 道练习 · 客观题规则评分 · 其余题目待批改

正在读取本地记录…

不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。

练习 1 / 4 · v1.0.1

选择题 · 先判断边界

关于“多模态质量与实时体验评测”,哪种做法更稳妥?

对应知识点:L9-multimodal-eval

选择一个答案
练习 2 / 4 · v1.0.0

简答题 · 解释失败

写出一个失败输入并说明记录字段。

对应知识点:L9-multimodal-eval

练习 3 / 4 · v1.0.0

代码题 · 边界测试

补充正常、边界、失败三组输入和预期结果。

对应知识点:L9-multimodal-eval

练习 4 / 4 · v1.0.0

场景题 · 结果未知

证据不足时如何设计状态和人工接管?

对应知识点:L9-multimodal-eval

图片查看器
100%

文章配图 · 按 Esc 关闭