☰
AI听稿检查不靠谱?用规则扫描和证据回执堵住代码混入
2026/10/20 21:59:04 网站建设 项目流程

上周我在审一批会议听稿,AI在交付前很笃定地告诉我:“已经检查过,格式和内容都没有明显问题。”结果我打开成品文档,第42段躺着一行console.log(JSON.stringify(res));,上下文却是大家在讨论新品发布会的排期。那一刻我意识到,AI嘴里的“检查过”,跟我们人类脑子里的“检查过”,可能根本不是一回事。

这类事情不是孤例。做播客文字稿、课堂录音整理、发布会速记、访谈逐字稿,凡是“听稿”场景,AI都能把口语理顺,但交付前那句“已检查”经常漏掉代码混入、乱码、重复段落。更麻烦的是,你要是追问一句“你确定检查过了吗”,它还会礼貌地补一句“是的,我已经全面核对过了。”语气越肯定,坑往往越大。

这篇文章不打算泛泛而谈“AI不可信”,而是从一次实实在在的漏检出发,拆出背后四条可复用的经验:为什么AI的自检靠不住、为什么代码会钻进听稿、怎么用确定性规则把漏网代码捞出来、怎么在流程上让AI提交“证据回执”。适合所有用AI辅助整理文字稿、字幕稿、课程稿的内容从业者,也适合对AI输出质量不放心的人参考。

1. 拆解“AI说检查过,但听稿里有代码”这件事

1.1 AI的“检查过了”为什么不能直接信

先说清楚一个底层事实:绝大多数对话式AI是自回归生成模型。它在生成每一个字时,都只是根据前面的内容去预测下一个概率最高的字。所谓“检查”,很多时候不是真的把整篇文档从头到尾逐字复核,而是模型基于当前上下文重新生成一段“评价性文本”。它并没有一个独立模块去对照原文,自然也没有“咦,这里漏了”这种真实体验。

我做了一个很能说明问题的类比:这就像一个边写字边往前看的速记员,你问他“刚才写的稿子里面有没有错别字”,他不会真的翻回去逐字看,而是凭手感回答。而且他大概率会回答“没问题”,因为你的问题已经给了暗示——你希望听到“没问题”。模型的训练目标让它倾向于生成连贯、完整、不引发冲突的回答,所以“应该检查过了吧”这种含糊提问,得到的往往是肯定的回话。

这不是说AI完全不能做质量检查。确切地说,它的“检查”是对文本合法性的概率判断,不是确定性校验。两个最直接的原因:

  • 上下文窗口有限。长听稿会被切段处理,后面的段落可能根本没有进入当前“注意范围”。AI说“检查过”的时候,可能只检查了最后那一段或摘要。
  • 注意力不均衡。模型对开篇、开头句、特殊符号的关注度高,但对中间段落的某个短暂技术词可能关注度极低。代码混入往往就藏在这种低关注区域。

所以,“AI说检查过”这句话本身没有多少信息量。可信度取决于你给它的任务约束、依赖的外部校验以及流程设计,而不是它嘴上说的确认词。

1.2 代码究竟是怎么钻进听稿里的

听稿里出现代码,乍看很荒诞,实际有三种典型来源。第一种来自语音识别阶段。语音识别模型(ASR)听到技术词汇时,很容易对比着常见代码语料去“脑补”。比如说话人讲“打印一下日志”,ASR可能直接转成print(日志);讲“控制台输出结果”,转成console.log(结果)。因为ASR底层语言模型本身也见过大量代码,遇到高度类似代码的发音就会倾向于补全括号、引号、分号。

第二种来自AI顺稿或润色阶段。原文本身是正常口语,比如“我们把这个结果打出来看一眼”,大模型在“口语变书面”时可能把“打出来”理解成编程动作,顺手补全成“我们把这个结果console.log出来看一眼”,甚至更极端,把整句改写成一行函数调用。越是训练语料里代码占比高的模型,这种倾向越明显。它不是在故意骗你,而是“打出来”这个双关语境同时激活了“打印结果”和“输出日志”两类表达,模型选了看起来更专业的那条路,却忘了手头这是一份口语听稿。

