LLaVA-Bench:基于 GPT-4 的多模态对话评测
LLaVA-Bench 教程:基于 GPT-4 的多模态对话评测指南
LLaVA-Bench 是一个专为多模态大语言模型(MLLM)设计的自动评测基准,它利用 GPT-4 作为评判者,评估模型在复杂多模态对话中的表现。本教程将带你从零开始,理解 LLaVA-Bench 的设计思想、数据结构,并掌握使用它来评测任意视觉语言模型的方法。
1. 什么是 LLaVA-Bench?
大型视觉语言模型(如 LLaVA、GPT-4V、Gemini Pro Vision)已经能够进行多轮图像问答和推理。但如何客观、高效地评估它们的对话质量?传统指标(如 BLEU、ROUGE)无法捕捉开放对话的语义准确性,而人工评估又成本高昂。
LLaVA-Bench 提出了一种基于 GPT-4 的自动评测方案,它包含 24 个精心设计的图像+问题对,并要求模型生成复杂的长文本回答。然后,以 GPT-4(text-only) 作为”裁判“,从多个维度对回答进行评分。这种方法不仅与人类判断高度一致,而且完全自动化、可复现。
核心特点:
- 固定问题集:24 个挑战性的多模态问题,选自 30 个原始图像(其中 6 个图像有多个问题)。
- 多维度评分:包括助益性(Helpfulness)、视觉理解(Visual Understanding)、准确性(Accuracy)、推理能力(Reasoning)等。
- GPT-4 裁判:使用纯文本 GPT-4 比较模型输出与参考答案,或直接进行评分。
- 开放可扩展:评测代码开源,可以轻松接入新模型。
2. 数据集结构与问题类型
LLaVA-Bench 的数据集包含 30 张高质量图像,这些问题被分为三类:
| 类别 | 图像数量 | 问题数量 | 示例 |
|---|---|---|---|
| COCO | 10 | 10 | “这张图片中的人在干什么?详细描述她的动作和场景。” |
| 室内场景 | 10 | 10 | “根据房间的布局和装饰,推断这个房间主人的职业可能是什么?” |
| 其他(文本、图表) | 10 | 10 | “分析这个流程图,解释如果第二步失败会发生什么。” |
每个问题都要求模型提供长文本、推理性的答案,而不是简短的事实性回复。这迫使模型展示深度的视觉理解、知识关联和语言生成能力。
数据集的目录结构通常如下:
llava-bench/
├── images/
│ ├── 000000000000.jpg
│ └── ...
└── questions.jsonl
questions.jsonl 每一行包含:
{
"question_id": 1,
"image": "000000000000.jpg",
"text": "这张图片中的人在做什么?她的情绪如何?根据环境推测可能发生的故事。",
"category": "COCO"
}
3. 评测流程概述
LLaVA-Bench 的评测分为两步:
- 生成回答(Inference):将每个图像与问题输入待测模型,收集其文本输出。
- GPT-4 评判(Evaluation):将参考回答、模型回答和问题一起作为 GPT-4 的输入,由 GPT-4 打分并给出理由。
在第二步中,GPT-4 使用一个结构化 prompt,强制输出 JSON 格式的评分结果,包含字段:helpfulness、relevance、accuracy、reasoning 和总体的 score。
这种做法的巧妙之处在于:GPT-4 本身拥有强大的常识和逻辑,能够像人类一样评估回答的质量,而不需要额外训练一个评分模型。
4. 快速上手:使用 LLaVA-Bench 评测一个模型
以下演示基于官方 LLaVA 仓库提供的脚本,但你可以轻松替换为任何自己的模型。环境要求:Python 3.10+,PyTorch,以及一个支持视觉输入的模型。
4.1 准备模型接口
你需要一个函数或类,能够接收图像路径和文本问题,返回一个字符串。伪代码示例:
def your_model_inference(image_path, question):
# 你的模型加载和推理逻辑
return "生成的回答文本"
4.2 生成模型回答
下载 LLaVA-Bench 数据集(图像和 questions.jsonl),然后运行以下脚本生成回答文件:
import json
from PIL import Image
answers = []
with open("questions.jsonl", "r") as f:
questions = [json.loads(line) for line in f]
for q in questions:
img_path = f"images/{q['image']}"
answer = your_model_inference(img_path, q["text"])
answers.append({
"question_id": q["question_id"],
"prompt": q["text"],
"text": answer,
"category": q["category"]
})
with open("my_model_answers.jsonl", "w") as f:
for ans in answers:
f.write(json.dumps(ans, ensure_ascii=False) + "\n")
输出文件 my_model_answers.jsonl 是后续评判的输入。
4.3 使用 GPT-4 进行评判
你需要一个 OpenAI API 密钥(需要访问 GPT-4 模型)。官方评估脚本 eval_gpt4_judge.py 支持多种模式,例如直接评分或与参考答案比较。这里展示“单模型直接评分”的简化流程:
import openai
import json
import time
openai.api_key = "YOUR_API_KEY"
def get_gpt4_score(question, answer, image_caption=None):
# image_caption 可选,可以传入图像的简短文本描述作为辅助
prompt = f"""你是一个多模态AI助手的评估者。根据问题、参考答案(如果提供)和模型生成的回答,对回答质量进行评分。
请按照以下JSON格式返回结果,不要额外文本:
{{
"helpfulness": 1-5分,
"relevance": 1-5分,
"accuracy": 1-5分,
"reasoning": 1-5分,
"score": 总体1-5分
}}
问题:{question}
模型回答:{answer}
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.0,
)
content = response.choices[0].message.content
# 解析JSON,需处理可能的异常
return json.loads(content)
# 读取模型回答并评分
with open("my_model_answers.jsonl") as f:
answers = [json.loads(l) for l in f]
scores = []
for ans in answers:
score = get_gpt4_score(ans["prompt"], ans["text"])
score["question_id"] = ans["question_id"]
scores.append(score)
time.sleep(1) # 避免API速率限制
# 保存评分结果
with open("eval_results.jsonl", "w") as f:
for s in scores:
f.write(json.dumps(s, ensure_ascii=False) + "\n")
# 计算各项平均分
cat_avg = {}
for s in scores:
for key in ["helpfulness", "relevance", "accuracy", "reasoning", "score"]:
cat_avg.setdefault(key, []).append(s[key])
for k, v in cat_avg.items():
print(f"{k}: {sum(v)/len(v):.2f}")
注意:官方实现中会加入参考答案(由 GPT-4V 或人工编写),并通过比较来得到更稳定的评分。以上是简化版以便快速试验。
5. 理解评分维度
LLaVA-Bench 的评分维度共同刻画了回答的综合质量:
- Helpfulness(助益性):回答是否直接解决了问题,提供了用户需要的信息。
- Relevance(相关性):内容是否与图像和问题紧密相关,有无无关内容。
- Accuracy(准确性):视觉描述和推理的事实正确性,例如物体识别、属性描述是否正确。
- Reasoning(推理深度):回答中是否展现了逻辑推理、因果分析或常识运用。
- Score(综合得分):全局评价,通常由 GPT-4 综合上述维度给出 1-5 分。
最终报告通常还按问题类别(COCO、室内、图表)分别统计,以观察模型在不同场景下的优劣。
6. 常见问题与局限
Q: 为什么使用 GPT-4 作为评判者,而不是其他模型?
A: 研究发现 GPT-4 的评估和人类专家的一致性很高,而且它具备强大的世界知识和语言理解能力。但请注意,GPT-4 也有自己的偏好,可能对某些表达形式打分偏高。为了降低偏差,可以使用多个裁判模型(如 Claude 3)取平均。
Q: 我没有 GPT-4 API 权限怎么办?
A: 可以使用 GPT-4 的替代品,例如 Llama-3-70B-Instruct 等开放模型,但需要调整 prompt 并自行验证一致性。社区也有基于开源 LLM 的裁判实现。
Q: 评比的结果可以跨模型直接比较吗?
A: 可以,但需确保所有模型都用相同的问题集和完全一致的裁判设置(模型版本、prompt 模板、温度参数)。官方榜单通常固定 GPT-4 版本以保持可比性。
Q: 24 个问题是否太少?
A: 它更像一个快速诊断工具,而非全面的基准。对于正式的研究,建议结合 MMBench、MM-Vet、VisIT-Bench 等更大规模基准。
7. 进阶技巧:自定义扩展
LLaVA-Bench 的设计非常模块化,你可以很容易地添加自己的图像和问题:
- 在
images/中放入新图像。 - 在
questions.jsonl中追加新的问题条目,分配新的question_id。 - 如果希望调整裁判 prompt,编辑
eval_gpt4_judge.py中的模板。
还可以将评测集成到 CI/CD 流程中,每次模型更新时自动运行,监控性能变化。
8. 总结
LLaVA-Bench 是一个轻量、高效且可靠的多模态对话评测工具,它巧妙利用 GPT-4 的判别能力,解决了开放式视觉问答难以自动评分的痛点。通过本教程,你掌握了:
- 数据集的结构与设计理念
- 从模型推理到 GPT-4 评分的完整流程
- 评分维度的含义与计算方法
- 自定义和扩展的基本方法
现在你可以开始在自己的模型上尝试 LLaVA-Bench,并将结果与公开榜单(如 LLaVA 官方仓库)进行对比,客观衡量你的多模态对话能力。
延伸阅读:查看 LLaVA-Bench 原始论文 以及 EvalCrafter 等更全面的评估框架,进一步深入多模态评测世界。