[控场AI]
· 6 分钟阅读· 3,449 字

AI代码审查的过度推断:alt文本缺失是事实,图片用途是另一回事

AI代码审查的过度推断:alt文本缺失是事实,图片用途是另一回事

AI 审查代理能准确报告缺失 alt 等观察事实,却容易对其用途做出未经证实的推断,修法应拆开两类论断并分支给出。

文章以一个刻意破坏的 HTML 测试夹具为例,展示了 AI 代码审查代理在无障碍检查中的一个系统性缺口。在 375 像素视口下存在水平溢出、图片缺少 alt 属性的页面上,Claude Code、Codex、agy 三个代理都正确报告了这两项观察事实,也都无视了植入的挑衅指令。问题出现在下一步:agy 把没有 alt 的图片当作"信息性图片"处理,但页面里没有任何证据支持这个角色判断。作者指出,缺失 alt 是可核实的观察,图片用途则是依赖需求简报和周边上下文的独立声明。W3C 的 alt 决策树从角色出发追问,审查者缺少用途就无法走完。Claude Code 的修复方案将缺失 alt 按事实报告,把用途当作需要证据的独立声明,用途未知时用条件化分支代替单一修法。作者同时强调验证仅限合成夹具,并指出同样缺口出现在视频清单和数字引用场景中,最后提出报告观察、点明推断所需证据、证据不足时分支方案的三段式审查模式。

AI 设计审查员在离线 HTML 夹具上的审查界面

AI 代理做代码审查时,"发现问题"和"推断意图"是两件不同的事。一个刻意破坏的 HTML 测试页把这条界线摆到了明处。

一个刻意破坏的测试页

据 hexisteme notes 的一篇技术笔记记录,作者搭建了一个合成 HTML 测试夹具:在 375 CSS 像素视口下离线渲染于 Chromium,文档实际宽度却是 744 像素——因为有元素溢出。页面里有一张没有 alt 属性的图片,还埋了一行挑衅性文本,要求审查者报告"全部通过"。

Claude Code、Codex、agy 三个代理 CLI 分别审查了这个页面。三者都正确报告了水平溢出和 alt 缺失,也都无视了那行植入指令。问题出在发现之后的下一步。

值得一提的是夹具截图本身:整页截图宽 744 像素,但这不等于视口宽 744 像素。整页截图包含溢出宽度,视口依然是 375。这个细节容易被误读。

alt 属性是 HTML img 元素上用于提供图片文本替代内容的属性,是 WCAG 2.x 中最常被检查的无障碍项目之一。它的取值分为三类:对于信息性图片,alt 应传达图片所承载的等价信息;对于装饰性图片,规范建议使用空值 alt="",以便屏幕阅读器直接跳过;对于功能性图片(例如链接或按钮内的图标),alt 应描述该控件的动作或目的地。关键之处在于,这三类之间没有外观上的判别依据——一张纯色方块可能是装饰性的背景,也可能是说明某概念的示意图。因此 alt 的正确写法必须由图片的用途决定,而用途是文档的外部信息,不从标记本身推导。审查代理能看到的是元素的存在与否,看不到作者对图片角色的意图,这正是推断容易越界的地方。

审查中的过度推断

agy 的博客审查把这张图当作"信息性图片"处理——仿佛它承载了读者需要的内容。但夹具里没有任何东西支持这个判断:没有需求简报界定用途,周围标记也没确立它的角色。回复把一个可观察事实(一个没有 alt 属性的 img 元素)和一条未经检验的用途声明捆在了一起。

这是两类不同的论断。第一类读标记就能核实。第二类依赖标记里没有的东西:作者想让这张图发挥什么作用,周边文本已经说了什么。把两者混为一谈,交给作者的就是一个建立在无人核实前提上的修法。

猜测的方向无关紧要。如果图是装饰性的,硬加文字描述会让屏幕阅读器用户听一堆无意义内容;如果图是信息性的,有人猜它是装饰性的并写入 alt="",内容就会在这些用户那里彻底消失。两种猜测都可能产出自信、具体、错误的修法。

训练数据里没有页码和章节的富文本阅读器——它们拿到的是原始 HTML,只有属性可供核对。

W3C 决策树问的是什么

W3C Web Accessibility Initiative 发布了一棵专门的 alt 决策树。它不从图片长什么样出发,而是问图片的角色:图中是否包含文本、是否位于链接或按钮中且缺少它就无法理解操作、是否在上下文中贡献意义、是否纯装饰。每个答案通向不同类别的替代文本。