第三种来源是提示词污染。很多人在让AI处理听稿时,会在提示词里给“好的例子”和“坏例子”。如果例子里面不小心放了代码片段,模型会把它当作风格模板去模仿。另一些情况是对话历史里有一段代码,模型在处理新稿件时仍然“惦记”着那段代码,结果在语义断裂处把它抛了出来。这种混入通常是整段代码块,特征非常明显,但偏偏容易出现在长稿件的后半段。

代码进入听稿,不是一次偶发故障,而是结构性风险。只要流程里存在“ASR生成 → LLM改写”这种非确定性链条,代码混入就可能反复出现。所以处理思路不能是“下次让AI注意点”,而是设计一套不依赖AI自觉性的兜底机制。

2. 先别让AI再读一遍:用确定性规则捞漏网代码

2.1 为什么让AI重读一遍不是好主意

出问题之后,人的第一反应往往是:把文档再扔给AI,让它“认真再检查一遍”。这个动作我做过很多次,结果基本是三个:一是AI回答“这次仔细检查了,确实没有代码”,但代码还在原地;二是AI把那一句删掉,却顺带把前后几句也改成了奇怪的话;三是AI承认有“疑似代码”,然后向你道歉,但问题的定位和修复完全依赖运气。

原因不复杂。让AI检查AI自己刚生成的文本,属于同源复核。第一次生成时,模型对那段代码的概率评估已经接近“合理”,第二次遇到同样的文本,它大概率还会输出“看起来没问题”。两个不同模型交叉检查会好一些,但也不解决根本问题,因为多模型兜底增加了成本,而且如果两个模型的思想来自同一批训练语料,错误模式可能高度相似。

人工通读一遍也不是好办法。听稿动辄几千字,短则五六千,长则上万。人的注意力放在语义上,反而容易忽略短小的代码片段。你会发现整篇读下来都很顺畅,但代码就在你视线滑过的地方。我后来总结了一条经验:对付这种问题,不能靠智能,要靠“笨办法”。也就是用确定性的规则,把代码特征硬性捞出来。

2.2 可以落地的代码特征扫描规则

我在团队内部用了一个不到一百行的Python脚本,专门做听稿代码特征扫描。核心思路很简单:列出常见编程语言的高频特征,用正则去全文匹配,把命中行输出为“可疑清单”。脚本跑起来不依赖网络,不依赖模型,结果稳定可复现,适合放在交付前最后一步。

