让 AI 的摄影评分接受质疑:Venus 的多智能体评审实践
今年 3 月,我在用一个摄影 App 时,发现它有个挺有意思的功能:给照片打一个美学分,评完还能让 AI 点评。
作为一个爱好摄影的程序员,我很自然地想:这个功能,我能不能也做一个?
最初的设想是:找一个照片美学评分模型,输入图片,拿到分数,再让 AI 写一段点评。能返回数字的接口不难找,但拿到分数后,我又想知道:这个分数为什么成立?
一张婚礼抓拍有轻微动态模糊,应该扣分,还是应该肯定它捕捉到的情绪?一张低饱和度人像,究竟是色彩平淡,还是有意为之的风格?如果同一张照片多评几次,判断又能否保持一致?
围绕这些问题,我在自己的摄影评估项目 Venus 中加入了场景化标准,让初评先接受质疑,再形成裁决。评价过程有了可供检查的记录,判断是否更准确则还要验证。
这篇文章记录了几次方案调整、评分标准的设计,以及一张照片在评审中的具体争议。引擎抽离、模型适配和流式交付的实现,放在了 《把多智能体评审做成可复用引擎:Venus 的工程实践》。
一、试过几种评分方案后,我需要的已经不只是分数
Apple Vision:先从现成能力开始
第一步,我试了 Apple Vision 的 CalculateImageAestheticsScoresRequest。它可以分析图像的美学属性并返回评分结果。
有现成的系统 API,这一步很容易上手。不过,在我测试的照片上,评分整体偏高。它又受平台限制,不能直接作为面向不同客户端的通用评估后端。
NIMA 与 MUSIQ:评分质量更好,仍然缺少解释
接下来,我尝试了 NIMA 和 MUSIQ。
NIMA 是基于 CNN 的图像评价模型,会预测评分分布,可以据此计算平均分等统计量。MUSIQ 则采用多尺度 Transformer 处理图像质量评估,能结合不同尺度的信息,兼顾整体画面和局部细节。
在我的试用中,MUSIQ 的评分质量比 NIMA 更好,但两者的分数都集中在 4–6 分之间。
我用的是基于 AVA 数据集训练的权重。分数集中让我开始留意训练数据的评分分布,以及模型学到的评价偏好。但这只是试用,没有控制训练目标、预处理和样本构成,不能把原因都归到 AVA 上,更不能由此判断“Transformer 一定比 CNN 更懂审美”。
比起分数集中,我更想知道它到底在评什么。尤其是人像作品,一个总分很难告诉我:模型是在肯定光影、否定构图,还是没有理解照片的情绪?
NIMA 的评分分布比单一均值包含更多信息,却仍解释不了具体判断。我原本打算让另一个 AI 根据分数补写点评,但那不一定是在解释原模型的判断:即使把照片也交给它,它也更像是在重新评价照片。
转向 VLM,同时接受新的问题
我需要模型在评价照片时就给出分项判断和理由。
VLM,也就是视觉语言模型,可以在同一次调用中接收图片和文字要求,生成维度评分、点评及改进建议。这更接近我想要的摄影反馈。
但评语也是生成结果,可能包含误判,也可能只是在替分数找解释,不能直接当作评分的真实依据。我要求理由落到照片的具体内容上,至少让人有机会核对。
这几种方案的能力和局限,可以归纳如下:
| 方案 | 我试用时关注的能力 | 没有解决的问题 |
|---|---|---|
| Apple Vision | 利用系统能力快速获得美学评分 | 平台限制;测试照片的分值不符合期待 |
| NIMA | 从评分分布获得量化评价 | 当时使用的结果缺少具体判断依据 |
| MUSIQ | 多尺度图像评价,试用中评分质量更好 | 分数仍集中在 4–6 分,缺少分项解释 |
| VLM | 一起生成评分、理由和建议 | 判断可能漂移,也可能编造依据;成本与延迟更高 |
选定 VLM 后,我先整理评分标准。否则,即使评语写得流畅,几次评价也可能各用各的尺度。
二、先确定怎么评,再让模型开口
摄影门类决定了评价重点
如果只告诉模型“你是一位专业摄影师,请打分”,它依然有很大的自由发挥空间。“专业”不是一个可以执行的评分协议。
我借鉴摄影赛事的分类与评审思路,整理了人像、风光、纪实、艺术、商业、建筑、自然、体育八大门类,再为每个门类定义不同的评分维度。这是项目自己的评估标准,不是某项赛事官方评分体系的完整复刻,也不代表赛事背书。
门类之下还要继续区分场景。以人像为例,当前分为棚拍/写真、环境人像/旅拍、婚礼三个子类型。
棚拍可以控制灯光和造型,因此更强调布光精度与人物表现。环境人像看重人景关系和色彩氛围。婚礼摄影则需要在不可重复的瞬间里兼顾情绪与构图,不能机械地按棚拍标准扣分。
标准文件里有一条很具体的要求:婚礼抓拍允许轻微动态模糊或非完美构图,真实情感优先于技术完美。类似地,胶片颗粒不应自动等同于画质缺陷,忧郁、孤独等情绪也不应因为“不明亮快乐”而被直接否定。
这些规则先明确该看什么、哪些理由不足以扣分,并不意味着模型已经拥有人的审美。
从维度名称,细化到分数区间与场景权重
人像评估采用五个维度:面部神态、姿态与体态、光影品质、色彩与氛围、构图与焦点。每个维度都给出不同分数区间的描述,而不是只列一个名称,让模型自行理解。
不同子类型还配有权重指引。例如,标准中光影品质在棚拍里的参考权重是 25%,在婚礼里是 15%;构图与焦点则分别是 15% 和 25%。这表达的是对不同拍摄条件的合理期待。
这些权重目前是提示词中的软性指引,不是引擎执行的固定计算公式。 我保留了模型根据整体效果调整判断的空间,总分也由模型输出。评估引擎 Venus Core 校验分值范围和精度,不会重新计算加权总分。
如果要严格复算总分,就得让模型只评各维度,再由代码加权计算。这样算术上会更一致,却取消了模型按整体效果调整总分的空间。我还没有决定是否这样改。
标准说明怎么判断,代码决定流程怎么走
调研时,我考虑过用 Harness 约束模型。在这里,它指模型外围的运行机制:提供标准、校验输出、传递反馈,再决定下一轮做什么。
像“婚礼抓拍允许轻微模糊”这样的要求,仍要靠模型理解和执行;分数是否越界、字段是否缺失、什么情况下进入修正轮,则可以交给代码检查。
标准本身也要和角色分开。早期标准文档写着“你是一位资深艺术总监”,外层 Agent 又有自己的角色要求,两处都在定义身份。我后来去掉标准里的角色设定,只保留评价依据,把初评者、批判者和仲裁者的任务留在各自的提示词里。
这样,不同角色使用的是同一套摄影规则,区别在于本轮要完成什么工作。
三、让评分接受质疑,而不是相信第一次回答
有了标准,模型仍可能给出缺少依据的高分,或把风格误判成缺陷。我引入多智能体对抗评估,让初评先接受质疑,再形成最终结果。
这里的“对抗”发生在推理工作流中,不涉及 GAN 式的对抗训练,也没有重新训练模型权重。
三种职责,加一个条件修正步骤
初评者(Proposer)、批判者(Critic)与仲裁者(Arbiter)是三种任务职责,可以使用同一个模型,也可以分别配置模型。当前流程如下,门类检测在调用方已经指定门类时可以跳过:
flowchart TD
I[图片与可选上下文] --> G[确定摄影门类]
G --> P[Proposer 初评]
P --> C[Critic 质疑]
C --> S{严重程度为 HIGH?}
S -->|是| R[Proposer 修正]
S -->|否| A[Arbiter 裁决]
R --> A
A --> O[评分报告与评估过程]
Proposer 先观察图片、识别子类型,再输出维度分数、总分、点评和建议。
Critic 要对照图片与标准审查初评:子类型有没有选错,分数是否偏高或偏低,有没有漏掉重要信息,评语与分数是否矛盾。每条质疑都包含目标维度、具体问题、从照片中观察到的证据和建议分数。
当 Critic 将严重程度判为 HIGH 时,Proposer 才进入修正。修正不等于必须认错:质疑合理就调整,否则可以坚持原判断,但仍须输出完整结果。
最后由 Arbiter 综合图片、提案、质疑和可选修正做裁决。它不是取两个分数的平均值,而是判断哪些意见成立。
Critic 的价值不是“必须挑出毛病”
把一个 Agent 设定成严厉的批判者,很容易带来另一种偏差:为了完成角色任务,对合理评价也强行反对。
因此,Critic 的提示词明确允许它在初评合理时给出 LOW,不必寻找不存在的问题。它既检查高估,也检查低估,不能因拍摄场景本身的限制而过度扣分。
我把 Arbiter 原先笼统的说明改成了结构化裁决记录,分别存储场景判断、争议目标、采纳或驳回的决定,以及最终理由;改进建议则拆成可独立展示的条目。没有实质争议时,裁决列表可以为空,不必让模型编出一段辩论。
除了最终分数,用户还能查看批判者提出了什么、仲裁者为什么接受或拒绝。但 evidence 里存的仍是模型对图片的描述,是否符合照片,还要由人核对。
四、一次实际评估:海港照片的构图争议

