构建响应回执:用小脚本拦截AI的空白与幻觉输出

用一张JSON回执卡片和50行Python脚本,在演示前拦截空白或无关的大模型输出。
本文介绍一种极简的大模型输出校验习惯:将一次模型调用的结果「冻结」成含 prompt、context、answer、source 四字段的 JSON 回执卡片,再用一个不依赖第三方包的 Python 脚本对其进行三层校验——字段完整性、空白检测、词汇接地检测。脚本的核心判断逻辑是:若答案与给定上下文没有任何有意义的共享实词(排除高频停用词和短词),则以非零退出码判定为「ungrounded」。作者通过三张示例卡片演示了接地、空白、流畅谎言三种典型场景,并诚实地指出方法的边界:它是词汇闸门而非真相核查,无法检测释义公平性或引用正确性。核心理念是把模型输出当作带字段的可校验记录,而非「感觉能用」的氛围。
深夜的实验室里,距离演示只剩几个小时,免费模型服务器返回了三个空格——却差点被当成结果塞进作品集的 README。这是本文作者的真实经历,也引出了一个值得每个使用大模型的人思考的问题:我们是否仅仅因为文本框过去能用,就盲目信任它的输出?
本文介绍一种极简的工程习惯:把一次模型回答「冻结」成一张可校验的 JSON 回执卡片,再用一个不到五十行的 Python 脚本,在空白或脱离上下文的答案进入作品之前把它拦下。