import re CODE_PATTERNS = [ # 高频关键字 r"\b(import|from|def|class|return|function|const|let|var|async|await|SELECT|UPDATE|DELETE|INSERT INTO)\b", # 常见函数调用特征 r"\b\w+\s*\([^)]{0,80}\)\s*[{;:]", # 代码块缩进特征:行首空格 + 关键字 r"^\s{2,}(if|for|while|print|console|System\.out)", # 分号结尾 r";\s*$", # 版本号或哈希特征 r"\b\d+\.\d+\.\d+\b", # 常见输出语句 r"\b(console\.log|print\(|printf\(|System\.out\.println|logging\.info)\b", ] def scan_lines(text): hits = [] for idx, line in enumerate(text.splitlines(), 1): for pattern in CODE_PATTERNS: if re.search(pattern, line, re.IGNORECASE): hits.append({ "line": idx, "pattern": pattern, "content": line.strip(), }) break return hits

跑完后的输出大概长这样:

第42行 命中 console.log 输出语句 "console.log(JSON.stringify(res));" 第87行 命中 分号结尾 "现在我们有三个方案;"

第87行这种就是误报,中文分号也会命中“分号结尾”规则。所以脚本的任务只是“捞出来”,不是“自动判断”。命中清单交给人工去翻上下文,通常几秒钟就能认定第42行是不是异常插入,而第87行是正常中文标点。

我特别想提醒一点:扫描规则不能只覆盖某一种语言。听稿场景里出现过JavaScript、Python、SQL、Shell命令,甚至JSON片段。所以规则要维持一个“特征库”,覆盖关键字、符号、缩进、URL、路径等。发现新的异常样本就往里加,不用追求一次到位。

2.3 发现可疑位置后,怎么让AI只改该改的地方

如果规则扫描已经标出了可疑行,下一步不是让AI把整篇再顺一遍,而是把影响范围控制到最小。我试过直接对全文说“把代码去掉”,结果AI把几个正常的英文缩写都改成了代码风格,还额外删了一段注释。后来我改成“局部手术”式操作:取可疑位置前后各两三句,一起喂给AI,并明确要求它只重写这一段。

推荐用这样一段提示词模板:

下面是一份听稿的局部片段,第X行被标记为“疑似代码混入”。请你阅读上下文,判断这一行是否和上下文语义断裂。如果确实断裂,请把它改写成自然的口语化表达;如果你不确定,请保留原句并在返回内容里标“[不确定]”。除此之外的段落不要做任何修改。绝对不要在输出里添加新的代码、括号或分号。

这种写法的好处是让AI在“小上下文”里做局部重写,它没有机会把整篇文章的语言风格带偏。同时“不确定就保留”能逼它暴露风险,而不是直接把怀疑压下去。改完之后,脚本要再跑一遍,确认可疑行消失且没有新增可疑特征。这条闭环虽然笨,但很干净。

这里也有一个重要的操作禁忌:当原文本身讨论的就是代码时,不要使用上述“去掉代码”的指令。比如技术讲座里说话人正在讲一段Python实现,听稿中保留代码反而是正确的。扫描规则在这种情况下会产生大量合法命中,所以技术稿件的流程需要另外加白名单,或者人工先把代码块区域标记出来,脚本跳过这些区域。

3. 把“自查”改成“证据回执”:流程层面的治本方案

3.1 让AI返回结构化检查日志,而不是一句“检查过了”

规则扫描能治漏网代码,但治不了“AI说自己检查过”这个行为本身。要想AI的自检有价值,必须把它从一句口头确认,变成一份可追溯的证据回执。我在实际项目里调整了收稿前的最后一个AI环节,强制它按JSON结构输出检查结果。

{ "checked_at": "2026-05-14 16:30", "check_items": [ { "item": "是否存在程序代码片段", "status": "可疑", "position": [42, 43], "evidence": "第42段出现console.log,疑似代码混入" }, { "item": "是否存在重复段落", "status": "passed", "position": [], "evidence": "" }, { "item": "是否存在异常符号", "status": "uncertain", "position": [87], "evidence": "第87行出现分号,不确定是中文标点还是代码特征" } ], "uncertain_items": [87] }

注意,我不是让AI保证自己百分之百对,而是要求它把怀疑点、位置、原文证据都列出来。同样的漏检率下,有结构的回执比一句“已检查”有用得多。因为哪怕它能漏掉一半问题,只要它愿意把“uncertain”单独列出来,人工就能针对性地看那几个位置,而不是对着全文大海捞针。

为了让这个机制生效,提示词里必须要写清楚:“宁可标记为可疑,也不要隐瞒;不确定就放进uncertain列表。”因为默认情况下,模型更倾向于输出“干干净净、全部通过”的结果,这会让自检流于形式。明确要求“可疑优先”,才能把模型从“讨好模式”扳过来。

3.2 质量门禁:三层漏斗拆掉“AI全包”的幻想

我在过往内容流程里踩过很多次坑,最终沉淀下来的方案是“三层漏斗”:

层级名称做什么负责人
第一层生成与顺稿ASR转写、AI口语改书面、错别字校对AI
第二层规则门禁代码特征扫描、重复段落检测、异常标点检测、长度校验确定性脚本
第三层人工抽检检查规则标记的可疑位置、关键段落、随机抽读内容编辑

第一层负责效率,第二层负责守住“AI哪些地方会犯傻”的边界,第三层负责判断人话是否通顺。这个漏斗的关键在于:第二层必须是确定性脚本,不能又是另一个AI。也就是说,你不能让AI去决定“要不要运行规则扫描”,更不能让AI来总结扫描结果。因为AI只要参与判断,就又把不确定性引入了回来。

我见过一些团队把规则扫描做成了AI的“工具调用”,模型觉得可疑才触发脚本。这个设计看起来很智能,实际上很危险——模型完全可以扫描完但声称没问题。正确做法是脚本独立存在,先于交付自动运行,并把结果直接推给人工。AI可以做辅助分析,但不能拥有最终判断权。这和我对“AI说检查过”的怀疑是一致的:口说无凭,直接上证据。

3.3 用版本对比锁死“代码从哪一步进来的”

听稿处理往往要经过好几个阶段:ASR原始稿、AI顺稿、AI校对、AI最终检查。代码可能在任一步被引入。只拿最终稿和原始稿对比,能发现问题,但很难定位是哪一步、哪个提示词导致的问题。

我现在的习惯是:每个AI处理阶段保留一个中间文件。例如v1_asr.txt、v2_smooth.txt、v3_proofread.txt,然后用文本对比工具或命令行diff去比较相邻版本。如果v1里没有代码,v2里出现了,那就说明是“顺稿”这一步搞的事;如果v2没有、v3出现了,那就是“校对”阶段的问题。定位到具体环节后,修复提示词或调整模型参数才有的放矢。

操作上不需要很复杂的系统,一条diff命令就够:

diff v2_smooth.txt v3_proofread.txt

这条命令会输出新旧两份文件的所有差异。代码特征通常非常显眼,比如一行只有console.log(JSON.stringify(res));而上下文都没变,那基本就是新增代码混入。即使是图形界面的对比软件也可以,只是我更喜欢命令行,方便批量跑。

另外,我还会让AI每处理一步后,输出一个“改动说明”:“你相对上一版做了哪些修改,逐条列出,不要归纳。”这个说明虽然不如diff可信,但加上diff的硬证据,排查效率会高很多。记住一个原则:AI的自我报告永远只能作为线索,不能作为证据。

4. 复盘一次真实漏检:从录音到成稿的完整追踪

4.1 那次交付稿的完整处理链路

用一个虚构但很典型的案例来复盘。A同学负责将一次产品技术公开课的录音整理成图文稿,流程如下:

  1. 录音文件约40分钟;
  2. 用ASR工具生成转写初稿;
  3. 用AI做“口语变书面”;
  4. 用AI做错别字和格式校对;
  5. 用AI做最终检查,AI回复“已检查,没有明显问题”;
  6. 交付。

整个流程不到一小时,速度很快,所以当时也没人觉得会出事。交付后,我在文档第42段看到了一段JavaScript代码:console.log(JSON.stringify(res));,而上下文却是在讨论活动排期。这个听稿的受众是行业读者,出现这种低级错误非常影响可信度。

A同学还去追问AI:“你不是说检查过了吗?”AI回答:“非常抱歉,可能是我在检查时没有覆盖到第42段附近的上下文。”这个回答反而印证了一个问题:AI的“检查”确实没有覆盖全篇,它只是在生成“检查结果”这套话,并没有真正做全文校验。

4.2 排查中真正起作用的三个动作

复盘时,我们做了三个动作。第一个是翻找中间文件。把ASR原始转写稿找出来,搜索console,结果没有。这说明代码不是语音识别阶段产生的,至少不是ASR直接转出来的。

第二个动作是拿到v2顺稿之后、v3校对之前的两个版本做diff。对比后发现,在v2进入v3的过程中,新增了那行console.log。也就是说,代码在“AI顺稿”这一步就已经被塞进去了,但校对阶段没有删掉,最终检查也没有发现。为什么顺稿会塞进代码?我们回过头去听原始录音,里面有句原话是“我们把这个结果打出来看一眼”。AI在“口语变书面”时,把“打出来”理解成了“调用console.log打印出来”,并自动补全了一个接收结果的变量表达式。

第三个动作是检查顺稿环节的提示词。提示词里恰好放了一段“正确示例”,里面有一段代码片段作为格式示范。模型在处理时把示例里的代码风格一并学习了,于是遇到“打出来”这一口语,就把示例里的代码模式迁移了过来。修复方式很简单:把示例改成纯文字示例,并在规则里显式写上“不要在口语稿中生成任何程序代码”。

这次复盘给了我一个很重要的认知:代码混入不是某个模型独有的抽风,而是提示词、语境、语音识别共同作用的结果。排查时要顺着流程链条找证据,而不是质问AI为什么犯错。

4.3 门禁上线后的复测变化

给这个流程加上规则扫描和结构化检查日志之后,我们连续复测了两周,处理的听稿大约十几篇。代码混入从平均每十篇出现一两次,降到了几乎没有。唯一一次漏网的,是说话人本身在课堂上念了一段代码,规则扫描命中后人工确认属于正常内容,直接放行。

这个样本量不足以说明统计上的显著意义,但至少说明一个问题:门禁能拦住结构性漏检。所谓结构性漏检,就是“AI顺稿时因语境双关插入代码+后续检查全部流于表面”这种模式。用规则扫描把它拦在交付前,比多抱怨几遍“AI不靠谱”有用得多。

还有一个额外收获:结构化检查日志让A同学不再一个人盯着全文看了。他会优先看“可疑”和“uncertain”清单,然后再抽两三段检查语义连贯性。整个审查时间反而缩短了,因为注意力被规则导向了最可能出现问题的地方。

5. 常见问题与排查技巧实录

5.1 别再问“检查过没”:正确的追问方式

只要你在跟AI协作,就一定会忍不住问“你检查过了吗”。我把这个问题换成了一整套“可验证问法”,实测下来管用很多。用表格对比一下:

错误问法很可能得到的回答正确问法
你检查过这篇稿件吗?是的,我已全面检查。请逐段列出你检查过的段落编号,并给出每段的检查结果。
确定没有代码混入吗?确定没有。请查找所有函数调用、分号结尾、缩进行,并输出位置与原文证据。
这段怎么会有代码?抱歉,可能是我生成时的失误。请解释这段代码为什么出现在这里,以及它与上一版的改动关系。
你重新读一遍,看看有没有问题。我重新检查过了,没有发现问题。请返回JSON格式的检查清单,uncertain条目单独列出。
能保证这次是准确的吗?是的,我保证。请标注置信度低于80%的段落,并说明不确定原因。

这些正确问法的核心,是让AI给出可验证的操作痕迹。你不需要它说“保证”,你需要它交出“检查了哪些位置、证据是什么、哪里还在犹豫”。

5.2 现场排查速查表

我把实际中遇到过的症状和排查路径整理成了一张速查表,适合在交付前或出问题后马上翻查:

症状可能原因快速处理动作
正文突然出现缩进、分号、函数调用ASR或LLM将口语补全成代码用代码特征扫描脚本定位,抽上下文让AI局部重写
AI说已检查无问题,但人工发现问题AI自检流于表面改成结构化JSON检查日志,加规则门禁
同一段内容在不同版本间反复变化提示词发散、参数温度过高降低temperature,固定随机种子,限定改写范围
只有讲技术主题时才会混入代码上下文联想被技术词触发在该类任务提示词中增加“禁止生成代码”约束
技术稿件本身有大量代码,全被标红扫描规则把合法代码当异常建立代码块白名单,人工标记后再扫描

这张表不能解决所有问题,但它能把很多“看起来像玄学”的异常收敛到具体环节。每次新增异常类型,我都会在表里补一行,相当于团队的踩坑笔记。

5.3 如果代码已经发布,怎么补救

最难受的情况不是交付前发现问题,而是文档已经发布,有读者截图过来问“第42行console.log是怎么回事”。我的处理流程分四步:

第一步,立刻重新跑一遍规则扫描,把整篇稿子的所有可疑命中全部拉出来。因为这一处代码出现了,很可能其他文档里也已经出现,只是还没人发现。第二步,定位到出错的中间版本,确认是哪个AI处理环节引入的。第三步,修正公开版本的对应段落,发布更正或追加勘误说明。如果是付费课程或正式报告的配套文字稿,我会额外加一段勘误页,说明修订日期和修订内容。第四步,把这次错误样本加回规则库和复盘文档,避免同类问题再次发生。

补救时有一点必须克制:不要直接把AI生成的新段落替换上去,然后就发更新版。很多人补了一次又出错,就是因为修改内容没有重新过门禁。任何补丁,都必须再跑一遍脚本和人工检查,确认无误后再发布。

现在我再回过头说下个人体会:AI模型在交付时那一句“检查过了”,我基本只当成一句客套话,真正决定稿件能不能发出去的,是它提交的证据回执、规则扫描的命中清单,以及人工在关键位置的那一眼确认。如果你也被AI嘴里的“已检查”坑过,我建议你把检查工作从AI手里拿回来,哪怕只是跑一个一百行的匹配脚本,都比反复交代AI“请再仔细检查一遍”可靠得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询