多模态质量与实时体验评测
正在读取学习记录…
多模态质量评测回答“结果是否正确”,实时体验评测回答“结果什么时候到”。一个提醒系统即使300毫秒就响应,也可能认错画面;另一个虽然正确,却在用户错过操作窗口后才回答。两项都要测,而且要用同一批输入与明确答案。
本例有四条人工标注记录,每条给出应该提醒与否、系统预测、判定完成耗时和输入模态。预测“提醒”与“不提醒”都需要完成一次判断,因此四条记录都具有判定完成时刻;这些数值没有表示播放声音的时间。混淆矩阵把四种情况分开:该提醒且提醒是命中,该提醒却没提醒是漏报,不该提醒却提醒是误报,不该提醒且没提醒是正确不报。像检查烟雾报警器,漏报与误报会导致不同问题,把它们合成一个正确率容易掩盖风险。
从输入到可核对结果
四条固定预测记录与耗时是教学材料,程序真实计算矩阵、正确率、判定及时率和按模态拆分的结果。矩阵依次为[命中,漏报,误报,正确不报],每种恰好一条,正确率为(1+1)÷4=50%。判定完成耗时不超过500ms的记录有三条,及时率为3÷4=75%。
图像与音频分别有两条,正确率都为50%,但应继续查看它们的错误类型:图像出现漏报,音频出现误报。测试空样本返回None,表示没有可计算的比例;把空样本写成0%会把“没有证据”误读成“全部失败”。MMMU原论文提供跨学科多模态理解评测;MMMU-Pro讨论更稳健的任务设计。课堂四条样本与这些基准的数据集不同。
| 材料 | 应提醒 | 预测 | 判定完成 | 分类 |
|---|---|---|---|---|
| 图像1 | 是 | 是 | 300ms | 命中 |
| 图像2 | 是 | 否 | 700ms | 漏报 |
| 音频1 | 否 | 是 | 400ms | 误报 |
| 音频2 | 否 | 否 | 450ms | 正确不报 |
保存并运行这两个文件
在 PowerShell 创建练习目录:
New-Item -ItemType Directory -Force l9-multimodal-eval
cd l9-multimodal-evalmacOS 终端:
mkdir -p l9-multimodal-eval
cd l9-multimodal-eval把下面第一段完整代码保存为 eval_lab.py,第二段保存为 test_eval_lab.py,两份文件放在这个目录。
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%"))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。
# 在刚才创建的练习目录检查文件,再运行程序。
ls
python -X utf8 eval_lab.py
python -X utf8 -m unittest -v test_eval_lab.py程序输出:
混淆矩阵[命中,漏报,误报,正确不报]:[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 目录运行:
python -X utf8 eval_lab.py确认上述变化后,把参数恢复成原值,保存并再次执行这条命令。
把机制接回 Agent
评测应保存输入ID、人工答案、模型回答、模态、首音时间与最终响应时间。先按同一规则计分,再按任务、模态、噪声和用户群分组检查。质量不足时查感知与推理,延迟不足时查端点、网络、生成和播放,下一次实验才有明确改动点。
课后练习展开习题收起习题
正在读取本地记录…
不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。
选择题 · 先判断边界
关于“多模态质量与实时体验评测”,哪种做法更稳妥?
对应知识点:L9-multimodal-eval
简答题 · 解释失败
写出一个失败输入并说明记录字段。
对应知识点:L9-multimodal-eval
代码题 · 边界测试
补充正常、边界、失败三组输入和预期结果。
对应知识点:L9-multimodal-eval
场景题 · 结果未知
证据不足时如何设计状态和人工接管?
对应知识点:L9-multimodal-eval
描述会发送给本站维护者,用于修订文章,保存90天。请只填写文章问题,省略个人信息、密钥和内部资料。