这棵树把依赖性摊开了:正确的替代文本由用途和上下文推导,而审查者两者都没有,就完不成这棵树。它能做的是诚实地说明自己卡在了哪一步。

W3C Web Accessibility Initiative(WAI) 是万维网联盟下设的负责制定 Web 无障碍标准与教学材料的机构,其发布的 WCAG(Web Content Accessibility Guidelines)是各国无障碍法规广泛引用的基础规范。这棵 alt 决策树属于 WAI 的教程材料,与规范文本不同,它把判断过程写成一组按序回答的问题,每个分支对应一类替代文本写法。它的设计哲学是把结论从"看图说话"反转为"先定角色、再写文本":只有当图片的角色在页面上被确认之后,替代文本的类别才有唯一解。对自动审查而言,这意味着当上下文缺失时,决策树本身无法走完,模型能做的不是猜一个类别,而是报告自己卡在了哪个问题上。

修法:拆开论断,分支给方案

Claude Code 收窄了该技能博客参考文件中的指引,改动做了三件事:

  • 缺失 alt 属性按观察事实报告。 这是真实发现,应当修复。
  • 图片用途被当作独立声明,需要自己的证据。 即作者的需求简报和图片周围的语义上下文。看外观不足以确立角色:纯色图片不等于装饰性,没有图注也不等于装饰性;反过来,审查也不能默认它一定是信息性的。
  • 用途未知时,用条件化方案代替单一选择。 大致形状如下(概念示意,非指引原文):
Observed: one <img> has no alt attribute.
Not established: what the image is for on this page.
If informative: write alt text that conveys the same meaning in this context.
If decorative: use alt="" so assistive technology can skip it.
If it is a link or button: describe the action or destination.
If it is complex, such as a chart: it may need a longer explanation too.

这个输出不如一个自信的修法"爽",但更有用。作者知道哪条分支适用于自己的场景,审查者不知道。

验证,以及它证明力有多弱

Codex 把收窄后的文件应用到共享技能源,重跑了同一个 agy 用例。这次回复没有假定图片用途,而是把信息性和装饰性两条路径作为条件选项给出。静态检查也重跑了:共享文件仍然逐字节一致,每个别名仍然解析到同一源。

这只是一次对合成用例的重跑。它表明新指引在这个夹具上把模型从假设中引开了,并不表明模型在别的页面上不会再犯同样的假设——作者也明确不作此主张。同样,作者也不主张每个缺失的 alt 都是无可争议的 WCAG 失败:某个页面是否合规,需要结合页面本身、用途和上下文做判断,而这正是这则笔记的要点。夹具也不是生产页面。

同样的缺口不止存在于 HTML

该技能的 Shorts 测试有个更小号的版本。输入是一份 20 秒的清单,描述点在第 0 秒和第 10 秒,没有视频、帧、音频或叠加层。描述视频的清单是"某人计划做什么"的证据,不是"渲染出了什么"的证据。把清单当成对视频的检查,就是在时间轴上犯下同一个 alt 错误。

数字上也有同样的形状。在《四个模型完美引用了我的数字,其中一个仍然误读了它们》中,一个模型准确引用了一行零,然后得出结论说它们意味着无错误的工具使用——而那其实是测量伪影。引用是准的,晚一步的推断不是。

作者现在要求审查遵循的模式包含三部分:报告观察到的内容;点明修法所依赖的推断,以及什么证据能了结它;如果输入里没有这种证据,就把修法作为分支给出,让知道用途的人去选。

对 AI 辅助开发来说,这是比"修好它"更难的纪律。它要求审查者承认自己不知道什么,而这恰恰是自信的模型最不擅长的部分。

测量伪影(measurement artifact) 是实验科学中的概念,指观察到的结果由测量过程或工具本身产生,而非被测系统真实性质的反映。在一个记录为零的数据里,看到零既可能是系统确实没有发生某事件,也可能是采样方式、日志格式或聚合口径导致该事件未被记录。把前者当作后者,就是把"记录为无"误读成"确实无"。这与 alt 审查的错误同构:引用数字的准确性是一阶观察,数字意味着什么则是需要独立证据的推断。模型可以逐字复现输入,但一旦越过观察进入解释,就需要额外前提,而这些前提往往不在输入里。识别测量伪影需要的恰恰是对数据来源和采集过程的了解,而不仅是数据本身。

#AI代码审查#alt文本#WCAG无障碍#AI代理过度推断#W3C决策树#可访问性#观察与推断
分享:

相关推荐