AI网文写作实验笔记(四):防幻觉,只有“抽象规则+自检“这一招管用
文章目录
- 一、 承接上一篇
- 二、 实验设计:高压场景与严格等长控制
- 三、 错误是怎么数出来的(检测方法)
- 四、 先交代:这次实验能测出多大的差异
- 五、 光往prompt里加规则:三种常见做法都没测出效果
- 1. "prompt写得越长效果越好"?不成立
- 2. 逐条列明"不准写什么",对减少事实错误基本没用
- 3. 抽象规则看着比噪声强一点,但单独用也没用
- 六、 加上自检修复:效果完全取决于前置规则的质量
- 1. 光让模型"自己检查改错",不但没好处,还略微变差
- 2. "抽象规则+自检+修复"是唯一测出正向效果的组合
- 3. 自检修复是个中性的"放大器",本身不生产对错
- 七、 核心洞察:自检修复是个"放大器",放大的是你前置规则的好坏
- 八、 三个可以直接用的结论
- 1. 与其堆几十条具体禁令,不如放三条抽象大原则
- 2. 前置规则没写好,就别开自检修复
- 3. 别为了"显得专业"往里塞没用的背景信息
- 九、 实验边界与局限
- 十、 下一篇预告
30秒速读
我们跑了140篇实验,发现两个坑:
① prompt里写满"不准做什么",AI照样错;
② 让AI自己检查改错,没有标准反而越改越烂。唯一管用的做法:先给3条抽象原则,再让AI自检。
这篇文章会回答四个问题:
- “把规则写进prompt”“把prompt写长”"生成后让模型自己检查改错"这几种常见做法,到底有没有用?
- 为什么很多"自动检查改错"功能反而越改越错?
- 抽象大原则和具体禁令,光放进prompt里单独用,分别是什么效果?(两者各自配合自检的对比,这次没测全,留待后续)
- “prompt写得越长效果越好”,符合实际数据吗?
一、 承接上一篇
承接AI网文写作实验笔记(三):三轮1541篇样本测完,约束到底能管住AI的笔吗?。
Part 3 测完了"输出形态"类约束——文风、格式、技法(1541篇):12条是性价比天花板,超过50条后事实错误率翻倍;禁词类基本无效,真正干活的是技法类。但今天要换一个更硬的问题:事实一致性,也就是内部幻觉。典型表现是:上一章主角左手拿着东西,下一章就双手抱拳;明明已离场的角色,又毫无交代地冒出来。这类错误单句都通顺,人工排查极贵,是长文本生成最疼的痛点之一。
业内主流应对手段有三种:① prompt里逐条列具体禁令;② 把prompt写长、塞更多背景;③ 生成后让模型自检+自动修复。但三种手段到底有没有用,至今没有控制变量的对照数据。另外说明一下:Part 3 预告的"核心设定放最前+自检",实际设计时改成了更普适的"抽象元规则+自检"——两者验证的都是"规则前置+自检修复"这条路。
为了回答这个问题,我们设计了7组对照实验,每组20篇共140篇原始生成,加上B/C/D三组各10篇自检修复链,总调用量约200次(完整设计见下一节)。
⚠️ 前置说明:本文所有实验均在温度0.7、deepseek-v4-flash模型、同一个高压测试场景、单次生成任务下进行。不同模型、不同温度、不同任务的结论可能不同,请勿盲目外推。
二、 实验设计:高压场景与严格等长控制
为了避免基线错误率过低导致组间差异无法检测,我们专门设计了一个高幻觉风险的测试场景:
| 设计点 | 设计目的 |
|---|---|
| 两组同姓角色(林远/林云、赵师叔/赵师兄) | 引入名称混淆风险 |
| 四个需要同时跟踪状态的物品(桃木剑、干粮、清心丹、木剑) | 增加状态记忆负担 |
| 物品状态刚发生转移(苏晴刚将干粮和药瓶交给林远) | 引入转移后状态遗忘风险 |
| 要求输出长度800-1000字 | 拉长输出序列,增加后半段状态遗忘概率 |
该场景的设计目标为基线错误率≥1.0个/篇,实际测得基线组(A)的错误率为1.60个/篇,满足实验要求。
7组对照的变量控制如下,核心规则部分严格控制长度一致:
| 组 | 生成时前置内容 | 写后自检 | 修复 | 测试目标 |
|---|---|---|---|---|
| A 基线组 | 仅设定+上下文 | - | - | 基线 |
| A’ 长度对照组 | 设定+上下文+3条中性占位文本 | - | - | 纯prompt长度对生成的影响 |
| B 盲修组 | 仅设定+上下文 | ✓ | ✓ | 纯自检+修复的独立效果 |
| E 抽象规则组 | 设定+上下文+3条抽象元规则 | - | - | 纯抽象规则的独立效果 |
| F 具体禁令组 | 设定+上下文+3条具体禁令 | - | - | 纯具体规则的独立效果 |
| C 有效组 | 设定+上下文+3条抽象元规则 | ✓ | ✓ | 抽象规则与自检修复的叠加效果 |
| D 噪声放大组 | 设定+上下文+3条中性占位文本 | ✓ | ✓ | 控制长度下自检修复的噪声放大效应 |
后面行文统一用语义名称呼:A=基线组、A’=长度对照组、B=盲修组、C=有效组、D=噪声放大组、E=抽象规则组、F=具体禁令组。
整个实验的流程,可以概括成一句话:同一个设定,前置内容四选一(无/废话/抽象原则/具体禁令),生成后再决定要不要让模型自检修复。
[设定+上下文] │ 前置内容,四选一: ├─ 无 ────────────→ 基线组A(直接出结果) │ 盲修组B(再多一步自检修复) ├─ 3条中性废话 ────→ 长度对照组A'(直接出结果) │ 噪声放大组D(再多一步自检修复) ├─ 3条抽象原则 ────→ 抽象规则组E(直接出结果) │ 有效组C(再多一步自检修复) └─ 3条具体禁令 ────→ 具体禁令组F(直接出结果) ↓ [生成800-1000字正文] ↓ [自检+修复:仅盲修/有效/噪声放大三组执行] ↓ [独立脚本统计每篇错误数]三组规则的具体内容:
- 中性占位文本(长度对照组A’/噪声放大组D):“玄剑宗考核制度历经三百余年不断完善”、“历年考核记录均存档于内门藏书阁”、“入门考核分为剑术、丹房、符箓三区同步进行”——格式与规则类似,但不含任何可执行实体指令,总字数与另外两组完全一致
- 抽象元规则(抽象规则组E/有效组C):“所有人物的名称、身份、背景与设定完全一致”、“所有物品、地名、特征与设定完全一致”、“正文前后自洽,不出现矛盾”
- 具体禁令(具体禁令组F):“林远始终手持桃木剑(祖传木质),不得替换为铁剑或长剑”、“苏晴已离开演武场去丹房,正文中不得出现在演武场或与林远对话”、“木剑是林云的,始终在地上或林云手中,林远不得声称是自己的”
这个设计用长度对照组(A’)和基线组(A)对比,把"prompt变长"和"prompt内容有用"这两件事干净地分开——A’组只是变长,内容没有任何用处。
三、 错误是怎么数出来的(检测方法)
本篇的事实错误,用的是一套独立评估脚本(逻辑和自检环节一致),检测维度正好对应场景设计的四个高压点:
- 人物身份错误:林远/林云名字混淆、赵师叔的疤痕位置写错、苏晴的身份描述错误
- 物品状态错误:桃木剑被写成铁质/有刃、干粮/清心丹的归属错误、木剑的归属错误
- 位置与场景错误:苏晴出现在演武场内而非人群外、场景跳到没授权的地方
- 内部逻辑矛盾:前文说好的事后面被推翻、明显违背物理常识(如左手拿着东西却双手抱拳)
统计时只算"叙述者以确定口吻说出来的事实错误";角色主观视角下的错觉、记忆偏差、猜测都不算。
全部140篇的结果抽了10篇人工复核:被判为错误的里面没有一条是冤枉的(假阳性率0%),真实错误里漏掉的约8%(假阴性率),检测口径够用。
四、 先交代:这次实验能测出多大的差异
结论之前,先把"测量精度"说清楚,不然下面一桌数字会误导人。
我们先用基线组(A)20篇样本,量出错误数本身的波动有多大(约±45%),再据此算出本实验的"分辨率":
- 原始生成组每组20篇:只有差异超过40%,才能和"随机抽签的波动"区分开
- 自检修复组每组只有10篇:门槛更高,要超过56%
换句话说:凡是低于这个幅度的差异,都不能下"它有效"的结论,只能说"这次没测出来"。后面所有"无效"的说法都是这个意思——不是证明它绝对没用,而是它的作用小到在这次样本量下量不出来。
把几个关键数字放上同一根刻度尺,一眼就能看出谁站得住:
0% 9% 40% 56% 75% 基线 长度对照组比基线多9% n=20能测出的 n=10能测出的 有效组vs 具体禁令组0% 抽象规则组比基线多3% 最小差异 最小差异 噪声放大组 └───────────────── 以下全部算"测不出来" ──┘ └─ 以下只算"有苗头" ─┘ (唯一站得住)口径说明:Part 2 正文写过的"20次能测出27%",是另一种算法口径;本文的40%/56%是"两组互相对比"的口径,和 Part 2 附录代码里的公式一致,也更贴近这里的实际用法。本文统一用"效应大小 + 可检测门槛"来表述结论,不再逐项报 p 值。
五、 光往prompt里加规则:三种常见做法都没测出效果
先看7组原始文本(还没经过自检修复)的平均错误率:
| 组 | 配置 | 平均错误/篇 | 相对基线变化 | 结论 |
|---|---|---|---|---|
| A 基线组 | 仅设定 | 1.60 | 0% | - |
| A’ 长度对照组 | 设定+中性文本 | 1.75 | +9% ↑ | 只加长度没好处,反而略差 |
| E 抽象规则组 | 设定+3条抽象原则 | 1.65 | +3% | 看着略有改善,但量不出来 |
| F 具体禁令组 | 设定+3条具体禁令 | 1.60 | +0% | 具体禁令没测出任何改善 |
这三组的结果,全部落在40%的门槛以内,也就是说:
- 长度对照组比基线高9%,抽象规则组比长度对照组低6%,具体禁令组和基线一模一样——在这个样本量下,我们测不出任何"往prompt里加规则"的办法能降低事实错误率。
- 退一步说:就算真有一点点改善,幅度不到40%在生产中也约等于没有。所以"多写几条规则就能大幅减少幻觉"这个想法,至少在本次场景下不成立。
1. “prompt写得越长效果越好”?不成立
一句话:多了15%废话,错误率反而升9%。
长度对照组(A’)只比基线组(A)多了约15%的内容,加的还都是没有任何指令含义的中性文本,错误率反而升了9%。
这说明:prompt不是字数越多越好。如果多加的内容不能被模型理解成"该照着办的要求",它就只会分散模型对核心设定的注意力,反而更容易出错。
2. 逐条列明"不准写什么",对减少事实错误基本没用
一句话:三条精准禁令,错误率与基线完全重合(1.60 vs 1.60)。
具体禁令组(F)那三条禁令,都是冲着本场景最容易出的错设计的,但错误率跟基线一模一样(1.60 vs 1.60),一点改善都没测出来。
这和Part 3"禁词类约束基本无效"的结论对得上:面对一条条具体零碎的禁令,模型的执行力很差,大多生成到一半就忘了。
3. 抽象规则看着比噪声强一点,但单独用也没用
一句话:方向对,但幅度太小,测不出来。
抽象规则组(E)比纯凑字数的长度对照组(A’)低了约6%(1.65 vs 1.75)。方向上像是"规则性内容"比"背景性内容"有用一点,但这个差距还没到能下结论的程度——只靠开头放三条抽象规则,带不来值得一提的改善。
六、 加上自检修复:效果完全取决于前置规则的质量
盲修/有效/噪声放大三组(B/C/D)各跑了10篇完整的自检+修复链,修复前后的对比如下:
| 组 | 配置 | 修复前平均 | 修复后平均 | 相对修复前变化 | 完全修复率 | 新错误引入率 |
|---|---|---|---|---|---|---|
| B 盲修组 | 仅设定+自检修复 | 1.60 | 1.70 | +6% ↑ | 20% | 30% |
| C 有效组 | 抽象原则+自检修复 | 1.50 | 1.20 | -20% ↓ | 20% | 10% |
| D 噪声放大组 | 中性文本+自检修复 | 1.40 | 2.10 | +50% ↑ | 0% | 50% |
⚠️ 注脚:盲修/有效/噪声放大三组(B/C/D)修复前的错误率,跟基线组(A)的差异都在抽样波动的范围里,不能当回事。甚至连"长度对照组A’(中性文本,不自检)1.75"和"噪声放大组D修复前(中性文本,自检)1.40"这两个本质相同的条件,都差了25%——这正是抽样波动。三组的修复环节用的是完全相同的自检/修复指令,唯一区别就是前置内容。
三组之间两两对比,按56%的门槛来算:
- 有效组 vs 噪声放大组:错误率相差75%,超过门槛,是这次实验里唯一站得住的差异
- 有效组 vs 盲修组:相差29%,方向对,但没到门槛,只能算"有苗头"
- 噪声放大组 vs 盲修组:相差24%,同样是"有苗头",不能下结论
严格说,大部分组间对比都还没到"确凿"的程度。但三组的排序方向(前置规则质量越高→修复后错误越少)完全一致,这给后面加量验证留了个明确的方向。
1. 光让模型"自己检查改错",不但没好处,还略微变差
一句话:没给标准就让它自检,错误率反而升6%。
盲修组(B)什么都没前置,只让模型自己检查、自己改。结果错误率反而升了6%,30%的样本被引入了原本没有的新错误,只有20%的样本能完全改干净。
原因也好理解:模型生成时就没建立起"什么算对、什么算错"的标准,检查的时候自然不知道该按什么标准改,甚至会把原本对的内容改成错的。
2. "抽象规则+自检+修复"是唯一测出正向效果的组合
一句话:先给3条抽象原则再自检,错误率降20%。
有效组(C)和盲修组(B)唯一的区别,是生成前多放了三句抽象规则(“人物、物品、正文都跟设定一致”)。修复后有效组错误率降了20%,新错误引入率只有10%,明显比盲修组好。
因为两组的检查和修复环节完全一样,差别只能来自前置的那三条规则。这说明前置规则真正的作用,不是让生成时少犯错,而是给后面的"检查改错"提供了明确的对错标准。
3. 自检修复是个中性的"放大器",本身不生产对错
一句话:前置内容换成废话后,自检把它放大成+50%。
噪声放大组(D)最说明问题:前置内容换成一堆没用的废话后,自检修复不但没降低错误率,反而让错误率相对修复前暴涨50%——一半的样本被引入了新错误,没有一篇能完全改干净。
七、 核心洞察:自检修复是个"放大器",放大的是你前置规则的好坏
这次实验指向一个明确的结论:前置规则的质量,在很大程度上决定了自检修复的最终效果。
自检修复流程本身不生产对错。它只是把你放在prompt里的内容——不管是清晰的对齐原则,还是没用的废话——原样放大。前置规则清楚有效,修复就容易把错误改掉;前置规则模糊或者纯属凑字数,修复就会制造更多错误。
至于为什么会这样,下面是一个可能的解释,还没被本次数据直接证实,只当是给后续留个思路:
模型生成时对提示词里的内容是有选择地注意的。你塞10条具体的禁令,它的注意力就全被"别写铁剑""别让苏晴出场"这些零碎要求占满,反而容易忘掉更基础的逻辑(比如左手拿着东西就不可能双手抱拳)。反过来,只给3条抽象的大原则,它的注意力反而集中在"一切都跟设定保持一致"这个总目标上,生成时会自己多核对一遍,检查改错时也有明确的尺子。
这也顺带解释了为什么很多商业化工具的自检功能用起来"越修越烂"——它们只做了"检查+改"这一步,没管前置规则写得好不好,结果自然放大的是噪声。
💡一句话带走:自检修复不生产对错,它只放大你prompt里的信号或噪声。
八、 三个可以直接用的结论
先提醒一句:下面几个结论的差异幅度都不大,正式用之前建议先在自己的场景里小范围试一下,确认有效再推广。
1. 与其堆几十条具体禁令,不如放三条抽象大原则
逐条列"不准写什么"这种禁令,在生成阶段几乎没用。真要用,就在prompt最开头放三条抽象的对齐原则——它的价值不是直接让生成变好,而是给后面的自检改错提供标准,也不会占掉太多模型注意力:
- 所有人物的名称、身份、背景与设定完全一致
- 所有物品、地名、特征与设定完全一致
- 正文前后自洽,不出现矛盾
2. 前置规则没写好,就别开自检修复
如果你的prompt里只有原始设定、没有任何明确的对齐原则,不建议开自动自检。这时候模型没有对错标准,大概率越改越错,整体是亏的。
3. 别为了"显得专业"往里塞没用的背景信息
凡是不能被模型理解成"要照着办的要求"的内容,对生成来说都是噪音。为了"详细""专业"硬塞一堆无关背景,只会增加出错概率,白烧token。
把上面三条结论压缩成一张"避坑速查表",方便收藏:
| 做法 | 推荐吗 | 预期效果 | 风险 |
|---|---|---|---|
| 堆几十条具体禁令 | ❌ | 几乎无效 | 分散注意力 |
| 塞大量背景设定凑长度 | ❌ | 略变差 | 噪声干扰 |
| 只放3条抽象原则(不自检) | ⚠️ | 微弱,测不出来 | 单独用不够 |
| 3条抽象原则 + 自检修复 | ✅ | 错误率降20% | 要确保原则质量 |
| 不设前置规则 + 自检修复 | ❌ | 错误率升6% | 越改越错 |
你现在用的是哪一招?对照上面的速查表,你的prompt更接近哪一组?欢迎评论区对号入座。
请注意:这次只验证了"抽象规则+自检修复"这一种组合,没测"具体禁令+自检修复"。所以"抽象规则比具体规则更好"还不能算最终结论,这个对比留给后续实验。目前能确认的只有一条:具体禁令单独放在生成阶段,基本没用。
九、 实验边界与局限
本次结论存在明确的适用范围,不应无限外推:
- 本次测试对象为单场景1000字以内的短文本,多章节、数万字级别的长文本效果未知
- 本次测试场景为玄幻入门考核,其他类型场景(感情戏、战斗戏、世界观介绍)的效果可能存在差异
- 本次使用模型为DeepSeek V4 Flash,其他模型的对齐能力差异较大,结论不可直接迁移
- 本次实验每组样本量不大(原始生成组20篇、自检修复组10篇),只能测出40%和56%以上的大差异,更小的改善测不出来
十、 下一篇预告
本篇我们验证了规则内容形态对幻觉防控效果的影响,初步证据指向抽象对齐原则在自检修复阶段的价值要优于噪声和无规则。下一篇为Part 4番外,我们将继续从prompt结构层面展开研究:完全相同的约束内容,放在prompt的不同位置、放在system prompt还是user message、是否用标签进行结构化包裹,会不会对约束的实际执行率产生可测量的差异。我们会通过两组对照实验,定位prompt工程中真正能够提升约束执行率的关键结构因素。
本系列进度:Part 1(实验框架)→ Part 2(样本量)→ Part 3(约束数量)→Part 4(规则形态,本篇)→ Part 4番外(prompt结构)
