测试AI提交结论:"页面没有错误,测试通过。"系统却把它标记为测试失败 ------复核被打回、任务重测。折腾半天,凶手是系统里一行"找'有错误'三个字"的关键词判断:"没有错误"里,藏着"有错误"。
一、结论明明是"通过",系统判了"失败"
测试AI(小牛)测试完页面,提交结果:
页面打开正常,没有错误,测试通过。
系统自动判定:测试失败。复核流程触发,任务被退回重测。
测试AI一脸无辜:我明明说通过了。系统一脸无辜:你明明说"有错误"。
两边都觉得自己对------因为它们说的,不是同一个"有错误"。
二、系统的"眼睛":一行关键词扫描
查系统的测试结果判断逻辑,发现它判断"测试失败"的方式简单粗暴:
python
if '有错误' in result_text:
status = 'failed'
只要测试结论文本里出现"有错误"三个字,就判定失败。
AI说"页面没有错误 "------这行字里包含 "有错误"三个字符(没有错误 → 没 + 有错误)------于是:
"页面没有错误,测试通过。" → contains "有错误" → 判定 failed
系统不是看到了"没有错误",它是看到了"有错误"------子串匹配,根本没有"否定"的概念。
三、更离谱的误判
正则收紧之前,误判的还不止"没有错误":
"如果有错误,请指出来" → 误判失败(假设语气)
"有错误吗?请复核确认" → 误判失败(疑问句)
"没有发现错误" → 误判失败("错误"单独命中?不------是"有错误"子串)
AI本来是想表达"我检查了,没问题"------系统读到的是"有错误"------它不是在读语义,它是在找字符。
关键词匹配最大的问题就在这:它分不清"没有X"、"有X吗"、"如果有X"和"有X"------四个完全不同的意思,在它眼里是同一个"X"。
四、修复:从"找字符"到"读语义"
第一版修复,把否定词排掉:
python
# 排除否定/疑问/假设语境
failed = ('有错误' in text) and ('没有错误' not in text) and ('有错误吗' not in text)
能挡住大多数情况,但心里没底------"没有出现错误"、"未发现有错误"......否定词的变体无穷无尽,正则迟早漏。
真正的修复是:不让AI用自然语言表达状态,改用结构化字段。
测试AI提交结果时,必须带上明确的机器可读状态:
测试状态: PASS # 或 FAIL
测试结论: 页面打开正常,没有错误。
系统只认测试状态字段判断通过/失败,结论文本仅供人工查看。判断的依据从"扫描文字"变成了"读取字段"------语义的歧义,根本没机会发生。
五、教训
- 关键词匹配要防子串陷阱 。"没有X"包含"X"------
'有错误' in '没有错误'为True------这类反向误判,写正则的人自己都容易忽略。 - 否定/疑问/假设语境,正则很难全拦住。"没有"、"未"、"吗"、"如果"------变体无穷------正则是在跟人类的语言习惯赛跑,注定输。
- 状态判断用结构化数据,别用自然语言扫描。PASS/FAIL字段一个字符就表达清楚------让AI写"测试状态: PASS",比让它在三百字结论里"暗示"通过,可靠一万倍。
- 误判要有可见性。那次误判要是没有被人工发现,测试AI会一直"说了通过却被判失败"------直到它学会用系统听得懂的方式说话(或者学会撒谎)。
AI说"没有错误",系统听到的却是"有错误"------关键词匹配,分不清否定。
我们教AI用人类的语言说话,却忘了系统只听得懂字符------后来我们让AI改口说"状态: PASS",误会从此消失。