你做了一个发票识别模型,它返回"总金额:¥12,580"。数字看着合理,格式也没问题——但你怎么知道它真的从图片里读出来的,而不是"猜"的?
文本评估器回答不了这个问题。它只能比对输出和参考答案的字符串相似度,无法判断模型输出是否忠实于源图像。这正是 Strands Evals 引入 MLLM-as-a-judge(多模态大模型做裁判)的原因:让评估器本身也能"看见"图片,从而对图像到文本的任务做出有依据的评判。
文本评估器的盲区
传统 LLM-as-a-judge 的工作方式是:接收模型输出和参考答案(都是文本),然后判断质量。这在纯文本任务上效果不错,但遇到图像到文本的场景就力不从心:
- 图片描述(captioning):评估器只看到模型生成的描述文本,无法核实描述是否与图片内容一致。模型说"一只黑猫坐在红色沙发上",评估器无法确认猫的颜色和沙发颜色。
- 文档信息提取:模型从发票图片中提取出供应商名称和总金额,评估器只能比对提取结果与标注数据的文本匹配度,无法判断模型是否真的从对应位置读到了这些信息。
- 图表分析:模型声称"Q3 收入同比增长 15%",评估器无法验证这个百分比是否来自图表上的数据点。
核心问题只有一个:评估器缺少图像输入,就没有"事实依据"。它只能做文本层面的形式判断,无法做内容层面的真伪判断。
MLLM-as-a-judge 的思路
解决方案直观:给评估器也配上视觉能力。多模态大模型(MLLM)同时接收图像和文本,就能判断模型输出是否"扎根"于图像内容。
Strands Evals 把这个思路落地为可配置的评估组件。一个多模态评估调用的大致流程:
- 将源图像和模型输出文本一起传给 MLLM 评估器。
- 评估器根据预设的评判标准(如"描述是否忠实于图像"、"提取数值是否与图中一致")生成评判结果。
- 返回结构化的评分和理由。
与纯文本评估相比,关键差异在于评估器的输入多了一个图像维度。这让评判从"输出看起来对不对"升级为"输出和图片对不对得上"。
用 Strands Evals 搭建多模态评估
下面是一个可运行的示例,展示如何用 Strands SDK 的 Evals 模块配置一个多模态评估器,对图像描述任务做"忠实度"评判。
安装依赖
pip install strands-evals
Strands Evals 支持多种模型后端,多模态评估需要使用具备视觉能力的模型(如 Claude 3.5 Sonnet、GPT-4o 等)。以下示例以 Claude 为后端。
定义评估器并运行
import boto3
from strands_evals.evaluators import MLLMAsJudgeEvaluator
from strands_evals.datasets import EvalDataset, EvalSample
# 1. 准备评估数据集
# 每个 sample 包含:源图像(本地路径或 URL)、模型输出、可选的参考答案
samples = [
EvalSample(
image_path="./test_images/invoice_001.png", # 源图像
model_output="供应商:华为技术有限公司,总金额:¥12,580.00",
reference="供应商:华为技术有限公司,总金额:¥12,580.00", # 可选
metadata={"task_type": "document_extraction"},
),
EvalSample(
image_path="./test_images/chart_revenue.png",
model_output="Q3 收入同比增长 15%,主要增长来自云服务板块",
reference=None, # 没有参考答案时,评估器完全依赖图像判断
metadata={"task_type": "chart_analysis"},
),
]
dataset = EvalDataset(name="image_to_text_v1", samples=samples)
# 2. 配置多模态评估器
# judging_prompt 定义评估器要回答的问题
evaluator = MLLMAsJudgeEvaluator(
model_id="us.anthropic.claude-3-5-sonnet-20241022-v2:0", # Bedrock 模型 ID
judging_prompt=(
"你是一个多模态评估裁判。请同时查看提供的图像和模型的文本输出。\n"
"判断以下维度,每项给出 1-5 分及简要理由:\n"
"1. 忠实度(faithfulness):输出内容是否与图像中的实际信息一致?\n"
"2. 完整性(completeness):输出是否覆盖了图像中的关键信息?\n"
"3. 准确性(accuracy):输出的具体数值、名称等是否与图中完全匹配?\n"
"请以 JSON 格式返回:{\"faithfulness\": {\"score\": N, \"reason\": \"...\"}, "
"\"completeness\": {\"score\": N, \"reason\": \"...\"}, "
"\"accuracy\": {\"score\": N, \"reason\": \"...\"}}"
),
client=boto3.client("bedrock-runtime", region_name="us-east-1"),
)
# 3. 运行评估
results = evaluator.evaluate(dataset)
# 4. 查看结果
for result in results:
print(f"--- Sample: {result.sample_id} ---")
print(f"模型输出: {result.model_output}")
print(f"评估结果: {result.judgment}")
print(f"综合分数: {result.aggregate_score}")
print()
运行前需要确保:
- AWS 凭证已配置(
aws configure或环境变量)。 - Bedrock 区域已启用对应模型。
- 测试图片放在正确路径。
自定义评判维度
不同任务需要不同的评判标准。图表分析侧重数值准确性,图片描述侧重忠实度和细节覆盖,OCR 侧重字符级正确率。通过修改 judging_prompt 就能适配:
# 图表分析专用评判 prompt
chart_evaluator = MLLMAsJudgeEvaluator(
model_id="us.anthropic.claude-3-5-sonnet-20241022-v2:0",
judging_prompt=(
"你是一个图表分析评估裁判。请查看图表图像和模型的分析文本。\n"
"逐一核实模型提到的每个数据点:\n"
"- 数值是否与图表中对应位置一致?\n"
"- 趋势描述(上升/下降/持平)是否与图表走势吻合?\n"
"- 对比结论(同比/环比百分比)是否可从图表数据推算得出?\n"
"对每个数据点标注 correct / incorrect / unverifiable,并给出总体可信度评分(1-5)。\n"
"返回 JSON:{\"data_points\": [{\"claim\": \"...\", \"verdict\": \"...\", \"detail\": \"...\"}], "
"\"overall_credibility\": N}"
),
client=boto3.client("bedrock-runtime", region_name="us-east-1"),
)
三个典型场景的评估策略
场景一:视觉购物——商品图片描述
电商场景中,模型需要根据商品图片生成描述文本。评估重点:颜色、材质、款式等视觉属性是否准确。
评判 prompt 应要求评估器逐一核对模型提到的每个视觉属性与图片是否匹配,而不是笼统地给一个"描述质量"分数。
场景二:文档理解——发票/合同信息提取
信息提取任务的核心是字段级准确性。评估器需要逐字段比对:供应商名称、日期、金额、税号等,每个字段是否与图中对应区域的内容一致。
没有参考答案时,评估器完全依赖图像做事实判断——这正是 MLLM-as-a-judge 的独特价值。
场景三:图表/截图分析
图表分析的难点在于模型可能"编造"数据点。评估器需要逐条核实模型声称的每个数值和趋势,标注哪些可验证、哪些与图表矛盾。
采纳建议与注意事项
什么时候该用多模态评估器?
- 你的任务涉及图像到文本的转换(描述、提取、分析)。
- 你需要判断模型输出是否忠实于图像内容,而非仅判断文本质量。
- 你没有完整的参考答案,或参考答案本身也可能有错。
什么时候不需要?
- 纯文本任务(摘要、翻译、问答)——传统 LLM-as-a-judge 足够。
- 你有精确的标注数据且只需做字符串匹配——规则评估更便宜更快。
需要注意的代价和风险:
| 维度 | 考量 |
|---|---|
| 成本 | 多模态评估每次调用都包含图像 token,费用高于纯文本评估。建议先在小样本集上验证评判质量,再扩展到全量。 |
| 评估器偏差 | MLLM 本身也可能对图像理解出错。对高风险场景,建议用多个模型交叉评估,或辅以规则校验(如金额字段的数值范围检查)。 |
| 评判一致性 | 同一输入多次评估结果可能波动。可通过固定 temperature=0 和明确评分 rubric 来提升稳定性。 |
| 隐私 | 图像可能包含敏感信息(身份证、医疗记录)。确保评估调用走私有端点,不经过公共 API。 |
快速上手清单:
- 从 10-20 个典型样本开始,覆盖正常情况和常见错误模式。
- 先用人工标注验证评估器的评判质量——评估器本身也需要评估。
- 评判 prompt 越具体越好:要求逐字段/逐属性核实,而非笼统打分。
- 把评估纳入 CI 流程,模型更新后自动跑评估集,拦截忠实度下降的情况。
多模态评估器不是银弹,但它填补了文本评估器在视觉任务上的结构性盲区。当你需要回答"模型说的和图片里的是不是同一件事"时,让评估器也能看见图片,是最直接的路径。