为什么你的模型总是“不听话”?——一文讲透 Structured Output、采样机制和 AI 幻觉的真相

你有没有遇到过这种离谱场景:

你让模型帮你生成一个 JSON,它非常努力地给你……
一个缺右括号的、跑不了的、甚至完全不是 JSON 的玩意。

再比如:

同样的 Prompt 你问两次,它回答却完全不一样。
甚至前一句刚说“Chip Huyen 是建筑师”,后一句又一本正经地胡说八道。

这背后,其实都是 AI 结构化输出能力不足 + 采样机制本质概率性 + 幻觉机制固有缺陷 的综合结果。

今天这篇文章,我用 最通俗、最工程化、最干货、不打哑谜 的方式,带你看透:

  • 为什么结构化输出难得要命?

  • 为什么模型回答永远“不稳定”?

  • 为什么模型会一本正经胡说八道(hallucination)?

  • 工程上如何“驯服”模型,让它稳、准、不瞎编?

看完你将知道:
AI 的“不听话”不是能力问题,而是概率问题、训练机制问题、架构问题。


一、结构化输出:看似简单,其实是所有工程师的噩梦

模型生成结构化内容(如 JSON、YAML、SQL)为什么这么难?

因为语言模型天生是“写散文的”,不是“写代码的”。

但现实中,我们就是要它写——并且要“严格格式正确”。

结构化输出有两类最典型场景:


场景 1:任务本身必须结构化(如 Text-to-SQL、Text-to-Regex)

比如让 GPT-4o 生成一个邮箱地址的正则表达式:

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}

看似简单,对吧?

但实际工程中你会发现:

  • 有时候它忘括号,

  • 有时候它多转义,

  • 有时候它给你写一段解释,而不是 regex。

你要的明明是 机器读得懂的结构化输出
它却时不时来个 人类友好的散文


场景 2:输出会被其他系统消费(如 JSON API)

比如你让模型生成一封邮件,但 downstream 要求格式必须是:

{
  "title": "",
  "body": ""
}

模型若生成一段解释性文字,一切 downstream 都挂。

工程灾难比模型内容本身更可怕。


二、怎么让模型乖乖输出结构化内容?四大常用方法

你可能听过很多,但真正有效的主要是 4 大类:


1. Prompting(提示词约束)

提示写清楚:

  • 输出格式

  • 字段要求

  • 示例

  • 严格禁止输出解释

成本最低,但不稳定。

适合作为第一道尝试。


2. Post-processing(后处理修补)

模型总爱犯固定错误,比如:

  • 缺右括号

  • 字段顺序乱

  • JSON 多了一句解释

工程师就写脚本自动修:

LinkedIn 的 YAML 修复器把准确率从 90% 拉到了 99.99%。

适用前提:

模型已经“八九不离十”,只需要你帮它补刀。


3. Constrained Sampling(约束采样)

这是最“硬核”的办法。

模型生成每个 token 前会输出 logits 向量,你可以:

把不符合语法的 token 全部过滤掉,只让模型在合法 token 里采样。

例如 JSON Grammar 决定:

  • { 后不能跟 {

  • key 必须跟 :

  • string 要用引号

缺点也明显:

  • 复杂、难维护

  • 每种格式都要写 grammar

  • 生成速度更慢

不是一般团队搞得起的。


4. Finetuning(微调)——最有效但最贵

你给模型大量“你想要的格式”的数据,它就能“学会”。

比如:

  • 想要严格 JSON,就给它 10 万条 JSON。

  • 想要固定 SQL 格式,就给它大量 SQL。

比 Prompting 稳太多。

如果你做的软件系统对格式要求极高,微调是最值得的投资


三、为什么 AI 回答永远“不稳定”?——因为它本质是概率模型

问 AI:

世界上最好吃的菜系是什么?

它可能 70% 的时候回答越南菜,30% 说意大利菜。

因为采样机制天然概率性,不是确定性的。


为什么即使同样 Prompt,也会回答不一样?

原因有三个:

  • Temperature、top-k、top-p 等采样参数本身就是随机机制

  • 不同硬件产生的浮点数差异

  • 生成过程本身是逐 token 采样,每一步都可能走不同路径

你可以:

  • 固定温度

  • 固定 top-p

  • 固定 seed

  • 用缓存去保证同问同答

但:

你永远不能让它做到 100% deterministic。


四、幻觉(Hallucination):模型为什么一本正经地胡说八道?

这部分是很多人最关心的。

AI 幻觉到底是怎么来的?

它不是故意的。

它是机制问题,不是态度问题


幻觉产生的两大核心原因


① 自我欺骗(Self-delusion)

来自 DeepMind 的经典例子:

模型生成一句错误事实

然后继续基于自己的错误事实往下扩写

越写越离谱

比如:

你问图片里的瓶子成分是什么,模型看成牛奶瓶:

“这是牛奶,因此含有奶制品。”

它自己造一个错,再用一堆错把它补圆。


② 模型知识 ≠ 人类标注者知识

SFT(监督微调)阶段:

  • 标注者写的是“正确答案”

  • 模型 可能根本不知道这些答案里的事实

  • 但被要求模仿

结果就是:

模型在模仿“它不理解的知识”时,等于被训练去“瞎编但要编得像真的”。

OpenAI 的 John Schulman 早期就说:

“模型其实知道自己知道什么,但我们训练方式却让它混淆了。”


五、那么工程上应该怎么抗幻觉?

以下方法都实测有效——不是理论:


1. 让模型少说话(减少 token)

越长越容易编。
越短越接近模型真实知识范畴。


2. Prompt 加限制

例如:

  • “如果不知道就回答不知道”

  • “简短回答”

  • “必须引用来源”

能明显降低幻觉率。


3. Verification(自我验证)

每次回答完,让模型自己检查:

  • 是否符合事实?

  • 来源是什么?

类似“反思链”,对抗自我欺骗效果很好。


4. RLHF 奖励惩罚机制

给奖励模型“不要瞎编”的动力。

但注意:
早期 InstructGPT 实验显示 RLHF 有时会加重幻觉,
但整体体验依旧更好。


六、总结:模型“不听话”、不稳定、瞎编,都是机制所致

大模型本质是:

  • 概率系统(所以不稳定)

  • 自回归生成(所以会自我欺骗)

  • 知识不对齐(所以会幻觉)

  • 擅长语言,不擅长结构(所以结构化输出难)

驯服它的方式:

  • Prompt → 便宜但不稳

  • Post-processing → 修补刀

  • Constrained sampling → 工程硬控

  • Finetuning → 最强但最贵

  • Verification → 防幻觉

  • 减少 token → 降低风险

这就是你做 AI 工程时 80% 的坑与解法。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