这次评估的照片中,前景是飞翔的海鸥,背景是大桥、码头和船只,上方留有大面积天空。请求没有手动指定门类,系统先识别为风光(landscape),Proposer 再将子类型选为城市风光(urban)。
Proposer 给出的总分是 7.1,肯定了海鸥与桥梁的动静对比、天空与船只的色彩关系,同时已经指出“天空留白过多,构图稍散,焦点不够集中”。
Critic 同意子类型判断和整体评价,只对“构图与纵深”提出质疑。它认为天空占比约六成,海鸥分布较散、缺少明确的视觉引导,因此建议把构图分从 7.0 降到 6.5。
双方都注意到了构图松散,分歧在于该扣多少分。Critic 将严重程度判为 LOW,流程跳过 Proposer 修正轮,直接交给 Arbiter。
Arbiter 采纳了这条质疑,把构图分调整为 6.5,其他维度保持不变,最终输出总分 7.0。两轮结果对比如下:
| 指标 | Proposer 初评 | Arbiter 裁决 |
|---|---|---|
| 构图与纵深 | 7.0 | 6.5 |
| 光线与气氛 | 6.8 | 6.8 |
| 色彩和谐 | 7.5 | 7.5 |
| 锐度与细节 | 7.0 | 7.0 |
| 情感共鸣 | 7.0 | 7.0 |
| 总分 | 7.1 | 7.0 |
最终报告还建议在后期裁剪上方约 15%–20% 的空白天空。这是模型的建议,裁剪后的效果尚未验证。
这次引擎记录的评估耗时约 60.8 秒,包含门类检测与三轮评审。总分只变了 0.1,记录却让人看清了争议所在,以及仲裁者采纳了什么。
上下文共享也有代价
各轮调用都会接收图片。后续 Agent 不只阅读前面的评语,还可以重新观察原图;编排器同时把相关结构化结果与可用的 reasoning 输出传给后续角色。
这里的 reasoning 指模型服务实际返回的推理文本或摘要,并不假定模型服务会提供完整内部思考过程。
这种共享方式有利于保留争议背景,但也会增加 token 开销,并让前面的错误影响后面的判断。一个很有说服力的错误初评,可能成为后续 Agent 的锚点。多角色不等于独立证据,多个模型也可能共享偏见。
成本上,不计格式修复等重试,单图评估需要三轮主要调用;触发修正时是四轮,自动检测门类还会增加一次调用。由于后续阶段依赖前序结果,不能把整条链路简单并行化。
我目前用条件修正、按角色选择模型和配置推理预算来控制成本。
五、可追踪之后,还要验证评得有没有用
这次海港照片的评估展示了流程怎样工作,但一张照片、一次运行,不足以证明多智能体优于单 Agent。
固定模型响应后,工程测试可以检查流程分支、字段和分值是否符合约束。但一份报告即使格式正确,也可能看错主体、误判情绪,建议也未必有用。这些问题需要另做实验。
把稳定性、有效性和成本分开看
稳定性和有效性是两回事。每次都给出同一个不合理分数,结果虽然稳定,却没有实用价值。
后续对照实验至少要分别回答这些问题:
| 要验证什么 | 需要观察什么 |
|---|---|
| 评分是否稳定 | 同一照片重复评估时,总分、维度分和场景判断怎样变化 |
| 质疑是否有效 | 批判者指出的问题是否真实,仲裁者有没有纠正误判或接受错误质疑 |
| 建议是否有帮助 | 建议是否对应画面中的具体问题,实际调整后是否有改善 |
| 额外调用是否值得 | 相比单 Agent,获得了什么反馈,增加了多少耗时与成本 |
做这组比较时,我需要固定照片集、模型版本、评分标准和配置,也给单 Agent 同样的标准与输出要求。否则,比较的可能只是“有标准”和“没标准”的差异,不能都归功于多智能体。
报告中的优缺点、争议处理和改进建议,还需要人核对。若为不同角色更换模型,也要与流程变化分开测试,才能分清收益来自哪里。这些实验尚未完成,本文没有相应结论。
历史基线和 Few-shot,仍然需要可靠的参照
我还调研过用历史记录来校准评分:保存评估历史,按门类统计评分分布,再把历史基线和少量参考案例放进提示词。Few-shot 在这里指让模型参照几个已有的评估样例,不涉及重新训练权重。
这可能帮助保持评分尺度,但历史记录并不天然是正确答案。如果只把模型自己过去的分数当基线,可能连偏差一起保留下来;如果只挑用户喜欢的高分报告作样例,也会把反馈偏好带入下一次评估。
我也调研过多模型投票,但不能只凭“更多模型赞同”就认定判断正确,还要考虑新增调用的成本。
Venus Core(评估引擎)与 Venus Lite(交互应用)尚未完成历史基线校准、Few-shot 注入和多评委投票。要回答现有流程比单 Agent 稳定多少、能否达到专业评委水平,还需要固定样本下的重复实验数据。
结语:我更关心那个分数后面留下了什么
最初只是想做一个“上传照片、得到分数”的功能。做下去以后,作为摄影爱好者,我更想追问:你看到了什么,为什么这么评,有什么可以改?
审美依然没有唯一的数学答案。我能要求 Venus 做的,是留下具体的观察、分歧和裁决理由,供使用者核对。
分数我仍然会看。但比起照片最后是 7 分还是 8 分,我更关心的是:这次评价有没有提醒我注意到画面中的某个问题,或者让我重新理解一个原本没有留意的优点。
如果能做到这一点,Venus 对我就已经有了意义。