为什么需要一张「回执」而非截图
作者的核心观点很犀利:截图会撒谎。「截图在当下对你微笑,一周后同样的提示词返回空白时它就背叛了你。」
相比之下,回执更像一张公交车票。它不能证明城市很美,但能证明你是带着某张具体的笔记上车的。换句话说,回执记录的是可复现的中间状态,而不是一种「感觉它能用」的氛围。
这个思路把课堂笔记或项目要求转化成可被机器检查的工件。作者的项目要求本身很枯燥——「演示必须展示文本回执,而不仅仅是一个颜色徽章,且样本文件采用 CC0 协议」——但正是这句枯燥的话构成了整个判断的基准。如果模型的答案无法与它产生关联,那这个答案就不配被称为「结果」。
脚本做什么,不做什么
目标很明确:一条命令读取一张 JSON 卡片,当答案缺失、空白、或与上下文没有任何有意义的词汇重叠时,以非零状态码退出。失败必须出现在终端里。
作者强调了一个诚实的组合:绿色的 README 旁边配一个红色的进程退出码。脚本是一道闸门(gate),而不是一个评分(grade)——即便回执通过了,你仍然得自己把那句话读一遍。
核心代码逻辑
脚本的依赖刻意保持极简:Python 3.11+、一个终端、零第三方包。即使同学在没有信号的火车上克隆了文件夹,检查依然能跑起来。
校验逻辑分三层:
- 字段完整性:
prompt、context、answer、source四个必填字段缺一不可,否则返回missing_fields。 - 空白检测:对答案做
strip()后若为空,返回empty_answer。三个空格不是「礼貌的停顿」,而是明确的失败。 - 接地检测(grounding):对答案和上下文分别做分词,取交集。若共享词汇为空,则判定为
ungrounded。
值得一提的是停用词表(STOP)的设计。the、and、not、only 等高频词被排除在证据之外,避免它们冒充「重叠」。词长小于 3 的词也被过滤掉。
「接地检测」(grounding)这一概念来源于自然语言处理中的 grounded language understanding,核心思想是:一个回答要被视为有效,它必须能与给定的上下文或知识源产生可追溯的联系,而不是凭空生成。在检索增强生成(RAG)系统中,这种联系通常通过向量相似度或引用片段来衡量。本文的脚本采用了一种极度轻量的代理方式——词汇重叠(lexical overlap),即直接比较答案与上下文的分词集合交集。这种方式不需要嵌入模型或网络请求,但代价是只能捕捉表面词汇信号,无法处理语义等价的释义。这也是作者在「方法边界」一节中明确承认的权衡:词汇重叠是接地性的必要不充分条件,能拦截明显的幻觉,却无法判断一段正确的改写是否真的忠实于原文。
三张卡片,三种判决
作者用三个 fixture 文件完整演示了脚本的行为,这也是本文最有说服力的部分。
第一张:接地卡片(grounded.json)。答案复述了笔记中确实存在的主张。运行后退出码为 0,重叠词包括 demo、show、text、receipt、color、badge。作者提醒:source 字段只是你手动输入的标签,它不是服务器的签名,不应被当成签名来读。
第二张:空白卡片(blank.json)。答案是三个空格,source 标为 live-free-server。这正是差点进入 README 的那张卡片。脚本返回 empty_answer,退出码 1。作者的态度很坚决:「沉默不是摘要。我没有重试三次然后对感觉取平均值。」
第三张:流畅的谎言(ungrounded.json)。答案是「该模型在一个私有排行榜上得了 99 分」——语法通顺,却与项目笔记毫无共享实词。退出码同样是 1。
「如果你的初稿只检查字符串是否非空,这一张会轻松过关。那就是我的初稿。它感觉很善良,但它是错的。」
这句话点出了关键陷阱:非空字符串恰恰是演示最常骗过我们的方式。那句排行榜的话之所以听起来像结果,仅仅因为它带了个数字。作者的比喻很到位——「数字是戏服。」99 从未出现在项目笔记中,脚本并不在乎这句话语法是否正确。
这个方法在哪里会失效
作者没有回避方法的边界,这是本文可信度的来源。
回声问题:把上下文直接复制进答案,回执会给你鼓掌——但这是回声,不是理解。
释义问题:一个干净的、正确的释义如果不共享任何实词,回执反而会训斥它。作者亲自踩了这个坑:用「访客需要文字,而不是绿点,示例数据是公共领域的」来释义,结果因为没有共享 receipt、badge、CC0 这些词而被判为 false。
作者由此给出精准定位:词汇闸门是烟雾报警器,不是消防检查员。 它检查的是与你提供的笔记的词汇重叠,而不检查真相、许可证,也不判断释义是否公平。
谁应该跳过这个方法?如果你需要引用核查、评分,或任何可能被招聘方当作评估框架的东西,这是错误的工具;如果你需要演示期间服务器保持在线,你需要另一套方案;如果你的上下文短于一句话,词汇重叠会变成掷硬币。
作者还列出了自己犯过的常见错误:把空白当答案、打印 JSON 却忽略退出码、在停用词表存在之前让 the 算作证据、把密钥存进 fixture(绝对不要),以及最危险的一条——反复重试直到出现漂亮句子,然后在没有笔记的情况下冻结那句漂亮话。「那就是演示变成虚构的方式。」
作者所描述的「流畅的谎言」问题,在大模型研究领域有一个专门的术语:幻觉(hallucination)。它指模型生成语法通顺、语气自信、却与事实或给定上下文不符的内容。幻觉之所以危险,正是因为它在表面上与真实输出难以区分——两者都是非空字符串,都有完整的句子结构,甚至都可能带有数字或引用。当前主流的幻觉缓解手段包括:检索增强生成(RAG)、基于人类反馈的强化学习(RLHF)、以及输出后的事实核查管线。本文的词汇闸门可以被理解为这些方案中最轻量的本地替代——它不依赖外部服务,只依赖你自己提供的上下文笔记,因此在离线场景和快速演示验证中有独特的实用价值,但也继承了所有轻量方案共有的局限性。
一个值得动手的扩展
作者留下了一个开放练习:把通过规则改成 ok 至少需要两个重叠词,再重跑接地卡片。text 加 receipt 还算接地吗,还是你只是奖励了一次复制?
再加一张第四 fixture,答案是零共享词的真实释义,然后决定你想要一个失败,还是在 source 里加一条人工备注。
这个小脚本本身并不复杂,但它背后的工程直觉值得推广:对待大模型的输出,应当像对待一条带字段的记录,而不是一种情绪。 免费模型服务适合用来完成生成卡片的那一次实时调用,却是一个糟糕的「长期依赖」——当别人在火车上打开你的 README 时,服务可能早已不可用。把结果固化成可校验的回执,才是让作品集经得起时间检验的方式。
相关推荐

Workbuddy零基础入门:桌面AI智能体如何落地工作流
Workbuddy桌面AI智能体零基础教程解读:从安装、积分领取到文件管理与自动化工作流搭建,对比CodeX的适用场景与成本差异,帮助职场人完成从AI提问者到AI管理者的思维转变。

OpenAI智能体新栈:计算机操作、决策API与超速工作流
OpenAI Dev Day发布智能体新栈:Computer Use操作速度超越普通人,Decisions API基于Luna实现极低延迟分类,Agents API开放同源计算机操作能力,GPT-6.1 Sol成本仅为Astra七分之一。本文梳理核心更新、实测数据与开发者落地要点。

梁文峰开源推理框架DeepInfo,硬刚美国禁令
DeepSeek在开源模型后再开源推理框架DeepInfo,包含GPU/CPU交叉流水线、小模型预判大模型复核、华为昇腾与英伟达芯片全面适配等技术,直面美国联邦禁令。本文解析其对AI产业落地的意义与开源策略。