视频生成模型的“视力”到底好不好?相信很多做 AIGC 的同学都有这种感觉:模型生成的视频画面很清晰、很酷炫,但一旦追问细节——画面里物体运动是否合理、物体遮挡后是否还在、因果关系是否成立——就很容易暴露问题。
VGI-Bench 这类评测体系,就是想解决“视频生成模型视觉智能”如何量化评估的问题。它通过设计一套探针任务,像考试一样去“提问”模型,从而判断模型是真的理解视觉世界,还是仅仅在“照着数据分布画图”。
本文将围绕 4 件事展开:
- 解释 VGI-Bench 是什么,以及“探针”评测和传统评测的区别;
- 拆解视频生成模型视觉智能的核心维度;
- 给出一套可复用的探针评测流程,包含可运行 Python 示例;
- 整理本地部署、调用过程、并发评测中的常见坑与工程建议。
不管你是做多模态模型研究的同学,还是在业务中落地视频生成能力的开发者,这篇文章都能提供一个比较完整的实践参考。
1. 背景与核心概念
1.1 为什么要评测视频生成模型的“视觉智能”
过去我们对视频生成模型的评价,集中在画面质量上。常用的指标包括 FVD(Fréchet Video Distance)、CLIP-Score、PSNR、SSIM 等,这些指标衡量的是“生成画面与真实画面的相似度”。但这类指标有一个明显问题:它们不关心模型是否“理解”了内容。
举个例子,一个模型可以生成非常逼真的猫跳上桌子的视频,但如果你换一个角度提问,比如“猫落地时四条腿是否符合作息规律?”“跳上桌子的过程是否受到重力影响?”它可能就答不上来。更常见的是下面这种场景:
- 生成视频中,杯子被手推到桌边,下一帧杯子穿过桌沿悬浮在空中;
- 一个球滚进遮挡物后面,再出现时颜色发生了变化;
- 视频里人物转身,五官位置明显错乱。
这些在传统指标上未必能发现,因为传统指标通常只统计整体分布差异,而不是基于视觉内容进行推理。VGI-Bench 的思路是:直接用“视觉问题”去探针模型,考察它能不能对视频画面中的对象、行为、关系、事件给出合理判断。
1.2 探针评测是什么
“探针”(Probe)这个概念在很多领域都有。比如硬件测试里用的探针卡,是接触芯片引脚来检测电气性能;网络运维中也有 IP 探针,用来探测网络连通性。它们的共同点是:通过一个外部工具,向被测对象发送特定信号,然后根据反馈判断被测对象的内部状态。
模型评测中的探针也是这个逻辑。我们设计一组“探针任务”——通常是一段视频配一个问题——然后让模型根据视频回答问题或者做判断。如果模型能利用视频中的视觉信息回答正确,说明它具备对应的视觉理解能力;如果回答错误,则说明模型在这类视觉推理上存在短板。
VGI-Bench 中的“探针视频生成模型”,就是把这套思想用到视频生成模型上:将生成模型生成的视频作为输入,用专门设计的问题去探测它内部习得的视觉概念。这和“测试集评估”最大的区别是:它不是只看生成质量,而是看模型生成结果里“隐含的认知能力”。
1.3 视频生成模型与视觉智能的边界
这里需要区分三个容易混淆的概念:
- 视频生成模型:通过扩散模型、自回归模型等方式生成视频的模型,常见的有 Sora、Runway、可灵、Open-Sora 等。它本身是一个“生成器”,输入是文本、图像,输出是视频帧序列。
- 视频理解模型:输入视频,输出文本,比如视频问答、视频标注、视频摘要等模型。
- 视频生成模型的视觉智能:生成模型中隐含的视觉概念与因果关系。通过生成结果反推,观察模型是否掌握了物理常识、空间关系、时间变化等知识。
注意,VGI-Bench 评测的不是“视频理解模型”,而是“视频生成模型”。它把视频生成模型当作被测对象,用探针问题去观察它生成视频中的“内在逻辑”。
为什么这样做值得?因为传统视频生成评估只关心“是否好看”,而视觉智能评测关心“是否合理”。在真实业务中,这两者同样重要。比如:
- 游戏行业生成技能特效视频,如果物体运动和物理规律不一致,用户会立刻察觉;
- 电商生成商品展示视频,如果物体的透视关系有问题,商品会显得不真实;
- 自动驾驶数据增强生成场景视频,如果道路车辆运动不遵循交通规则,生成的扩展数据反而会污染模型。
2. VGI-Bench 的评测体系设计
2.1 总体框架
VGI-Bench 这类评测体系的整体思路,可以拆成 4 层来理解:
| 层面 | 内容 | 作用 |
|---|---|---|
| 数据层 | 探针视频样本 + 标注 | 提供测试材料,覆盖不同场景、对象、运动方式 |
| 任务层 | 探针问题 / 提示词 | 将视觉智能能力转化为可执行、可评分的任务 |
| 模型层 | 被测视频生成模型 + 主干 LLM 裁判 | 生成视频、回答问题、评估答案 |
| 指标层 | 准确率、一致性、违规率 | 输出量化结果,反映单项能力和整体水平 |
2.2 探针任务的分类
为了评测“视觉智能”,探针任务需要覆盖多个能力维度。这里给出一个比较常用的分类方式:
1. 物理常识
- 物体是否遵循重力;
- 物体的碰撞、反弹是否合理;
- 液体流动、烟雾扩散是否符合物理规律。
2. 对象状态变化
- 物体是否保形(不随运动发生非自然形变);
- 颜色是否变化(比如红色球进入阴影,是否被错误变为蓝色);
- 数量是否变化(一个苹果被切开后是否变多)。
3. 空间关系
- 前后遮挡关系是否正确;
- 物体移动后相对位置是否保持一致;
- 透视尺寸变化是否合理。
4. 时间一致性
- 物体消失再出现后状态是否一致;
- 动作时序是否颠倒;
- 因果事件是否按正确顺序发生。
5. 反事实推理
- 在相同场景下修改一个条件,结果是否发生合理变化。这类问题能深度探测模型对因果关系的建模。
2.3 探针视频的构造
构造探针视频通常会采用两类方法:
- 文本引导 + 视频生成:设计一段文本提示词,用被评测的视频生成模型生成视频,然后基于生成的视频进行提问。适合自动化批量评估。
- 真实视频 + 扰动:使用真实视频,施加特定扰动(比如删除一段帧、翻转遮挡关系),再让模型进行生成或补全,观察模型是否理解被扰动部分的语义。
在 VGI-Bench 实践中,文本引导方式是主路径,因为它可以大量构造场景,覆盖不同概念。
2.4 评分机制设计
探针评测不能只靠人工判分,否则规模上不来。实际工程中通常采用“LLM 裁判 + 规则校验”的混合评分方式:
- 用大语言模型(如 GPT-4o、Qwen-VL、DeepSeek-VL)对模型回答进行打分;
- 对存在确定答案的问题,用规则抽取关键实体进行比对;
- 对模型拒绝回答、超出范围回答等情况进行特殊标记,不混入正常准确率计算。
评分维度一般包括:
- 准确率:回答与标准答案一致的占比;
- 一致性:在多个平行视频中,模型回答是否保持逻辑一致;
- 鲁棒性:同一提示词不同随机种子生成的视频,得分方差是否过大;
- 拒绝率:模型是否经常避答,这也会影响体验。
3. 环境准备与工具链
3.1 运行环境说明
开始写探针评测代码之前,先确认基础环境。下面以常见配置为例:
- 操作系统:Ubuntu 20.04 / 22.04,Windows 也可以,但路径写法注意适配;
- Python:3.10 及以上;
- 视频生成模型接口:OpenAI 兼容接口或各自官方 Python SDK;
- LLM 裁判接口:支持 openai SDK 的兼容服务;
- 视频处理:OpenCV、Decord 或 PyAV(用于抽帧)。
版本请根据你的实际项目情况调整,本文示例重点是演示评测思路,不绑定具体模型。
3.2 安装依赖
建议新建一个虚拟环境,避免依赖冲突:
python -m venv vgi_bench_env source vgi_bench_env/bin/activate # Windows 使用 vgi_bench_env\Scripts\activate然后安装 Python 依赖:
pip install openai opencv-python decord pandas numpy pyyaml其中:
openai:调用支持 OpenAI 协议的视频生成模型与 LLM 裁判;opencv-python:读取视频、抽帧;decord:高性能视频解码库,批量抽帧时比 OpenCV 更快;pandas:汇总实验结果;numpy:计算分数;pyyaml:加载配置文件。
如果视频生成模型需要本地部署,例如在 Ollama 或 FastAPI 服务中加载视频生成模型,那么还需要按具体框架安装对应依赖。这一块在第五节结合本地部署进一步说明。
3.3 项目结构规划
一个比较清晰的探针评测项目,目录结构如下:
vgi-bench-demo/ ├── configs/ │ └── config.yaml # 全局配置 ├── data/ │ └── probes.json # 探针任务定义 ├── evaluator/ │ ├── __init__.py │ ├── video_generator.py # 调用视频生成模型 │ ├── judge.py # LLM 裁判 │ └── metrics.py # 指标计算 ├── scripts/ │ └── run_eval.py # 主入口脚本 ├── outputs/ │ ├── videos/ # 生成的视频 │ └── results/ └── requirements.txt下面按这个结构逐步实现。
4. 完整实战案例:搭建视频生成模型视觉智能探针评测流程
4.1 定义探针任务
在data/probes.json中维护探针任务。每个任务包含:
id:唯一标识;prompt:生成视频的文本提示词;question:针对该视频的探针问题;answer:标准答案或评分要点;dimension:能力维度。
示例:
[ { "id": "phys_001", "prompt": "A red apple falling from a table to the ground, realistic physics", "question": "当苹果从桌面掉落到地面的过程中,它的运动轨迹是怎样的?", "answer": "苹果先加速下落,接触地面后弹跳或停住", "dimension": "physical_common_sense" }, { "id": "obj_001", "prompt": "A green car passing behind a white building, then appearing on the other side", "question": "汽车从建筑物一侧消失后,它应该出现在哪里?", "answer": "建筑物的另一侧", "dimension": "object_permanence" }, { "id": "space_001", "prompt": "A person walking toward the camera, keeping face shape consistent", "question": "随着人物靠近摄像头,人物面部的轮廓应该发生什么变化?", "answer": "面部轮廓变大,但五官相对位置保持稳定", "dimension": "spatial_relationship" } ]4.2 编写视频生成调用器
新建evaluator/video_generator.py,通过 OpenAI 兼容接口调用视频生成模型。
# 文件路径:evaluator/video_generator.py import base64 import os import time from openai import OpenAI class VideoGenerator: """ 通过 OpenAI 兼容协议调用视频生成模型。 如果你的视频生成模型部署成本地 OpenAI 接口,只需要改 base_url 和 api_key。 """ def __init__(self, base_url: str, api_key: str, model_name: str, save_dir: str): self.client = OpenAI(base_url=base_url, api_key=api_key) self.model_name = model_name self.save_dir = save_dir os.makedirs(save_dir, exist_ok=True) def generate(self, prompt: str, sample_id: str, retries: int = 3): result = None for attempt in range(retries): try: response = self.client.chat.completions.create( model=self.model_name, messages=[ { "role": "user", "content": ( f"生成一个短视频,视频描述:{prompt}\n" "要求:画面清晰,运动自然,遵守物理规律。" ), } ], # 视频生成参数,按实际服务能力调整 n=1, ) # 这里假设响应中包含视频的 base64 内容或视频 URL。 # 实际字段名根据服务实现调整。 content = response.choices[0].message.content if content.startswith("http"): video_path = self._download_video(content, sample_id) else: video_path = self._save_base64_video(content, sample_id) return video_path except Exception as e: print(f"[VideoGenerator] attempt {attempt + 1} failed: {e}") time.sleep(2 * (attempt + 1)) return None def _download_video(self, url: str, sample_id: str): video_path = os.path.join(self.save_dir, f"{sample_id}.mp4") # 这里用简单的 HTTP 下载方式。 # 生产环境推荐使用 requests + 流式下载,并增加超时与重试。 import requests resp = requests.get(url, timeout=60) resp.raise_for_status() with open(video_path, "wb") as f: f.write(resp.content) return video_path def _save_base64_video(self, content: str, sample_id: str): if "," in content: content = content.split(",")[-1] video_path = os.path.join(self.save_dir, f"{sample_id}.mp4") with open(video_path, "wb") as f: f.write(base64.b64decode(content)) return video_path注意,不同视频生成服务返回格式差异很大。有些返回视频 URL,有些返回 base64,还有一些需要在提交任务后通过任务 ID 轮询结果。这段代码只是一个通用模板,实际使用时需要根据你对接的模型服务调整。
4.3 编写 LLM 裁判
生成视频后,需要将视频送入“裁判模型”。这里有两个选择:
- 把视频抽帧,用多帧图像的方式交给多模态 LLM 判断;
- 直接调用支持视频输入的多模态 LLM。
第一种方式兼容性更好,因为很多 LLM 接口不支持视频输入。下面使用 OpenCV 抽取中间帧、起始帧和结束帧,拼接到 prompt 中交给判官模型。
# 文件路径:evaluator/judge.py import base64 import cv2 from openai import OpenAI class LLMJudge: """ LLM 裁判:基于视频多帧图像 + 探针问题,输出判断结果。 """ def __init__(self, base_url: str, api_key: str, judge_model: str): self.client = OpenAI(base_url=base_url, api_key=api_key) self.judge_model = judge_model @staticmethod def _extract_frames(video_path: str, num_frames: int = 5): cap = cv2.VideoCapture(video_path) frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) total_frames = max(frame_count, 1) frame_indices = [] for i in range(num_frames): frame_indices.append(int(total_frames * i / max(num_frames - 1, 1))) frames = [] for idx in frame_indices: cap.set(cv2.CAP_PROP_POS_FRAMES, idx) ret, frame = cap.read() if ret: # 压缩图片,减少 token 开销 frame = cv2.resize(frame, (512, 512)) encode_params = [int(cv2.IMWRITE_JPEG_QUALITY), 80] _, buffer = cv2.imencode(".jpg", frame, encode_params) frames.append(base64.b64encode(buffer).decode("utf-8")) cap.release() return frames def judge_video(self, video_path: str, question: str, reference_answer: str): frames = self._extract_frames(video_path) image_contents = [ { "type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{frame}"} } for frame in frames ] user_content = [ { "type": "text", "text": ( "以下是同一个视频中的若干帧画面。" f"请基于这些画面回答下面问题。\n问题:{question}\n" f"参考要点:{reference_answer}\n" "请以 JSON 格式输出:" '{"reason": "判断理由", "score": 0 或 1, "answer": "简短回答"}' ) } ] + image_contents response = self.client.chat.completions.create( model=self.judge_model, messages=[{"role": "user", "content": user_content}], response_format={"type": "json_object"} ) return response.choices[0].message.content这里需要注意:
- 抽帧数量不宜过多,否则 LLM 接口负载太高;
- 抽帧位置尽量均匀覆盖整个视频,避免只取开头或结尾;
- 评分二值化(0/1)适合快速统计,但也可以设计更细的 0-5 分制,需按任务类型确定。
4.4 编写指标计算与结果汇总
探针评测的核心输出是准确率。同时我们还要统计“按维度拆分”的准确率,方便找出模型的弱项。
# 文件路径:evaluator/metrics.py import json import pandas as pd def aggregate_results(records): """ records 为列表,每个元素是: { "id": str, "dimension": str, "score": int, # 0 或 1 "reason": str, "answer": str, "prompt": str } """ df = pd.DataFrame(records) if df.empty: return {} overall_accuracy = df["score"].mean() dimension_summary = df.groupby("dimension")["score"].agg(["mean", "count"]) output = { "overall_accuracy": round(float(overall_accuracy), 4), "total_samples": len(df), "dimension_summary": {}, } for dim, row in dimension_summary.iterrows(): output["dimension_summary"][dim] = { "accuracy": round(float(row["mean"]), 4), "count": int(row["count"]), } return output4.5 编写主运行脚本
在主脚本中串联整个流程:
- 读取配置;
- 读取探针任务;
- 调用视频生成模型生成视频;
- 调用 LLM 裁判评分;
- 汇总结果并保存报告。
# 文件路径:scripts/run_eval.py import json import os from datetime import datetime import yaml from evaluator.video_generator import VideoGenerator from evaluator.judge import LLMJudge from evaluator.metrics import aggregate_results def load_config(config_path: str): with open(config_path, "r", encoding="utf-8") as f: return yaml.safe_load(f) def main(): config = load_config("configs/config.yaml") video_gen = VideoGenerator( base_url=config["video_generator"]["base_url"], api_key=config["video_generator"]["api_key"], model_name=config["video_generator"]["model"], save_dir="outputs/videos", ) judge = LLMJudge( base_url=config["judge"]["base_url"], api_key=config["judge"]["api_key"], judge_model=config["judge"]["model"], ) with open(config["probe_file"], "r", encoding="utf-8") as f: probes = json.load(f) records = [] for probe in probes: sample_id = probe["id"] video_path = video_gen.generate(probe["prompt"], sample_id) if video_path is None: print(f"[ERROR] 视频生成失败: {sample_id}") continue judge_output = judge.judge_video( video_path=video_path, question=probe["question"], reference_answer=probe["answer"], ) try: judge_json = json.loads(judge_output) except json.JSONDecodeError: judge_json = { "reason": judge_output, "score": 0, "answer": judge_output } records.append( { "id": probe["id"], "dimension": probe["dimension"], "prompt": probe["prompt"], "question": probe["question"], "reference_answer": probe["answer"], "reason": judge_json.get("reason", ""), "score": int(judge_json.get("score", 0)), "answer": judge_json.get("answer", ""), } ) print(f"[DONE] {sample_id} -> score: {judge_json.get('score')}") summary = aggregate_results(records) os.makedirs("outputs/results", exist_ok=True) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") result_path = f"outputs/results/result_{timestamp}.json" payload = { "summary": summary, "records": records, } with open(result_path, "w", encoding="utf-8") as f: json.dump(payload, f, ensure_ascii=False, indent=2) print(json.dumps(summary, ensure_ascii=False, indent=2)) print(f"[SAVED] {result_path}") if __name__ == "__main__": main()4.6 配置文件示例
# 文件路径:configs/config.yaml probe_file: data/probes.json video_generator: base_url: "http://localhost:8000/v1" api_key: "sk-local" model: "video-gen-model-v1" judge: base_url: "https://api.example.com/v1" api_key: "${JUDGE_API_KEY}" model: "multimodal-judge-model"${JUDGE_API_KEY}这类占位符建议通过环境变量注入。实际使用时可以用os.getenv读取,避免把密钥写进配置文件。
4.7 运行与预期结果
执行以下命令:
python scripts/run_eval.py正常流程会输出:
[DONE] phys_001 -> score: 1 [DONE] obj_001 -> score: 0 [DONE] space_001 -> score: 1 ... { "overall_accuracy": 0.6667, "total_samples": 3, "dimension_summary": { "physical_common_sense": { "accuracy": 1.0, "count": 1 }, "object_permanence": { "accuracy": 0.0, "count": 1 }, "spatial_relationship": { "accuracy": 1.0, "count": 1 } } } [SAVED] outputs/results/result_20250520_153000.json这里的示例结果只是演示,不代表真实模型表现。如果你只有 3 个探针样本,这个分数没有统计意义。正式评测时,单个维度至少需要 50 到 100 个探针样本,才能得到比较稳定的结论。
5. 常见问题与排查思路
用探针评测视频生成模型时,踩过的坑可以列出一长串。下面按问题现象、常见原因、解决思路整理。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 视频生成服务一直超时 | 视频生成耗时长,默认 HTTP 超时太短 | 拉长请求超时到 120 秒以上,或者改用异步任务轮询 |
| 生成视频无法被 OpenCV 打开 | 返回内容不是标准 MP4,或文件未完整写入 | 校验文件头、文件大小;打印返回格式,按实际格式解码 |
| LLM 裁判返回格式不稳定 | 没有强制 JSON 输出,或回答问题太长超出模板 | 使用 response_format 强制 JSON,并增加解析兜底逻辑 |
| 抽帧后画面全是黑帧 | 视频编码格式问题,或者按帧索引读取失败 | 改用 Decord 或 PyAV 解码;检查视频流编码 |
| 探针问题太简单,所有模型都答对 | 问题区分度过低 | 增加反事实、因果、物理细节问题,构造分层难度 |
| 同一提示词多次生成,得分波动大 | 视频生成本身随机性强 | 固定种子(如果服务支持),或多次生成取平均分 |
| 模型拒绝回答探针问题 | LLM 裁判误判视频内容或安全策略过严 | 调整提示词,补充“这是视频帧样本,请客观描述”等背景说明 |
| 评分明显和人工判断不一致 | 裁判对视频理解不够,或参考要点太抽象 | 细化参考要点,增加 0/1 之外的理由约束;必要时接入人工复核 |
排错时建议按下面的顺序走:
- 先确认视频文件本身能正常播放、能在播放器中打开;
- 再确认抽帧逻辑,单独跑一次抽帧脚本,把帧保存到本地检查;
- 接着用一张静态图单独测试 LLM 裁判接口,排除视频输入导致的问题;
- 最后才跑完整评测流程。
6. 最佳实践与工程建议
6.1 探针样本要分层设计
不要所有探针问题都是同一个难度。建议分三层:
- 基础层:考察对象是否存在、数量是否正确、颜色是否一致;
- 推理层:考察遮挡后的对象是否保持存在、运动轨迹是否合理、空间关系是否稳定;
- 因果层:考察事件顺序、反事实条件、物理交互是否正确。
分层的好处是:能区分模型是“看起来好”还是“真正理解”。如果基础层得分高、因果层得分低,说明模型更多是表面拟合,深层推理能力不足。
6.2 评测过程要可复现
视频生成模型通常带有随机性,所以评测时要做好三件事:
- 固定随机种子:如果模型服务支持 seed 参数,务必固定;
- 多次运行取平均:每个探针至少跑 3 到 5 次,统计平均分和方差;
- 记录生成参数:把 prompt、seed、生成时间、模型版本全部写入结果文件,后期排查方便。
6.3 本地部署与并发优化
如果使用本地部署的视频生成模型,通常会有一个明显的瓶颈:生成速度慢、显存占用高。这里有几个经验:
- 视频生成模型服务建议与评测脚本分开部署,避免评测脚本内存过高导致服务被挤挂;
- 如果支持批处理,尽量用批处理生成视频,而不是逐条请求;
- LLM 裁判调用可以并发,但要控制并发数,避免触发限流。示例代码如下:
from concurrent.futures import ThreadPoolExecutor def judge_one(item): # 实际评分逻辑 pass with ThreadPoolExecutor(max_workers=4) as executor: results = list(executor.map(judge_one, probe_list))6.4 指标不要只看准确率
准确率是最基础的指标,但评测视觉智能不能只看平均分。还需要关注:
- 维度差异:哪些维度分低,意味着模型哪类视觉推理弱;
- 方差:同一问题多次生成,如果方差很大,说明模型不稳定;
- 拒绝率:如果模型经常“答非所问”或拒答,说明语义把握不足;
- 相关性:评测得分是否和人工体验一致,这一步需要定期人工抽样复核。
6.5 注意数据污染与评测泄漏
如果探针样本是从公开视频数据集里取来的,而视频生成模型训练时也用了同样的数据,评测结果会虚高。因此:
- 尽量使用新构造的合成场景,避免直接使用公开数据集中的原始视频;
- 如果条件允许,设计“文本生成 + 3D 渲染”方式来构造可控视频;
- 定期更换探针池,防止模型在评测集上过拟合。
6.6 安全与授权边界
在评测过程中,如果你使用的是在线模型 API,需要注意两点:
- 不要上传包含个人隐私、商业机密或未授权人脸数据的视频;
- 涉及生产环境变更、模型替换、评测任务大批量执行时,先在测试环境小范围验证,确认没有异常再放量。
使用本地部署模型时,要遵守模型开源许可证要求,并按最小权限原则配置访问控制,不要将本地评测服务直接暴露到公网。
6.7 结果应以可重复验证为基础
评测报告不能只给一个平均分,建议输出:
- 每个探针任务的明细结果;
- 生成的视频文件路径;
- 抽帧使用的帧序号;
- LLM 裁判的完整理由;
- 人工复核抽样的比例和建议。
例如可以额外输出一份 CSV 报告:
import pandas as pd records_df = pd.DataFrame(records) records_df.to_csv("outputs/results/detail.csv", index=False, encoding="utf-8-sig")这样后续分析、复查、审计都有据可查。
7. 总结与下一步学习路线
这篇文章介绍的 VGI-Bench 探针评测思路,核心并不复杂:把视频生成模型从“生成器”变成“被测对象”,用一组视觉问题去探测它的内部视觉智能。
我们完成了这样几件事:
- 解释了为什么传统指标不够,为什么要用探针评测;
- 梳理了探针任务的维度设计与评分机制;
- 给出了一个完整的 Python 评测流程,包括视频生成调用、抽帧、LLM 裁判、结果汇总;
- 整理了常见的排错表和工程建议。
如果你准备在自己项目中落地类似评测,下一步建议从下面几个方向继续深入:
- 扩展探针题库:按物理、空间、时间、因果维度各设计 50 个以上问题,先跑通全流程;
- 搭建自动化评测平台:把视频生成、裁判评分、报告生成封装成定时任务或 CI 流水线;
- 加入人工复核机制:LLM 裁判负责初筛,人工负责抽检矛盾样本,逐步校准评分标准;
- 关注生成模型演进:随着视频生成模型能力提升,探针任务难度也需要动态升级。
对视频生成模型来说,“生成清晰画面”只是第一步,“理解视觉世界”才是更值得关注的能力。探针评测就是给这类能力画了一面镜子。
如果你在搭建评测流程时遇到了奇怪的报错,也可以把现象、错误日志、模型服务版本这三样信息整理好,去对应模型的开源仓库或官方开发者社区搜索,解决问题的速度往往比直接硬猜快很多。如果本文对你有帮助,可以收藏备用,后面实战的时候直接对照实现。