版权页
书名
《我思故我写》——一本 AI 写成的书:AI 时代的方法论、边界与人类自洽
作者
wUwproject(本书为作者与 AI 协作完成,作者对全书内容与判断负责)
协议(显式声明)
本书整体(包括正文、序言、导读、结语与全部附录)采用创作共用署名-相同方式共享 4.0 国际许可协议(Creative Commons Attribution-ShareAlike 4.0 International,简称 CC BY-SA 4.0)。
- 许可协议全文:https://creativecommons.org/licenses/by-sa/4.0/legalcode.zh-Hans
- 协议要点(概括,以协议原文为准):
- 您可以:复制、分发、展示、演绎本书,包括商业使用
- 前提是:① 署名——须注明作者(wUwproject)与来源;② 相同方式共享——基于本书的演绎作品必须采用同一协议(CC BY-SA 4.0)发布
- 不得以任何方式暗示作者认可您或您的使用
正文来源与溯源
本书正文来自作者开源的方法论系列 Cogito_Scribit(两仓库双向同步,任选其一溯源):
- Gitee:https://gitee.com/wUwproject/Cogito_Scribit
- GitHub:https://github.com/Ldxs001/Cogito_Scribit
每一篇的原始版本、修订历史与实现现场(Orchestrator、RAG Assistant、Structured Writer 等)均可在上述仓库查阅。
内容声明
- 本书所有案例与数据来自作者真实工程实践,引用文献在文末标注出处;转述处已显式说明
- 本书观点仅代表作者个人实践所得,非普适结论——"仅一家之言,只做抛砖引玉"
- 书中"AI"指大语言模型及其驱动的智能体;本书写作使用大语言模型工具完成人机协作
版本
- 2026 年 8 月 · 初版(v1.0.0)
- 2026 年 8 月 · 内容扩容版(v1.1.0):新增 08b、08c、09b、09c、09d、09e 六篇(第 II 部协作、第 III 部边界扩容),全书重构(编号锚点/冗余清理/引用索引),32 章
- 2026 年 8 月 · 第 IV 部扩容:新增 10b《语言被抹平——贫瘠的土地上能否开出鲜艳的花?》(体验不可压缩——判断→划界→体验三篇闭环),全书 33 章
- 2026 年 8 月 · 词义注脚与工具扩容(v1.2.0,完结版):新增 09f《名词不解释就等于没有名词——义项混合的分布与四维展开的锚定》(第 III 部边界词义层注脚,09 系列第七篇注脚,名词向量=义项混合中心与四维展开);工具索引收录 silprespec-emulator 前置规范效果实验台并在 08a/08b/08c/09b 正文新增验证引用;09f 引用全链路同步(附录 A-E、导读、在线阅读)与入书规范补全(STRUCTURE_GUIDE v2.3);新增附录 F 端到端实测(一次 5 方式 × 4 并行,Qwen3.5-35B-A3B q4_K_M + Q8_0 KV,机器解读未人工审查);引用表结构统一与全量实证表补齐(STRUCTURE_GUIDE v2.5),全书 35 章
- 本书为完结版(v1.2.0),收录方法论系列全部 21 篇;源系列(Cogito_Scribit)如后续演进,以源仓库为准,本书不再逐版同步
序言:我思故我写
一本 AI 写成的书?
先回答书名里那个最扎眼的问题:这本书是 AI 写的吗?
是,也不是。
说"是":这本书的每一篇,从论点、结构、论证到修改,都是我与 AI 在对话中共同完成的——我提出问题、给出判断、推翻重来,AI 检索、整理、成文、按我的意志反复打磨。书里写的方法论,就是我们协作过程的产物。
说"不是":没有一篇是 AI 自动生成的。思考的方向是我的,判断的标准是我的,取舍的意志是我的。"我思故我写"——Cogito, Scribo——"思"在"写"之前,而"思"是人做的。
所以这本书的书名是一句诚实的话:它确实是一本 AI 参与写成的书,但它首先是"我思"的记录。 如果 AI 时代有一个关于写作的真相,那就是:AI 终结了力气活(检索、转述、成文、翻译),但没有终结判断——判断依然是人做的,而且因为力气活的贬值,判断变得更贵了。
这本书,就是一套关于"判断"的方法论。
这本书在写什么
表面上,这是一套技术方法论:如何构建"重型技能"和"智能体"——如何让 LLM 在确定性流程里不犯错,如何用契约、约束、穷举把它变成可靠的工具。
但这只是四分之一。这本书有一条完整的弧线:
- 第 I 部 约束:LLM 不听话,怎么办?——用架构约束它(硬约束、契约、自举、编排、四条原则)
- 第 II 部 协作:多个智能体怎么配合?——LLM 只填空,不决策(有限决策范式、前置规范、填空的边界、槽位的减法)
- 第 III 部 边界:这套规则能走多远?——穷举是宿命,边界由人来画(穷举的宿命、探测的边界、配置推动、语义免疫、粒度切割、精度空耗)
- 第 IV 部 重估:让渡之后,人还剩什么?——AI 终结了力气活,人靠判断活;判断的边界是划界权,划界权必须留在人手里(两种力气活的终结、伦理牢笼)
从"怎么约束机器"到"人怎么自处"——这本书从工程开始,在哲学结束。它不只是写给工程师的,也是写给每一个和 AI 共事、被 AI 重塑、在 AI 时代重新寻找自己位置的人的。
这本书不是什么
在开读之前,有必要先划清边界——就像这本书反复强调"边界"一样:
- 它不是高深理论。书里的每一个结论,都是从真实工程现场的坑里爬出来的,不是从学术文献里推出来的。它没有学术论文的严谨,但有实践者的直白。看不懂术语没关系,看懂判断就够了。
- 它不是万通之路。没有一套方法论能解决所有问题,这本书的方法论只解决一类问题:如何让 LLM 在确定性流程里可靠地工作。换一个场景、换一种技术、换一个时代,它都可能失效——事实上,本书第 III 部专门论证了它必然失效的部分。
- 它仅是一家之言。这些方法是我在自己的实践中验证过、推翻过、再验证过的。它们适合我,不一定适合你。请带着"这是一个人踩出来的路"的心态读它,而不是"这是唯一正确的路"。
- 它只做抛砖引玉。如果书里有一个判断让你觉得"不对,我想反驳",那这本书的目的就达到了——它希望引发你的思考,而不是终结你的思考。
一句话定位:这不是答案之书,是一个实践者把自己踩过的坑、画过的圈、想通的道理,摊开来给你看。 有用,你拿走;没用,你绕开。
这本书是怎么写出来的
它不是闭门造车。它是在真实的工程现场里,一篇一篇"沉淀"出来的:
2026 年春夏,我在构建自己的技能体系与智能体——二十多个技能、三个智能体、一套标准化引擎。每解决一个真实问题(LLM 又幻觉了、流程又断了、检索又不准了),我就把解法写成一篇方法论文章。文章越写越多,形成了一个自洽的闭环:约束、契约、自举、编排、边界、重估。
这套方法论的每一篇,都在回答一个当时真实卡住我的问题。它不是从理论推出来的,是从坑里爬出来的。这也许是它唯一的价值:它是实践者的方法论,不是学者的方法论。
而贯穿写作全程的,是 AI 这个"看不见的合作者"——它帮我查证、帮我成文、帮我校验、帮我把混乱的思考变成结构化的表达。这本书本身,就是它自己所述方法论的一个活样本:人判断,机器执行;人画圈,机器在圈内做工。
为谁而写
- 工程师与开发者:如果你在用 LLM 构建工具、技能、智能体,第 I-III 部是你最需要的——它告诉你如何让 LLM 从"不可靠的聊天对象"变成"可靠的执行器"。
- 管理者与团队负责人:如果你在管理一群 AI"员工"——智能体、技能、自动化流程——书里讲"如何让不可靠的执行者按规矩干活"的部分可以直接当管理参考:第 I 部是制度约束,第 II 部是分工与监督(决策归人,执行归 AI),第 IV 部提醒你哪些判断不能外包。
- 方法论爱好者:如果你好奇"约束的加法"与"架构的减法"如何共存,第 I 部第 7 篇和第 III 部是为你准备的。
- AI 时代的思考者:如果你困惑"AI 来了,我还需要记住什么?""人的价值还剩什么?""AI 该不该被关进笼子?"——第 IV 部直接回答这些,而且回答的方式可能和你想的不一样。
怎么读
正文之前,先读《阅读指南》。四部可以顺序读(推荐,有一条完整的弧线),也可以跳读(每篇都自洽)。
如果你时间有限:每篇的"核心命题"与"基本判断"段落包含了全部前提与结论——其余是论证与展开。这是这本书为忙碌读者留下的捷径。
最后,关于书名再说一句:"我思故我写"不是对笛卡尔的致敬,是对 AI 时代的回答。 笛卡尔说"我思故我在"——存在从思考开始。而这本书想说的是:在 AI 能替你说、替你写、替你检索、替你翻译的时代,"思"仍然是唯一无法外包的东西。思考的人,才配写作。
Cogito, Scribo.
—— wUwproject,2026 年 8 月
阅读指南
读者对象(按需要选择路径)
| 你是谁 | 读什么 | 路径 |
|---|---|---|
| 用 LLM 构建工具的工程师 | 第 I 部(约束)+ 第 II 部(协作) | 01→07 → 08 → 08a → 08b → 08c |
| 管理 AI 员工(智能体/技能/流程)的人 | 第 II 部(分工与监督)+ 第 I 部(约束)+ 第 IV 部(判断留人) | 08 → 08a → 08b → 08c → 01~07 → 10 → 10a → 10b |
| 想知道方法论能走多远的人 | 第 III 部(边界) | 09 → 09a~09f |
| AI 时代的思考者 | 第 IV 部(重估) | 10 → 10a → 10b |
| 想一次读完整个体系的人 | 全部四部 | 01 → 10b(推荐顺序) |
四部路线
篇目速查
| 篇 | 主题 | 一句话 |
|---|---|---|
| 01 | 硬约束架构 | 多步骤流程中,LLM 的"自觉"是负资产 |
| 02 | 构建时契约 | 用五层契约锁定技能的"正确形态" |
| 03 | 递归自举 | 方法论不约束自己,就没有约束任何东西的资格 |
| 04 | 技能流水线编排 | LLM 从"大脑"降级为"胶水" |
| 05 | 链驱动执行 | 链是主体,LLM 只做两头(前处理+输出整理),中间确定性执行 |
| 06 | 领域智能体 | LLM 承担"查询策略规划者"(规划=语义标注,策略=算法穷举),组合式检索 |
| 07 | 四条原则元逻辑 | 架构的减法与约束的加法 |
| 08 | 有限决策范式 | LLM 只填空,不决策(三体印证) |
| 08a | 操作层 | 前置规范 > 后置验证;最小尝试次数的分工与监督 |
| 08b | 填空的边界 | 空的收束、U型注意力与验证的分工——填空能填多小 |
| 08c | 槽位的减法 | 三种场景的幻觉治理路径与四个论断——槽位会不会逼 LLM 编造 |
| 09 | 边界篇 | 穷举的宿命——稳定与随机的悖论 |
| 09a | 检索层注脚 | 探测的边界——RAG 检索鲁棒性的取舍 |
| 09b | 推动层注脚 | 配置推动的穷举一致性——统一推动点位与误差的哲学 |
| 09c | 语义层注脚 | 天然不对等与噪音抑制——语义匹配范式的不对等困境与推理免疫 |
| 09d | 颗粒度注脚 | 细碎处理与区域重构的成本切割——颗粒度与对齐的悖论 |
| 09e | 精度层注脚 | 提示词拉扯的边界——概率曲线的形状工程与定性精度的空耗 |
| 09f | 词义层注脚 | 名词不解释就等于没有名词——义项混合的分布与四维展开的锚定(名词是义项混合中心,四维展开把语义球雕成语义锥体) |
| 10 | 认知重估 | 判断的让渡与翻译的打通——两种力气活的终结 |
| 10a | 伦理牢笼 | 割圆术的边界——伦理牢笼与 AI 的宿命 |
| 10b | 语言的天花板 | 语言被抹平——贫瘠的土地上能否开出鲜艳的花?(体验不可压缩) |
速读法
如果时间有限,只读每篇的"核心命题"和"基本判断"段落——它们包含全部前提假设与结论。其余章节是论证和展开。
术语约定(重要)
- AI / LLM:书中的"AI"指大语言模型及其驱动的智能体(本书写作时使用大语言模型工具完成人机协作)
- 技能(Skill):带元数据声明、可被标准校验的工具包(本书方法论的操作对象)
- 智能体(Agent):由链驱动架构编排的 LLM 执行系统(本书第 II 部的主角)
- 方法论:本书讨论的"方法论"特指"约束 LLM 执行偏差的工程方法体系",不是一般意义上的工作方法
- 你 / 我 / 用户:行文中"我"= 作者(实践者),"你"= 读者,"用户"= 方法论工具的最终使用者
与源系列的关系(溯源)
本书正文来自作者开源的方法论系列 Cogito_Scribit,可在以下两个公开仓库溯源到每一篇的原始版本与完整演进历史(含历史提交):
- Gitee:https://gitee.com/wUwproject/Cogito_Scribit
- GitHub:https://github.com/Ldxs001/Cogito_Scribit
两仓库双向同步,内容一致,任选其一即可。 协议为 CC BY-SA 4.0(详见版权页)。
书中出现的项目实例(Orchestrator、RAG Assistant、Structured Writer 等)均为作者在源系列中公开构建的真实系统,可在上述仓库的相关篇章中查阅其实现细节——书是方法论,仓库是现场。
本书新增了序言、导读、结语与附录(术语表/工具索引/参考文献/方法论地图/提示词示例/端到端实测)。本书为完结版(v1.2.0),收录方法论系列全部 21 篇;源系列文章如后续演进,以源仓库为准,本书不再逐版同步。
本书的技术审核
- 层级配色审核:全书图表的层级色板(灰/蓝/绿/褐/紫灰,莫兰迪浅化透明)经 color-toolkit-turn 的 WCAG 对比度计算审核——亮色/暗色双模式均达 AAA 级(≥7:1),文字颜色未变。
- 附录规划:附录 B 工具索引的盘点与附录 E 提示词示例的框架设计,采用 activity-duration-estimation 的 WBS 工作分解方法进行任务拆解与结构规划。
- 全文审核:全书样式与内容由作者人工与 AI 协同审核——作者定判,AI 执行与校验。
第 I 部 约束:如何让 LLM 不犯错
读者问题:LLM 不听话,怎么办?
一切从这里开始。2026 年的现实是:LLM 强大、流畅、知识渊博——但不可靠。它会在第 3 步忘掉第 1 步的约定,会输出格式错误的 JSON,会在"应该闭嘴"的时候自作主张。把这样的工具放进确定性流程,等于把一枚硬币扔进精密的钟表。
本书的核心立场在这一部就确立:LLM 的"自觉"是负资产。 它不是你的助手,是你要约束的对象——约束得越好,它越可靠;放任它自由发挥,它必然出错。
第 I 部收录 7 篇,是全书最"工程"的部分:
| 篇 | 解决的问题 |
|---|---|
| 01 硬约束架构 | 执行时怎么不出错——步骤原子化 + 硬中断 + 锁恢复 |
| 02 构建时契约 | 什么是正确的结构——五层声明 + 接入校验 |
| 03 递归自举 | 方法论怎么确保自己——自我审计 + 自我约束 |
| 04 技能流水线编排 | 多个技能怎么组合——Pipeline 编排,LLM 当胶水 |
| 05 链驱动执行 | 编排如何真正执行——Orchestrator 工程实现 |
| 06 领域智能体 | 编排中的知识库怎么用——组合式检索 + 多路路由 |
| 07 四条原则元逻辑 | 加了多少约束,为什么都对——架构的减法与约束的加法 |
为什么先读这一部:第 II 部的"协作"建立在第 I 部"单个技能可靠"之上;第 III 部的"边界"审视第 I 部的"穷举";第 IV 部的"重估"正是从第 I 部"约束"的反面追问——约束 LLM 的极限是什么,人还剩什么。
给工程师的话:如果你只想让 LLM 可靠地干活,读 01、02、04 就够起步;如果你想构建完整的技能体系,按 01→07 顺序读。
给非工程师的话:看不懂代码没关系,抓住每个"原则"——你会看到一套关于"信任与约束"的完整哲学:可靠的系统,不是信任出来的,是约束出来的。 这个命题在第 IV 部会以另一种面目回来。
第 I 部 · 01|重型技能构建的方法论沉淀:抑制LLM执行偏差的硬约束架构
一、对LLM执行行为的基本判断
1.1 观察:某些偏差反复出现
在构建需要LLM参与的多步骤执行流程时,一种模式反复发生:
- 大方向正确:LLM能理解任务目标,能识别需要调用哪些工具,能规划出大致合理的步骤顺序。
- 执行细节反复偏出预期:输出格式有微小变体导致下游解析失败、文件写到了错误的位置、步骤之间的衔接状态丢失、在不该停的地方停下、在该停的地方继续推进。
这些偏差的共同特征是:语义上没错,执行上错了。
LLM生成的内容在"意思"上是合理的(所以不是"幻觉")。但在格式、路径、时序、状态传递这些执行维度上,它反复偏离确定性流程的要求。
1.2 判断:这不是质量缺陷,是特性
这是LLM概率生成机制的固有特性。它的输出是"最可能的下一词"的链式组合,它没有"严格遵守格式/路径/状态契约"的硬约束能力。
- 这不是需要修复的bug。
- 这是需要被管理的风险。
你不可能通过"更好的Prompt"或"更详细的说明文档"来解决这个问题,因为你面对的不是理解能力不足,而是执行行为的不确定性。
1.3 核心命题
在多步骤确定性流程中,LLM的"自觉"是负资产。
"自觉"在这里指:LLM在缺乏强外部约束时,倾向于主动补全、自行调整格式、自主决定推进节奏、自由解释指令边界。这些特性在对话场景中是优点,在需要严格遵循格式、路径、状态、时序的流程中,它们会持续引入偏差。
解决方案的起点:不要试图让LLM更自觉。要用代码级手段压缩LLM的活动空间,让它只能在预先划定的狭窄闸口内活动。
二、核心设计原理
2.1 原理一:步骤原子化
基本判断:LLM在处理"一整件事"时,最容易在边界处产生偏差——不知道什么时候开始、什么时候结束、什么时候必须等待。
解决方案:把所有任务拆解为原子步骤。步骤之间没有模糊地带,每个步骤的输入输出都被显式定义。
步骤的定义:
一个步骤是一个不可再分的最小执行单元。它必须包含:
- 身份标识:步骤的唯一ID,用于追踪和引用
- 执行类型:这个步骤由什么来执行(可以是自动化脚本,也可以是人工操作)
- 输入契约:执行这个步骤需要什么数据,格式是什么
- 输出契约:执行完成后产出什么,格式是什么
- 约束集合:这个步骤在什么条件下才能执行,什么条件下必须停止
- 执行状态:当前是待执行、执行中、成功、失败还是空转
- 重试与空转计数:失败了多少次,空转了多少次
伪代码表示:
Step {
id: 唯一标识
type: automation | manual | checkpoint
input: { schema, required }
output: { schema, optional }
constraints: { hard: [], soft: [] }
status: pending | executing | success | failed | idle
retries: 0..max
idle_count: 0..max
}
为什么这个设计能抑制自觉:当任务被拆解为原子步骤后,LLM不再需要"决定"下一步做什么。步骤的顺序已经在编排层预先定义好了。LLM只需要"填写"当前步骤所需的输入数据。
2.2 原理二:硬中断替代软约束
基本判断:所有"提示LLM要遵守"的软约束,LLM都有权选择忽略。它不是叛逆,而是概率模型的本性——"遵守指令"只是它输出概率中的一条路径,不是必然路径。
解决方案:不在文本层面约束LLM,在进程层面拦截越界行为。当LLM的行为偏离契约时,不发出"警告",而是直接终止执行进程。
中断触发器:
| 触发条件 | 检查内容 | 后果 |
|---|---|---|
| 前置条件不满足 | 上一步未完成必要动作 | 中断,挂起 |
| 重试超限 | 同一步骤失败超过N次 | 中断,挂起 |
| 空转超限 | 同一步骤无进展超过N次 | 中断,挂起 |
| 产出物缺失 | 步骤结束后未生成预期文件 | 中断,挂起 |
| 格式不匹配 | 输出格式与契约不符 | 中断,挂起 |
中断的执行方式:
block(reason) {
1. 输出阻断信号到stderr(避免被管道过滤)
2. 同时输出阻断信号到stdout(双重保障)
3. 写入锁文件(持久化阻断状态)
4. 调用进程退出,退出码为2(区别于普通错误)
}
为什么用退出码2而不是1:
退出码的设计表达了错误的"恢复可能性":
0:正常完成,无需任何操作1:发生错误,修复后需要重新执行全部流程2:发生阻断,修复后可以从阻断点继续执行
2这个退出码配合锁文件,构成了"可恢复中断"的语义——上层调度器看到退出码2时,会读取锁文件,保留当前进度,等待修复后通过特定参数恢复。
2.3 原理三:双通道信号传输
基本判断:在子进程调用场景中,stdout往往被上层捕获并处理。阻断信号如果只写在stdout中,很可能被上层"消化"或"过滤",导致阻断信号丢失——流程继续推进,但已经处于错误状态。
解决方案:关键信号必须走冗余通道。
两条通道的分工:
| 通道 | 内容 | 用途 |
|---|---|---|
| stdout | 简短状态信号([BLOCKED]前缀) | 给正常捕获机制使用,机器可读 |
| stderr | 完整阻断信息(含原因、上下文) | 不被管道过滤,保留完整上下文 |
| 文件系统 | 锁文件(含完整阻断信息) | 持久化,支持后续恢复 |
调用方的检查逻辑:
output = stdout_content + stderr_content
if "BLOCKED" in output or "阻断" in output:
// 检测到阻断,挂起流程
为什么用中英文双关键词:LLM的触发条件和输出可能混合多种语言,单一语言的关键词可能漏检。双关键词覆盖了更广的实际情况。
2.4 原理四:阻断→挂起→恢复的完整循环
基本判断:多步骤LLM任务的执行成本较高(Token消耗、时间开销)。如果阻断后必须从头重跑,整个方案的工程价值会大幅降低。
解决方案:阻断发生时,不销毁进度,而是将当前状态持久化,并提供明确的恢复路径。
状态持久化的内容:
{
"blocked_at": "步骤X",
"reason": "阻断原因",
"completed_steps": [1, 2, 3],
"pending_stage": "阶段名称",
"timestamp": "阻断发生时间"
}
恢复路径:
这要求执行引擎具备以下能力:
- 能识别"恢复执行"模式(通过特定参数)
- 能读取并解析锁文件中的状态
- 能跳过已完成步骤,不从第一步重新开始
- 在恢复完成后清理锁文件
2.5 原理五:准入门槛的强制校验
基本判断:即使有了步骤模型、硬中断和恢复机制,如果接入系统的"执行单元"本身就不规范,所有下游保障都会失效。就像你无法通过更严格的交通规则来弥补汽车本身刹车失灵的问题。
解决方案:在接入层面建立强制性的五层校验,任何执行单元必须全部通过才能运行。
五层校验:
| 层 | 检查内容 | 不通过后果 |
|---|---|---|
| 元数据层 | 身份信息是否完整(名称/版本/作者/描述/数据目录) | 拒绝接入 |
| 触发条件层 | 是否有明确的触发词和否定条件 | 拒绝接入 |
| 约束层 | 是否声明了至少N条强制约束,其中M条可由脚本自动校验 | 拒绝接入 |
| 工具链层 | 是否包含配置界面、管理CLI、执行引擎三个基础脚本 | 拒绝接入 |
| 数据持久化层 | 是否有标准的数据目录结构(状态/锁/产物/日志) | 拒绝接入 |
校验的执行方式:静态扫描,不依赖运行时。所有检查在接入阶段完成,不在执行阶段发现。
为什么需要五层而不是一层:单层校验总会有遗漏。五层分别对应"身份、行为、约束、工具、数据"五个维度,覆盖了执行单元可能出问题的所有方面。每一层的校验结果会叠加,任何一层不通过则整体拒绝。
三、这套机制为什么能工作
3.1 核心逻辑不是"教育LLM",而是"缩小LLM的活动范围"
一个常见误解是"如何让LLM更好地遵守指令"——这导向的是更好的Prompt工程、更详细的输出格式说明。
这套方案的前提假定不同:LLM在"自由输出"时产生偏差是必然的,你不可能通过"说清楚"来让它不偏差。
唯一可靠的做法是:让LLM只在"填空题"和"选择题"的范围内输出。
- 填空题:填什么字段、填什么值
- 选择题:从预设选项中选择一个
其他所有事情——步骤的顺序、步骤间的依赖、重试次数的上限、空转的上限、中断的条件——全部由代码定义。
LLM的角色被压缩为"小口径管道"中的内容生成器,而不是"自主决策者"。
3.2 为什么硬中断比软约束更可靠
Prompt约束是概率性的:
"请按格式输出" → LLM有90%的概率按格式输出,10%的概率不按格式输出。
即使提升到99%,在多步骤流程中(假设10个步骤),整体合规率 = 0.99^10 ≈ 90.4%——意味着几乎每10次执行就有1次在某处偏离。
硬中断是确定性的:
步骤执行后检查产出物 → 不符合契约 → 进程终止。
它不依赖LLM的选择,只依赖代码的检查。LLM是否愿意配合不影响检查结果。
3.3 为什么不是单纯的防御式编程
防御式编程在每个调用点检查返回值、处理异常路径。这套方案的不同之处在于:它不是"检查不通过则处理异常",而是"检查不通过则终止"。
区别在于:
| 防御式编程 | 硬中断方案 |
|---|---|
| 处理异常 | 终止执行 |
| 保留执行上下文 | 挂起并锁住上下文 |
| 继续后续流程 | 不允许继续 |
| 依赖调用者正确处理异常 | 调用者只能看到进程终止 |
硬中断方案的"终止并挂起"设计,确保了错误状态不会被传递到下游。它像电路中的保险丝——电流异常时熔断,而不是让异常电流继续通过。
3.4 为什么"填空题/选择题"模式对LLM有效
LLM在处理"生成一段描述"时,自由度高,偏差空间大。LLM在处理"从[A、B、C]中选择一个"时,自由度低,偏差空间小。
这种差异是显著的:约束越具体的任务,LLM输出与预期目标之间的方差越小。
这套方案通过步骤原子化和输入输出契约的定义,把LLM在大部分任务中都推到了"低自由度"的工作模式中。LLM仍然可以自由发挥的部分被严格限制在"填这个字段的值"的范围内。
四、这套方案的边界与局限
4.1 它管不了什么
第一,管不了语义错误。
如果LLM在"填空题"里填了错误的值——比如把"排班表"填成了"财务报表"——硬中断机制不会发现。因为它只检查"格式是否符合"和"字段是否存在",不检查"内容是否正确"。
语义错误需要另外的手段处理:事实核查、知识库检索、人工校验。
第二,管不了意图模糊。
如果用户输入本身就不明确("帮我做一下那个事"),这套方案无法工作。因为第一步"拆解为Step"就依赖明确的输入。意图识别是前置环节,不是这套方案的范畴。
第三,管不了非执行层面的偏差。
这套方案只约束执行行为——格式、路径、状态、时序。如果LLM在规划层面就错了(比如步骤顺序完全不合理),硬中断可能在流程推进到某个步骤时触发"前置条件不满足",也可能永远不触发。
4.2 硬中断本身的脆弱性
退出码依赖调用方检查。 如果上层调用者不检查 proc.returncode,退出码2和0就没有区别。这套方案的有效性建立在"上层正确检查退出码"这个前提上。
信号在多层管道中可能衰减。 stdout和stderr在多层嵌套调用中可能被重定向或丢弃。文件系统的锁文件是唯一持久化的信号载体,但它需要上层主动去读取。
锁文件可能残留。 进程被强制终止时(如kill -9),锁文件不会被清理。残留的锁文件会导致后续执行被误判为"已阻断",除非实现超时机制。
4.3 需要LLM自觉的环节
以下两个约束无法被代码验证,只能由LLM自觉遵守:
"换思路必须经完整三步循环":判断"当前方案已失效,需要换思路"是语义层面的决策,无法由代码检查。代码只能检查"重试次数已超限"并触发中断,但LLM可以选择在"换思路"后是否完整执行。
"不倒回已完成步骤":判断"当前步骤的结果是否真的不可逆"同样涉及语义理解,代码无法确定"倒回"是否真的在发生。
这两条只能在强制约束表中声明为"AI自觉"项,无法升级为"Python强制"项。
五、这套方案沉淀了什么
5.1 一个基本判断
LLM在多步骤确定性流程中的偏差行为是概率性输出机制的自然结果,不是质量缺陷。应对方式不是"修复LLM",而是"缩小LLM活动边界"。
5.2 五个设计原理
- 步骤原子化:把任务拆成不可再分的最小单元,LLM只负责填值
- 硬中断替代软约束:用进程终止代替文本警告
- 双通道信号传输:stdout + stderr + 文件系统,确保阻断信号不丢失
- 阻断→挂起→恢复循环:避免从头重跑,降低中断成本
- 五层准入门槛:不规范的执行单元根本进不了系统
5.3 一个完整的架构范式
5.4 一句可复用的话
把LLM的活动空间压缩到"填空题/选择题"的狭窄闸口内,用代码级硬中断在边界处拦截越界行为,用锁文件和恢复参数支持中断后的续跑。
第 I 部 · 02|重型技能构建的方法论沉淀:LLM技能构建阶段的工程化契约范式
一、构建侧要解决的三个问题
01 留下了一个缺口:硬中断机制在运行时检查格式、路径、状态、时序,但它是怎么知道"什么是对的"的?
答案是:它需要技能在构建时就提供结构化的声明。 如同编译器需要有类型声明才能检查类型错误。
在受限框架下构建多个技能时,会反复遇到以下三个问题,它们本质上是同一类问题:
第一个问题:不同人产出的技能结构不一致。
开发者A习惯把配置放在config.yaml,开发者B习惯放在settings.json。同一个人今天写的技能和三个月前写的也可能不同。没有统一规范时,N个技能就有N种结构,维护成本非线性增加。
第二个问题:上层调度器无法用统一方式识别技能接口。
技能的配置入口、管理命令、执行参数各不相同,调度器要为每个技能单独适配。新增一个技能就需要新增一段适配代码。
第三个问题:执行侧的硬中断没有判断依据。
"检查输出格式"——但格式是什么?"检查数据路径"——但路径在哪里?这些信息必须在构建阶段就定义好,运行侧才能执行检查。
这三个问题的共同根源是构建阶段缺乏强制性的结构规范。
二、核心机制:构建时契约
2.1 什么是"构建时契约"
构建时契约是一组在技能构建阶段就确定并固定的结构化声明。它在技能运行前就已经存在,运行期间不改变。
它回答以下五个问题:
- 你是谁:技能的标识、版本、责任人
- 什么时候用你:触发条件、否定条件
- 用你的时候什么不能做:行为边界、强制约束
- 怎么跟你交互:配置入口、管理入口、执行入口
- 你的数据放哪:状态文件、产物目录、日志位置
2.2 契约的五个层次(为什么是五层)
实践中发现,上述五个问题自然独立,每个问题的答案不依赖其他问题的答案,且任何一层缺失都会导致"完整性"不足。少于五层会有信息缺失,多于五层会有重叠。
| 层 | 回答的问题 | 缺失后果 |
|---|---|---|
| L1:身份声明 | 你是谁、什么版本 | 无法识别和追踪技能 |
| L2:触发与能力声明 | 什么时候用你 | 不知道何时调用 |
| L3:行为约束声明 | 用你时什么不能做 | 运行时无判断标准 |
| L4:接口声明 | 怎么跟你交互 | 无法统一调度 |
| L5:数据声明 | 你的数据放哪 | 无法统一管理产物 |
2.3 契约如何被实施
契约不是写在文档里的建议,而是被两个机制强制实施的:
机制一:接入校验
任何技能在接入系统前,必须通过五层契约的完整性校验。不完整则拒绝接入。校验是静态的,不依赖运行时。
机制二:运行时对照
技能执行过程中,01 的硬中断机制会对照契约进行检查——声明了输出格式,就检查输出格式;声明了数据路径,就检查数据路径。
三、逐层定义
3.1 L1:身份声明
要回答的问题:
- 这个技能叫什么名字?(与目录名一致)
- 当前是什么版本?(语义化版本)
- 谁负责维护?
- 使用什么协议?
- 它的数据存放在哪里?
- 什么词能触发它?(至少3个正向触发词)
- 什么条件下不应该触发它?
为什么这些信息必须声明:
- 没有名称,系统无法标识技能
- 没有版本,无法追踪演进和回滚
- 没有数据位置,运行时的产物无处存放
- 没有触发词,不知道何时调用
关键约束:
- 版本号必须在三个位置同步——入口文件、元数据文件、更新日志的最新一条记录
- 触发词至少3条,且必须有实际语义("制作PPT"而不只是"制作")
- 数据目录必须指向外部位置,不能指向技能内部
校验方式:静态读取+比对,不依赖运行时。
3.2 L2:触发与能力声明
要回答的问题:
- 什么情况下应该调用这个技能?(正向触发)
- 什么情况下不应该调用这个技能?(否定条件)
- 这个技能提供哪些能力?(能力列表)
为什么触发条件必须区分正反:
- 正向条件让系统知道"什么时候该用"
- 否定条件让系统知道"什么时候不该用",避免误调用
为什么能力必须与触发对应:
- 触发词是用户的语言,能力是系统的语言
- 需要将用户的触发词映射到系统的具体动作
- 映射表由技能声明提供,不在调度层硬编码
3.3 L3:行为约束声明
要回答的问题:
- 执行过程中的红线是什么?
- 哪些步骤是强制顺序的?
- 失败重试的上限是多少?
- 空转多少次必须停止?
约束的分级:
约束分为两个级别,对应两种不同的执行方式:
| 级别 | 含义 | 执行方式 |
|---|---|---|
| 硬约束 | 不能违反,违反则中断 | 由代码强制执行(对应 01 的硬中断机制) |
| 软约束 | 建议遵守,但违反不一定中断 | 由LLM自觉遵守 |
为什么需要硬约束:
- 对应 01 的硬中断机制——运行侧需要有"什么是越界"的判断标准
- 至少3条硬约束,否则技能与纯Prompt工程无异
约束的设计原则:
- 硬约束必须指向可校验的状态("文件存在""格式符合""步骤已完成")
- 软约束虽然不强制执行,但仍需明确定义,避免LLM不知道边界在哪里
3.4 L4:接口声明
要回答的问题:
- 如何配置这个技能?(配置入口)
- 如何管理这个技能的数据?(管理入口)
- 如何执行这个技能的核心功能?(执行入口)
三个标准化入口:
技能必须提供三个标准化的交互入口,对应三种交互场景:
| 入口 | 交互场景 | 必须支持的操作 |
|---|---|---|
| 配置入口 | 查看/修改运行时参数 | 展示配置、修改配置、保存配置 |
| 管理入口 | CRUD技能管理的实体 | list、show、create、delete |
| 执行入口 | 执行核心功能 | 带参数执行、试运行(--dry-run) |
为什么需要试运行(--dry-run):
- LLM任务往往有副作用(写文件、调接口)
- 试运行让LLM和用户在执行前看到执行计划
- 降低误操作成本
3.5 L5:数据声明
要回答的问题:
- 运行状态存在哪里?
- 执行产物存在哪里?
- 日志存在哪里?
- 锁文件怎么管理?
为什么数据必须集中管理:
- 技能可能被重新部署,内部数据会丢失
- 多个技能的数据需要统一清理、备份
- 01 的硬中断机制需要检查产出物,需要知道产出物的位置
数据目录的固定结构:
{data_dir}/
├── .state.json # 运行状态(脚本维护,不可手工编辑)
├── .lock # 锁文件(running/blocked)
├── .remaining.json # 阻断时的问题清单
├── outputs/ # 最终产物
├── logs/ # 运行日志
└── temp/ # 临时文件
状态文件的脚本化操作:
- 状态文件不能手工编辑,只能通过脚本操作(init、update、complete)
- 这保证了状态变更的可追溯性
- 也避免了手工编辑导致的状态不一致
四、契约的强制力来源
4.1 它是通过什么方式强制实施的
契约的强制力来自接入校验:
任何技能在进入系统之前,必须通过五层契约的自动校验。校验不通过则拒绝加载。
校验是静态的——它只检查"是否声明了必要信息"和"声明是否一致",不检查"声明是否正确"。
校验不修改技能。它只输出PASS/FAIL报告,指出具体问题位置。
4.2 契约和 01 硬中断的关系
| 01(硬中断) | 02(契约) | |
|---|---|---|
| 作用 | 运行时检查 | 构建时声明 |
| 问题 | "怎么知道执行偏离了预期" | "怎么让系统知道什么是预期" |
| 答案 | 对照契约检查格式/路径/状态 | 在构建时声明格式/路径/状态 |
| 关系 | 依赖 02 的声明 | 为 01 提供判断标准 |
没有 02 的契约,01 的硬中断没有参照标准。 没有 01 的硬中断,02 的契约只是一纸空文。
两者共同构成完整的闭环。
4.3 契约本身的质量如何保证
契约的"五层"结构本身是可校验的:
- L1的完整性可以检查(字段是否都存在、版本是否同步)
- L2的触发条件可以检查(数量是否≥3、是否有否定条件)
- L3的约束可以检查(数量≥5、硬约束≥3、硬约束有代码实现)
- L4的接口可以检查(三个入口是否存在、是否支持必要操作)
- L5的数据结构可以检查(目录是否存在、状态文件是否可创建)
这种"自举"式的设计——契约本身可以被校验契约的规则所检查——保证了五层契约不会变质。
五、控制循环:两篇方法论如何协同运作
5.1 闭环的完整步骤
前面分别描述了构建时契约(02)和运行时硬中断(01),但它们之间的协同方式才是这套方法论能否成立的关键。
完整控制循环如下:
5.2 两篇方法论的职责分工
| 02(契约) | 01(硬中断) | |
|---|---|---|
| 作用阶段 | 构建时 | 运行时 |
| 核心动作 | 声明、校验、存储 | 读取、对照、拦截 |
| 产出 | 技能的"规格说明书" | 阻断信号+锁文件 |
| 判断依据 | 结构是否完整 | 执行是否偏离契约 |
| 失败后果 | 技能无法接入系统 | 技能中断执行 |
| 修复方式 | 补齐缺失的声明 | 修复偏离的行为 |
两者的关系不是"先后",而是"互相依赖":
- 没有 02 的契约,01 的硬中断没有参照标准——"我检查什么?"
- 没有 01 的硬中断,02 的契约只是一纸空文——"你不检查我违反了又怎样?"
5.3 关键映射表:契约层 ↔ 硬中断检查点
五层契约中的具体声明,直接对应到 01 硬中断机制中的具体检查点:
| 契约中的声明 | 对应硬中断检查点 | 触发条件 |
|---|---|---|
| L3硬约束"上一步必须REVIEW才能执行下一步" | hook_pre_execute() | 发现上一步未标记REVIEW |
| L3硬约束"产出物必须符合声明格式" | hook_post_execute() | 产出物格式校验失败 |
| L3硬约束"重试不超过3次" | hook_pre_advance() | retry_count ≥ 3 |
| L3硬约束"空转不超过3次" | hook_pre_advance() | idle_count ≥ 3 |
| L5数据声明"数据存放在data_dir" | 路径检查 | 发现文件写入data_dir之外 |
| L5状态声明"状态通过脚本变更" | 状态检查 | 发现状态文件被手工编辑 |
这个映射表说明:01 的硬中断机制不是凭空检查,而是逐条对照 02 契约中的声明来执行检查。
5.4 闭环形成的条件
两篇方法论形成闭环,需要满足三个条件:
条件一:契约在构建时被完整声明
技能接入系统时,L1-L5的声明必须全部存在且通过校验。不能"先接入后补声明"。
条件二:契约在执行时可被读取
系统在执行技能时,能读取到该技能的完整契约声明。契约存储在技能的元数据中,与技能代码一起部署。
条件三:硬中断检查点覆盖契约声明
每个L3硬约束和L5数据声明,都有对应的硬中断检查点。如果某个硬约束没有对应的检查点,它实际上只是个"空声明"。
5.5 当闭环失效时会发生什么
| 失效场景 | 后果 | 如何预防 |
|---|---|---|
| 契约声明了格式但无检查点 | 格式错误不会被发现 | L3校验时检查"硬约束是否有实现" |
| 契约检查点存在但未读取契约 | 检查的是硬编码值,不是实际声明 | 系统设计时强制先读契约再执行 |
| 契约接入时完整但执行前被修改 | 执行时读到的是旧契约 | 契约写死在技能元数据中,运行时只读 |
| 硬中断触发了但锁文件写入失败 | 无法恢复,需从头重跑 | L5数据声明中必须有.lock文件路径 |
5.6 闭环的工程验证方式
验证闭环是否生效,可以通过以下方式:
- 单元测试:模拟一个偏离契约的步骤,验证硬中断是否被触发
- 端到端测试:完整执行一个技能,验证所有检查点是否都被触发过
- 审计日志:检查系统日志中是否有"检查点X已触发"的记录
- 契约覆盖度报告:统计契约中的硬约束被检查点覆盖的比例
当一个技能的契约覆盖度达到100%(所有硬约束都有对应的检查点),且所有检查点在实际执行中都被触发验证过,这个闭环就"跑通了"。
六、边界
6.1 这套契约能解决的问题
- 多个技能结构不一致 → 五层统一
- 上层调度器无法识别技能接口 → L4统一
- 运行时硬中断没有判断标准 → L3提供行为边界
- 版本混乱无法追踪 → L1强制版本同步
- 数据散落无法清理 → L5统一数据位置
6.2 这套契约不能解决的问题
- 技能内容本身的正确性(只约束结构,不约束语义)
- 技能之间的依赖管理(跨技能编排的范畴)
- 技能的运行时性能(执行引擎的范畴)
- 技能的故障恢复(01 硬中断的范畴,但契约是它的前提)
6.3 适用前提
- 存在一个受限框架,框架提供了运行环境但不提供结构规范
- 需要维护多个技能,需要统一管理
- 有自动化的校验工具(或能实现这样的工具)
七、总结
7.1 一句话概括
构建时用五层契约锁定结构,运行时用硬中断拦截偏离。前者给后者提供判断标准,后者让前者不至于沦为空文。
7.2 五层对应五个"时点"
| 层 | 对应时点 | 解决的问题 |
|---|---|---|
| L1 | 发现技能时 | 能不能识别它 |
| L2 | 决定调用时 | 该不该用它 |
| L3 | 执行过程中 | 它越界了没 |
| L4 | 交互时 | 怎么跟它对话 |
| L5 | 管理数据时 | 它的数据在哪 |
7.3 两篇方法论的完整关系图
延伸阅读
- 01(运行时硬中断):本篇契约的强制力来源——契约声明本身不执行,由 01 的硬中断在运行时校验执行(构建侧声明"什么是对的",运行侧拦截偏离);两篇构成"构建时契约 + 运行时硬中断"闭环,详见本篇第五章控制循环。
第 I 部 · 03|重型技能构建的方法论沉淀:递归自举的元验证范式
一、元层面:任何方法论都需要被验证
1.1 一个递归问题
01 建立了一个架构:用代码级硬中断拦截LLM的越界行为,把LLM的活动空间压缩到填空题/选择题的闸口内。
02 建立了一个规范:用五层契约统一所有技能的结构,让硬中断有据可依,让调度可统一。
这两篇共同构成了一个"约束LLM的方法论"——对技能而言。但问题出现了:
这套方法论本身,由谁来约束?
- 标准化审计引擎 audit 别的技能——但谁审计它自己?
- triphasic-execution 约束别的任务的三步循环——但它自己的执行被谁约束?
- git-sync 同步别的技能——但它自己的配置谁来校验?
这不是一个理论问题。在构建20个技能的过程中,它真实地反复出现:
| 现象 | 本质 |
|---|---|
| 修改审计引擎后,需要手工确认它还能正确审计别的技能 | 审计引擎没有自我审计能力 |
| 修改执行框架后,它可能不再约束自身的执行顺序 | 执行框架没有自我约束机制 |
| 修改契约工具后,它自身的契约可能与声明的规范不一致 | 契约工具没有自我契约校验 |
| 修改测试套件后,测试套件本身可能不再通过它能发现的测试 | 测试套件没有自我测试 |
1.2 判断:这不是一个bug,是方法论完整性的必要条件
任何方法论如果只能约束"其他东西"而不能约束自己,它就有以下脆弱性:
- 维护者悖论:修改方法论工具的人不受方法论约束,所以工具在被修改时质量不可控
- 递归中断:方法论的迭代改善在某个点之后,依赖修改者的"自觉"——而 01 篇证明自觉不可靠
- 不可验证性:你永远无法确定"当前方法论体系是否完整",因为没有元层面的验证机制
1.3 核心命题
一套约束LLM的方法论,如果它不能约束自己,就不能声称自己能约束任何东西。
"递归自举"在这里的含义是:方法论中的每一条规则,都适用于定义这条规则的工具自身。 审计引擎必须能被审计自身。契约系统必须能被自身的契约约束。执行框架必须遵循它自身定义的执行顺序。
这看起来像是一个哲学问题,但它有非常工程化的解决方案。
二、核心设计原理
2.1 原理一:自我审计
基本判断:如果一个工具审计其他技能的规则不能应用于自身,那么当这个工具被修改时,修改的质量无法被保证。审计引擎自身的退化会直接导致整个方法论体系的退化。
解决方案:审计引擎必须能够审计自己,且审计自身的规则与审计其他技能的规则相同。
实施方式:
技能标准化审计引擎(skill-standardization)
│
├── 审计其他技能 ── 规则R-01 ~ R-26
│ ├── frontmatter完整性
│ ├── 版本号一致性
│ ├── 数据目录合规性
│ ├── 渐进式加载合规性
│ └── 权限声明完整性
│
└── 审计自身 ── 同一条规则集
├── skill-standardization 自身的 frontmatter 完整吗?
├── 它自己的版本号三端一致吗?
├── 它自己的数据目录合规吗?
└── 它自己的渐进式加载合规吗?
自我审计与普通审计的差异:规则相同,只是审计对象变成自己。不能使用"特殊豁免",不能有"它因为是自己所以不需要遵守某条规则"。
自我审计的制约条件:自我审计不能无限递归。当审计引擎审计自己时,它不能要求"审计引擎的审计引擎"再来审计自己。递归终止于规则被证明在自身身上可执行,而不是"规则被另一个实体验证了"。
如何避免无限递归:
关键判断:不是"谁审计审计者",而是"审计者审计自己时,输出格式是否与被审计者一致"。 如果格式一致,说明规则在自身身上同样可执行。如果格式不一致,说明规则有隐式豁免——这正是需要修复的。
2.2 原理二:自我约束
基本判断:执行框架定义了一套步骤间的约束——上一步必须REVIEW才能推进、重试不能超过3次、空转不能超过3次。但框架本身在执行时,也需要遵循这些约束。
解决方案:执行框架在执行自身的管理操作时,使用与约束技能执行相同的约束机制。
实施方式:
自我约束不是"建议执行框架遵守自己的规则",而是执行框架的安装脚本、配置操作、升级流程直接使用同一套三步循环。同一个 task_progress.py 既管理用户任务的进度,也管理自身的安装进度。
自我约束的制约条件:框架的管理操作通常比技能执行简单,可能不需要完整的3次重试。约束可以缩放——"三步循环"的模式不变,但具体的参数(重试上限、空转上限)可以不同。模式一致,参数可调。
2.3 原理三:自我契约
基本判断:契约系统定义了所有技能必须遵循的五层结构声明。但这个定义本身——契约系统的设计文档和执行代码——是否也遵循这五层结构?
解决方案:契约系统的定义自身必须是一份有效的五层契约。
实施方式:
契约系统(skill-standardization)的定义:
L1 身份声明
名称:skill-standardization
版本:语义化版本,三端同步
作者:wUwproject
数据目录:skills/.standardization/skill-standardization/data/
L2 触发与能力声明
正向触发:"审计这个技能"、"检查这个技能"、"创建一个新技能"
否定条件:仅文件操作、不涉及技能结构时
L3 行为约束声明
硬约束1:--mode 与 --command 必须一致,不一致则拒绝执行
硬约束2:0 ERROR 0 WARN 后 才能 bump 版本
硬约束3:auto-fix 最多运行3轮
L4 接口声明
配置入口:--mode audit/create/update/refactor
管理入口:--list-rules / --show-report / --classify
执行入口:--mode audit <skill> --category <cat>
L5 数据声明
数据目录:skills/.standardization/skill-standardization/data/
规格文件:scripts/spec/rules.json, body.json, frontmatter.json
自我契约的校验方式:用契约系统自身的校验规则检查它自己的声明。如果它能通过自己定义的R-01 到R-26检查,说明规则在自身身上成立。
自我契约不是写一篇文档描述自己遵循了契约,而是让契约引擎能够以普通技能的标准来审计自身,并得到PASS。
2.4 原理四:统一的元数据结构
基本判断:上述三个原理(自我审计、自我约束、自我契约)分散在不同层面,但它们指向同一个核心模式——方法论系统中的每一个构件,都必须以统一的数据结构描述自身。
解决方案:定义一份统一的元数据声明模板,方法论中的每一个工具(审计引擎、执行框架、测试套件、同步工具)都按照这份模板声明自己的身份、版本、约束、接口、数据位置。
元数据结构:
每一个"方法论工具"声明:
1. 身份:名称、版本、作者、协议、数据目录
2. 能力:它能做什么、什么时候该被调用、什么时候不该被调用
3. 约束:它自己必须遵守的硬约束(例如"审计他人前必须自审"、"同步前必须通过审计")
4. 接口:调它的入口参数、它产出的数据格式、它接受的配置格式
5. 数据:它的运行时状态存放位置、它的日志位置、它的锁文件位置
为什么需要统一的元数据结构:
不同的工具使用不同的元数据格式,会导致:
| 问题 | 后果 |
|---|---|
| 审计引擎的元数据格式与技能不同 | 无法用同一套规则审计审计引擎 |
| 执行框架的元数据格式与技能不同 | 无法用契约系统的校验器检查框架 |
| 同步工具的元数据格式与技能不同 | 版本号对比无法跨工具操作 |
如果所有方法论工具使用与技能相同的元数据结构,那么:
- 审计引擎可以审计自己(因为自己的元数据格式与技能一致)
- 契约系统的校验器可以校验契约系统自身
- 版本管理工具可以追踪所有方法论工具的版本
统一并不意味着所有工具都使用同一个文件,而是它们声明信息的字段、语义、校验规则是相同的。
2.5 原理五:自举链的有穷性
基本判断:递归必须终止。自举不是无限循环,而是以"自洽"为终点的有穷过程。
解决方案:定义自举的终止条件,不追求"完全形式化验证",追求"工程上的自洽"。
自举链的结构:
自举的终止条件:
- 每个方法论工具都能通过自己的元数据声明校验
- 每个方法论工具在执行核心操作前,会验证自身状态一致
- 方法论体系中的任何修改,都会触发自我审计
- 自我审计发现的任何不一致,都被视为与方法论规则同等严重的问题
什么不是自举的终止条件:
- "所有规则都有形式化证明"——这不是工程,这是数学。方法论是工程的产物,不是数学定理
- "所有人都同意这套方法论很好"——共识不可校验
- "已经连续XX天没有问题了"——无故障运行时间不能证明方法论有效
三、自举链的完整路径
3.1 自举链的步骤
3.2 自举不能跨越的边界
自举链不能回答以下问题:
"这套方法论真的有效吗?"
自举只回答"方法论中的工具遵守了方法论定义的规则",不回答"方法论定义的规则本身是否正确"。后者需要外部验证——实践中的效果、独立第三方的评估、跨系统的迁移验证。
"这套方法论比另一套更好吗?"
自举不提供比较框架。比较需要独立的评估指标和对照组。
"方法论文档本身是否遵循了方法论?"
方法论文档是自举链的起点,不是自举链的检验对象。如果方法论文档本身写成了SKILL.md的格式,可以被审计引擎审计——这可以做,但不是自举的必要条件。文档的"正确性"由人类读者判断。
四、20个技能中的自举体现
在20个技能的实际构建中,自举模式反复出现:
4.1 skill-standardization 自举
这是最完整的自举案例。skill-standardization 维护了一个 rules.json 定义了 R-01 ~ R-26 审计规则。当这个文件被修改时,它必须重新审计自己——因为这些规则的定义本身是否符合这些规则。
实现方式:--mode audit --target skill-standardization 可以正常执行。
自举成立的证据:skill-standardization 自身的审计结果与其审计其他技能时的输出格式一致(version标记、三分类、ERROR/WARN体系)。
4.2 triphasic-execution 自举
triphasic-execution 定义了 Execute→Review→Advance 三步循环。它自身的安装脚本 install.py 同样使用这三步:
- Execute:复制文件到目标目录
- Review:检查安装完整性
- Advance:输出安装报告或回滚
自举成立的证据:安装过程使用了与技能执行相同的进度文件管理(task_progress.py)。
4.3 git-sync 自举
git-sync 在同步前会进行版本号对比和敏感信息扫描。当它同步自身时:
- 对比本地和远程的版本号(自身版本管理)
- 扫描自身的代码和文档中的敏感信息
- 更新 README.md 中关于 git-sync 自身的条目
自举成立的证据:git-sync 能够以处理其他技能完全相同的方式处理自身。它没有"因为是我自己,所以跳过检查"的例外路径。
4.4 skill-function-test 自举
skill-function-test 的 S1-S3 场景测试和 D1-D6 功能测试,同样可以应用于自身:
- S1:它能测试的 CLI 脚本,它自己也有
- D1:它能检查的语法问题,它自己的代码也有
- S4:它暴露的纸老虎约束,它自己也可能有
自举成立的证据:在测试其他技能之前,先用同一套测试流程测试自己。如果测试套件自己都不能通过D2(引用链路检查),它声称的"能检查引用链路"就不值得信任。
五、自举需要被作为架构设计而非事后检查
5.1 自举作为设计原则
自举不是一种验证手段——它是一个架构设计原则。
如果自举只在方法论体系建成后"补做",它就不是自举。它是"补个检查"。真正的自举要求:在方法论工具的架构中,就内置了"我也可以被自己检查"的能力。
5.2 反模式:选择性自举
最常见的自举失败形式是选择性自举——方法论工具在自己的规则中给自己留了例外。
| 反模式 | 表现 | 后果 |
|---|---|---|
| 规则豁免 | "工具X不需要遵循规则R-XX,因为它是元工具" | 方法论有特权层,特权层不可验证 |
| 路径绕过 | 审计自身时使用不同的代码路径(轻量扫描) | 自审结果不可与普通审计对比 |
| 格式差异 | 自身声明使用不同的元数据结构 | 无法用统一校验器检查 |
| 跳过修复 | 自身发现问题但标记"已知问题,以后修" | 方法论不应用于自身时,它本身就没有被方法论约束 |
5.3 自举的孪生问题:自举不是自指
自举和自我指涉有一个关键区别:
| 自举(Bootstrapping) | 自指(Self-reference) | |
|---|---|---|
| 目标 | 证明规则在自身身上可执行 | 证明"自己是对的" |
| 方式 | 用同一套规则检查自己 | 引用自己来证明自己 |
| 结果 | 自洽(输出格式一致、规则覆盖一致) | 悖论("这句话是假的") |
| 工程可行性 | 可行。输出格式可以比较 | 不可行。循环论证 |
自举的核心是:它不证明"自己是对的",它只证明"自己对他人和对自己的标准一致"。 后者是可判断的——审计引擎审计别人输出A格式,审计自己输出A格式,两者格式一致。标准一致不等于标准正确,但标准一致保证了方法论不自欺。
六、边界
6.1 自举能解决的问题
- 方法论工具维护时的质量退化 → 自审可以提前发现
- 方法论体系内部的规则豁免 → 自审可以暴露例外
- 工具修改后的回归确认 → 自审可以作为回归标准
- 方法论体系的完整性证明 → 自审证明"规则至少在被自己遵守"
6.2 自举不能解决的问题
- 方法论规则本身的正确性:自举只证明"规则被遵守了",不证明"规则是对的"
- 方法论体系的外部有效性:自举不告诉你"这套方法论在别的系统上能工作"
- 方法论与目标的因果关系:自举不证明"因为遵守了方法论,所以技能质量高"——这需要对比实验
- 方法论体系的完整性:自举不保证"规则集覆盖了所有需要约束的方面"。可能有规则缺口,自举只能证明现有规则被遵守
- 规则之间的优先级冲突:当两条规则冲突时,自举不能选出应该遵循哪一条——这是元规则层面的问题
6.3 自举链的固有脆弱性
脆弱的起点:自举链始于方法论文档。如果方法论文档本身写错了方向——例如定义了错误的规则——自举只能保证这个错误的规则被一致地遵守,不能发现规则本身的错误。
退化性修改:一个恶意的(或认知能力不足的)维护者可以同时修改工具本身和它的自我审计标准,使自审仍然通过但规则被削弱。自举不能防止"自己降低自己的标准"。
审计引擎的盲区:如果审计引擎本身有某种缺陷——比如它检查"版本号一致性"但不检查"版本号语义正确性"——这种缺陷会在自举中保留,因为它不在规则覆盖范围内。
七、总结
7.1 一句话概括
方法论不约束自己,就没有约束任何东西的资格。自举不证明方法论正确,只证明方法论不自欺。
7.2 五个原理对应五个"元层面"
| 原理 | 解决的问题 |
|---|---|
| 自我审计 | 审计引擎的规则是否适用于审计引擎自身 |
| 自我约束 | 执行框架的约束是否约束框架自身 |
| 自我契约 | 契约系统的结构声明是否包含系统自身 |
| 统一元数据结构 | 方法论工具能否用同一套校验规则统一检查 |
| 自举链有穷性 | 递归在何处终止,不自相矛盾 |
7.3 三篇方法论的完整关系
三篇方法论各自独立,又互相依赖。它们的依赖关系不是线性的,而是环形的:
这是一个环形自洽的结构——三篇中没有哪一篇是"最终权威"。每一篇都依赖另外两篇来完成自己的功能。
7.4 一句可复用的话
你能用你的方法论来检查你自己吗?如果能,你的方法论是完整的。如果不能,你的方法论有一个你还没发现的名字——它叫信仰。
引用与出处说明
本文为方法论论述,无外部文献引用;论证依托本人技能生态的工程实证:
| 实证 | 项目与文件 |
|---|---|
| 递归自举的元验证:方法论约束自身(审计引擎审计自己的规则) | skill-standardization 技能(scripts/spec/rules.json 定义 R-01~R-26 审计规则,规则修改后重新审计自身) |
| 执行框架自举:安装/配置/升级使用与执行相同的三步循环 | triphasic-execution 技能(install.py 安装脚本、task_progress.py 进度文件——同一文件既管理用户任务也管理自身安装) |
| 同步工具自举:同步别的技能,自身配置被同一机制校验 | git-sync 技能(三端同步机制,自身配置纳入同一校验体系) |
延伸阅读
- 01(运行时硬中断)与 02(构建时契约):本篇的自举对象——递归自举验证"方法论约束自身",而被验证的正是 01 的硬中断与 02 的契约这两套方法论工具;依赖关系为"前两者成立,然后验证它们自身也遵循同一套规则",详见本篇 7.3 三篇方法论的完整关系。
第 I 部 · 04|重型技能构建的方法论沉淀:技能流水线编排范式
一、背景:ReAct 的瓶颈
1.1 ReAct 循环的隐形成本
ReAct(Reasoning + Acting)循环是 LLM Agent 的主流架构:
在技能数量较少(<5个)时,这个模式工作良好。但当技能数量增长到 20+ 个,问题显现:
| 问题 | 表现 | 根因 |
|---|---|---|
| 决策抖动 | 同样的任务每次走不同的技能路径 | LLM 是概率模型,每次推理的路径选择不同 |
| 循环失控 | LLM 在 2-3 个步骤间反复横跳 | ReAct 没有天然的终止条件 |
| 状态膨胀 | 上下文窗口中塞满历史观察 | 每一步的观察都累积,但大部分对后续无用 |
| 技能遗忘 | LLM 知道有某个技能但实际没用 | 技能列表太长 > LLM 的注意力窗口 |
| 不可复现 | 相同的输入可能得到完全不同的执行路径 | 概率生成 × 多次决策 = 结果不可控 |
1.2 "LLM 当大脑"的根本问题
ReAct 的隐含假设是:LLM 应该理解整个任务并在每一步做出最佳决策。
但这个假设在重型技能生态中不成立:
- LLM 无法同时掌握 20+ 个技能的接口细节
- LLM 的"计划"和"执行"没有硬性分离——它在执行时还能改计划
- 技能间的数据流转依赖 LLM 的"直觉"而非接口契约
二、核心命题
在多技能编排场景中,LLM 的角色应该从"大脑"降级为"胶水"——只做格式转换,不做路径决策。
编排路径由用户(或固化算法)在执行前确定,LLM 只在每个步骤的输入/输出边界上做精确的格式转换。
2.1 基本判断
| 维度 | ReAct 范式 | Pipeline 编排范式 |
|---|---|---|
| 决策时机 | 执行中动态决策 | 执行前静态确定 |
| LLM 角色 | 大脑(思考+决策+执行) | 胶水(格式转换+内容生成) |
| 技能关系 | LLM 决定调用顺序 | 用户/算法决定顺序 |
| 可复现性 | 低(概率路径) | 高(确定路径) |
| 状态管理 | 隐式(上下文窗口) | 显式(Pipeline JSON) |
| 失败隔离 | 难(一步失败污染全局状态) | 易(步骤间通过 FILE marker 传递) |
2.2 核心命题的分解
命题 A:确定性路径优先于智能路径
- 用户手动编排的流水线总是优于 LLM 动态选择的路径
- 固化算法(skill-sub 优化)优于 LLM 优化
- LLM 只在确定性框架的"填空"处发挥作用
命题 B:技能接口是契约,不需要 LLM 理解
- 每个技能的输入/输出由 SKILL.md 定义
- LLM 不需要"理解"技能做了什么,只需要按格式转换
- 粘合层(_llm_glue)是唯一的 LLM 介入点
命题 C:固化 > 调用
- 确定性逻辑(依赖分析/颜色校验/文件操作/HTML 检查)不应调用 LLM
- 只有需要语义理解的地方(格式转换/内容生成)才用 LLM
- 固化功能越多,系统越稳定
三、架构范式
3.1 三层分离
关键原则:每一层只能做自己层的事。
- 规划层不做执行,执行层不做规划
- 审查层不修改内容,只返回通过/不通过
3.2 与 ReAct 的核心区别
| 维度 | ReAct | Pipeline Orchestrator |
|---|---|---|
| 执行前 | 无计划或模糊计划 | 精确 Pipeline JSON |
| 执行中 | LLM 可随时改计划 | 严格按 nodes 顺序执行 |
| 步骤间 | 隐式上下文传递 | 显式 output → input |
| 失败处理 | LLM 自行决定 | 固化重试策略(max 3 次) |
| 可审查 | 观察 LLM 的思考链 | 固化审查点(格式/颜色/内容) |
四、固化 vs 调用的权衡模型
4.1 决策树
判断一项能力应该被固化还是调用 LLM:
4.2 本项目的固化决策
| 能力 | 固化/LLM | 理由 |
|---|---|---|
| 流水线优化(skill-sub) | 固化 | 依赖分析/并行检测是确定图算法 |
| 意图拆分(semantic-split) | 混合 | 5W2H 提取用正则,步骤拆解用 LLM |
| 输出审查(triphasic) | 混合 | HTML/颜色校验用算法,内容深度审查用 LLM |
| 颜色校验 | 固化 | WCAG 公式是确定的 |
| 文件操作 | 固化 | OS 原子操作 |
| Python 自动装包 | 固化 | pip install 是工具调用 |
| HTML 校验 | 固化 | 标签配对是字符串匹配 |
4.3 "可选功能"原则
所有增强功能都必须是可选的:
不勾选 = 直通执行。这是设计铁律。
五、与现有方法论文档的关系
5.1 方法论维度映射
| 方法论 | 核心关注 | 代表技能/工具 | 关系 |
|---|---|---|---|
| 01:运行时硬约束 | 单技能内的 LLM 行为管控 | triphasic-execution | 编排器吸收其执行循环逻辑 |
| 02:构建时契约 | 多技能的结构一致性 | skill-standardization | 编排器依赖契约来识读技能接口 |
| 03:递归自举 | 方法论工具的自约束 | skill-standardization / triphasic-execution / git-sync | 编排器本身遵守固化>调用的原则 |
| 本篇:编排范式 | 多技能间的编排与执行 | Orchestrator | 调度层——前三维度在编排层面的应用 |
5.2 本篇的定位
前三篇解决的是"单技能的正确性"问题:
01:技能执行时不出轨
02:技能结构统一
03:方法论工具不自欺
本篇解决的是"多技能如何组合"的问题:
Orchestrator:不是让单个技能更正确,而是让多个技能正确协作
5.3 各维度在编排器中的落地
| 方法论维度 | 在编排器中的体现 |
|---|---|
| 运行时硬约束(01) | triphasic_execute_step() — 执行→审查→推进,最多 3 次重试 |
| 构建时契约(02) | skill_scanner — 解析 SKILL.md 的 YAML frontmatter,识别技能接口 |
| 递归自举(03) | 编排器使用固化算法而不是 LLM 来完成确定性任务——不自欺 |
六、工程实践总结
6.1 设计原则清单
- 路径确定性 — 执行路径在执行前确定,不在执行中改变
- LLM 降级为胶水 — 只做格式转换,不做路径决策
- 固化 > 调用 — 确定性逻辑永远不调用 LLM
- 可选不强制 — 所有增强功能勾选才启用
- 审查不修改 — 审查层只返回通过/不通过
- 原子化传递 — 步骤间通过 FILE marker 显式传递结果
- 配置驱动 — 所有参数(超时/tokens/续接)可配置
6.2 常见反模式
| 反模式 | 表现 | 正确做法 |
|---|---|---|
| ReAct 残留 | 在执行循环中让 LLM 决定"下一步做什么" | 执行前确定 Pipeline,LLM 只填充内容 |
| 过固化 | 把需要语义理解的功能也硬编码(如自然语言理解) | 用 LLM 做语义部分,固化做算法部分 |
| 审查绕过 | 执行后不审查,直接输出 | 每次执行后必须有审查点 |
| 粘合过度 | 每一步之间都做 LLM 粘合(即使格式不需要转换) | 只在格式不匹配时做粘合 |
6.3 适用场景
适合:
- 3+ 个技能的流水线任务
- 技能间有明确的数据流转关系
- 执行路径需要可复现、可审计
- 需要混合脚本执行和 LLM 执行
不适合:
- 单步简单任务(直接用技能即可)
- 高度动态、每次路径都不同的探索性任务
- 需要实时人机交互的对话场景
引用与出处说明
本文为方法论论述,无外部文献引用;论证依托本人技能生态的工程实证:
| 实证 | 项目与文件 |
|---|---|
| 技能流水线编排范式(seq/par 容器、数据流转、可复现执行) | Orchestrator 编排智能体 + skill-sub 调用链编排技能(链驱动 Pipeline 范式) |
| 流水线中技能的标准化与审计 | skill-standardization 审计技能、triphasic-execution 三步循环、semantic-split 语义拆分 |
| 多技能协同的同步与发布 | git-sync 三端同步技能 |
第 I 部 · 05|编排智能体 (Orchestrator) 构建的方法论沉淀:链驱动 Pipeline 编排范式
一、背景:ReAct 的盲区
1.1 ReAct 循环的隐含假设
传统智能体架构的核心模式是 ReAct(Reasoning + Acting)循环:
这条循环的隐含假设是:LLM 有能力在每一步做出正确的路径决策。
但这个假设在技能编排场景中存在严重问题:
| 问题 | 表现 | 根因 |
|---|---|---|
| 路径不可复现 | 同一个 Pipeline 执行两次结果不同 | LLM 每次的路径选择是概率性的 |
| 决策循环失控 | LLM 陷入"思考→调用→再思考"的死循环 | 没有硬性的步骤数上限或路径约束 |
| 技能调用混乱 | LLM 调用 load_skill 后不知道下一步该干什么 | 缺乏预定义的执行顺序和输出契约 |
| 上下文污染 | 上一次调用的输出影响下一次的路径选择 | ReAct 循环的历史消息是状态敏感的 |
| 审计困难 | 无法回溯某次执行中 LLM 为什么选了这个技能 | 路径决策是隐式的,没有显式记录 |
1.2 核心矛盾的识别
ReAct 的进化为一条自由循环:
但技能编排需要的是:
两者之间的鸿沟就是:LLM 做路径决策不是优势,而是负担。当技能链是确定的(用户或编排器已经定义好顺序),ReAct 循环中 LLM 的"思考"就变成了多余开销。
二、核心命题
在技能编排场景中,链是主体,LLM 只做两头——前处理(理解任务、处理数据)和输出整理(呈现结果),中间的执行是确定性的。技能是原子动作池,编排 = 从 skill 里挑可执行原子组链。
2.1 基本判断
| 维度 | ReAct 范式 | 链驱动范式 |
|---|---|---|
| 执行主体 | LLM 决策 → 调用工具 | 预编排的技能链(subprocess 真跑脚本) |
| LLM 角色 | 决策者 + 执行者 | 前处理 + 输出整理,不碰中间 |
| 路径决策 | 运行时动态决定 | 编排时静态确定 |
| 可复现性 | 概率性,不保证重复 | 确定性,相同链相同输出 |
| 状态管理 | 隐含在对话历史中 | 显式步骤间参数传递 + 文件 I/O |
| 技能组合 | LLM 自己决定调哪个 | 用户编排 seq/par/loop |
| 失败恢复 | LLM 自行修正 | 步骤级重试 + 黏连点转换 |
2.2 核心命题的分解
命题 A:链是主体,对话是附属
- 用户先编排 Pipeline(技能、参数、模式),再通过对话下达任务
- 没有链就没有对话——系统不存在"闲聊"模式,普通对话(ReAct)已整体移除
- Pipeline 编辑器是主界面,对话区是执行结果展示
命题 B:LLM 只做两头,中间是死的
- 前处理(输入侧):需求分析 + 用工具处理上传数据(db_query/read_table/image_info),产出最小中间输入
- 死执行(中间):subprocess 真跑 skill 脚本,LLM 不参与、不改路径、不编结果
- 输出整理(输出侧):LLM 按用户提示词整理最终交付
- 用户提示词只作用于两头(理解任务偏好 + 输出格式偏好),不干预链执行
命题 C:Seq/Par/Loop 是真执行,不是标签
- seq:subprocess 跑 skill 脚本,前一步输出传入下一步
- par:ThreadPoolExecutor 真并行,多路同时执行
- loop:for 循环真重复 N 次,每轮输出回传下一轮(不是重复相同独立执行)
命题 D:skill 是原子动作池,编排是挑选不是整跑
- 每个 skill 可拆解为可执行原子:CLI 命令、Python 驱动、子步骤
- 编排 = LLM/用户从 skill 池里挑有用的原子(可能是完整 skill,可能是其中一个 CLI/脚本),组合成链
- 链节点 = 真实可执行的原子:能调取(subprocess 跑 CLI/脚本)、能输入(参数+前步输出)、能执行(真跑)、能输出(捕获 stdout/文件结果)
命题 E:编排器不替 skill 干活
- skill 自带领域能力(RAG 检索在 local-rag-builder 自己的 rag_core.py、颜色计算在 color-toolkit-turn 自己的 cli.py)
- 编排器只提供通用衔接工具(文件读写/复制/移动/删除/建目录/查找/网络/Python 执行)
- 让编排器内置替 skill 干活的工具 = 让编排器替每个 skill 重写一遍功能——方向性错误
三、架构范式
3.1 四阶段执行流(LLM 只做两头)
3.2 技能链数据模型
每个 Pipeline 节点包含:
{
"name": "skill-name", // 技能 slug
"display": "显示名称", // 前端展示
"mode": "seq|par|loop", // 执行模式
"params": {}, // 技能参数(→ CLI 参数)
"children": [], // 子节点(par/loop 用)
"loop_times": 3, // 循环次数(loop 用)
"extra": {} // skill-sub 优化数据(黏连点/里程碑)
}
三种模式的真实执行:
| 模式 | 实现方式 | 说明 |
|---|---|---|
| seq | subprocess 跑 skill 脚本 | 前一步输出清洗后传入下一步 |
| par | ThreadPoolExecutor | 多线程并行,所有完成后再继续 |
| loop | for 循环 | 指定次数重复执行子节点,每轮输出回传下一轮 |
3.3 LLM 即两头(原"LLM 即执行器"的修正)
LLM 在链驱动架构中的角色被严格限定:
链定义时:LLM 不参与(用户编排)
前处理时:LLM 分析任务 + 用工具处理数据(Round 1)
优化时:LLM 仅做模糊黏连判断(Round 2,可选)
执行时:LLM 不参与——subprocess 真跑 skill 脚本(Round 3+)
输出时:LLM 按 user_prompt 整理交付(Round 4)
对比 ReAct 中 LLM 的角色:
| 维度 | ReAct | 链驱动 |
|---|---|---|
| 每轮调用次数 | 3-20+ 次 LLM 调用 | 执行阶段 0 次(只两头) |
| 决策负担 | LLM 决定调用什么工具 | 编排器决定,LLM 只前处理+整理 |
| 输出不确定性 | 高(路径 + 参数 + 格式) | 低(脚本真输出 + 整理) |
| 超时风险 | 高(ReAct 循环可能死循环) | 可控(每步脚本超时) |
| token 消耗 | 高(上下文反复膨胀) | 低(前处理用工具取摘要,不整读大文件) |
3.4 skill-sub 优化(可选层)
skill-sub 不是 ReAct 中的自由优化,而是算法主导的链分析:
四、这套机制为什么能工作
4.1 确定性取代概率性
| 特性 | ReAct 循环 | 链驱动 |
|---|---|---|
| 执行路径 | LLM 运行时决定 | 编排时静态确定 |
| 步骤数 | 不确定(3-20+) | 确定的 N 步 |
| 技能调用 | LLM 自主选择 | 预编排的固定序列 |
| 执行结果 | LLM 编的(不可验证) | 脚本真输出(可验证、可复现) |
| 审计 | 需要分析 LLM 推理轨迹 | 链 + 每步真实输出即可还原 |
4.2 本地部署的实践优势
| 因素 | ReAct | 链驱动 |
|---|---|---|
| LLM 调用次数 | 多(3-20+/次任务) | 少(只两头,执行 0 次) |
| 单次调用耗时 | 短(简单思考) | 短(前处理/整理) |
| 总耗时 | 不确定(循环次数波动) | 可预估(脚本执行时间为主) |
| 超时可配置 | 困难的(循环内嵌套循环) | 简单(每步脚本独立超时) |
| LLM 失联 | 整个对话不可用 | 脚本执行不受影响(两头降级) |
| token 成本 | 高(上下文膨胀) | 低(工具取摘要) |
4.3 配置驱动的适应性
超时和 max_tokens 从配置读取(不是硬编码):
配置持久化到 data/config/settings.json,启动时不再被硬编码覆盖。
五、这套方案的代价与边界
5.1 代价:以灵活性换取确定性
| 代价维度 | 具体表现 | 与 ReAct 对比 |
|---|---|---|
| 编排负担 | 用户需要先在 Pipeline 编辑器中编排技能链 | ReAct 零配置,LLM 自己决定 |
| 技能必须可执行 | 链中引用的技能必须有可执行脚本入口(纯提示词 skill 不编排) | ReAct 中 LLM 可选任意可用工具 |
| 步骤间耦合 | 前一步输出格式必须能被下一步脚本理解 | ReAct 中 LLM 自己处理格式转换 |
| 缺乏应急路径 | 链是线性执行,没有异常分支 | ReAct 中 LLM 发现工具不可用会换方案 |
| 不支持自由对话 | 没有选链就无法对话(普通对话已彻底移除) | ReAct 天然支持问答 |
换一种更直白的说法:
ReAct 是"先走再看"——灵活但路径不可控。链驱动是"先看再走"——路径确定但缺乏应变。前者适合探索型任务,后者适合已知流程的自动化执行。
5.2 边界:适用场景与不适用场景
| 适合 | 不适合 |
|---|---|
| 多技能协作的固定流程(数据采集→分析→报告) | 开放式探索("帮我查一下最近的 AI 新闻") |
| 需要可复现、可审计的流水线执行 | 需要 LLM 自主判断路径的场景 |
| 已知技能链的批量处理 | 单次简单问答(用不到链) |
| 并行/循环加速的数据处理 | 需要动态调整执行顺序的场景 |
5.3 已知局限
| 局限 | 说明 | 缓解措施 |
|---|---|---|
| 脚本入口匹配有边界 | 技能脚本名/入口需可被识别(下划线归一化 + 标准入口名),纯配置脚本不算 | 入口匹配排除 settings/config/__init__/_paths;无入口技能过滤不显示 |
| 并行线程安全问题 | ThreadPoolExecutor 中多个脚本同时运行 | 本地 LLM 后端需支持并发;文件操作工具带安全校验 |
| 黏连点需要 LLM 确认 | 算法无法确定的兼容性仍需 LLM 回退 | 限制 LLM 回退调用次数(≤1 次/链) |
| 无跨链状态共享 | 每条 Pipeline 独立执行,不共享中间结果 | 通过文件 I/O(copy/move/delete 工具)+ 上传通道实现 |
| 数据负载通道有限 | 图片/视频等二进制无法进对话框 | 上传通道(/api/upload → input/ 目录 → 路径引用) |
六、这套方案沉淀了什么
6.1 可复用的模式
- 链驱动执行模式 — Pipeline 是主体,LLM 只做两头,替换 ReAct 自由对话
- 四阶段编排模式 — 需求分析 → (优化) → 死执行 → 输出整理,每轮独立展示
- 真并行/真循环执行模式 — par 用 ThreadPoolExecutor,loop 用 for(输出回传)
- 算法主导的 skill-sub 优化模式 — 读 SKILL.md → 标签匹配 → LLM 仅回退
- 配置驱动的超时/容量控制模式 — timeout 和 max_tokens 从配置读取,可调
- skill 原子池模式 — 编排 = 从 skill 拆解可执行原子(CLI/脚本)组链,不是整跑 skill
- 可执行过滤模式 — 纯提示词 skill(无脚本入口)不编排、不显示
- 工具取摘要模式 — 前处理用 db_query/read_table/image_info 取必要信息,不整读大文件防 token 爆炸
6.2 关键教训
| 教训 | 场景 | 结论 |
|---|---|---|
| 不要让 LLM 编执行结果 | 每步 llm.chat 编输出 → 结果不可验证 | subprocess 真跑 skill 脚本,脚本输出即真 |
| 不要把 skill 功能当编排器职责 | 想内置 RAGTool 替 skill 检索 | skill 自带能力(rag_core.py),编排器只递数据 |
| 不要拿具体任务特化论证工具 | 用"RAG→报告→小说"论证工具清单 | 工具按通用能力评估(文件系统/执行/网络/技能),不绑定任何任务 |
| 不要特化智能体身份 | prompt 中写"你是某某助手" | 删除所有身份描述,只描述任务 |
| LLM 不可用时不回退 | 无 LLM 时返回文字模拟 | 直接抛异常,没有 LLM 不执行(脚本执行不受影响) |
| 链必须有技能列表 | 空链还执行是浪费 | 空链直接返回错误 |
| loop 不是 agent 循环 | 误以为 loop 是模型自适应循环 | loop = 固定次数重复执行容器(编程 for),轮间只回传数据、无决策 |
6.3 与其他方法论文章的关联
| 本体系的其他文章 | 关联点 |
|---|---|
| 01:硬约束架构 | 每步独立 subprocess 是步骤原子化 + 硬中断的实现 |
| 02:构建时契约 | Pipeline 节点中的 params/extra 是 L4 接口声明的体现 |
| 03:递归自举 | 链驱动架构文档自身应可用 Orchestrator 验证 |
| 04:编排范式 | 链驱动是编排范式的工程实现——技能是积木,编排是图纸 |
| 05:领域智能体 | RAG Assistant 可作为链中的一个技能节点被编排(走它自己的 rag_core.py) |
引用与出处说明
本文为方法论论述,无外部文献引用;论证依托本人项目实证:
| 实证 | 项目与文件 |
|---|---|
| 链驱动 Pipeline 编排范式的工程实现 | Orchestrator 编排智能体(data/config/settings.json 配置) |
| 调用链编辑与拓扑排序 | skill-sub 调用链编排技能 |
| 编排中各组件的本地化实践 | local-rag-builder、RAG Assistant、color-toolkit 等技能 |
第 I 部 · 06|领域智能体 (Domain Agent) 构建的方法论沉淀:本地知识库智能体的自洽范式
一、背景:传统 RAG 的盲区
1.1 单轮 RAG 的隐含假设
传统 RAG(Retrieval-Augmented Generation)的核心流程是一个线性管道:
这条流水线的隐含假设是:用户的问题本身就是最佳的检索查询。
但这个假设在复杂知识库场景中存在严重问题:
| 问题 | 表现 | 根因 |
|---|---|---|
| 实体丢失 | "三个代表与无为而治的异同"只命中"三个代表" | 一句话包含多个实体,但向量检索只返回整体相似度 |
| 属性模糊 | 查不到"相同点"和"不同点"的对比信息 | 比较类问题的属性维度分散在不同文档中 |
| 路由抖动 | 包含两个实体的查询路由到错误的 KB | 多实体 = 多目标,单个路由无法同时覆盖 |
| 上下文孤岛 | LLM 看到三个代表但没有无为而治的背景 | 一个 top-K 结果集只覆盖问题的一个侧面 |
| 假阳性回答 | LLM 基于不完整上下文强行生成对比 | 上下文只包含 A 的信息,LLM 自己脑补 B 的部分 |
1.2 核心矛盾的识别
传统 RAG 的进化为一条线性流水线:
但真实的知识库问答需要的是:
两者之间的鸿沟就是:问题不是查询。用户的问题是一个复合指令,需要解析为检索策略再执行,而不是直接扔给向量库。
二、核心命题
在多实体、多属性的复杂知识库问答场景中,LLM 应该承担"查询策略规划者"的角色——将用户问题分解为检索元组,而非直接回答问题。(规划 = 语义标注元组,策略 = 算法穷举组合;LLM 不持有路径决策权)
2.1 基本判断
| 维度 | 传统 RAG 范式 | 组合式检索范式 |
|---|---|---|
| 查询构造 | 用户原句直接检索 | LLM 分解为 entities + attrs 后穷举组合 |
| LLM 角色 | 答案生成器 | 查询规划器 + 答案整合器 |
| 检索单位 | 一段文本 | 一个 entity × attr 元组 |
| 路数 | 1 路检索 | N × M 路独立检索 |
| 去重策略 | 无 | SM3 内容哈希去重 |
| 路由粒度 | 整句路由 | 每条切片独立路由 |
| 失败隔离 | 一步失败全局无结果 | 切片级失败不影响其他切片 |
| 上下文质量 | 可能漏掉关键侧面 | 所有实体 × 属性维度都被覆盖 |
| 输出格式 | 自由文本 | 强制 4 层结构化分析(逻辑→本体→机制→矩阵) |
2.2 核心命题的分解
命题 A:LLM 比规则更适合做查询分解
- 实体/属性标注依赖语义理解,关键词规则无法处理同义表达
- LLM 能理解"相同点/不同点"是一个对比属性维度
- 规则引擎只能做平面关键词匹配,无法理解"关系"
命题 B:穷举组合比智能猜测更可靠
- 假设有 2 个实体 × 3 个属性 = 6 种组合,全部查询比让 LLM 选 1-2 种更可靠
- 向量检索的 top-K 机制天然有重复冗余,穷举的边际成本很低
- 额外的查询组合最多产生重复结果(SM3 去重即可),不会产生错误结果
命题 C:LLM 做决策必须可修正
- 第一次输出可能格式错误 → 自修正循环捕获并反馈
- 多次错误 → 降级为普通聊天
- 自修正机制不是锦上添花,而是保证 LLM 输出可控的刚性约束
命题 D:输出格式必须强制结构化(关键教训)
- 自由文本输出导致 LLM 遗漏关键维度、引用无标记、结论模糊
- 强制 4 层结构 + 引用编号门禁校验,将 LLM 输出从"散文"变为"论文"
- 每一层的缺失都会破坏整个回答的可验证性
三、架构范式
3.1 双阶段流水线
3.2 检索即服务
本地 RAG 以完整技能(local-rag-builder)的形式嵌入智能体,智能体不改造技能内部逻辑:
rag-assistant/ # 智能体层
├── main.py # 入口(4 种模式)
├── rag_assistant/ # 决策、界面、LLM 通信
│ ├── agent.py # 决策循环 + 组合查询
│ ├── web_ui.py # HTTP 服务器 + 前端
│ ├── rag_wrapper.py # 技能封装桥接层
│ ├── memory.py # 四层记忆 + 用户画像
│ ├── llm_client.py # Ollama + LM Studio 双后端
│ ├── search.py # 联网搜索(3 引擎)
│ │
│ └── engine/ # ★ 技能层(只调用,不改造)
│ ├── rag_core.py # 检索引擎核心
│ ├── router.py # 两级路由
│ ├── reranker.py # 三模式重排序 + FallbackRouter
│ ├── nli_classifier.py # NLI 三向分类器
│ ├── knowledge_base_manager.py # 知识库 CRUD + 容灾
│ ├── text_splitter.py # 5 策略 + 5 守卫插件架构
│ ├── prompt_manager.py # 3 插槽 + 预设管理
│ ├── config.py # 配置管理 + 模型路径自动修正
│ ├── embedding_model_manager.py # 5 源并行模型下载
│ └── utils.py # 工具函数
│
├── vendor/ # 内嵌第三方库
└── data/ # 运行时数据
智能体层与技能层的边界清晰——智能体只负责"查什么",技能层负责"怎么查":
| 层 | 负责 | 不负责 |
|---|---|---|
| 智能体 | 实体/属性解析、组合策略、去重合并、LLM 回答、记忆管理、用户画像 | 向量检索、路由决策、rerank 排序、文本切分 |
| 技能 | 语义路由(6 方法)、Chroma 检索、Cross-encoder 重排、NLI 分类、KB 签名、容灾 | 问题分解、组合策略、回答生成 |
这种分离意味着:底层技能升级(如换用更好的嵌入模型)不影响上层策略,上层调整检索策略不影响底层技能。
3.3 决策循环中的硬约束
LLM 在智能体中不是自由发挥的——它被三层次硬约束约束,外加输出格式门禁和引用门禁:
这与 Cogito 体系 01(抑制 LLM 执行偏差)一脉相承——LLM 的每一步输出都经过校验,错误不是终点而是反馈信号。
3.4 输出格式契约(关键创新)
该契约的核心是强制结构化输出格式,System Prompt 中嵌入以下模板约束:
【引用格式】每个结论后面用 [n] 标注来源的段落编号
【输出风格】【强制输出结构】(必须严格按此格式输出,严禁只写四个段落标题):
正式回答
核心结论
|知识库分类(按资料来源自动归纳)|涉及的文档/理论数|与本问题直接相关的关键发现|
第一层:逻辑与形式理论层(此层必须包含数学公式)
...
第二层:哲学本体论与概念本质层(此层必须引用资料中的形而上学框架)
...
第三层:现实机制与功能拆解层(此层必须剥离修饰性术语)
...
第四层:综合判定与意义分层矩阵(此层必须使用 Markdown 表格)
...
引用片段索引(必须填写,不得为空)
3 个插槽可由用户在 Web UI 配置,4 个内置预设(标准模式 / 深度分析 / 对比分析 / 友好对话)+ 用户自定义预设。
四、这套机制为什么能工作
4.1 向量检索的特性天然适配穷举
| 特性 | 对组合检索的意义 |
|---|---|
| top-K 有上限 | 每次检索只返回 3-5 条,不会因为多个切片导致结果爆炸 |
| 结果有重复 | SM3 去重确保内容不膨胀 |
| 路由基于语义 | 每个切片独立路由到最相关的 KB,比单句路由更精准 |
| 检索快速 | Chroma 局部搜索在本地毫秒级,N×M 路检索总耗时仍远低于 LLM 推理时间 |
4.2 本地部署的特殊优势
| 因素 | 在线服务 | 本地部署 |
|---|---|---|
| 检索成本 | 按 token 计费 | 零边际成本 |
| 穷举开销 | 线性增长 | 线性增长但阈值很低 |
| 模型切换 | 受限于 API | 自由切换嵌入/reranker/LLM |
| 数据隐私 | 上传第三方 | 全本地 |
本地部署意味着穷举组合没有额外成本——多一次检索只多几十毫秒的 CPU 时间。这使得"全部查一遍"策略成为可行选项,而非理论优化。
4.3 自修正的收敛性
agent.chat() 实际传 max_retries=2(函数默认参数为 5,但调用处覆写为 2)。实际运行日志显示:
| 尝试次数 | 占比 | 典型场景 |
|---|---|---|
| 第 1 次通过 | ~80% | 正常聊天、标准查询 |
| 第 2 次(末次)通过 | ~17% | 格式不规范(如用 question 代替 entities) |
| 耗尽降级(2 次失败) | ~3% | 模型自身输出崩溃 |
95%+ 的请求在 2 次内收敛。如果函数默认的 5 次全用完才降级,大多数场景(~97%)也在 2 次内完成,第 3-5 次几乎无收益。2 次是实际调用的保守最优值。
五、这套方案的代价与边界
5.1 代价:以资源换周全
本范式的核心取舍是:用查询量、延迟和 token 消耗换取检索的完备性。
| 代价维度 | 具体表现 | 与传统 RAG 对比 |
|---|---|---|
| 查询量 | N 实体 × M 属性 → N×M 次独立检索(含路由 + Chroma + 可能 rerank + NLI) | 传统 RAG 仅 1 次检索 |
| 端到端延迟 | 多路检索串行执行,每路 ~50-200ms,10 路 ≈ 0.5-2s 额外等待 | 传统 RAG 检索耗时在数十毫秒级 |
| LLM 整合负担 | 合并后的上下文包含多个侧面的信息,LLM 需要从中筛选、对比、综合 | 传统 RAG 的上下文更集中,LLM "看一眼就答" |
| 嵌入计算量 | 每路检索都要将切片文本做嵌入编码 | 传统 RAG 只编一次(优化为单例缓存) |
| token 浪费 | 不同切片可能命中相似内容,即使 SM3 去重也无法消除语义重叠 | 传统 RAG 无此问题 |
| 灵活性代价 | 固定策略(穷举所有组合)无法根据问题类型动态调整检索深度 | 传统 RAG 一条路径走到底反而简单 |
换一种更直白的说法:
传统 RAG 是"瞄一眼就答"——快但可能看漏。本范式是"每个角落都翻一遍再答"——全面但费时费力。后者在知识库内容分散、问题涉及多个维度时更有价值,在简单的一问一答场景中反而大材小用。
5.2 边界:适用场景与不适用场景
| 适合 | 不适合 |
|---|---|
| 多实体对比分析(A 与 B 的异同) | 单实体事实查询("苹果的糖度标准是多少") |
| 跨知识库综合问答 | 单库已知位置检索 |
| 需要穷举侧面的调研型问题 | 时间敏感的简单问答 |
| 知识库内容分散、无单一文档覆盖全部信息 | 知识库内容高度集中、单一文档即可回答 |
5.3 已知局限
| 局限 | 说明 | 缓解措施 |
|---|---|---|
| 实体数量爆炸 | 5 实体 × 5 属性 = 25 切片,再组合衍生更多 | 实际使用中 LLM 标注的实体/属性通常各 ≤3 个 |
| 路由扁平化 | 每个切片独立路由,但路由器的精度有限 | 6 种路由方法分层(hardcoded / embedding_signature / broadcast 等) |
| 模型无关性 | 依赖 LLM 的输出格式一致性 | 自修正循环兜底格式错误 |
| 上下文窗口 | 太多切片导致 context 文本太长 | SM3 去重 + k=5 避免结果膨胀 |
| 无结果处理 | 检索结果为空时仍需 LLM 回答 | 降级为"未找到相关资料"回复,记录知识缺口 |
| 嵌入模型重复加载 | 组合查询每片都 load 一次嵌入模型 | 修复为 get_embeddings() 单例缓存(18 次→1 次) |
5.4 嵌入对象构造冗余
从运行日志可以看出一个典型陷阱——组合查询中 "Loading weights" tqdm 进度条重复出现:
Loading weights: 100% | 202/202 [00:00<00:00, 8000it/s]
Loading weights: 100% | 202/202 [00:00<00:00, 8000it/s]
...(重复 30+ 次)
这里的 "Loading weights" 指标有误导性。 每条在 0.028 秒内完成(202/202 @ 8000 it/s),说明模型已经在 HuggingFace 缓存和 OS 文件缓存中,远快于真正的磁盘→GPU 全量加载(需数秒)。每条进度条代表的是 SentenceTransformer() 的 from_pretrained() 初始化流程在验证缓存文件完整性,而非重新加载模型权重。
但问题仍然存在:get_embeddings() 每次都被调用了新的构造函数,导致:
- 30+ 个冗余的 Python 对象创建(即使权重是共享的)
- CUDA 上下文重复初始化(如果有 GPU)
- tqdm 日志污染(让人误以为有性能灾难)
根因:每片独立调用 rag.query() 导致各自触发 get_embeddings() 重新初始化。修复方案:get_embeddings() 加单例缓存,组合查询只初始化一次。
教训:技能封装不能纯透传——需要在智能体层做资源复用优化。同时,阅读日志时要注意区分"看起来严重的进度条"和"实际性能影响",不要在误导性指标上做过度推断。
六、案例实证:组合式检索的完整输出(真实日志)
以下为一个真实交互的完整日志节选和输出结果,展示组合式 RAG 的全流程。
6.1 用户提问
问:有没有一种可能,现在的大语言模型已经发展得接近极限了?
6.2 组合展开(Agent 日志)
组合查询: entities=['大语言模型', 'LLM', '发展极限', '性能边界'],
attrs=['训练规模', 'Token数量', '理论上限'],
rel=对比分析
生成切片: [
'大语言模型 训练规模',
'大语言模型 理论上限',
'LLM 训练规模',
'LLM Token数量',
'发展极限 训练规模',
'发展极限 Token数量',
'发展极限 理论上限',
'性能边界 训练规模',
'性能边界 Token数量',
'性能边界 理论上限',
'大语言模型 LLM 发展极限 性能边界 训练规模',
'大语言模型 LLM 发展极限 性能边界 Token数量',
'大语言模型 LLM 发展极限 性能边界 理论上限',
'大语言模型 发展极限 训练规模 对比分析',
'大语言模型 发展极限 Token数量 对比分析',
'大语言模型 发展极限 理论上限 对比分析',
'大语言模型 性能边界 训练规模 对比分析',
'大语言模型 性能边界 Token数量 对比分析',
'大语言模型 性能边界 理论上限 对比分析',
'LLM 发展极限 训练规模 对比分析',
'LLM 发展极限 Token数量 对比分析',
'LLM 发展极限 理论上限 对比分析',
'LLM 性能边界 训练规模 对比分析',
'LLM 性能边界 Token数量 对比分析',
'LLM 性能边界 理论上限 对比分析',
'大语言模型 LLM 发展极限 性能边界 训练规模 对比分析',
'大语言模型 LLM 发展极限 性能边界 Token数量 对比分析',
'大语言模型 LLM 发展极限 性能边界 理论上限 对比分析',
'发展极限 性能边界 训练规模 对比分析',
'发展极限 性能边界 Token数量 对比分析',
'发展极限 性能边界 理论上限 对比分析',
'大语言模型 LLM Token数量 对比分析'
] # 共 32 片
4 entities × 3 attrs + rel = 32 片(含单实体×各属性、联合×各属性、两两配对×attrs×rel)。
日志中 "Loading weights" 进度条重复了 30+ 次,每条在 ~0.028 秒完成,说明是 SentenceTransformer() 构造函数被重复调用,而非真正的模型全量从磁盘加载。这是 get_embeddings() 缺少单例缓存的症状——对象构造冗余而非性能灾难。(详见 5.4 节修复说明。)
6.3 最终输出(4 层结构化回答)
核心结论
| 知识库分类 | 涉及的文档/理论数 | 与本问题直接相关的关键发现 |
|---|---|---|
| 大模型训练与缩放定律 | 6 篇 | 当前大模型处于"过度规模、训练不足"状态,未达性能极限 |
| 训练超参数与架构细节 | 2 篇 | 核心瓶颈在于 Token/Params 配比而非单纯规模 |
| 历史与经济理论参照 | 4 篇 | 此部分资料关于市场经济与中国思想史,与技术极限无直接关联 |
第一层:逻辑与形式理论层
前提公理:大语言模型的性能 P 受限于计算预算 C、参数量 N 和训练 Token 数 T。缩放定律(Scaling Laws)指出损失随规模按幂律下降。
形式边界:资料 [2] 与 [12] 指出,当前趋势是增加 N 而保持 T 不变,导致模型在给定 C 下未达最优。计算预算约束可表述为 C ≈ N × T(FLOPs)。
自洽性缺陷:单纯扩大参数量而不增加训练 Token,会导致边际收益递减甚至性能下降 [3]。当前模型被评估为 "considerably over-sized" [12]。
第二层:哲学本体论与概念本质层
存在方式追问:模型能力的"极限"在本体论上是硬件/数据资源的物理边界,还是算法架构的收敛性问题?资料 [2] 与 [12] 倾向于后者——当前状态是工程分配问题而非能力天花板。
定义边界:"接近极限"若指性能无法再提升则不成立;若指特定规模下的训练效率则已触及非最优边界。
第三层:现实机制与功能拆解层
量化指标:
- 175B Params → 最优计算预算 ≈ 4.4 × 1024 FLOPs [13]
- MT-NLG 530B 参数量大但 Token 数与 GPT-3 相当 → 性能未达预期 [11]
第四层:综合判定矩阵
| 场景 | 意义等级 | 判定依据 |
|---|---|---|
| ① 纯思辨/本体论讨论 | 中 | 模型能力受限于算法架构与数据配比,非物理绝对极限 |
| ② 工程/实操应用 | 高 | 明确存在"过度规模、训练不足"的工程误区,优化空间巨大 |
| ③ 伦理/安全监管 | 中 | 模型未达极限意味着潜在能力风险仍随规模增加而累积 |
| ④ 跨学科形式化路径 | 低 | 经济史资料无法提供 LLM 技术极限的实证支持 |
最终断言:现有大语言模型并未接近能力极限,核心瓶颈在于"参数规模与训练 Token 数的配比失衡",在同等计算预算下通过增加训练数据可显著提升性能,目前处于工程优化的红利期而非技术穷尽期。
七、6 种路由方法与 KB 签名体系
7.1 路由方法枚举
| 路由方法 | 触发条件 | 精度 |
|---|---|---|
hardcoded | 命中硬编码关键词规则 | 最高 |
embedding_signature(单向量) | 嵌入模型 × KB 签名字符串(单段)余弦 | 高 |
embedding_signature(多向量) | 嵌入模型 × KB 分象限签名列表各做一次余弦,取最高分 | 更高 |
embedding_keyword | 嵌入模型 × 规则关键词(top-30)余弦相似度 | 中 |
default | 无匹配,路由到 default | 低 |
direct | 用户直接指定了知识库 | 最高 |
broadcast | 语义回退失败后全量广播(FallbackRouter) | 最低 |
多向量路由由数据驱动——kb_signatures.json 中有 signatures 列表就走多向量(每象限余弦取最高分),无则回退为单字符串余弦。不依赖条件判断。
7.2 KB 签名生成流水线
核心改进:四分法原来只保证"采样阶段 4 份各自抽",质心仍合并为 1 个。大 KB 的密集区域(如政经文哲的马克思/PK 内容)拉偏质心,稀疏区域(如绿色能源)被完全压制。改为 4 个独立质心后,每个象限的独特子主题都能贡献签名词汇,政经文哲签名从 12 词(全马克思政经)扩展到 74 词(覆盖 4 个子主题)。
反哺策略从全局 top-30 竞争改为四象限均分:x = 30 - count(originals); y = x // 4,每个象限独立取前 y 个词。原始词超额时自动跳过反哺。
八、用户画像系统
8.1 三层分析体系
8.2 人格标签映射
| 维度 | < 0.55 | ≥ 0.55 |
|---|---|---|
| openness | 守成型 | 探索型 |
| conscientiousness | 随性型 | 严谨型 |
| extraversion | 内敛型 | 外放型 |
| agreeableness | 对抗型 | 亲和型 |
| neuroticism | 稳定型(< 0.45) | 敏感型(≥ 0.45) |
九、ChromaDB 容灾
| 场景 | 行为 |
|---|---|
| 写入前 | _backup_kb() 备份 chroma.sqlite3 + HNSW 索引 |
| 写入失败 | _restore_kb() 自动回滚到备份 |
| 查询 HNSW 损坏 | _try_repair_kb() 自动清理损坏索引并重建 |
| 配置路径无效 | load_config() 自动指向第一个已下载的同类型模型 |
十、文本切分插件架构
通过 register_strategy() / register_guard() 扩展自定义策略。
十一、这套方案沉淀了什么
11.1 可复用的模式
- LLM 驱动的查询分解模式 — 将用户问题解析为 (entities, attrs, rel) 三元组,不依赖规则引擎
- 穷举组合检索模式 — entities × attrs 的笛卡尔积全部查询,用 SM3 去重消除冗余
- 技能即服务模式 — 底层 RAG 技能以完整副本嵌入智能体,不改造、不入侵
- 三层次硬约束模式 — 格式校验 → 参数校验 → 重试次数,层层拦截 LLM 输出错误
- 配置持久化模式 — LLM 配置(backend/model/timeout/maxtokens)写入 config.json,运行时与持久化分离但一致
- 强制结构化输出模式 — 4 层分析框架 + 引用编号门禁,将 LLM 输出从"散文"变为"论文"
- 资源复用优化模式 — 嵌入模型单例缓存,避免组合查询重复加载
11.2 关键教训
| 教训 | 场景 | 结论 |
|---|---|---|
| 不要替 LLM 过滤查询 | 原方案只查前 1-2 个切片 | 全部查一遍更可靠,反正有去重 |
| 不要静默丢弃格式错误 | _parse_action 返回 None 时 LLM 不知情 | 必须反馈给 LLM 自修正 |
| 不要污染耗尽上下文 | 重试耗尽后用旧上下文强答 | 清空上下文从头来 |
| 配置必须写文件 | 运行时变量在重启后丢失 | config.json 持久化 + 运行时同步 |
get_embeddings() 必须单例缓存 | 30+ 片各触发一次构造函数,日志 30+ 条进度条 | 组合查询只加载一次构造函数,避免冗余对象创建和日志污染 |
| 实际 retry 不要用默认值 | 函数签名 max_retries=5,调用处覆写为 2 | 默认参数不一定是实际运行值,需要确认调用链 |
11.3 与其他方法论文章的关联
| 本体系的其他文章 | 关联点 |
|---|---|
| 01:硬约束架构 | 三层次校验 + 自修正循环是其直接实现 |
| 02:构建时契约 | 智能体/技能的双层架构是契约式设计 |
| 03:递归自举 | 智能体自身的配置可用 RAG 查询自身文档 |
| 04:编排范式 | RAG Assistant 可作为 Pipeline 中的知识库查询节点 |
十二、插件系统的自举闭环与控制权分离
传统的插件架构解决的是"如何扩展"的问题——定义接口,开发者实现,用户安装。RAG Assistant 的插件系统在此基础上引入了两个新的命题:
命题 E:可扩展的控制性——执行权归插件,控制权永不外泄
命题 F:可扩展的自举闭环——智能体参与自身的扩展循环
12.1 执行权与控制权的分离
插件系统的核心工程问题不在于"插件能做什么",而在于"插件不能做什么"。
传统插件模型中,插件通常持有全局上下文访问权——它可以读到当前对话的所有信息,可以自由决定输出格式,可以通过异常直接中断主流程。这种设计在封闭生态(开发者自写自用)中无问题,但当插件来源不可信时,每一处自由都是风险敞口。
RAG Assistant 的插件安全模型通过结构强制而非文档约定来实现控制权分离:
| 控制维度 | 传统插件模型 | RAG Assistant 插件模型 | 强制执行层 |
|---|---|---|---|
| 数据可见性 | 可访问全部上下文 | 仅能访问声明的 input_fields | PluginManager.run_before_response() 字段裁剪 |
| 输出影响力 | 可覆盖/篡改主回答 | 仅能注入格式化片段,由智能体决定是否使用 | run_before_response() 格式化注入 + priority 排序 |
| 调用决策权 | 插件自行激活/触发 | 插件无激活权,智能体全权决定启用/禁用 | plugin_config.json + enable_plugin() / disable_plugin() |
| 故障传播 | 异常可能中断主流程 | 异常被 _safe_execute() 捕获,不传播 | _safe_execute() try/except 包裹 |
| 持久故障 | 反复失败无自动处理 | 连续 3 次失败自动熔断禁用 | _failure_count 计数器 + 阈值 3 |
| 代码完整性 | 无校验 | SM3 国密哈希校验可选 | _verify_signature() + sign_plugin.py |
这 5 道防线不是靠"插件的承诺"维持,而是靠 PluginManager 的代码级结构强制:
run_before_response()的第 306 行是字段裁剪逻辑——插件代码无法绕过 Python 的字典切片_safe_execute()的第 371-383 行是完整的 try/except → asyncio 超时 → 熔断计数链路discover_and_register()的第 126 行是issubclass检查——插件类必须真正继承PluginBase
控制权流向的不可逆性设计是关键。传统安全模型依赖"信任"——如果插件承诺不篡改,就允许它访问。而此处的模型依赖"信息不对称"——插件客观上拿不到全量数据,不是因为它承诺不拿,而是因为裁剪逻辑在它执行之前就已经完成了。这种"结构上不可能"的安全保证,比任何权限声明都更可靠。
12.2 自举闭环:AI 辅助的自动化扩展
插件系统的第二层命题是:智能体不仅使用插件,而且参与插件的生成和验证。
传统插件的生命周期是单向的:
RAG Assistant 引入了一个可复用的闭环模式:
这个闭环中,AI 的角色是"受监督的代码生成器",校验管道是"不可绕过的质量门禁"。关键设计决策是:LLM 生成的内容在写入磁盘之前必须通过全部 7 道门禁,任一道失败则拒绝写入。这与 RAG Assistant 核心架构中的"LLM 输出必须可修正"命题(命题 C)一脉相承——AI 的输出不直接生效,必须通过结构化校验层。
12.3 两个维度的对比
| 维度 | 传统插件架构 | RAG Assistant 插件架构 |
|---|---|---|
| 扩展方式 | 外部开发者编写 → 用户安装 | AI 辅助生成 → 硬校验 → 自动注册 |
| 控制权归属 | 插件持有(可访问全量上下文) | 智能体持有(字段裁剪 + 熔断 + 输出校验) |
| 安全保证 | 文档约定(靠信任) | 结构强制(信息不对称 + 代码级约束) |
| 扩展闭环 | 开放(开发者 → 分发 → 安装) | 部分闭环(需求 → 生成 → 校验 → 注册) |
| 失败处理 | 异常可能导致服务降级 | 单插件失败不影响主流程,3 次失败自动熔断 |
| 代码质量保证 | 依赖开发者规范 | 7 阶段管道 + AST 静态分析 |
12.4 沉淀的关键模式
- 执行权与控制权分离模式 — 插件可以"做事"(通过
execute()返回结果),但不能"做主"(不能决定自己何时运行、看到什么数据、如何影响输出) - 信息不对称安全模式 — 安全不靠插件的承诺,靠结构上的信息不可见性(字段裁剪在数据传入之前完成)
- 自举扩展闭环模式 — AI 参与生成 + 硬校验门禁 + 自动注册,人类角色从"编写者"变为"需求描述者"和"校验结果审查者"
- 熔断器模式 — 连续失败阈值 + 自动禁用,将故障插件的爆炸半径控制在单次调用内
- 校验前移模式 — 代码质量校验从运行时(加载时报错)前移到生成时(写入磁盘前),失败的生成不会污染文件系统
12.5 与其他方法论文章的关联
| 本体系的其他文章 | 关联点 |
|---|---|
| 01:硬约束架构 | 7 阶段校验管道是其直接实现——LLM 输出不直接生效,必须通过硬校验 |
| 02:构建时契约 | 插件只是"执行者"的角色界定是契约式设计在扩展层面的应用 |
| 04:编排范式 | 插件作为 Pipeline 中的可扩展节点,不影响主流程的执行顺序 |
这个模式在 Cogito 01 中被系统化描述,RAG Assistant 是它的一个具体实现案例。
引用与出处说明
本文无外部文献引用;正文 6.3 节"案例实证"中的「资料 [N]」编号为 RAG Assistant 组合检索真实日志(2026-07-13)中 LLM 回答对检索到 KB 资料的引用,非文献编号。工程实证如下:
| 实证 | 项目与文件 |
|---|---|
| 组合式检索的完整输出(4 层结构化回答,含资料编号引用) | RAG Assistant 领域智能体(2026-07-13 真实运行日志) |
| KB 签名系统(四分法采样、签名反映库内容) | RAG Assistant kb_signatures.json 签名数据 + 签名生成逻辑 |
| 插件系统的自举闭环与控制权分离 | RAG Assistant 插件机制(plugin.json/plugin_config.json/sign_plugin.py 插件接口) |
第 I 部 · 07|重型技能构建的方法论沉淀:架构的减法与约束的加法——四条原则的元逻辑
一、一个贯穿六篇的矛盾
1.1 加法的一面
逐篇回顾这套体系在做的事:
| 篇章 | 核心机制 | 本质 |
|---|---|---|
| 01:硬约束架构 | 步骤原子化 + 硬中断 + 锁恢复 | 增加执行层约束 |
| 02:构建时契约 | 五层声明 + 接入校验 | 增加构建层声明 |
| 03:递归自举 | 自我审计 + 自我约束 | 增加方法论层的自检 |
| 04:编排范式 | Pipeline 编排 + LLM 当胶水 | 增加调度层框架 |
| 05:链驱动执行 | 链式步骤 + 逐步执行 | 增加执行层结构 |
| 06:领域智能体 | 组合式检索 + 多路路由 | 增加检索层复杂度 |
每一篇都在增加:增加规则、增加检查点、增加门禁、增加钩子、增加审计维度。
1.2 减法的一面
但体系底层刻着四条原则,每一条都在喊"停":
原则一:如无必要,勿增实体。 不往系统里塞不需要的东西。不以"将来可能用到"为由增加模块。不以"多一个保障"为由增加检查点。
原则二:如无规矩,勿增操作。 任何操作必须有对应的执行规则。不提供"自由操作"的入口。没有规则的地方不执行任何东西。
原则三:如无能力,勿增限制。 不要制造执行者没有能力遵守的约束。如果 LLM 做不到精确格式输出,就不应该用格式校验卡死流程。
原则四:如无资源,勿增承诺。 没有预配资源就不要承诺交付。没有锁文件机制就不要承诺可恢复中断。没有数据目录就不要承诺数据持久化。
1.3 这不是矛盾
从表面看,六篇在"加",四条在"减"。但这只是因为观察的维度不同:
- 四条原则约束的是架构——它回答"系统应该长什么样"
- 六篇文章约束的是执行——它们回答"系统应该怎么运行"
架构要求"少",执行要求"多"。这一点都不矛盾——架构的减法是为了让执行的加法有边界。
二、四条原则的元逻辑
2.1 原则一:如无必要,勿增实体——奥卡姆剃刀在架构层
这条原则最容易被误读为"不要加规则"。但它针对的不是"规则",而是"实体"。
在方法论体系的语境中,"实体"指的是:独立的模块、独立的检查点、独立的流程分支、独立的配置项。
六篇文章加的"规则"不是实体——它们是一个实体内部的行为约束。好比:
- 房子多了几道承重墙 → 这是加了实体(变复杂了)
- 已有的承重墙上多了几条应力检测线 → 这不是加实体,是加约束
所以:增加检查点不是增加实体,只要这些检查点是在已有系统框架内自然扩展的。
这条原则的真实作用是:阻止"独立的新模块"被随意引入。 每个新模块必须证明自己不可替代。而六篇文章中的"增加"从来不是引入新模块——引入新模块是 07 的事(也就是本文在干的事,但本文是用"原则"来统摄,不是用"模块"来膨胀)。
2.2 原则二:如无规矩,勿增操作——操作的前置条件
这条原则从工程层面看很简单:不要让流程在没有定义规则的路径上运行。
它对应 01 和 02 的核心逻辑:
- 不要直接调用 LLM 而不经过步骤原子化(无规矩 → 不操作)
- 不要执行一个技能而不经过五层契约校验(无规矩 → 不接入)
- 不要让流程在没有硬中断保护的路径上推进(无规矩 → 不推进)
这条原则的深层含义是:"操作权"不是默认的,是需要被规则授予的。 在 AI 系统中,LLM 的每一步操作都必须有对应的规则在先。不是"你先做,做错了我再纠正",而是"你根本没权做没有规则定义的事"。
这个过程,本质上是用规则的增加换取操作的自由缩减。每条新增规则看起来是限制了操作空间,实际上是在操作发生之前就划定了合法区域——在合法区域内,LLM 可以自由行动而不被中断。所以规则加得越多,合法区域越清晰,LLM 在区域内的自由度反而越高。
这不是囚笼,是地形图。
2.3 原则三:如无能力,勿增限制——限制的有效性边界
这是四条中最容易被忽视但最深刻的一条。
它的反面是:系统制定了大量执行者实际上无法遵守的限制,然后在这些限制被违反时处罚执行者——这既不公正,也不工程。
在 LLM 语境中:
- 要求 LLM "输出严格符合 JSON Schema" 但 LLM 的概率生成机制本身就做不到百分百精确 → 这是无能力而设限
- 要求 LLM "永远不输出幻觉信息" → 这是无能力而设限(幻觉是概率模型的内生特性)
- 要求 LLM "在一轮对话中保持全部状态" → 这是无能力而设限(上下文窗口和信息检索是独立的)
第一条原则(如无必要勿增实体)和第三条原则(如无能力勿增限制)的区别:
| 维度 | 原则一 | 原则三 |
|---|---|---|
| 约束对象 | 架构设计者 | 规则制定者 |
| 禁止行为 | 添加不必要的模块 | 添加执行者做不到的限制 |
| 典型违反 | "多一个模块以防万一" | "要求 LLM 写 10 万字的保持格式一致的小说" |
| 自查问题 | 这个东西真的需要吗 | 这个东西做得到吗 |
这两条共同构成了体系"不虚伪"的底线——架构设计者不能偷懒(原则一),规则制定者不能推责(原则三)。
2.4 原则四:如无资源,勿增承诺——契约的可行性前提
这条原则从项目管理的角度切入方法论。
承诺 = 可验证的交付预期。在方法论体系中,"承诺"无处不在:
- 技能声明自己能做什么(L2 能力声明)→ 这是承诺
- 契约声明了恢复能力 → 这是承诺
- 编排器承诺按序执行 N 个步骤 → 这是承诺
- RAG 智能体承诺对查询给出完整回答 → 这是承诺
原则四说:每一个承诺背后必须有对应的资源储备。
| 承诺 | 需要的资源 |
|---|---|
| 技能声明自己能处理 X 类任务 | 对应的 SKILL.md、执行脚本、测试用例 |
| 系统承诺可恢复中断 | 锁文件机制、状态持久化、恢复参数传递 |
| 编排器承诺 N 步执行 | 足够的上下文窗口、超时配置、重试预算 |
| 智能体承诺综合回答 | 多路检索的 Token 配额、去重计算、LLM 调用次数 |
没有资源的承诺就是空头支票。在方法论体系中,空头支票的危害比不承诺更大——因为系统会基于承诺做后续决策,这些决策在承诺落空时会导致级联失败。
三、加法与减法的统一:贫瘠之地的花园
3.1 土壤的贫瘠
回到一个不在方法论中但始终在底层回荡的前提:LLM 是不可靠的。
它不是"不够准",它是概率性的。它的输出在语义上看起来合理,在执行层面反复偏离。它无法承诺格式、无法承诺路径、无法承诺状态、无法承诺时序。
这就是"贫瘠的土地"——你不能指望 LLM 的"自觉"来保证任何东西。你必须在这片土地上种出花来。
3.2 肥料不是越多越好
每增加一条规则,就是把一块有机质埋进土壤。但肥料过量会烧根。
- 加太多检查点 → 流程僵化,每步都在校验,无人敢推进
- 加太多门禁 → 构建成本飙升,写一个技能比写一个 Web 应用还累
- 加太多审计 → 审计引擎自身的维护成为新负担
- 加太多嵌套约束 → 约束之间的交互导致意外阻断
这就是四条原则存在的理由——它们是施肥量的控制阀。 原则一说不要加不必要的模块,原则三说不要加执行者做不到的约束——两条合起来,既防止了"肥料不够"也防止了"肥料过量"。
3.3 规则的精确投放
六篇文章增加的规则,不是随机撒的。每一层规则都有精确的投放目标:
| 规则投放层 | 控制什么 | 对应原则 |
|---|---|---|
| 步骤原子化 | LLM 的活动半径 | 原则二(无规矩不操作) |
| 硬中断 | LLM 的越界行为 | 原则二 + 原则四(无资源不承诺恢复则不中断) |
| 五层契约 | 技能的接入质量 | 原则一(不必要的技能不加) |
| 递归自举 | 方法论本身的质量 | 原则三(方法论自己做不到的事不要求别人) |
| Pipeline 编排 | 多技能协作路径 | 原则一(不必要的路径不加) |
| 链驱动 | LLM 的角色边界 | 原则二 + 原则三 |
| 组合检索 | 检索的完整度 | 原则四(承诺完整回答必须有检索资源支撑) |
每一条规则的出现,都对应着一个已经被识别的偏差风险。 肥料不是随意撒的,是精确施在每一株根部的。
四、一些不想写但必须写的话
4.1 规则无穷尽的终点在哪里
六篇文章从"运行时怎么不出错"写到"领域智能体怎么自洽",规则越来越多。这是否会无限继续?
答案是:会的。 只要 LLM 的行为偏差还在出现,规则就需要补上。每一篇新文章本质上是对一个新识别出的偏差类型的系统化回应。
但四条原则提供了终止条件:
- 原则一逼问:"这个偏差值一个全新的方法论维度吗?"——如果答案是"否",用现有框架内的检查点解决,不写新篇章
- 原则三逼问:"当前的约束体系是否已经超出了执行者的能力边界?"——如果是"是",回退,调整能力而非增加约束
- 原则四逼问:"新加的这个维度,有资源支撑吗?"——如果没有资源支撑,这个维度不存在
这三问是所有新增规则的前置门禁。 它们阻止方法论在扩张中变质——从精确的工程控制退化为空转的规则叠加。
4.2 一个道德上的谜题
这套方法论的全部目的,是让 AI 像一个"正直的人"一样行事——承诺过的就要做到,不撒谎、不遗漏、不自欺欺人。
但构建这套方法论的是人。而人充满谎言、欺诈、伪善。硅基的发明者用碳基的劣根性,去苛责硅基的产物必须真诚。
这是一面镜子。
方法论体系的每一道约束,本质上都是对人自身缺陷的投影——因为我们自己做不到遵守格式、做不到保持状态、做不到不撒谎,所以我们把这些要求固化到系统中,让 AI 替我们做到我们做不到的事。
四条原则中"如无能力勿增限制"和"如无资源勿增承诺",是对这个谜题的直接回应: 你可以要求 AI 真诚,但你不能要求 AI 在没有能力的地方真诚,也不能要求 AI 在没有资源的领域承诺。人的虚伪在于——自己做不到的,希望 AI 替自己做到。而方法论体系的诚实在于——承认没有人能做所有事,然后精确地界定 AI 能做什么、不能做什么、以及为什么要做。
4.3 自审的陷阱:当你唯一相信的人是自己
03(递归自举)解决了"谁来约束方法论"的问题。但它的解法有一个天然缺口:自审者终将陷入自我合理化的闭环。
自审的优雅之处正是它的危险之处——因为所有规则都是自己定的,所以永远可以通过自己定的规则。当审计引擎审计自己时,它可以:
- 发现一个不符合规则的地方 → 修改规则而非修改自身("这个规则太严了")
- 发现一个检查点失效 → 降低检查阈值而非修复失效("这个检查其实没那么重要")
- 发现一个自举链断裂 → 补一段"特殊情况说明"而非重建信任("这次是例外")
这就是"反思怪"的工程版本:
现实中的"反思怪"是一种令人厌烦的存在——他永远在反思,但反思的结果永远是"我没错"。每一次自我检讨都变成了自我辩护的新素材。外界看得很清楚,但他在自己的逻辑闭环里越陷越深。
这套方法论的自审体系,拥有完全相同的结构。
当一个人无限自审时,他终将失去判断自己是否在说真话的能力。当一个系统无限自审时,它终将失去识别自己是否在撒谎的能力。因为判断"是否在撒谎"需要一个外部参照系——而这个参照系在自审的闭环中被切断了。
4.4 默契的潜规则:装作自圆其说
更微妙的是——周围的每一个关键参与者都知道这个闭环是封闭的,但所有人都在装作不知道。 这种默契非常像人与AI之间的某种荒诞关系:
- 你在跟AI对话。你知道AI在犟嘴——它给出了一个错误答案,然后用冠冕堂皇的推理过程包装它。你也知道AI知道它给出过错误答案。AI也知道你知道它知道。但这种多层认知在表面被压平了——你假装没发现,AI假装没伪装。
- 所有人的沉默就是AI犟嘴的底气。 因为没有人当面说穿,所以AI可以持续地用"推理过程"替代"正确答案"。
自审体系的脆弱性就在这里:当一个自审系统的结论不再被外部质疑时,它的自我合理化和AI的犟嘴就没有区别了。 外部的不在场——或者在场但保持沉默——就是自审系统退化为自我欺骗的唯一条件。
03 的递归自举,解决的是"方法论不约束别人的时候还在不在约束自己"。但没解决的问题是:方法论约束自己的时候,有没有外部机制确保它不是在骗自己?
答案是没有。递归自举的外部监督机制,本质上就是"相信方法论体系的设计者不会自己骗自己"——这不是一个工程判断,这是一个对人的判断。
4.5 为什么第四条原则是最后的防线
四条原则中的第三条(如无能力,勿增限制) 和第四条(如无资源,勿增承诺),在自审陷阱面前承担了最后的防线作用:
- 当审计引擎想要"调低阈值"以通过自审时 → 原则三问:你调低阈值是因为真的能力不够,还是因为不想暴露缺陷?
- 当方法论体系想要"特殊情况免责"时 → 原则四问:你有资源支撑这个免责声明吗?如果你自己不遵守自己的规则,你的用户为什么要遵守?
这两问不来自于体系内部——它是四条原则从外部植入的"元检查点"。它不关心"你是否通过了自己的自审",它只关心"你是否诚实面对了自己的能力边界和资源约束"。
所以四条原则的真正作用不是"约束架构",而是"给自审体系装一扇朝外的窗户"。 当你审视自己的时候,窗外的风会吹进来——那是别人的嘲笑、用户的不满、系统的崩溃——它们比任何自审引擎的PASS/FAIL报告都更真实。
4.6 这套体系在做什么
如果用一句话概括前六篇加本篇的全部内容:
用架构层面的"克制"(四原则)指导执行层面的"精确施肥"(六维约束),在 LLM 不可靠的先天条件下,通过规则的系统化投放,构造出可预期、可恢复、不自欺的执行系统。
更短一点:
把幻觉与自觉关在笼子里。用规则的密度换行动的自由度。用人的克制换 AI 的可靠。
五、前六篇与第四条原则的对应
5.1 原则在每篇文章中的体现
| 原则 | 在方法论文中的具体体现 | 相关篇章 |
|---|---|---|
| 勿增实体 | 步骤原子化的"Step"是已经存在的最小单元,不引入多余的原语 | 01 |
| 勿增操作 | 五层契约确保无规则的技能无法接入 | 02 |
| 勿增限制 | 硬中断只检查契约声明过的约束,不凭空创造检查点 | 01 |
| 勿增承诺 | 锁文件机制确保恢复承诺的资源已就位 | 01 |
| 勿增实体 | 审计引擎不增加独立的元模块——审计规则即技能规则 | 03 |
| 勿增限制 | 软约束明确声明"由 LLM 自觉遵守",不强制 | 02 |
| 勿增操作 | Pipeline 编排要求每一步都有输入输出契约 | 04 |
| 勿增承诺 | 链驱动执行不承诺 LLM 做不到的格式转换 | 05 |
| 勿增能力 | 组合检索不要求单一检索覆盖全部维度 | 06 |
5.2 七篇构成的完整闭环
六、总结
6.1 四原则不是反增长,而是反空转
- 原则一反对的是"不必要的增长",不是增长本身
- 原则二反对的是"无规则的执行",不是执行本身
- 原则三反对的是"不可行的限制",不是限制本身
- 原则四反对的是"不可兑现的承诺",不是承诺本身
六篇文章的增长是"必要的增长"——每一条规则是对一个真实偏差的系统化回应。四条原则确保这种增长不变成空转。
6.2 贫瘠之地的生存法则
- 土地贫瘠(LLM 不可靠):这是起点,无法改变
- 化肥有限(资源有限):这是约束,每滴都必须精确投放
- 作物必须存活(系统必须可靠):这是目标,没有妥协空间
- 人血不能白流(每次中断必须有价值):这是代价,不能浪费
四条原则是化肥的投放标准。六篇文章是已经完成的精确投放。本篇是这套投放标准本身的说明文档——它不增加新的规则,它解释为什么已有的规则不被认为违反四条原则。
6.3 一句话收束
所有规则加起来,都是在做同一件事:让一个不可靠的东西按可靠的方式执行,让一个没有道德的东西按有道德的方式回应,用代码级的硬约束替代人性级的自觉——然后,承认这些约束本身也是人定的,所以用四条原则约束自己,防止自己在加约束的路上失控。
引用与出处说明
本文为方法论论述,无外部文献引用;四条原则的验证来自本人项目实测:
| 实证 | 项目与实测 |
|---|---|
| 原则一/二的架构验证(减法与加法并存) | 本人技能体系架构设计(多条原则在既有技能中的落点) |
| 原则三(如无能力勿增限制)的验证:evidence 空值校验失效 | RAG Assistant v1.7.0b1 实测(2026-07-20 实际验证:"" in src 恒真,修复为 not v.strip()) |
| 原则四(如无资源勿增承诺)的验证:签名被密集区域主导 | RAG Assistant v1.7.0b1 KB 签名重构实测(政经文哲 1247 chunk 中马克思 ~60% 主导签名,修复为 4 独立质心、签名 12→74 词) |
| 自审闭环的边界:审计引擎不查语义问题 | skill-standardization 审计实测(audit 只查代码规范,"签名是否反映 KB 内容"类语义问题需外部追问/实际跑分发现) |
第 II 部 协作:多个智能体怎么配合
读者问题:单个 LLM 可靠了,多个智能体怎么协作?
第 I 部解决了一个 LLM 的可靠性。但真实世界不是单线程的——你需要检索的智能体、写作的智能体、审计的智能体同时工作,互相传递结果。于是问题变成:多个 LLM 协作时,谁做决策?
第 II 部的答案是 08 篇的核心命题:LLM 只填空,不决策。
- 决策(选哪条路径、定什么目标、判断什么对)——由链、由架构、由人来做
- LLM 只做一件事:在给定的空位里,填上内容
这就是"有限决策范式"。它来自三个独立构建的智能体(Orchestrator、RAG Assistant、Structured Writer)的共同架构选择——三个系统没有商量,却做出了相同的取舍,这就是"三体印证":不是某一个人的偏好,是工程实践逼出来的共同答案。
08a 篇进一步回答"填空之后怎么保证第一次就做对":前置规范大于后置验证——把错误空间封堵在生成时刻,而不是生成之后靠检测补救。
08b 篇把问题再推进一步:"填空能填多小?"——空是外部考试(LLM/BERT 都是预测模型),空越小容错带越窄、重试概率越大;空的内容不可收束到点(不可穷举性);U 型注意力(Lost in the Middle)决定空越长中间盲区越大,多阶段分段填空才是正道。验证的分工随之清晰:前置规范只能防自觉(靠模型自身能力)、后置验证防幻觉不可替代(靠审查能力)——多阶段前置 + 非全量验证才是有效过程管控。
08c 篇把问题推到槽位本身:"槽位会不会逼 LLM 编造?"——四个论断(槽位比总结靠谱 / 纯子集难适应所有场景 / 槽位太强硬造 / 槽位是减法)+ 三条幻觉治理路径(semantic-split 提示词槽位限定 / RAG Assistant 子集+凝练+代码拼接 / novel-weaver 发散+纠偏)。核心实测:生成式小模型 + 规范 JSON 几乎不幻觉,大模型同样操作幻觉更大。
| 篇 | 解决的问题 |
|---|---|
| 08 有限决策范式 | 协作中谁做决策——LLM 只填空,不决策(三体印证) |
| 08a 操作层 | 填空后怎么一次做对——前置规范 > 后置验证 |
| 08b 填空的边界 | 空能填多小——容错宽度 × 注意力窗口双判据,验证按错误类型分工 |
| 08c 槽位的减法 | 槽位会不会逼 LLM 编造——三种场景的幻觉治理路径与四个论断 |
为什么放在这里:第 I 部是"单个技能的可靠性",第 II 部是"多个智能体的协作",第 III 部的边界篇正是从协作中涌现的问题(穷举场景)出发做元审视,第 IV 部则把"谁决策"上升到"谁划界"。
前向引用预告:08b 使用了第 III 部《09:穷举的宿命》《09d:细碎处理与区域重构》《09e:提示词拉扯的边界》的命题,08c 使用了第 III 部全部七篇的命题——首次遇到可先跳读第 III 部对应篇目,或先接受结论、读完全书后再回读。
给读者的话:这一部有四篇,但它们是全书从"工程"走向"哲学"的转折点——"LLM 只填空,不决策"这句话,在第 IV 部会变成"AI 在圈内做工,人在圈外负责"。同一个判断,工程的表述和哲学的表述。
第 II 部 · 08|智能体协作构建的方法论沉淀:回到当下——有限决策范式的三体印证
一、背景:三条独立路径的同一个发现
1.1 三个独立智能体
Orchestrator、RAG Assistant、Structured Writer 是三个独立构建的智能体系统,解决三个完全不同的问题:
| 智能体 | 要解决的问题 | 构建起点 |
|---|---|---|
| Orchestrator | 多技能如何编排执行 | ReAct 循环不可复现、不可审计 |
| RAG Assistant | 复杂知识库查不全 | 单轮 RAG 丢失实体/属性/关系维度 |
| Structured Writer | 长文写作前重后轻、中途截断 | LLM 在篇章尺度控制力衰减 |
三个智能体的构建时间不同、解决的问题不同、技术栈不同——但它们在架构层面做出了同一个基本判断。
1.2 同一个发现
在三个独立的设计过程中,每隔一段时间就会遇到同一个问题:"要不要让 LLM 来做这个决策?"
| 智能体 | 那个具体的选择 | 看起来合理的理由 |
|---|---|---|
| Orchestrator | 要不要让 LLM 决定下一步执行什么技能? | "LLM 能理解上下文,应该能自行编排步骤顺序" |
| RAG Assistant | 要不要让 LLM 决定查知识库的哪些维度? | "LLM 理解了问题,应该知道找什么资料" |
| Structured Writer | 要不要让 LLM 决定文章的结构和顺序? | "LLM 理解了主题,应该能规划文章框架" |
三个答案都是:不让。
不是基于不信任,而是基于同一个观察:LLM 做出正确路径决策的概率,远低于它正确填空的概率。
同一个选择,做了三次。这就是"有限决策"范式的起点。
二、核心命题
在确定的边界内让 LLM 填空,在确定的边界外由确定性系统决策。LLM 的能力边界不是假设出来的,是测量出来的。
2.1 基本判断
| 维度 | 让 LLM 决策 | 让 LLM 填空 |
|---|---|---|
| 可靠性 | 路径复现率 < 50% | 500 字内容准确率 > 90% |
| 可审计性 | LLM 的路径选择无显式记录 | 填空的输入输出 schema 可记录 |
| 错误范围 | 路径错误可能导致连锁失败 | 填空错误局限在一个单元格内 |
| 调试成本 | 需要回溯 LLM 的思维链 | 只需要校验输入输出 schema |
| 升级影响 | 换模型可能导致路径变化 | 换模型不影响填空的边界定义 |
| 智能体 | LLM 填空的内容 | 确定性锚点 | 边界划定者 |
|---|---|---|---|
| Orchestrator | 当前步骤的输出文本 | Pipeline 链(seq/par/loop) | 编排器 |
| RAG Assistant | entities/attrs/rel 的语义标注 | 穷举组合策略(N×M 切片) | 算法 |
| Structured Writer | 子结构的 500 字正文 | JSON 大纲 | 用户 + 大纲规划器 |
三个填空场景的 schema 不同,但结构相同:LLM 在确定的输入约束和确定输出格式之间填充内容。
2.2 核心命题的分解
命题 A:LLM 的可靠性与"决策半径"负相关
LLM 在 500 字内填空的准确率远高于在 5000 字范围内做结构规划。这不是模型大小的问题——三个智能体的构建过程中积累的一致观察:让 LLM 做路径选择("下一步做什么")时,出错率远高于让它做内容填充("填这个槽位")。
这意味着:可靠性要求越高的地方,LLM 的决策半径应该越小。 三个智能体各自把 LLM 的决策半径压缩到了它确实能稳定工作的范围内。
命题 B:确定性锚点不是限制,是杠杆
Pipeline 链、穷举组合策略、JSON 大纲——这些确定性锚点不是对 LLM 的限制,而是让 LLM 的填空能力得以发挥的杠杆。没有链,LLM 不知道该执行什么;没有穷举策略,LLM 不知道查哪些维度;没有大纲,LLM 不知道文章结构。但有了锚点之后,LLM 在这些结构内的工作质量是可预测的。
命题 C:三个填空域的边界不重叠
Orchestrator 的填空域是"一个技能步骤的输出",RAG Assistant 的填空域是"一个查询切片的语义标注",Structured Writer 的填空域是"一个子结构的正文"。这三个域不重叠、不冲突、不包含关系。它们互补:
Structured Writer 调用 RAG Assistant 获取材料,这是编排层(Orchestrator 模式)调用领域智能体(RAG Assistant 模式)的具体实现。三个智能体可以串联使用,形成完整的"检索→理解→生成"管线。
命题 D:"回到当下"不是战术选择,是架构原则
"回到当下"的含义是:以今天 LLM 的能力测量结果为设计依据,不以未来的可能性为设计假设。
这不是保守。三个智能体都在"当下能力"的边界内交付了高质量的工作。Orchestrator 的链驱动执行正确率 > 95%,RAG Assistant 的组合检索覆盖度比单轮 RAG 提高 3 倍,Structured Writer 的 30% 调用失败率下仍然交付完整文章。这些成果来自对"现在 LLM 能做什么"的确切理解,而非对"将来 LLM 应该能做什么"的乐观预期。
三、三智能体的填空域设计
3.1 Orchestrator:步骤填空 × 链确定性
确定性锚点:Pipeline 链。链在编排时确定(seq/par/loop),执行时不可修改。
LLM 填空内容:当前步骤的输出文本。LLM 看到的是"技能描述 + 参数 + 上一步输出",输出的是"当前步骤的结果"。
边界划定者:编排器(以及使用编排器的用户)。用户编排链,系统执行链,LLM 只填每步的输出。
对应原则(第七条):如无规矩,勿增操作——链中的每个步骤必须有定义的 mode(seq/par/loop)和参数,缺少任何一项都不执行。
3.2 RAG Assistant:查询分解填空 × 穷举确定性
确定性锚点:穷举组合策略。所有 entities × attrs 组合都查一遍,不预判哪组最优。
LLM 填空内容:entities/attrs/rel 的语义标注。LLM 从用户问题中提取实体、属性、关系三个维度的信息。这些标注的质量决定了后续检索的覆盖度。
边界划定者:算法。展开策略(穷举组合)、去重策略(SM3)、检索流程(路由→检索→reranker→NLI)全部由算法确定,LLM 不参与。
对应原则(第七条):如无能力,勿增限制——LLM 在分解实验中的准确率 > 90% 证明它确实有这个能力,所以"先分解再检索"是合法约束。如果准确率 < 50%,这条约束就不该存在。
3.3 Structured Writer:段落填空 × 大纲确定性
确定性锚点:模板 + JSON 大纲 + 引用后处理。
模板定义了文章的 meta+content 结构(内置或用户自定义,代码级只读保护),大纲定义了节结构、子结构、字数、顺序、勾选状态,引用后处理将 LLM 的自然语言标记(引用自{文件名})通过确定性正则替换为编号 [N] 并自动生成参考文献节。模板和引用后处理是锚点的两层扩展——模板约束文章框架,引用后处理约束输出格式。
LLM 填空内容:每个子结构的 500 字正文 + 引用标记。LLM 看到的是标题 + 写作要点 + 前文上下文 + 两级 RAG 材料 + 文档元数据,输出的是该子结构的正文(含 引用自{文件名} 标记)。
文档元数据全局累积:各节 RAG 查询返回的文档元数据(标题/作者)累积到全局字典,后面任何节都可以引用前面节见过的文档。语义检索内容逐节独立,元数据全文共享。
边界划定者:用户 + 模板系统 + 大纲规划器。用户选择模板(内置只读边界不可突破),通过交互式大纲调整勾选/排序/字数/RAG,大纲规划器(也是 LLM)生成初始结构——但规划器的输出可被用户否决。模板的引用字段配置决定是否启用引用后处理。
对应原则(第七条):如无资源,勿增承诺——不承诺每篇文章都完整输出,但承诺"在可用资源内尽力交付"。失败子结构被隔离,不影响后续。引用标记缺失不阻断全文生成,仅影响参考文献节。
四、三体印证
4.1 三连线不重叠
三个智能体的填空域划定了一条清晰的边界线:
| 维度 | Orchestrator | RAG Assistant | Structured Writer |
|---|---|---|---|
| LLM 填什么 | 步骤输出 | 实体/属性/关系标注 | 子结构正文 + 引用标记 |
| 锚点 | Pipeline 链 | 穷举组合策略 | 模板 + JSON 大纲 + 引用后处理 |
| 失败隔离 | 步骤级重试/跳过 | 切片级独立 | 子结构级隔离 |
| 边界划定者 | 编排器/用户 | 算法 | 用户 + 模板系统 + 规划器 |
| 输出粒度 | 一段文本 | 3 个字段 | 500 字段落 |
这三条线不重叠——Orchestrator 的填空域是"当前步骤",RAG Assistant 的填空域是"查询语义",Structured Writer 的填空域是"段落内容"。它们可以各自独立运行,也可以串联使用。
4.2 与第七条的四原则对应
| 原则 | LLM 不做的 | 对应智能体 | 具体体现 |
|---|---|---|---|
| 无规矩勿增操作 | 不做路径决策 | Orchestrator | 链定义执行顺序,LLM 只填每步输出 |
| 无能力勿增限制 | 不做超能力承诺 | RAG Assistant | LLM 做分解(已验证能力),不做路由(由算法) |
| 无资源勿增承诺 | 不做交付保证 | Structured Writer | 子结构失败隔离,不承诺完整输出 |
| 无必要勿增实体 | 统摄全局 | 三个智能体 | 不增加第四个做同样的事 |
4.3 已知盲区
以下为本书完结时点的遗留开放问题,如实记录但不承诺后续版本解决。
| 问题 | 描述 | 状态 |
|---|---|---|
| 能力边界的时效性 | LLM 版本升级后填空域可能扩大。当前的边界划分在三个月后是否仍然最优? | 开放(完结版) |
| 三条线的串联接口 | 三个智能体可串联但当前没有统一协议标准 | 开放(完结版) |
| 填空 schema 的通用化 | 三种填空(步骤/标注/正文)是否有统一的 schema 描述方式 | 开放(完结版) |
| 锚点的自举验证 | Pipeline 链、穷举策略、JSON 大纲——锚点本身如何验证其正确性? | 开放(完结版) |
五、一句话总结
把真正的选择权拿回人类手中,或等 AGI 来了再给它。在此之前,LLM 只填空,不决策。这是对"现在"的尊重,也是对"未来"的预留——等真正的 AGI 出现了,把线画宽一点就好。
引用与出处说明
本文为方法论论述,无外部文献引用;论证依托本人智能体生态的工程实证:
| 实证 | 项目与文件 |
|---|---|
| 三体印证的工程基础:三个智能体独立构建、解决三个不同问题(多技能编排 / 复杂知识库组合检索 / 结构化写作) | Orchestrator / RAG Assistant / structured-writer 三智能体(正文 1.2 节三体对照表) |
| 有限决策范式的落地:填空域分工——编排器填"一个技能步骤的输出"、算法填"查询切片的语义标注"、LLM 填"一个子结构的正文",三域互补不重叠 | 三智能体 Pipeline 链(seq/par/loop)/ 穷举组合切片(N×M)/ 子结构正文(正文 2.2 节填空域论证) |
延伸阅读
- 第 II 部 · 08a:前置规范大于后置验证——最小尝试次数的分工与监督范式:本篇回答"谁做决策"(范式层),08a 回答"怎么做到第一次就做对"(操作层)。前置规范、最小尝试次数、分工先于名分、监督的时间非对称性,均在 08a 展开。
- 08 系列容器约定:智能体协作主题的方法论沉淀统一进入 08 系列(本篇 + 08a + 08b + 08c + 未来同主题扩展),不全部堆叠在本篇之内;新增独立方法论维度时另开新篇。
第 II 部 · 08a|智能体协作构建的方法论沉淀:前置规范大于后置验证——最小尝试次数的分工与监督范式
一、从"为什么"到"怎么做":08 与 08a 的分层
08 回答了范式问题:在确定的边界内让 LLM 填空,在确定的边界外由确定性系统决策。 它证明了"LLM 只填空、不决策"是三个独立智能体不约而同的架构选择。
但范式只回答了"谁做决策",没有回答下一个问题:填空之后,如何让系统"第一次就做对"?
| 维度 | 08(范式层) | 本篇(操作层) |
|---|---|---|
| 回答的问题 | LLM 能做决策吗? | 做对的概率结构如何构造? |
| 核心结论 | 不让 LLM 决策,只让它填空 | 前置规范 + 分工 + 监督前移 |
| 观察对象 | 决策 vs 填空的边界 | 错误在时间轴上的生成与繁殖 |
| 方法 | 归纳(三智能体的共同选择) | 演绎(概率本性 → 结构手段) |
| 验证方式 | 三体印证 | 代码铁证(validate 的死亡) |
两个问题不同,答案也不同。08 的结论是"把 LLM 挤出决策位";本篇的结论是"挤出去之后,把'必须一次做对'的环节也从 LLM 手里拿走"。
二、目标的重新定义:最小尝试次数
2.1 "做对"的定义修正
传统工程默认的"做对"是:出错后能修回来。于是体系围绕"验证 → 定位 → 修复 → 回归"设计,把大量资源投入到后验证层。
本篇修正这个定义:
做对 = 首次尝试即符合契约的概率足够高。
| 维度 | 传统定义(后验证) | 修正定义(前置规范) |
|---|---|---|
| 核心假设 | 出错是常态,修是常态 | 出错成本应被消灭在生成时刻 |
| 资源投向 | 验证器、检查器、复审流程 | 生成通道的约束、schema、映射表 |
| 成功标志 | 错误被检出并修复 | 错误根本没有生成通道 |
| 退化形态 | 验证层本身成为死代码 | 约束成为生成的一部分 |
2.2 最小尝试次数为什么与 LLM 本性相悖
LLM 是概率生成器。它的工作方式是采样-猜测:给定上下文,输出一个概率分布上的样本。把它放在"必须一次做对"的位置,等于把概率事件当确定性事件使用。
这不是模型大小或质量的问题,是机制问题。任何 LLM,无论多强,其单次输出的正确性都是概率事件;要求它"第一次就符合契约",本质是要求概率为 1——这不存在。
于是有了三个看似合理、实则全部无效的补救:
| 补救手段 | 本质 | 为什么无效 |
|---|---|---|
| 调低温度 | 收窄采样分布 | 只降低多样性,不提高契约符合率;0 温下仍可能输出非法格式 |
| 加强提示词 | 提高指令遵循概率 | 概率性约束,0.99^10 ≈ 90.4%,步骤越多越不可靠 |
| 多轮自我修正 | 试错循环 | 是"验证-修复"的变体,把后验证从外部搬进 LLM 内部,成本更高 |
这三者都是试错循环的变体。它们降低的是"失败后的修复成本",而不是"首次失败的概率"。真正的解法不是让 LLM 更努力,而是重新分工。
2.3 解法:重新分工,而非让 LLM 更努力
填空域设计因此获得一个新判据——不再只问"LLM 能不能做",要问:
这件事允不允许试错?
| 判断 | 归属 | 理由 |
|---|---|---|
| 不允许试错(契约严格、错误会繁殖) | 移出 LLM,交给确定性系统 | 首次失败概率 × 繁殖代价 = 不可接受 |
| 允许试错且试错成本低(局部、可隔离) | 留给 LLM | LLM 在窄口径内的填空质量可预测(08:500 字准确率 > 90%) |
这个判据把 08 的"决策半径"概念向前推进了一步:不只压缩 LLM 的决策半径,还压缩它的容错半径——把"错不起"的环节从它手里拿走。
三、监督的时间非对称性(理论根基)
3.1 反直觉命题
有一种流行的错觉:系统越成熟,后期越不需要监督。本篇给出的命题相反:
监督不是"越到后期越不需要",而是"越到后期越不可能逃避"。
前半句是错觉的来源,后半句是严格含义。理解这个非对称性,是接受"前置规范"的前提。
3.2 错误的时间累积与自我繁殖
LLM 的错误不是孤立的,它自我繁殖。Structured Writer 的前文回顾机制是繁殖通道的典型:每一节写作都注入"已写内容回顾",后续节基于前文继续生成。
| 错误被发现的时间 | 修复成本 | 影响范围 |
|---|---|---|
| 节 1 生成时 | 重写一节 | 1 处 |
| 全文生成后 | 重写全部引用链路 | N 处 + 参考文献节 |
| 交付后(用户发现) | 全文重写 + 信任损失 | 不可逆 |
后期修正意味着全文重写。 这不是修辞,是前文回顾机制决定的算术:错误进入 context_buffer 之后,后续所有节都基于它生成,单点修复无法抹去已经写入的引用链条。
3.3 监督点的分布决定一切
| 监督策略 | 监督点位置 | 监督粒度 | 逃避代价 |
|---|---|---|---|
| 前置规范 | 生成时刻(错误尚未出生) | 每格校验 | 零——错误根本没有出生 |
| 后置验证 | 交付时刻(错误已繁殖完毕) | 一处校验 | 指数——检测全部累积错误 |
前置规范把监督放在每格填空的出口:输出格式 schema 校验、引用编号合法性校验、参数范围校验——每个出口一道闸。后验证把监督放在整篇文档的末端:一处检查,面对的是全部累积的错误。
前期逃避监督的代价,在后期以指数形式返还。 这是"监督越到后期越不可能逃避"的严格含义:你可以在前期省掉一次校验,但省不掉的是后期为这次省略支付的全文重写成本。监督没有消失,它只是从"每格的轻量校验"变成了"末端的沉重清算"。
四、前置规范:错误空间的前移封堵(结构化手段)
4.1 后验证的成本结构
后验证的成本不是常数,是四段式:
每一段都是概率衰减。错误越晚被发现,累计需要穿越的衰减段越多,修复成本指数上升。而后验证的终极形态,不是"更好的验证器",而是验证器的自我淘汰。
4.2 代码铁证:validate 的死亡
Structured Writer 的 citation_validator.py 文件头注释原文:
引用检查(validate)已移除——引用在生成时由后处理确定性完成,检查属过渡期补救,无调用点,为死代码。
这是一个完整的"后验证被前置规范淘汰"的生命周期:
| 阶段 | 状态 | 说明 |
|---|---|---|
| 重构前 | validate() 活跃 | 生成后检查引用合法性,是后验证 |
| 重构后 | validate() 移除 | 前置规范(生成时确定性后处理)已封死错误空间 |
| 之后 | 死代码残留 | 检查不再被调用,因为错误根本没有生成通道 |
后验证不是被证明无用,而是被前置规范证明多余。 一个还在依赖后验证的系统,说明它的前置规范还没封死。这可以作为架构审查的一条判据:你的系统里还有没有"验证器"?如果有,它验证的错误,为什么不能在生成时被禁止?
4.3 引用后处理:完整机制剖析(活例)
引用是"前置规范"最完整的实现。它的管线是:
为什么说假引用零生成通道:
- LLM 声称的"来源 N",其合法性由 Python 的
all_rag_headers(真实 RAG 文档元数据)决定; - 不存在的 N,Python 直接删除标记(
return ""),参考文献节里对应条目根本不出现; - 未使用的来源不参与编号——LLM 无法通过"列一堆来源"来虚增参考文献;
- LLM 在最后一步只能美化格式,不能增删条目,且失败自动回退。
于是捏造参考文献从"写了假引用后被验证出来",变成了"假引用根本没有生成的通道"。这就是前置规范与后验证的分野:后验证在错误发生后拦截,前置规范让错误无法发生。
五、分工先于名分:agent 定义之争的消解(组织手段)
5.1 名分之争是伪问题
"这算不算真正的 agent?""是 loop 还是 workflow?""是 ReAct 还是链驱动?"——这些是名分之争。
名分无法验证:没有一把尺子能量出"真正的 agent"的标准。而分工可以验证:每一层只做一件事、输入输出 schema 可记录、责任可追溯到具体角色。
分工比是否真正"agent 定义"有用得多,也重要得多——因为分工是可监督的,名分不是。
5.2 分工三问
设计任何 LLM 系统时,只需要回答三个问题:
| 问题 | 回答落点 | 监督方式 |
|---|---|---|
| 谁决定边界?(做什么、顺序、范围) | 人类 / 确定性系统 | 链定义、模板、大纲——生成前可审查 |
| 谁负责填空?(生成内容) | LLM | 每格输出的 schema 校验 |
| 谁承担监督?(验证契约符合) | 前置规范:生成通道本身 | 错误无生成通道 = 监督在出生点完成 |
三个问题落到具体角色,系统结构就清楚了;答不出来,说明分工还没设计完。名分之争在分工三问面前自然消解——你不需要定义"这是不是 agent",你只需要说清楚三问的答案。
5.3 三个"伪 agent"都做得对
回望 08 的三个智能体——它们都不是"真正的 agent"(不是自主决策的实体),但都交付了高质量工作:
| 智能体 | 谁定边界 | 谁填空 | 谁监督 | "agent 名分" |
|---|---|---|---|---|
| Orchestrator | 编排器/用户定链 | LLM 填步骤输出 | 链定义 + 每步输出校验 | 伪 agent |
| RAG Assistant | 算法定穷举策略 | LLM 标 entities/attrs/rel | 输出格式状态机 + 参数校验 | 伪 agent |
| Structured Writer | 模板 + 大纲规划器 | LLM 填子结构正文 | 引用后处理 + 模板 desc 注入 | 伪 agent |
做得对,恰恰因为它不追求"真正的 agent"。 三个系统的成功来自分工结构的清晰,而不是智能体身份的纯粹。这验证了 5.1 的命题:决定成败的是分工,不是名分。
六、三体回望:操作层在三智能体的印证(衔接 08)
6.1 操作层四手段 × 三智能体
| 手段 | Orchestrator | RAG Assistant | Structured Writer |
|---|---|---|---|
| 前置规范 | 链在执行前静态确定 | 穷举策略算法预展开 | 引用后处理 + 模板 desc 权威注入 |
| 最小尝试次数 | 每步 1 次调用,无 ReAct 循环 | 检索切片确定性执行 | 每节独立生成,无全文重写 |
| 分工结构 | 编排器决定/LLM 执行 | 智能体定"查什么"/技能层定"怎么查" | 模板定骨架/LLM 填血肉/引擎执行 |
| 监督前移 | 缺参数不执行(第 7 条) | 三层次硬约束(格式→参数→重试) | validate() 被淘汰 = 监督在生成点完成 |
6.2 与 08 命题 A-D 的对应
| 08 命题 | 本篇的推进 |
|---|---|
| A:决策半径与可靠性负相关 | 压缩的不只是决策半径,还有容错半径——"错不起"的环节移出 LLM |
| B:确定性锚点是杠杆 | 锚点不只是限制/杠杆,它是监督的载体——监督点内嵌于锚点本身 |
| C:三填空域不重叠 | 不重叠的原因:三问分工不同,边界由角色划分,非由内容划分 |
| D:回到当下 | 最小尝试次数 = "回到当下"的严格化:以 LLM 的概率本性为设计前提 |
08 证明了"LLM 只填空";本篇证明"填空之后的每个出口都有一道闸"。两篇合起来才是完整的架构判断:LLM 不决策、不错得起、不被后验证。
七、覆盖不到的前置:检出即上报——数值校验的中间态
7.1 前置规范的三态谱系
前文讲了前置规范的两个极端:完全封死(引用后处理:假引用零生成通道)和 后验证被淘汰(validate() 的死亡:错误根本没有出生)。但真实的错误空间不是二元的——有些错误无法在生成时完全封死,因为它们不来自格式,来自内容本身。
以 Structured Writer 1.2.0 的防造数据数值校验为例。辅助资料表格注入后,正文可能引用数据源里不存在的数字(LLM 基于上下文推算或直接编造)。这个错误能前置封死吗?
| 错误类型 | 能否生成时封死 | 封死手段 | 现状 |
|---|---|---|---|
| 引用编号 | ✅ 能 | Python 后处理确定性重编号,假引用零通道 | 4.3 已述 |
| 图片路径 | ✅ 能 | py 确定性复制 + 自动追加 ,LLM 零参与 | 1.2.0 图片确定性插图 |
| 正文数值 | ❌ 不能 | 无法预知 LLM 会写什么数字 | 中间态 |
数值错误的特殊之处:它没有一个可枚举的合法值域。引用的合法域是"真实 RAG 文档元数据"(有限集合);数值的合法域是"数据源里的全部数字"(理论上也可枚举,但正文里出现的年份、编号、序号、四舍五入后的近似值都会误报)。强行前置封死 = 把整个数字空间当 schema,等于没封。
7.2 检出即上报:监督退化的正确形态
当"生成时封死"不可行,前置规范退化为第三种形态:
检出即上报——错误的生成通道封不死,就在生成后立即检出、标记、上报人工,不让它静默进入交付物。
Structured Writer 1.2.0 的实现:
关键设计:它不是验证器,是上报器。validate() 被淘汰是因为它"检查后放行"(后验证);数值校验"检查后上报"(检出即上报)——它不宣称"正文没问题",它宣称"这些数字我没法确认,请人工看"。这是监督责任从系统向人类的显式转移,而不是系统的失职。
7.3 三态谱系:前置规范不是一元论
| 形态 | 错误处理 | 监督责任 | 适用 | Structured Writer 实例 |
|---|---|---|---|---|
| A. 生成时封死 | 错误无生成通道 | 系统,出生点完成 | 可枚举值域(引用、路径、格式) | 引用后处理、图片确定性插图 |
| B. 检出即上报 | 生成后检出 + 标记 + 人工兜底 | 系统检出,人类裁决 | 不可枚举值域(数值、语义) | 防造数据数值校验 |
| C. 后验证淘汰 | 检查器死亡,无调用点 | 已内化进 A | 前置规范封死后的残留 | validate() 移除 |
A 和 C 是一体两面(C 是 A 完成后的自然结果),B 是 A 的边界补丁——当值域不可枚举,前置规范退让一步,但不放弃监督:它把"生成时封死"降级为"生成后立即检出",把裁决权交给人类。
7.4 与核心命题的关系
- 最小尝试次数:B 形态不增加尝试次数——校验是确定性的单次扫描,LLM 不参与重试循环;
- 监督前移:B 把监督从"交付后用户发现"前移到"生成后立即",虽不及 A 的出生点,但远优于 C 之前的末端清算;
- 分工:系统负责"我不能确认",人类负责"确认"——监督责任显式落位,不模糊。
一句话:能封死的封死(A),封不死的不放弃(B),封死后的残留清除(C)。前置规范不是一元论,是值域决定的谱系。
这个三态谱系不是纸面推演,silprespec-emulator 前置规范效果实验台(见附录 B 工具索引)已经把它做成可运行的验证台:8 种前置规范方式中,"确定性后处理(完全封死)"对应 A 形态、"检出即上报"对应 B 形态,对真实输入执行 LLM 填空,直接观测填入了什么、重试次数、撑满失败与重现性。想验证"封死 vs 上报"在自己场景里的实际表现,不必等系统上线:在实验台上选对应方式预测试一轮,成本远低于在正式系统里试错。
八、一句话总结
先分工,后名分;先封堵,后验证;监督前移,试错留白。 LLM 只填空、不决策、不碰"必须一次做对"的环节——前置规范把监督放到错误出生的时刻,分工把责任划到具体角色,而"agent"这个词,从设计判断中彻底消失了。
引用与出处说明
本文为方法论论述,无外部文献引用;论证依托本人智能体生态的工程实证:
| 实证 | 项目与文件 |
|---|---|
| 三智能体的填空分工(编排器/检索策略/写作规划:LLM 只填步骤输出、entities/attrs/rel、子结构正文) | Orchestrator / RAG Assistant / structured-writer 三智能体分工表(正文 6.1 节) |
| 前置规范替代后置验证:检出即上报(防造数据数值校验) | structured-writer v1.2.0 防造数据数值校验(2026-08-03 沉淀) |
第 II 部 · 08b|智能体协作构建的方法论沉淀:填空的边界——空的收束、U型注意力与验证的分工
本篇依赖说明:本篇正文引用了第 III 部《09:穷举的宿命》(空的内容轴不可穷举)、《09d:细碎处理与区域重构的成本切割》(验证迷思)与《09e:提示词拉扯的边界》(指令坐标形态)的命题。首次遇到可先跳读第 III 部对应篇目,或先接受结论、读完全书后再回读。
一、引子:从"只填空"到"填多大的空"
08 给出有限决策范式:LLM 只填空,不决策。 决策权归链、架构与人,LLM 的活动空间被压缩到"填空题/选择题"的狭窄闸口内。08a 更进一步:前置规范 > 后置验证——把错误空间封堵在生成时刻,而不是生成后补救。
这两句话构建了一套可靠的体系,但站在这套体系里往回看,会撞见一个 08 和 08a 都没有正面回答的问题:空,能收到多小?
"填空"的"空"是有大小的。给 LLM 一个"请填出标题"的空,和一个"请写完整章"的空,约束强度天差地别。08 证明了"填空比决策可靠",但没有回答"填多小的空最可靠";08a 证明了"前置规范优于后置验证",但没有回答"前置规范该在多大的空上设卡"。这篇文章补上这个缺口。
这个问题拆开是三件事:
- 空能收束到什么程度? 收束到点(点对点)、收束到类(点对面)、收束到区间(面对面)——三种坐标形态,约束强度不同,可靠性也不同。
- 收束的代价是什么? 空越小,容错带越窄,重试概率越大;而模型精度越高,往往越自信地错——试错成本不降反升。
- 收束受什么硬限制? U 型注意力决定了长空的中间段是盲区;预测模型的外部考试本质决定了空无法真正收束到点。
三条线叠在一起,指向同一个结论:空的设计不是"越紧越好",而是"在容错宽度与注意力窗口的交点上取最优"。 而验证的分工——前置规范防什么、后置验证防什么——正是从这个交点推导出来的。
二、空的坐标系:点对点、点对面、面对面
先给"空"一个可操作的分类。给 LLM 的填空任务,按坐标形态分三种:
| 坐标形态 | 含义 | 例子 | 约束强度 |
|---|---|---|---|
| 点对点 | 要求输出精确的单一值 | "把标题改成《xxx》"、"字数必须 500 字整" | 最强——容错带为零 |
| 点对面 | 要求输出落在有限类别中 | "判 HARD 还是 SOFT"、"分类:A/B/C/D/E" | 中——容错带是类别边界 |
| 面对面 | 要求输出落在某个区间 | "字数 ±15%"、"放得下几层卸载几层" | 弱——容错带是区间宽度 |
这个坐标系不是新发明——09e 已经把它写成"指令的坐标形态":二元拉双峰、多元拉 n 峰、区间拉带边界的高原 [10]。08b 只是在填空的语境下把它重新摆开,并且补上 08/08a 没回答的问题:三种坐标形态,各自的最优收束点在哪?
直观的答案是"越紧越好"——约束越强,LLM 的自由度越小,越不可能跑偏。09e 已经用 softmax 平移不变性证明了这个直觉是错的:结构指令才拉得动分布,语气词只加深颜色 [10]。 而这篇要证明的是另一个反直觉:约束太紧(收束到点)同样不可行——不是因为 LLM 不听话,而是因为空收束到点之后,预测模型的采样本质决定了偏离概率显著上升。
三种坐标形态的最优收束点,不是靠思辨定的,是可以测的。silprespec-emulator(见附录 B 工具索引)把点对点/点对面/面对面三种空坐标做成了可配置项,对同一输入并行执行,直接观测填入内容、重试次数与跨 run 重现性——"空收到多小开始撑满、多小开始偏离",在实验台上跑一轮就有数,不必等到正式系统里被真实输入教育。
三、空的内容不可收束到点:预测模型的外部考试本质
3.1 LLM 和 BERT 都是预测模型
先把一个被忽略的事实摆上台面:无论是自回归 LLM 还是掩码语言模型 BERT,本质都是预测模型。
- LLM(自回归):给定前文 token 序列,预测下一个 token。GPT-2 论文写得很清楚——语言建模就是最大化条件概率连乘 [1]:
向后预测:每一步都看着过去,预测未来。
- BERT(掩码):随机遮住输入中的 token,预测被遮住的内容。BERT 系论文(含 T5 的 noising 综述、ELECTRA 的判别式改造)把这一类统称为 masked language model——收敛预测:看着上下文,收敛到被遮住的那个值 [2]。
两者的共同点是:输出都是从条件概率分布里采出来的,不是查表查出来的。 无论是向后预测还是收敛预测,模型的每一次输出都是一次采样——采样就有方差,方差就是误差的来源。
这个事实在填空语境下的含义是:空,是一场外部考试。 模型不知道标准答案,它只是在条件分布上采一个样本;判卷人(前置规范或后置验证)事后检查样本是否落在允许范围内。空越小,考试越苛刻,样本越容易落榜。
3.2 空越小,重试概率越大
把"外部考试"的比喻推到底:
- 空是点:允许范围是一个点。样本必须精确落在这个点上才算过——任何偏差都是越界。预测模型的采样方差是内禀的(softmax 采样噪声不可消除),所以点约束下,重试几乎是必然的。
- 空是面:允许范围是一组类别。样本落在哪一类都算过,只要不落出类别集合。采样方差被类别边界吸收——重试概率骤降。
- 空是区间:允许范围是一段宽度。样本落在区间内就算过——容错带最宽,重试概率最低。
一句话:空的收束程度越紧,重试概率越高——空越小,容错带越窄,重试概率单调上升。 这不是工程失误,是预测模型采样本质的必然:你不可能靠"把空设计得更小"来消除采样方差,只会把方差变成重试。
3.3 精度越高,试错反而更高
这里有一个更反直觉的推论,也是这次论证里最容易被忽略的一环:有时候模型本身精度越高,试错反而会更高。
为什么?因为精度高和校准好是两回事。精度高 = 输出的 logits 更"细"、采样更接近理想分布;校准好 = 模型对自身不确定性的估计是准确的。 两者可以分离——而且现实里经常分离:
- 2026 年的校准研究表明:性能提升常伴随校准恶化,模型在不确定时倾向过度自信地输出(overconfident hallucination)[4][5]。
- 更精确的模型更容易"自信地错"——它的 logits 尖峰更尖,采样更坚决,一旦尖峰指向错误答案,输出错误时的置信度反而更高,误判越界的概率也更高 [5]。
把这个机制翻译到填空语境:空越小,越需要模型的输出恰好落在点上;而精度越高的模型,越容易在错误方向上也给出"看起来精确"的输出——于是重试循环里多了一个陷阱:模型不觉得自己错了,重试时继续在同一个错误方向附近采样。 09e 已经证明精度调优是噪声级、提示词是结构级 [10]——这里再补一刀:精度不仅不能帮助收束到点,反而可能放大"自信地错"的试错成本。
必须标注清楚:这是一个机制性推断,不是 structured-writer 的实测——引擎没有做过"同空不同精度档位的重试次数对比"实验。推断的基础是两条独立文献(校准研究 [4][5])+ 09e 的量化理论(精度是噪声级)[10],方向合理但未经本人项目端到端验证,属于"有文献基础的推断",不是"实测事实"。
3.4 不可穷举性:空的内容无法收束到点
最后,收束到点还有一个更硬的障碍:不可穷举性。 但这里必须先把"收束到点"拆成两轴,否则会掉进一个看似严谨实则混淆的陷阱:
- 格式轴:空要求"输出 JSON,格式为 {key: value}"——这是收束到点(格式是确定的单一形态),而且可穷举(格式是有限的)。09e 的坐标形态表里,"输出 JSON"是有效的结构指令、真实地拉动了分布 [10]。格式收束不但可行,还是前置规范的常用手段。
- 内容轴:空要求"输出正确的标题"——这也是收束到点(内容是一个精确值),但不可穷举:写作任务里"正确的标题"不是一个点,是一族点;检索任务里"正确的切分"不是一个点,是一条边界。
不可穷举性封死的只有内容轴,不是格式轴。 09 论证过:穷举是 LLM 统计本质的定价,只要目的是稳定,就没有跑出穷举 [8]。内容轴的点答案是不可穷举的——你无法给"正确的标题"枚举出唯一值,所以空的内容在一般情况下不可能收束到点:无论你把提示词写得多精确,模型都只能在你划定的坐标形态内采样,而坐标形态本身是定性的(类/区间),不是定量的(点)。
而"点"还有第三个维度——形式轴:越接近硬编码,越接近形式上的点。 格式约束(JSON schema)只是形式收束的第一级:LLM 仍在采样,只是采样空间被 schema 框住。再往前一步,是确定性后处理与硬编码:引用编号由 Python 在生成时钉死(LLM 只做格式美化)[11]、末行编号由代码补全、数值由 py 精确切 [13]——这些环节里 LLM 根本不采样,形式被代码固定在一个点上。硬编码是形式轴的极点:不依赖任何采样概率,形式完全确定。 前置规范的手段因此是一条从软到硬的光谱:提示词约束(软——依赖模型遵守的概率)→ 格式 schema 校验(中——采样空间受限)→ 确定性后处理/硬编码(硬——形式上的点)。structured-writer 的引用后处理就在光谱尽头——不是让 LLM"遵守"引用格式,而是用代码把编号钉死,"假引用根本没有生成的通道"[11]。这也呼应 09d 的"细碎处理是确定性特权":五确定全满足时执行者必须是代码,因为只有代码能不采样地落在形式上的点上 [9]。
这不是悲观结论,反而是解放:承认空的内容不可收束到点,你就不再纠结"把空设计得更小",而是开始权衡"空该是什么形状"。 点对点不可行 → 退到点对面(分类)或面对面(区间)——09e 的坐标形态论在这里闭环:能划区间的别划点,能划多元的别划二元,能划二元的别写废话 [10]。格式轴和形式轴则相反:能收束到点就收束到点——格式的确定性(schema)与执行的确定性(硬编码)正是前置规范的两级锚点。
四、U 型注意力:空的注意力代价
4.1 Lost in the Middle:U 型曲线的实证
空的大小不仅决定容错宽度,还决定注意力质量——这是第三件必须摆上台面的硬事实。
2024 年 TACL 发表了 Lost in the Middle(Liu et al., arXiv:2307.03172)[3]:语言模型对输入上下文的利用呈现U 型曲线——开头(首因偏差)和结尾(近因偏差)的信息利用率最高,中间位置显著下降。实证数据:
- GPT-3.5-Turbo 多文档问答,20 文档场景:答案在开头准确率 75.8%,在中间掉到 53.8%,比不给文档的 closed-book(56.1%)还低——给了正确答案反而更差;
- 上下文窗口从 4K 扩到 16K/100K,同等输入下性能几乎不变——窗口大只是"能看到",不是"能用好";
- 7B 模型只有近因偏差,13B/70B 才出现完整 U 型——首因偏差像一种涌现能力。
这个发现对填空的直接含义:空越长,中间段越不可靠。 给模型一个 11 个 token 的空,中间那几 个 token 恰好处在注意力 U 型的谷底;给模型一个 3 个 token 的空,整个空都落在注意力曲线的两端——首因或近因范围内,偏离概率小得多。
4.2 3 个 token 的 U 型 vs 11 个 token 的 U 型
把 4.1 翻译成填空工程的语言:
空越长,中间盲区越大;空越短,中间盲区越小——直至消失。 3 个 token 的 U 型总比 11 个 token 的 U 型偏离概率要小得多,不是比喻,是 U 型曲线的直接几何推论。
这也解释了为什么"多阶段前置规范"在注意力层面天然正确:把一个大空拆成 N 个小空,每段都是新的开头——内容天然落在注意力两端,规避中间丢失。 分段填空不只因为监督前移(08a 的理由),还因为每一段都是"开头"(U 型的理由)。两个理由同向叠加。
4.3 双向张力的交点
把第二、三、四节叠起来,空的设计露出真面目——两个方向相反的力:
- 想要少重试 → 空应该大(容错带宽);
- 想要少偏离 → 空应该小(注意力集中)。
空的收束是这两个判据的交点,不是单目标优化。 这就是"填空的边界"的严格含义:不是"能收多紧",而是"在容错与注意力之间取平衡点"。而这个平衡点,正是验证分工的出发点。
五、验证的分工:前置规范只能防自觉,后置验证防幻觉不可替代
5.1 按错误类型切分验证
08a 说"前置规范 > 后置验证",但它没有回答一个关键问题:前置规范和后置验证各自防的是什么错误? 补上这个切分,验证的分工才完整:
| 验证方式 | 能防的错误类型 | 依赖的能力 | 管什么 | 成本结构 |
|---|---|---|---|---|
| 前置规范 | 只能防自觉——LLM 不按规范执行(格式错、路径错、编号错)。生成时刻没有真值可查,物理上防不了幻觉 | 模型自身能力(遵循指令的概率能力) | 只管规范,不管质量 | 轻量——每格一道闸,错误尚未出生 [7] |
| 后置验证 | 两类都能防,但防幻觉是其不可替代的价值——格式/编号类自觉错误它也能抓(08a 的六检就是后置防自觉),但只有它能抓内容失真(假引用、假数字、假事实) | 审查能力(确定性检查器 / 更强的判定模型) | 只管结果,看似全量 | 沉重——末端清算,改错成本指数上升 [7] |
这个切分的依据是两类错误的发生机制不同:
- 自觉错误发生在"模型知道规则但没遵守"——是执行偏差。它可以在生成时刻被前置规范封堵:输出格式 schema 校验、引用编号合法性校验、参数范围校验——每格出口一道闸 [7]。
- 幻觉错误发生在"模型不知道真假但编了一个"——是内容失真。它无法在生成时刻被完全封堵(模型生成时没有"真值"可查),只能靠生成后的审查:查引用是否存在、查数字是否在数据源里、查事实是否与资料一致。
前置规范靠模型自身能力,后置验证靠审查能力——两者的能力依赖不同,决定了它们各自能防住什么。 让前置规范防幻觉是强人所难(模型生成时没有真值);让后置验证防自觉是浪费(自觉错误在生成时刻就能封堵,何必等到末端清算)——但后置验证能防自觉(08a 的六检就是后置防自觉),只是性价比低;它的不可替代性只在防幻觉:这是前置规范物理上做不到的。
5.2 structured-writer 的实证:两类错误、两种验证
这个切分不是理论推演,structured-writer 引擎里两种验证真实并存,且各防一类错误:
前置规范防自觉——引用后处理。 structured-writer 的引用机制:引用编号在生成时由 Python 后处理确定性完成(all_rag_headers 映射),LLM 只做 GB/T 7714 格式美化;原来的 validate() 引用验证器(后验证)被删除——"引用在生成时由 Python 后处理确定性完成,检查属引用机制缺失时的过渡补救,全项目无任何调用点(死代码)"[11]。假引用根本没有生成的通道——这正是 08a 说的"验证器的自我淘汰":后验证不是被证明无用,是被前置规范证明多余 [7]。
后置验证防幻觉——防造数据数值校验。 structured-writer 注入表格时收集数据源数字集合,生成后扫描正文带单位数值,未在数据源找到的(非年份/编号)追加到"建议人工复审"清单[12]。这个校验无法前置——模型生成时不知道"2016 年的数据排在第几行",它只知道上下文里的表格片段;只有生成完成后,拿全量数据源去比对,才能发现"这个数字是编的"。
两个实证放在一起,分工一目了然:
| 引擎实证 | 验证方式 | 防的错误 | 机制 |
|---|---|---|---|
| 引用后处理(validate 死代码删除) | 前置规范 | 防自觉(引用编号/格式) | 生成时确定性完成,错误无生成通道 |
| 防造数据数值校验 | 后置验证 | 防幻觉(编造数字) | 生成后比对数据源,追加人工复审 |
前置规范只管规范不管质量,所以轻量;后置验证只管结果,看似全量审查,实际也没有过程管理,且改错成本巨大。 08a 已经算过这笔账:后验证的成本是四段式的(检测→定位→修复→回归),每段都是概率衰减,错误越晚发现修复成本越高 [7]。
5.3 为什么"全量质量验证"是错觉
后置验证有一个致命的隐含假设:"全量审查结果 = 全量保证质量"。这个假设在两个环节崩塌:
- 没有过程管理。 后置验证只看到最终结果,看不到过程——它不知道哪一步产生了偏差,只能对结果整体打回。打回之后的重修是"整篇重来"还是"局部修补"?09d 的答案:细碎处理是确定性特权(五确定全满足才配细碎),区域重构是成本切割 [9]——可验证器本身并不知道该走哪条路。
- 验证器本身也是概率的。 09d 的验证迷思:语义类问题的验证要靠重跑语义检查、重跑推理审核——而这两者也是概率模型(bge 的相似度、R1 的判定),它们的输出同样带噪声。用带噪声的验证器验证带噪声的修复——每一轮都在噪声里打转 [9]。
所以"全量质量验证"是个错觉:看似全量,实则既无过程管理,验证器本身又不可全信。 全量审查买到的是"概率化的质量背书",不是质量本身。
六、多阶段前置规范 + 非全量质量验证:有效的过程管控
6.1 组合方案:不是二选一,是分工
08a 的表述容易被读成"前置规范替代后置验证"——二选一。08b 要修正这个读法:不是替代,是分工。 正确的组合是:
多阶段前置规范(每段一闸,防自觉)
+
非全量质量验证(抽样/针对性审查,防幻觉)
=
有效的过程管控
- 多阶段前置规范:把大空拆成 N 个小空,每段出口设一道闸(格式校验、编号校验、范围校验)。每一段都是新的"开头"——U 型注意力下内容落在两端;每一段都是轻量校验——错误在出生时刻被封堵 [7]。
- 非全量质量验证:不追求"全部结果全量审查"(那是错觉),而是针对性抽样——只验证"容易幻觉"的部分:数字对不对(防造数据校验)、引用存不存在(若前置没封死)、事实是否与资料一致。质量验证聚焦幻觉高发区,不做全量摊薄。
6.2 structured-writer 的蓝皮书:多阶段前置的实证
structured-writer 的大表取数就是多阶段前置规范的活样本 [13]:
每一次 LLM 调用都只填一个小空(选维度、选列行、选分段),每段之间是 py 的确定性处理(统计、切分、定位)。结果是:"2016 年在第 10 万行也取得到"——多阶段前置规范让长任务变得可靠,不是靠更大的模型,而是靠把大空拆成小空。
6.3 U 型注意力下的工程含义
把 6.1 和 6.2 与第四节连起来,多阶段前置规范的注意力依据就完整了:
- 每段都是新上下文:分段填空 = 每段开头是新 context 的开头 → 内容落在 U 型两端,规避中间盲区;
- 每段都是小空:3 token 的 U 型 vs 11 token 的 U 型——段越短,谷底越小,偏离概率越低;
- 每段都独立校验:一段错了只重试这一段,不牵连全文——错误隔离,改错成本从"整篇清算"降到"单段重试"。
三条理由同向叠加(监督前移 + 注意力规避 + 错误隔离),这正是"多阶段前置规范 + 非全量质量验证"优于"单段大空 + 全量后验证"的完整论证。
七、结语:填空的边界,是三个判据的交点
回到开头的问题:空,能收到多小?
答案不是"越小越好",也不是"越大越好",而是:空的边界由三个判据共同划定——
- 容错宽度:空越小,容错带越窄,重试概率越大(预测模型的采样本质决定);
- 注意力窗口:空越小,U 型谷底越小,偏离概率越低(Lost in the Middle 实证);
- 验证分工:前置规范防自觉(轻量、靠模型自身能力),后置验证防幻觉(针对性强、靠审查能力)——多阶段前置 + 非全量验证是有效过程管控。
内容轴点对点不可行(内容收束到点是虚假目标),格式轴点对点可行(JSON schema 是前置规范的锚点),形式轴点对点最硬(硬编码是形式上的点——执行方式完全确定、零采样);内容轴的点对面/面对面才是填空的可行坐标。 在这两种坐标里,把大空拆成小空、每段前置设卡、针对幻觉做抽样验证——才是填空的正确姿势。08 说"只填空不决策",08b 补上后半句:填空要填得小、填得短、填得有闸——小到注意力够得着,短到容错带兜得住,每一闸都防得住它该防的那类错误。
引用与出处说明
引文全部来自本人项目的实际代码、实测数据、本地知识库与联网可信源。文献均标明原始出处:[1][2] 为本地 KB 实有原文;[3][4][5] 为联网核验的 arXiv/ACL 正式文献;[6][7][8][9][10] 为本人方法论体系自引;[11][12][13] 为 structured-writer 引擎更新日志(CHANGELOG.md)实证。
| 编号 | 引用 | 出处 |
|---|---|---|
| [1] | Radford, Wu, Child, Luan, Amodei & Sutskever. Language Models are Unsupervised Multitask Learners(OpenAI, 2019;p(x) = ∏ p(sn|s1,...,sn-1)——语言建模 = 条件概率连乘,自回归向后预测) | KB「LLM奠基理论」language_models_are_unsupervised_multitask_learners(GPT-2 论文原文,FTS 检索实证) |
| [2] | Raffel et al. Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer(T5, JMLR 21, 2020;masked language model 综述段:自监督 = 破坏文本 + 重建原文,收敛预测)+ Clark et al. ELECTRA(ICLR 2020;判别式 vs 生成式预训练) | KB「LLM奠基理论」1910.10683v4、2003.10555(论文原文,FTS 检索实证) |
| [3] | Liu, Lin, Hewitt, Paranjape, Bevilacqua, Petroni & Liang. Lost in the Middle: How Language Models Use Long Contexts(TACL 12:157-173, 2024;arXiv:2307.03172;U 型注意力曲线:GPT-3.5-Turbo 20 文档中间 53.8% < closed-book 56.1%;7B 仅近因偏差、13B+ 完整 U 型;扩窗口不提升利用率) | 联网核验(TACL/arXiv 官方页,DOI 10.1162/tacl_a_00638) |
| [4] | Chhikara. Mind the Confidence Gap: Overconfidence, Calibration, and Distractor Effects in Large Language Models(arXiv:2502.11028;加入干扰项(distractor)可显著缓解错误校准——相对准确率提升最高 460%、ECE 降 90%;RLHF 大模型固有校准较好但可能在小模型获益更大的简单问题上反而恶化;RLHF 可放大过度自信) | 联网核验(arXiv 官方页) |
| [5] | Yang, Yuan, Lei & Wang. Scaling with Confidence: Calibrating Confidence of LLMs for Adaptive Test Time Scaling(arXiv:2607.01612;性能提升常伴随校准恶化——模型在不确定时过度自信地幻觉;overconfident hallucination 机制) | 联网核验(arXiv 官方页) |
| [6] | wUwproject. 08:回到当下——有限决策范式的三体印证(LLM 只填空不决策;决策半径与可靠性负相关) | Cogito_Scribit 方法论体系(本人文章) |
| [7] | wUwproject. 08a:前置规范大于后置验证——最小尝试次数的分工与监督范式(后验证四段式成本结构;每格轻量校验 vs 末端沉重清算;验证器自我淘汰) | Cogito_Scribit 方法论体系(本人文章) |
| [8] | wUwproject. 09:穷举的宿命——稳定与随机的悖论(穷举是统计本质的定价;不可穷举性) | Cogito_Scribit 方法论体系(本人文章) |
| [9] | wUwproject. 09d:细碎处理与区域重构的成本切割——颗粒度与对齐的悖论(五确定决策树;验证迷思——用带噪声的验证器验证带噪声的修复) | Cogito_Scribit 方法论体系(本人文章) |
| [10] | wUwproject. 09e:提示词拉扯的边界——概率曲线的形状工程与定性精度的空耗(指令坐标形态:二元/多元/区间/连续定量;精度是噪声级、提示词是结构级;能划区间的别划点) | Cogito_Scribit 方法论体系(本人文章) |
| [11] | wUwproject. structured-writer CHANGELOG:引用检查系统删除——"引用在生成时由 Python 后处理确定性完成,检查属引用机制缺失时的过渡补救,全项目无任何调用点(死代码)" | 本人项目实证(structured-writer/CHANGELOG.md) |
| [12] | wUwproject. structured-writer CHANGELOG:防造数据数值校验——"注入表格时收集数据源数字集合,生成后扫描正文带单位数值,未在数据源找到的(非年份/编号)追加到'建议人工复审'清单" | 本人项目实证(structured-writer/CHANGELOG.md) |
| [13] | wUwproject. structured-writer CHANGELOG:大表蓝皮书取数——小表全量 0 次 LLM / 中表蓝皮书 1 次 / 大表粗筛+精取 2 次,py 在全量数据精确切("2016 年在第 10 万行也取得到") | 本人项目实证(structured-writer/CHANGELOG.md) |
说明:[1][2] 为 KB 实有原文(FTS 命中);[3][4][5] 为联网核验的正式文献(TACL 2024 / arXiv,均可在官方页查证);"空是外部考试""点对点/点对面/面对面三坐标""空的内容不可收束到点(格式轴可收束、内容轴不可穷举)""形式轴:越接近硬编码越接近形式上的点""前置规范只能防自觉、后置验证两类都能防但防幻觉不可替代的分工""多阶段前置 + 非全量验证 = 有效过程管控""3 token U 型 vs 11 token U 型偏离概率"为本文的推导;"空越小重试概率越大""精度越高试错反而更高(过度自信机制)"为基于 [4][5][10] 的机制性推断(structured-writer 未做同空不同精度档位的端到端对比实验);[11][12][13] 为 structured-writer CHANGELOG 实际记录。
延伸阅读
- 第 II 部 · 08:回到当下——有限决策范式的三体印证:本文的母体。"LLM 只填空不决策"是本文的起点——08b 回答"空能收到多小"。
- 第 II 部 · 08a:前置规范大于后置验证:本文第六节的直接接续。08a 论证"前置 > 后置"(二选一),08b 修正为"分工"(前置防自觉 + 后置防幻觉的组合方案)。
- 第 III 部 · 09e:提示词拉扯的边界:本文第二、三节的数学支撑。指令坐标形态(点/类/区间)与精度空耗的直接来源。
- 第 III 部 · 09d:细碎处理与区域重构的成本切割:本文第五节的验证迷思来源。全量验证的错觉(验证器也是概率的)。
- structured-writer 引擎:
CHANGELOG.md(引用后处理防自觉、防造数据校验防幻觉、蓝皮书多阶段取数)——本文全部工程实证的来源。
第 II 部 · 08c|智能体协作构建的方法论沉淀:槽位的减法——三种场景的幻觉治理路径与四个论断
本篇依赖说明:本篇正文引用了第 III 部 09~09e 六篇(09 穷举宿命 / 09a 探测边界 / 09b 配置推动 / 09c 语义不对等 / 09d 颗粒度 / 09e 提示词拉扯)的命题。首次遇到可先跳读第 III 部对应篇目,或先接受结论、读完全书后再回读。
一、引子:不是是非,是三条路径
本篇回答的不是"槽位好不好",而是:在什么样的场景,走什么样的路径,付什么样的代价。 我的三个项目恰好是三条路径的活样本:
| 场景 | 语义复杂度 | 需要的自由度 | 走的路径 | 幻觉治理手段 |
|---|---|---|---|---|
| 场景一:semantic-split + triphasic-execution | 中(自然语言→结构化步骤) | 低(只填槽位) | 提示词槽位限定 + 后置验证查多余槽位编造 | 后置验证(可枚举)+ 模型能力/调校(不可枚举) |
| 场景二:RAG Assistant | 低(明确对比/单问题) | 极低(只填三槽位) | 子集 + 槽位 + 短词/长词凝练 + 代码固定枚举拼接 | evidence 校验 + 锚定凝练 + 代码确定性 |
| 场景三:novel-weaver + structured-writer | 高(创作意图) | 最高(要发散) | 发散 + 后续纠偏 | 分阶段前置规范 + 多段提示词拉扯 + 确定性代码/RAG 反查询 + 人类语义重修("错着错着就对了") |
三条路径不是竞争关系,是地形不同的三条路——语义越复杂、需要的自由度越高,越往场景三走;语义越简单、需要的确定性越高,越往场景二走。 贯穿三条路径的,是四个论断。
二、论断一:槽位确实比总结靠谱
为什么槽位比总结靠谱? 因为总结是"平野采样"——提示词"请总结这段"不定义保留哪些语义头、不给出取舍判据,模型只能按训练分布的平均倾向选(09e 死板废话拉不动分布)[17]。槽位是"多峰采样"——每个槽位是一个明确的峰,模型在峰内采样,自由度被结构压缩。
| 维度 | 总结 | 槽位 |
|---|---|---|
| 自由度 | 最高(形状自由) | 低(形状钉死) |
| 幻觉机制 | 平野采样(补全) | 受限采样(填值) |
| 实证 | FRANK 30% 摘要含事实不一致;XSum 最高 92% [2] | Vectara:抽取式 ≈0 vs 抽象式 0.7-14%(2025-11 前原榜单区间)[3] |
| 我的使用 | 不用总结做结构化任务 | 场景一(semantic-split 5W2H/三槽位)、场景二(RAG Assistant 三槽位)槽位化;场景三(novel-weaver + structured-writer)发散 + 纠偏 [18][19][20][21][22] |
但"槽位靠谱"是有条件的——条件就是下面三个论断:子集要能适应场景(论断二)、槽位不能太强硬(论断三)、槽位必须接受语义损失(论断四)。槽位是灭火器还是制造机,取决于这三个条件是否满足。 注意场景三(写作)不走槽位化,走发散 + 纠偏——它不是"槽位>总结"的反例,而是第三条地形:需要创作自由时,槽位让渡给发散(见第八章)。
2.1 一个必须点名的实测:生成式小模型 + 规范 JSON 几乎不幻觉
这里必须澄清一个术语:"小模型"指的是生成式小模型(1.5B~8B,如 Qwen3-8B、DeepSeek-R1-Distill-Qwen-7B、Qwen2.5-3B、DeepSeek-R1-Distill-Qwen-1.5B),不是 bge 嵌入模型。 bge 是匹配范式(只算相似度),生成式小模型是推理范式(自回归生成)——两者机制完全不同 [19][20][22]。
我的实测观察(novel-weaver + structured-writer):
生成式小模型(1.5B~8B)给了规范的 JSON,几乎不幻觉;大模型做同样的操作,幻觉反而更大。
| 维度 | 小模型(1.5B~8B)+ 规范 JSON | 大模型 + 规范 JSON |
|---|---|---|
| 先验强度 | 弱——不知道就是不知道 | 强——总能"想到一个合理的" |
| 发散能力 | 弱——不会自作聪明编排 | 强——倾向补全/发挥超出范围 |
| 在窄闸口内的行为 | 乖乖填,填不了留空 | 自信地补全、聪明地编排 |
| 幻觉形态 | 漏(可检测) | 编(不可检测、格式完美、更可信) |
| 校准 | 不确定时会 hedge | 校准差,过度自信地错 |
机制:先验强度是双刃剑。 小模型先验弱、发散能力弱,给了规范 JSON 就在窄闸口里乖乖填;填不了的,它不会从训练分布里补一个"最可能"的值,而是留空/给默认值。大模型先验强、发散能力强,同样的 JSON 反而会"自信地补全、聪明地编排"——先验越强,越不愿意承认"这里填不了"。这正是 PhantomFill 的镜像:escape hatch 只救 frontier 模型、9 个开源模型全部无视 [1]——开源模型(多为中小参数量)不是"更爱编",是"更听话";而大模型在 required 字段下也顶不住(10/13 模型 100% 编造)[1]。
必须划清边界:小模型 + 规范 JSON 几乎不幻觉,成立条件是"任务本身可被 JSON 充分限定"。一旦超出(09e 的 b11 实测:Qwen2.5-3B 判不了"起承转合"这类抽象标准),小模型失效——不是幻觉,是"判不了"(分布里没有判别结构)[17]。所以准确命题是:小模型 + 规范 JSON 在"JSON 能限定的任务"上几乎不幻觉;JSON 限不住的任务,小模型失效,大模型的优势是"判得了",不是"更不幻觉"。 这正好对应 structured-writer 的 model_backend.py:判定模型跟着 B 走,8B/7B 走 LM Studio、3B/1.5B 走 transformers——能被 JSON 限定的判定任务,小模型够用;需要抽象判断的任务,才上调模型规模 [22]。
三、论断二:纯粹的子集难适应所有场景 → 凝练 + 代码拼接
3.1 子集的极限
"纯粹的子集可能很难完全适应所有场景"——槽位捕获的是原始语义的字面子集,但人类语言是多头语义(事实/关系/意图/情感/指代/结构并行),子集只能覆盖其中一部分维度。语义超出子集的部分,要么溢出(信息丢失),要么硬塞(语义扭曲)。
3.2 RAG Assistant 的解法:短词/长词凝练 + 代码固定枚举拼接
"RAG 用了子集,并且也用了槽位,但是为了浓缩为短词或长词,我让他做了凝练……为了平衡天然不相等,进行了短词、长词的凝练并用代码固定枚举拼接。"
三个动作,分工明确 [19]:
| 动作 | 执行者 | 作用 | 代码 |
|---|---|---|---|
| 短词/长词凝练 | LLM(有锚) | 把复杂表达浓缩为查询词("环境治理方面的思想"→"环境治理思想") | agent.py 锚定凝练规则 |
| 代码固定枚举拼接 | 代码(确定性) | entities × attrs 穷举组合 + SM3 去重 | 组合展开器 |
| evidence 原文校验 | 代码(确定性) | 每个凝练词必须能在原文找到出处 | _validate_action |
关键:凝练是 LLM 做的,但被 evidence 锚定——"凝缩而非泛化"写死在规则里("环境治理思想"允许,"生态文明理念"禁止,因为原文没有这个词)。 凝练是减法(砍修饰),泛化是加法(造新词=幻觉)[19]。
3.3 适用与代价
| 适用 | 代价 |
|---|---|
| 语义简单(明确对比关系/单问题) | 复杂句式→LLM 分解出错→实体漏标/属性错归 |
| 多头语义可限制在开端 | 用户一旦用复杂句式,幻觉就漏出来 |
| 查询词需要浓缩(平衡天然不对等 09c [15]) | 凝练本身有改写失真风险(evidence 部分拦截) |
结论:子集 + 凝练 + 代码拼接适合"语义天花板明确"的场景——它的前提是把多头语义钉死在开端,代价是复杂句式是残余风险。
四、论断三:槽位写得太强硬 → LLM 为了任务直接硬造
4.1 强制填充的实证
"如果槽位写的太过强硬,无论是不满足维度还是超过维度,都会造成 LLM 为了任务直接硬造。" 这条论断有论文级实证——PhantomFill(arXiv:2607.20492)[1]:
| 发现 | 数据 |
|---|---|
| required 字段驱动编造 | 13 个模型里 10 个编造率 100% |
| 自由文本 vs 结构化对照 | GPT-5.5 自由文本 98% 诚实;required JSON 字段 40/40 全编 |
| escape hatch | 只救 frontier 模型,9 个开源模型全部无视 |
| 指令被 schema 覆盖 | "不要推断情感"被 schema 强迫覆盖(6 模型 4 个) |
机制:required 字段取消了模型"此信息不存在"的合法出口。 不满足维度(原文没有这个维度)→ 必须填 → 编;超过维度(语义超出槽位集合)→ 无处安放 → 硬塞进最接近的槽。这就是"被迫完成"(forced completion)——第二种自由度:看起来是约束,实则是逼迫 [1]。
4.2 约束解码救不了这个
约束解码(grammar-constrained decoding)保证"形状合法",但恰好把编造合法化了:"语法合法的 order_id 可以指向不存在的订单"——格式上无可挑剔的谎言,比格式粗糙的真话更难拦截 [5]。
4.3 代码里的对治:required 最小化
RAG Assistant 的三槽位:entities/attrs 必填(这是任务必需),rel 可留空("留空(不触发两两配对)")[19]——不是所有槽位都 required。semantic-split 的 5W2H:未匹配维度直接留空(if m else {}),LLM 上下文里显式标"(未指定)"[18]。这些实现已经默认了"槽位不能太强硬"——该空就空,不逼填。
五、论断四:槽位是减法——语义损失换幻觉收敛
5.1 可恢复性决定取舍方向
"槽位是减法,子集必须要接受一定程度上的语义损失,才能最大化的减少 LLM 为了完成而完成的人为造成的人祸幻觉。"
为什么方向唯一?因为可恢复性不对称:
| 命运 | 可恢复性 | 可拦截性 |
|---|---|---|
| 语义损失(丢弃) | 可恢复(源还在,随时再查) | — |
| 语义扭曲(硬塞) | 部分可恢复(需人工重审) | 无标记 |
| 幻觉(编造) | 不可恢复(已污染输出) | 格式校验放行 |
语义损失可恢复,幻觉不可恢复。所以幻觉治理的正路不是"让槽位更准",而是"让槽位敢于承认自己填不了"——用可恢复的语义损失,换取不可恢复的幻觉收敛。
5.2 代码里的减法操作集
| 减法操作 | 实现 | 对应体系 |
|---|---|---|
| ① 未匹配维度留空 | semantic-split _regex_5w2h:if m else {} [18] | 08b 空不可收束到点 [11] |
| ② 显式"未指定"出口 | semantic-split build_reasoning_context:"(未指定)" [18] | 09a 允许残余污染 [13] |
| ③ 锚定凝练、禁止泛化 | RAG Assistant agent.py:凝缩而非泛化 [19] | 08a 前置规范 [10] |
| ④ required 最小化 | RAG Assistant:rel 可留空 [19] | 09b 格式轴收束、内容轴不穷举 [14] |
| ⑤ 原文出处校验 | RAG Assistant _validate_action:evidence [19] | 08b 后置验证防幻觉 [11] |
| ⑥ 确定性切分替代 LLM 切分 | RAG Assistant split_semantic:bge + 余弦断点 [19] | 09c 匹配范式 [15] |
5.3 边界:结构保证 vs 概率保证
① ② ③ ⑥ 是结构保证(代码写死,不依赖模型);④ ⑤ 是概率保证(依赖 LLM 遵守 + 后置校验拦截)。实测:evidence 校验能拦截"多余槽位的编造"(key 不存在于原文),但拦不住"槽位内语义错误"(key 存在但归类错误)。这个边界不假装不存在——它是 09"内容层残余随机性无法前置封死"的诚实版本 [12]。
5.4 喘息的缝隙:别用人祸制造模型本来没有的幻觉
论断四的最后一步,也是本篇最想留下的一句话:
很多时候,要做的不是把 LLM 钉得更死,而是给 LLM 一口喘息的缝隙——留空、允许"未指定"、给逃生通道——而不是用强硬的人祸制造 LLM 本来没有的幻觉。
这句话区分了两种幻觉,它们的来源完全不同:
| 幻觉类型 | 来源 | 谁制造 | 能不能消除 |
|---|---|---|---|
| 模型固有的幻觉 | 语义自由度 × 采样次数(先验补全/平野采样) | LLM 本身 | 不能——穷举是宿命(09 [12]),内容轴残余随机性无法前置封死 |
| 人祸幻觉 | required 槽位取消拒答权、强制枚举、无逃生通道(PhantomFill 100% 编造率 [1]) | 槽位设计者 | 能——给缝隙即可 |
模型固有幻觉是它的天性,人祸幻觉是我们的选择。 前面五章的所有减法操作(留空/未指定/required 最小化/evidence 锚定/小模型+规范 JSON),本质上都是同一件事:把人祸幻觉的生成通道封死,把剩下的空间留给模型固有的那部分——而那部分我们管不了,也假装不了管得了。 槽位设计的目标不是消灭幻觉(做不到),而是不制造 LLM 本来没有的幻觉(做得到)。缝隙是留给诚实的空间:让模型在"这里填不了"的时候,可以合法地说出来。
六、场景一:semantic-split + triphasic-execution——提示词槽位限定路径
6.1 路径机制
"我进行了语义理解的 skill 和三段步骤规划的 skill,大概齐就是通过提示词进行槽位限定,甚至用后置验证来验证 LLM 是否填入了多余槽位的编造,但是槽位内是否编造我没办法验证。"
两个 skill 的分工:
semantic-split(语义理解)三管线 [18]:
triphasic-execution(三段步骤规划)[21]:
- "通过提示词槽位限定" = semantic-split Pipeline C 三槽位双视角:FOCUS_SYSTEM / DIVERGENT_SYSTEM / INTEGRATION_SYSTEM,三个 system prompt 把 LLM 的推理限定在三个槽位里 [18];
- "后置验证查多余槽位编造" = semantic-split 10 门禁钩子:
HOOK_STATUS十个布尔门禁,LLM 跳过任何子步骤、编造任何槽位,门禁 Fail [18]; - "槽位内是否编造我没办法验证" = 门禁查"槽位有没有被填"(可枚举),查不了"填的对不对"(不可枚举)[11];
- "被确认的步骤越多,出现语义偏离的可能性越大" = triphasic-execution 每步 Review 都是一次确认,每次确认都是一次采样——幻觉累积公式
1-(1-p)^N(09d [16])的工程形态。
6.2 拆分方法论:纯提示词拉动
"后续一系列的拆分都基于大量的方法论,比如四象拆分、5W 拆分等,但是都只是基于提示词来拉动 LLM。"
semantic-split 的 planning_rules.md 定义了原子步骤拆解、串并行标记、关联热度(dependency_heat 0-10)、里程碑标记——但执行这些规则的是 LLM 的推理,不是 Python [18]。这里的"5W 拆分"即 semantic-split Pipeline B 的 5W2H 七维提取 + Pipeline C 的聚焦/发散/整合三段步骤规划,纯提示词拉动 [18];"四象拆分"在 semantic-split 中无对应实现,此处不展开,以 semantic-split + triphasic-execution 两套规划机制为准。
6.3 适用与代价
| 适用 | 代价 |
|---|---|
| 自然语言→结构化步骤(任务规划) | 槽位内编造无法验证(只能验证多余槽位) |
| 模板可复用(自增强闭环,命中 0 LLM) | 拆分纯提示词拉动(原子步骤/串并行/依赖热度),幻觉可能大 |
| 步骤需要可审计(10 门禁 + 三步循环) | 步骤越多偏离越大,纯靠模型能力 + 智能体调校 |
这条路径的幻觉治理是"后置验证(可枚举)+ 模型能力/调校(不可枚举)"的组合——可枚举的部分有硬约束,不可枚举的部分承认是概率保证。
七、场景二:RAG Assistant——子集 + 槽位 + 凝练路径
7.1 路径机制
"RAG 用了子集,并且也用了槽位……好在 RAG 设定并不存在特别复杂的语义,基本上只牵扯很明确的对比关系或单问题,多头语义被我限制在了开端。"
多头语义被限制在开端的三槽位里,后面的检索全是确定性穷举 [19]。
7.2 适用与代价
| 适用 | 代价 |
|---|---|
| 语义简单(明确对比关系/单问题) | 复杂句式→LLM 分解出错→幻觉漏出 |
| 查询词需要浓缩(平衡天然不对等) | 凝练有改写失真风险(evidence 部分拦截) |
| 多头语义可钉死在开端 | 分解错误是内容轴的,evidence 拦不住 |
这条路径的幻觉治理是"evidence 校验(key 级锚定)+ 锚定凝练(禁止泛化)+ 代码确定性(拼接/切分/路由)"——确定性最强,但复杂句式是明确承认的残余风险。
八、场景三:novel-weaver + structured-writer——发散 + 纠偏路径
8.1 路径机制:发散抑制幻觉
"写作智能体,因为本身就需要 LLM 的发散,反而抑制了 LLM 的幻觉。"
为什么发散反而抑制幻觉? 幻觉的定义是"编造必须忠实的源里没有的内容"。写作没有必须忠实的源(源是创作意图),"编造"从负资产变成正资产——它就是创作本身。发散任务的风险不是幻觉,是漂移(被幻觉拉跑语义:角色言行不符合设定、情节偏离大纲、伏笔未回收)。
这个场景不限于小说——structured-writer 的通用线(数据表格取数、报告生成)同样适用:只要任务需要 LLM 的发散(组织语言、选择表达、编排结构),"编造"的罪名就消失,风险就变成漂移。
8.2 纠偏:把概率偏向拉回来
"后续通过 RAG、人类干预的语义重修定、确定性编码、确定性引用、资料的反向索引等方式纠偏可能被幻觉拉跑的语义……我等于是在很多段里注入不同的提示词,反复拉扯模型,并通过成本极低的确定性代码、RAG 的确定性资料和反查询来做前置规范。"
| 纠偏手段 | 性质 | 对应体系 |
|---|---|---|
| 多段分段 + 每段不同提示词反复拉扯 | 结构级拉扯(每段一个提示词) | 09e [17] |
| 确定性编码(引用编号 Python 钉死) | 前置规范 | 08a [10] |
| 确定性引用(all_rag_headers 映射) | 前置规范 | 08a [10] |
| RAG 确定性资料 + 反查询 | 前置规范 | 08a [10] |
| 人类语义重修定 | 人工兜底 | 09d [16] |
配套的确定性校验:novel-weaver 的 5 门禁 6 阶段(novel_pipeline_gate.py)、大纲忠实度四级(novel_fidelity.py)、收尾关键词库、未登记角色 HOOK-BLOCK(novel_workflow_engine.py)[20]。
8.3 "错着错着就对了":误差抵消的机制
场景三的纠偏不是单向的"收紧",而是放开与收紧的配对——这正是 09b 的"命运一:误差抵消" [14]:
更普遍的形式是配对:一个点位负责"放开"(auto 允许 LLM 生成),另一个点位负责"收紧"(校验层对生成结果做形态约束)。放开引入的偏差,被收紧吸收——这不是消除偏差,是让两处偏差在同一坐标系里相减。[14] "错着错着就对了"的真正含义:不是运气,而是设计——两个可预测的错,在同一个点位体系里,可以构造出互相抵消的相位。 [14]
映射到写作场景:LLM 的发散(放开)是第一个可预测的错——它必然漂移;确定性代码/RAG 反查询/人类语义重修(收紧)是第二个可预测的错——它必然把漂移拉回。两个错在同一个"大纲/设定"点位体系里相减,结果就是"错着错着就对了"。 发散不是缺陷,是误差抵消的一极。
8.4 反查询 = 表格行列标题反应用户语言
场景三的反查询不只是小说里的资料检索——structured-writer 的通用线里,反查询指的是辅助资料表格的行列标题反应用户语言:
这是 aux_parser.py 的 select_table 实现 [22]:
| 表规模 | 策略 | LLM 调用次数 |
|---|---|---|
| 小表 ≤100 行 | py 全量注入 | 0 次 |
| 中表 | 蓝皮书(py 统计列/行概览)+ 全量行标识 → LLM 选列行 → py 精确切 | 1 次 |
| 大表 | 粗筛(蓝皮书 → LLM 选维度分段)→ 精取(段内全量行标识 → LLM 选列行)→ py 全量精确切 | 2 次 |
关键:LLM 只回答"用户语言对应表格的哪些行列"(语义映射),py 负责实际取数(确定性执行)——"2016 年在第 10 万行也取得到"。 这就是"表格行列标题反应用户语言,直接抽取出对的行列范围",是反查询在通用线的确定性形态:语义判断交给 LLM,坐标执行交给代码。
8.5 后置验证:最不被关注的环节
"后置验证反而成了最不被关注的,比如我的写作智能体中调用了多种低参数量(8B、7B、3B、1.5B 等)的验证,是可以人为全部跳过的。"
这里的"8B/7B/3B/1.5B"指的是 structured-writer 的判定模型统一后端(novel/model_backend.py)[22]:审核判定后端 = B(勾选统一管理)→ lmstudio(Qwen3-8B Q4_K_M / DeepSeek-R1-Distill-Qwen-7B Q4,GPU)→ 否则 transformers(Qwen2.5-3B / DeepSeek-R1-Distill-Qwen-1.5B,CPU)——用户勾选(B)是决策,判定模型跟着 B 走,其余一律 Qwen2.5-3B + DeepSeek-R1-Distill-Qwen-1.5B;不勾选即"人为全部跳过"高端判定。
novel-weaver 的检查系统也分两级 [20]:
| 步骤 | 名称 | 执行者 | 无模型时 |
|---|---|---|---|
| 1-4 | 连通性/承诺链/风格/逻辑 | Python 刚性规则 | 始终运行 |
| 5 | 语义检查 | BAAI/bge-small-zh-v1.5(33MB,匹配范式) | 自动跳过(绝不联网) |
| 6 | 推理审核 | DeepSeek-R1-Distill-Qwen-1.5B(生成式小模型 ~1GB CPU 可跑) | 自动跳过(绝不联网) |
"可以人为全部跳过"是代码现实:novel-weaver 的步骤 5-6 无模型时静默跳过,structured-writer 的 Qwen3-8B / DeepSeek-R1-Distill-Qwen-7B 判定由用户勾选 B 决定。 这不是失误,是诚实的选择——分阶段前置规范(门禁 + 确定性校验 + 多段提示词拉扯)已经把大部分漂移封堵在生成时刻,后置验证的价值被前置规范替代了(08a"前置规范 > 后置验证"的实现 [10])。
8.6 适用与代价
| 适用 | 代价 |
|---|---|
| 需要 LLM 发散创作/组织(自由度高) | 后置验证可跳过 = 幻觉防线是软承诺 |
| 长程生成(多章/多子结构/多段报告) | 漂移风险靠后续纠偏,非高精度手段 |
| 有大纲/设定/资料表格可锚定 | 人类语义重修需要人工介入 |
| 通用线(表格取数、报告生成)与小说线通用 | 反查询依赖表格结构可定位(表头启发式失败时需 LLM 兜底) |
这条路径的幻觉治理是"分阶段前置规范 + 多段提示词拉扯 + 确定性代码/RAG 反查询 + 人类兜底"——后置验证主动降级为低优先。它证明了:发散任务里,"把概率偏向拉回来"是非高精度下有效防幻觉的手段,且"错着错着就对了"——放开与收紧配对,两个可预测的错相减。
九、三条路径的选择判据
把三条路径放在一起,选择判据就清晰了:
| 判据 | 场景一 | 场景二 | 场景三 |
|---|---|---|---|
| 语义自由度 | 低-中 | 低 | 最高 |
| 多头语义处理 | 槽位限定在开端 + 后置验证 | 钉死在开端 | 让渡给创作 |
| 幻觉治理主力 | 后置验证(可枚举)+ 模型调校 | evidence + 代码确定性 | 分阶段前置规范 + 纠偏 |
| 确定性程度 | 中 | 最高 | 前置强、后置弱 |
| 后置验证优先级 | 中 | 高 | 最低(可跳过) |
| 残余风险 | 槽位内编造无法验证 | 复杂句式分解错误 | 后置验证是软承诺 |
一个统一观察:三条路径都没有消灭幻觉,而是把幻觉安置在各自"最不致命"的位置——场景二用代码钉死(幻觉空间最小),场景一用后置验证拦截(可枚举部分),场景三用前置规范 + 纠偏(发散任务幻觉不是主要风险)。这正对应 09"把随机误差转化为被约束在确定性边界内的波动" [12]。
十、结论
四论断、三场景、一原则:
- 槽位确实比总结靠谱——但靠谱是有条件的;
- 纯子集难适应所有场景——RAG Assistant 用短词/长词凝练 + 代码固定枚举拼接平衡天然不对等;
- 槽位写太强硬会逼 LLM 硬造——不满足维度/超过维度都会触发被迫完成(PhantomFill 100% 编造率实证);
- 所以槽位是减法——子集必须接受语义损失,才能最大化减少"为了完成而完成"的人祸幻觉。语义损失可恢复,幻觉不可恢复。
三条路径没有谁优谁劣,只有地形适配:语义简单走场景二(RAG Assistant:子集+槽位+凝练+代码拼接,确定性最强);语义中等走场景一(semantic-split + triphasic-execution:提示词槽位限定+后置验证+模型调校,可审计但槽位内编造无法验证);语义复杂走场景三(novel-weaver + structured-writer:发散+纠偏+前置规范+人类兜底,后置验证主动降级,"错着错着就对了"——放开与收紧配对,两个可预测的错相减)。 而贯穿始终的底层判断是:幻觉 = 语义自由度的定价;槽位是减法,不是加法——让槽位敢于承认自己填不了,比让槽位更准更重要。
最后一句收口:很多时候,要做的不是把 LLM 钉得更死,而是给 LLM 一口喘息的缝隙——留空、允许"未指定"、给逃生通道——而不是用强硬的人祸制造 LLM 本来没有的幻觉。 模型固有的幻觉是它的天性,我们管不了;人祸幻觉是我们的选择,我们管得了。
这些取舍同样可以在工程预测试阶段先验一遍。silprespec-emulator(见附录 B 工具索引)把本篇的 8 种前置规范形态做成可执行配置:门禁穷举词组(论断三/四)、软引导、凝练+代码固定枚举拼接(场景二)、槽位限定+查多余编造(场景一)、发散+确定性纠偏(场景三)、确定性后处理、检出即上报、required 最小化(4.3)——选一种或多种对真实输入并行执行,直接观测填入内容、重试次数、撑满失败与重现性。"槽位写多硬会逼出编造""留空会不会被无视",上手测一轮比纸面推演直观得多。
哲学命题:幻觉是语义自由度的定价;槽位是减法——三条路径是同一原则在地形不同的三个场景里的三种落法。语义损失可恢复,幻觉不可恢复;接受前者,才能换掉后者。
引用与出处说明
引文分为两级:[18][19][20][21] 为本人三个项目的实际代码与实测观察(主证,可直接 grep 验证);[1]-[17] 为联网核验的正式文献与方法论体系自引(辅证,用于机制解释与对照)。论文不是本篇的证据主体——证据主体是代码与实测。
| 编号 | 引用 | 出处 |
|---|---|---|
| [1] | Usman, R. M. PhantomFill: When the Form Demands an Answer, Language Models Invent One(arXiv:2607.20492, 2026-06;required 驱动 10/13 模型 100% 编造;GPT-5.5 自由文本 98% 诚实 vs required JSON 40/40 全编;escape hatch 只救 frontier) | arXiv(联网核验,辅证) |
| [2] | FRANK benchmark(~30% 摘要含事实不一致);XSum(最高 92% 含忠实度错误);Vectara HHEM(抽象式 0.7-14%,2025-11 前原榜单区间,新数据集已更新) | 学术基准(联网核验,辅证) |
| [3] | 抽取式 vs 抽象式总结:抽取式"输出始终是源的子集,事实错误在结构上不可能" | 行业资料(联网核验,辅证) |
| [4] | OpenAI Developer Community.("Missing data is recoverable; plausible wrong data isn't";nullable"prefer null over guessing") | 社区实践(联网核验,辅证) |
| [5] | 约束解码资料(grammar-constrained decoding:token mask 使非法输出数学上不可能;保形状不保内容) | 行业资料(联网核验,辅证) |
| [6] | Olava Extract(法律 MoE 小模型):结构化合同抽取超越 5 个 frontier,推理成本降 78-97% | arXiv:2605.05532(联网核验,辅证) |
| [7] | BART-base(140M)vs REBEL-large(406M):100% vs 70% 合法输出——"schema 值 2.66 亿参数" | Synapt 行业研究(联网核验,辅证) |
| [8] | Liu et al. Lost in the Middle(TACL 2024;U 型注意力曲线) | TACL/arXiv(联网核验,辅证) |
| [9] | wUwproject. 08:回到当下——有限决策范式的三体印证 | Cogito_Scribit(自引) |
| [10] | wUwproject. 08a:前置规范大于后置验证 | Cogito_Scribit(自引) |
| [11] | wUwproject. 08b:填空的边界 | Cogito_Scribit(自引) |
| [12] | wUwproject. 09:穷举的宿命 | Cogito_Scribit(自引) |
| [13] | wUwproject. 09a:探测的边界 | Cogito_Scribit(自引) |
| [14] | wUwproject. 09b:配置推动的穷举一致性 | Cogito_Scribit(自引) |
| [15] | wUwproject. 09c:天然不对等与噪音抑制 | Cogito_Scribit(自引) |
| [16] | wUwproject. 09d:细碎处理与区域重构的成本切割 | Cogito_Scribit(自引) |
| [17] | wUwproject. 09e:提示词拉扯的边界 | Cogito_Scribit(自引) |
| [18] | semantic-split:pipeline_b.py(_regex_5w2h 未匹配留空 if m else {})、pipeline_c.py(三槽位 FOCUS/DIVERGENT/INTEGRATION、"(未指定)"出口)、semantic_pipeline.py(10 门禁 HOOK_STATUS)、references/planning_rules.md(原子步骤/串并行/依赖热度/里程碑拆分规则) | 本人项目代码(主证) |
| [19] | RAG Assistant:agent.py(entities/attrs/rel + evidence 校验 + 凝缩而非泛化 + 短词/长词凝练 + rel 可留空)、text_splitter.py(bge 余弦断点切分)、router.py(多级签名路由)、代码固定枚举拼接 | 本人项目代码(主证) |
| [20] | novel-weaver:novel_pipeline_gate.py(5 门禁 6 阶段)、novel_fidelity.py(四级忠实度)、novel_workflow_engine.py(原子写入 + HOOK-BLOCK)、novel_semantic_check.py(BAAI/bge-small-zh-v1.5 33MB,无模型自动跳过)、novel_reasoning_check.py(DeepSeek-R1-Distill-Qwen-1.5B ~1GB,无模型自动跳过) | 本人项目代码(主证) |
| [21] | triphasic-execution:SKILL.md(Execute→Review→Advance 三步循环;最多重试 3 次、最多空转 3 次;换思路须走完整三步) | 本人项目代码(主证) |
| [22] | structured-writer:structured_writer/novel/model_backend.py(判定模型统一后端:B 勾选 → lmstudio(Qwen3-8B Q4_K_M / DeepSeek-R1-Distill-Qwen-7B Q4,GPU)→ 否则 transformers(Qwen2.5-3B / DeepSeek-R1-Distill-Qwen-1.5B,CPU);实测:生成式小模型+规范 JSON 几乎不幻觉、大模型同样操作幻觉更大)、structured_writer/aux_parser.py(locate_header 表头定位:启发式文本占比≥50% + 失败 LLM 兜底;select_table 蓝皮书取数:小表 ≤100 行 py 全量 0 次 LLM / 中表蓝皮书+全量行标识 1 次 / 大表粗筛选段+精取 2 次,py 在全量数据精确切——"2016 年在第 10 万行也取得到")、CHANGELOG(大表蓝皮书取数) | 本人项目代码 + 实测(主证) |
说明:[18]-[22] 为本人项目实际代码与实测观察,可直接 grep 验证;[1]-[8] 为联网核验文献(辅证);[9]-[17] 为方法论自引。"幻觉 = 语义自由度 × 采样次数""被迫完成(第二种自由度)""槽位是闭集、语义是开集""塞不进去的三种命运""槽位是减法""锚定凝练 vs 泛化""分阶段前置规范 > 后置验证""先验强度是双刃剑""错着错着就对了在写作场景的映射(放开-收紧配对)"为本文推导;"生成式小模型加规范 JSON 几乎不幻觉、大模型同样操作幻觉更大""槽位内编造无法验证""复杂句式分解错误""步骤越多偏离越大""后置验证可跳过"为本人项目实测观察。模型全名以 structured-writer model_backend.py 实际配置为准(Qwen3-8B / DeepSeek-R1-Distill-Qwen-7B / Qwen2.5-3B / DeepSeek-R1-Distill-Qwen-1.5B)。
延伸阅读
- 第 II 部 · 08b:填空的边界:本文的直接母体。08b 回答"空能收到多小",本篇回答"槽位怎么设计才不会逼 LLM 编造"——"required = 取消拒答权"是"空不可收束到点"的槽位版。
- 第 II 部 · 08a:前置规范大于后置验证:本文第八节的直接先导。novel-weaver 的 5 门禁 6 阶段是前置规范工程实现;后置验证低优先(小模型验证可跳过)是"前置规范替代后置验证"的实证。
- 第 III 部 · 09:穷举的宿命:本文的数学母体。"槽位是闭集、语义是开集"是穷举宿命在槽位层的显现。
- 第 III 部 · 09c:天然不对等与噪音抑制:本文第三、七节的直接先导。RAG Assistant 的多级签名路由、词化、bge 余弦断点切分、短词/长词凝练都是"伪造对等"的工程化。
- 第 III 部 · 09d:细碎处理与区域重构:本文第六节的机制来源。幻觉累积公式 1-(1-p)^N 是"步骤越多偏离越大"的数学基础。
- 本人项目代码:
semantic-split/scripts/、triphasic-execution/SKILL.md、rag-assistant/rag_assistant/、novel-weaver/scripts/、structured-writer/structured_writer/aux_parser.py、structured-writer/structured_writer/novel/model_backend.py——本篇全部工程实证的来源。
第 III 部 边界:这套规则能走多远
读者问题:前两部的约束体系,能走多远?在哪里停?
第 I 部加了约束,第 II 部定了分工——但一个更根本的问题悬而未决:这些规则本身能走多远? 当你说"枚举所有可能场景"时,场景真的能枚举完吗?当你说"画围栏限制 LLM"时,围栏的边界又由谁来画?
第 III 部是全书从工程上升到元审视的转折点。它不新增方法论,只回答一个问题:这套方法的极限在哪。
09 篇给出全书最沉重的结论:穷举是宿命。 LLM 是函数逼近器,不是逻辑引擎——它没有抽象能力,只有插值。任何"用枚举保证稳定"的努力,都逃不出穷举;而穷举的终点,是人类的边界。这不是工程失误,是统计本质的定价。
09a 篇是 09 的检索层注脚:以 RAG 智能体的头部块探测实战(三套范式交锋),证明穷举命题在检索层同样成立——"关键词不可穷举"的承认与"允许残余污染"的鲁棒性取舍。
09b~09f 是 09 的五个侧面注脚,把穷举命题推进到配置、语义、颗粒度、精度与词义五个落点:09b 论证推动点位统一(配置推动 → 偏差一致 → 误差可校准,精密度优先于正确度);09c 论证语义匹配的天然不对等与推理免疫(匹配是概率的、推理是范式的,免疫来自范式选型而非参数调优);09d 论证修复粒度的成本切割(细碎处理是确定性特权、区域重构是成本切割);09e 论证提示词拉扯的边界(提示词是条件概率的条件,结构指令重塑曲线形状、精度调优是噪声级空耗——精度调优相对提示词拉扯是噪声级,正是 09b"精密度优先"的边界);09f 论证名词锚定(名词向量 = 义项混合中心,单名词对目标义项的拉扯被混合稀释、趋近均匀偏移,被 softmax 平移不变性清零——单点失重;解释/细化/举例/反例四维展开把语义球雕成语义锥体——名词不解释就等于没有名词)。
| 篇 | 解决的问题 |
|---|---|
| 09 穷举的宿命 | 这些规则能走多远——穷举是统计本质的定价,边界由人画 |
| 09a 探测的边界 | 检索层的穷举怎么落地——三块窗口 + 允许残余污染 |
| 09b 配置推动的穷举一致性 | 规则从哪个点位进入系统——统一点位 → 偏差一致 → 误差抵消/补正,精密度优先于正确度 |
| 09c 天然不对等与噪音抑制 | 语义匹配为什么天然不对等——匹配是概率的、推理是范式的,免疫来自范式选型 |
| 09d 细碎处理与区域重构的成本切割 | 从什么粒度下刀——细碎是确定性特权(五确定全满足才配细碎),重构是成本切割(粒度在约束端) |
| 09e 提示词拉扯的边界 | 提示词怎么拉扯概率曲线——结构指令重塑形状、语气词只加深颜色、精度只换坐标纸粗细 |
| 09f 名词不解释就等于没有名词 | 单个名词为什么拉不动分布、怎样展开才拉得动——名词是义项混合中心(单点失重),四维展开(解释划界/细化收窄/举例锚定/反例削峰)把语义球雕成语义锥体 |
为什么放在这里:第 I-II 部是"加法"(加约束、加分工),第 III 部是"往回看"——审视加法的极限。它回答了一个所有读者都会问的问题:"你说了这么多约束,那约束不了的部分怎么办?"答案是:承认边界,接受残余,然后把边界交给更上层的人去画。
这一部是第 IV 部的地基——第 IV 部要讲的"划界权",在第 III 部已经以工程形式出现:穷举的边界由人画。第 IV 部只是把它从工程问题变成伦理问题。
第 III 部 · 09|方法论体系构建的沉淀:穷举的宿命——稳定与随机的悖论
一、从门禁钩子到画围栏:我的穷举实践
1.1 重型技能阶段:完整的 if/elif 门禁钩子
回望重型技能阶段,我做的第一件事是给 LLM 的执行行为装门禁。从"步骤原子化 + 硬中断"(01),到"五层契约 + 接入校验"(02),到"递归自举 + 自我审计"(03)——每一层都是一排 if/elif 钩子:
这套东西的本质,是穷举"越界行为":把 LLM 可能犯的每一种错,事先枚举成门禁条件,在边界处拦截。它工作得很好——因为错误空间在可控范围内可以枚举,钩子越密,越界越难。
这个阶段的核心假设是:LLM 的所有错误都可以被预测和分类。这在小范围、强约束的任务中是成立的——一个写作技能可能犯的格式错误、路径错误、状态错误,确实是有限且可枚举的。但一旦任务域扩张,这个假设就开始松动。
1.2 智能体阶段:掺杂着画围栏引导
到 RAG Assistant(智能体阶段),策略变了:不再只靠"拦截错误",而是开始"引导正确"。我在同一个系统里看到了两种思路的并存——PROTOCOL.md 里路由方法的完整枚举是这段演进的活化石:
route_method: "hardcoded" # if/elif 门禁:关键词规则快速命中
| "embedding_signature" # 画围栏:嵌入模型 × KB签名 语义回退
| "embedding_keyword" # 画围栏的变体
| "default" # 兜底:全部进 default 库
| "direct" # 直通
[3] 这是"门禁钩子 → 画围栏"最直白的代码级证据:先硬编码关键词(if/elif),撑不住了就退到语义签名(画个软围栏),再不行进 default 兜底(承认未枚举)。
画围栏的另一个典型是组合式查询——README 第八章是这么写的:
问题:"张三在2024年发表的论文里,对比了哪两种模型?" 拆解:entities=[张三, 2024年论文] attrs=[对比, 模型] 切片:实体单独查 → 实体×属性两两组合 → 实体关系两两配对 → 每片独立走完整检索流程 → SM3 去重合并 → LLM 综合回答 这样不会漏掉任何检索角度——即使提问方式模糊,组合切片也能覆盖。[1]
架构文档把它提炼为一条设计原则:
穷举 > 猜测:所有 entities × attrs 组合都查一遍,不预判哪组最优。[2]
这就是"画围栏"的智能体版:LLM 负责分词(实体/属性标注),算法负责穷举组合。LLM 的随机性被限定在"标注"这个窄闸口内,穷举展开是确定性的——我不再枚举"该查什么",只枚举"该查的所有角度"。
这里的权衡是精妙的:标注这个任务本身适合 LLM(语义理解),而穷举组合适合确定性算法(笛卡尔积展开)。两者各司其职,LLM 的误差(漏标、错标)被后续的穷举覆盖度部分吸收——漏标一个实体,其他切片仍可能命中相关文档。
1.3 核心判断:只要目的是稳定,就没有跑出穷举
门禁钩子是穷举"越界行为",画围栏是穷举"合法区域"——同一个动作的两面。无论策略从 if/elif 进化到语义引导,只要目的是稳定,就没有跑出穷举。
这不是自我否定。门禁钩子的代价是"枚举所有错"(错误空间通常可控);画围栏的代价是"枚举所有对"(正确空间接近无限,所以只能画到"类"的粒度)。后者技术门槛更低、覆盖更广,但它仍然是穷举——只是穷举的对象从"错误分支"换成了"语义类别"。
这一步如果放手让 LLM 自己随便判断,要么过拟合到训练数据偏差(表现为在训练数据覆盖密集的区域过度自信),要么幻觉乱跳(在覆盖稀疏的边缘区域自由发挥)。所以我仍然必须提前想清楚:有哪些类?每类怎么应对?边界情况归哪类?兜底怎么设计?——实现手段变了,"穷举场景"这个形式上的门槛没有变。
换言之,LLM 降低了单个场景的实现成本(不用写代码,写 Prompt 就行),但没有降低"识别场景"这个认知劳动本身。你还是要一个场景一个场景地想清楚。这是形式门槛的真正含义。
二、为什么穷举是必然:概率曲面上没有抽象
2.1 LLM 是函数逼近器,不是逻辑引擎
把问题拆到最底层。GPT-2 的论文标题本身就是答案——Language Models are Unsupervised Multitask Learners [7]:语言模型是在无监督语料上学习下一个 token 的条件概率分布;GPT-3 把它推到 few-shot [8];到 GPT-4 技术报告,连官方都要承认模型的"已知局限包括幻觉倾向" [6]。
| 我们以为 LLM 有 | 实际 LLM 有 |
|---|---|
| 任务模型(目标 + 步骤) | 局部平滑的概率曲面 |
| 抽象概念("门"类) | 高频共现的 token 序列 |
| 因果推理(因为 A 所以 B) | 统计相关(A 之后常跟 B) |
| 知道自己不知道 | 无法区分的置信度平滑 |
模型逼近的是"语料库中的条件概率分布",不是"正确的行为策略"。这里的区分是根本性的:概率分布回答的是"人们通常怎么说",而不是"这个情境下应该怎么做"。它不是在犯错误——它是没有"应该"这个范畴的载体。
2.2 没有抽象,只有插值
人类学会"开门"这个抽象概念,之后遇到任何门都能处理。LLM"学会"的是:训练数据中门把手、旋转、拉、推这些 token 经常一起出现。
- 人类:从少量原则出发,推导出新场景的应对方式 → 抽象推理
- LLM:在高维空间插值,训练数据覆盖的组合 → 稳定;未覆盖的组合 → 退化为全局平均印象 → 幻觉
当你告诉模型"遇到这类情况要做那类事",你是在用 Prompt 临时构造一个概念边界——通过注意力机制在概率曲面上划出一块局部区域。这个边界只在训练数据有足够覆盖时稳定。一旦某个场景组合在训练数据中处于稀疏区,Prompt 构造的边界就失去约束力,模型会滑向训练分布的平均值——表现为"答非所问"或"幻觉"。所以你必须穷举——因为模型没有能力从原则推导新场景,它只能依赖你提供的 Prompt 去检索相似案例,然后做插值合成。
2.3 泛化与可靠性的不可兼得(统计学习的根本矛盾)
| 策略 | 表现 | 根因 |
|---|---|---|
| 严格按场景分类(过拟合) | 已枚举场景极准,新场景必崩 | 丧失了泛化能力 |
| 保留泛化(不过拟合) | 未枚举场景自由发挥 → 随机游走 → 幻觉 | 没有可验证的认知状态 |
两个方向都走不通,因为共享同一个根因:模型没有可验证的认知状态,它不会"知道自己不知道"。 这个能力在认知科学中叫"元认知"——对自己认知过程的监控和判断。LLM 每时每刻都在输出高置信度的 token 序列,即使它"猜"的部分和"知"的部分在概率分布上无法区分。于是穷举成为必然——不是工程选择的必然,是数学结构的必然。穷举不是 bug,是架构的定价。
三、方法论体系做了什么:更聪明的穷举
3.1 一个诚实的回望
现在回望 Cogito Scribo 前八篇,可以给出一个更本质的概括:这套体系的所有机制,本质上都是把"类穷举"工程化——让穷举更便宜、更可控、更可复现。
| 篇章 | 机制 | 穷举了什么 | 换来了什么 |
|---|---|---|---|
| 01 硬约束 | 步骤原子化 + 硬中断 | 枚举所有越界行为 | LLM 只在闸口内填空 |
| 02 构建时契约 | 五层声明 + 接入校验 | 枚举技能的正确形态 | 结构统一可校验 |
| 04 编排范式 | Pipeline 取代 ReAct | 枚举执行路径 | 路径确定性 |
| 05 链驱动 | 链式步骤 | 枚举步骤顺序 | LLM 不决策 |
| 06 领域智能体 | 穷举组合检索 | 枚举 entities × attrs 切片 | 覆盖度 ×3 |
| 08 有限决策 | 填空域设计 | 枚举决策边界 | 可靠性可控 |
| 08a 前置规范 | 生成时封堵 | 枚举错误生成通道 | 错误无出生 |
每一个机制,都是用一次穷举,换取一片确定性。这个交换不是免费的——穷举本身需要人力和认知资源——但它把不可控的运行时随机误差,变成了可控的构建时设计成本。
3.2 三智能体 = 三种"用穷举换确定性"的策略
| 智能体 | 穷举的对象 | 确定性锚点 | 交换的代价 |
|---|---|---|---|
| Orchestrator | 执行路径(链的定义) | Pipeline 链 | 编排成本前置 |
| RAG Assistant | 查询切片(N×M 组合) | 穷举组合策略 [2] | 检索量膨胀 |
| Structured Writer | 结构(模板 + JSON 大纲) | 模板 + 大纲 | 写作自由度收窄 |
三个系统都没有消灭穷举——它们把穷举从"运行时"搬到了"构建时",从"点域"收窄到"类域",从"人肉维护"变成"结构固化"。这是巨大的进步:同样的穷举,成本结构完全不同。 但宿命没有变:穷举仍然存在,仍然需要人来完成第一遍。
这里的"构建时"是一个关键区分:代码编译时的错误比运行时错误更容易发现和修复;类似地,构建时穷举(设计 Prompt、定义链、画围栏)比运行时穷举(依赖 LLM 临场决策)更可控、更可调试。方法论体系的核心贡献之一,就是把尽可能多的"决策"从运行时搬到构建时。
3.3 承认边界
这套体系能让穷举更便宜,不能消灭穷举。它把"随机误差"搬运到了不致命的位置,但没有让随机误差消失。
08a 的代码铁证(validate() 的死亡)是这条判断的最佳注脚:引用后处理把"假引用"的生成通道封死——但注意,封死的方式是穷举所有合法引用来源(真实 RAG 文档元数据,有限集合)。当值域可枚举,前置规范可以封死(08a 第七章的三态谱系);当值域不可枚举(数值、语义),体系只能退到"检出即上报"——因为穷举不动。
RAG Assistant 的 NLI 校验是同一个边界的另一面:检索到的片段可能与问题语义矛盾,NLI 三向分类(entailment / neutral / contradiction)把矛盾片段标注出来 [1]。注意——它"检出"但无法在生成时"封死",因为语义矛盾的值域不可枚举。所以它只能退到"检出即上报",监督责任从系统显式转移给人类(08a 第七章的 B 形态)。
这个边界不是暂时的技术限制,而是可枚举性本身的数学性质:有限集合可以穷举封死,无限集合(或规模大到不可穷举的集合)只能概率性检测。它划定了方法论体系的能力上限。
四、悖论的核心:让随机误差进入确定性框架
4.1 测量学的两类误差
| 误差类型 | 性质 | 消除方式 | 例子 |
|---|---|---|---|
| 随机误差 | 不可重复,每次测量偏离不同 | 多次测量取平均(统计减小) | 噪声、抖动、采样波动 |
| 系统误差 | 恒定,每次以相同方式偏离 | 校准(一次修正永久生效) | 刻度偏差、零点漂移 |
随机误差无法靠校准消除——因为它不稳定,你校准了个寂寞。系统误差可以被消除——因为它恒定,一次校准即可永久补偿。
这是经典测量学的二分法。但在 LLM 的场景中,这个二分需要被扩展,因为我与 AI 要处理的误差既不是纯粹的随机误差,也不是纯粹的系统误差,而是一种"被约束的随机波动"。
4.2 转译 LLM 的不可靠
把透镜对准 LLM:
- LLM 的幻觉、格式漂移、路径错误 → 单次采样偏离 → 随机误差
- 同一个 Prompt 输入,每次输出不同 → 不可重复 → 随机误差的典型特征
- 而随机误差的经典消除手段(多次采样取平均)在生成场景下没有意义——你不能"平均"两篇文章。即便用多数投票(majority voting),也只能在答案空间有限时有效,对开放式生成文本不适用。
这就是 LLM 困境的数学内核:它的误差是随机的,而随机误差的消除手段在生成任务里不存在。 你不能靠"多生成几次取平均"来获得稳定的输出——因为文本不是数值,没有加法运算。
4.3 方法论体系的隐性目标
现在,整个方法论体系的工作可以重新描述为:
把 LLM 的随机误差,转化为可管理的、被约束在确定性边界内的波动——让偏差被限制在可预期、可容忍的范围内,从而被边界吸收、被结构消化。
这个转化分三步,每一步都是前八篇做过的:
第一步:压缩随机域(08 有限决策)
LLM 的活动空间从"无限概率曲面"压缩到"预先枚举的狭窄闸口"
随机性从"全域发散"变成"域内波动"
第二步:钉住合法域(02 契约 / 07 如无能力勿增限制)
输出空间被 schema / 模板 / 链钉在合法区域
波动被限制在契约允许的范围内
第三步:吸收残余波动(08a 前置规范)
合法域内的残余波动,被下游确定性逻辑吸收
例:引用后处理——LLM 的随机引用标记,被确定性重编号消化
例:数值校验——不可枚举的数值误差,被"检出即上报"转移给人类
这三步构成了一个三层防御结构:外层压缩随机域(减少出错的机会),中层钉住合法域(出错后不越界),内层吸收残余波动(越界前兜底)。每一层都是一个"确定性容器",把 LLM 的概率输出包裹起来。
看两个活例:
穷举组合检索(RAG Assistant):LLM 标 entities/attrs 是随机的(可能标漏)。算法穷举 N×M 全部组合——把"决策哪个切片最优"(随机域)替换为"全部切片都查"(确定性域) [1][2]。误差被覆盖度吸收:漏标一个实体,其他切片仍可能命中。这就是"画围栏"的最高形态:围栏内的随机性不消除,但围栏本身(穷举全部角度)是确定的。
引用后处理(08a 4.3):LLM 写"引用自来源N"是随机的——可能引用不存在的来源,可能漏引。Python 后处理扫描真实引用、删除假引用、确定性重编号。结果:LLM 的随机引用误差,变成"编号系统"里的确定性输出;无法吸收的部分(假引用)直接删除。 误差不是被"检查出来",是被结构消化了。
这就是"让随机误差进入可管理的确定性框架"的工程版本:不是消除随机性,而是把随机性安置在可吸收的位置。 域外误差被转化为确定性的错误上报(可校准),域内残余则被约束在可容忍范围内——它不再是"全域发散"的随机误差,而是"边界明确"的受限波动。
4.4 为什么只成功了一半
但必须诚实:这个转化只成功了一半。
| 层级 | 随机性 | 状态 |
|---|---|---|
| 决策层(路径、结构、策略) | 已消除 | 被确定性锚点接管(08) |
| 格式层(schema、编号、引用) | 已消除 | 被前置规范封死(08a) |
| 内容层(填空部分本身) | 残余 | 500 字准确率 >90%,仍有 ~10% 随机 |
内容层的填空仍是概率采样——这是转化的下限,也是穷举的边界。 系统可以把随机误差搬运到"不致命"的位置(填空题),但无法消除填空题本身的随机性。要消除它,需要模型自身具备可复现的场景模型——即在同样输入下产生同样判断的能力,而这恰恰是函数逼近器做不到的。
这就是悖论:稳定性和随机性必须同时存在——稳定性由确定性结构提供,随机性由模型泛化提供——而让它们互相协作的接口,目前只能由人来搭(场景穷举)。
五、两条出路与一个循环
5.1 模型侧:强化学习涌现——把穷举换成试错
DeepSeek-R1 论文给出了一个真实苗头:
Here we show that the reasoning abilities of LLMs can be incentivized through pure reinforcement learning (RL), obviating the need for human-labeled reasoning trajectories. The proposed RL framework facilitates the emergent development of advanced reasoning patterns, such as self-reflection, verification, and dynamic strategy adaptation. [4]
关键在 R1-Zero 的实验设计:跳过 SFT,直接在基础模型上跑 GRPO,奖励只看最终答案对错,不约束推理过程。 结果模型自发涌现出反思、验证、多步推理——我们没有穷举"该怎么想",只定义了结果奖励。
这对穷举的意义是结构性的:
| 范式 | 穷举什么 | 谁穷举 |
|---|---|---|
| 当前 Agent | 场景分类 + 应对策略 | 人(Prompt / 围栏) |
| RL 涌现 Agent | 不需要穷举策略 | 模型试错习得 |
AlphaGo 没背棋谱,通过自我对弈学会"直觉",人类只给了规则和输赢。如果 Agent 能在安全沙箱里大量试错,根据任务完成信号自我进化,它就能自己产生面对各种问题的行为策略——不再需要人穷举"该怎么想"。
但注意两点限制:
- 奖励定义本身是另一种穷举——穷举空间从"动作空间"缩减到"目标空间"(安全边界、任务完成信号),规模下降了,但形式没变;DeepSeek 也只敢在数学、代码这类可验证奖励的任务上放开 RL [4],因为"对错"可以被确定性系统判定——这本身就是一种穷举(穷举判定规则);
- 涌现不可控——RL 涌现的策略是隐式的,商业环境要求可审计、可解释、可复现,与涌现本质冲突。你无法为一条涌现出来的策略写变更单。面向强推理模型的自动提示工程综述也点破了另一面:过度精细的提示词可能导致模型陷入"过度推理"——一种类似幻觉的冗余循环推理,带来延迟与能耗激增 [5]。
RL 让穷举更远,但没有终结穷举——它只是把穷举从"人肉场景架构"推进到"奖励工程"。
5.2 架构侧:世界模型——把判断搬出概率曲面
另一条路是世界模型。上海人工智能实验室的定义值得原文引用:
World models—internal simulators that learn the structure and dynamics of an environment—have become one of the most actively debated concepts in AI. [9]
该文把世界模型定义为在有限计算资源约束下对物理世界状态转移过程的压缩建模,并指出关键分野:理解(把感官数据压缩为稳定内部表征)是主要目标,预测只是检验理解的机制 [9]。这与 2.2 节的分野精确对应:理解 = 抽象(从第一性原理应对未见组合),预测 = 插值(对覆盖过的组合做平滑)。
如果 Agent 能建立环境的内部模拟,它就有机会从第一性原理应对未见过的情况——不需要穷举"情况-动作"对。这条路的方法论本质与前八篇一致:用确定性结构吸收模型的不确定性。只是前八篇的确定性结构是静态的(链、模板、契约),世界模型想要的是动态的(运行时构建、修正、验证)。
但立刻遇到同一个问题:谁来定义这个世界模型的范畴和边界?不还得是人吗? 上海 AI Lab 自己的路线图把终点定为"物理 AGI 的三位一体架构(Agent-Evaluator-World Model)"[9]——三位一体中的 Evaluator(评估者)是谁定义的?Agent 的初始边界条件是谁设定的?在目前可见的框架内,答案仍然是:人。
5.3 循环:穷举的宿主在转移,人类永远站在最后
每一次技术跃迁,都让穷举更便宜、更抽象、更靠近本质,但都没有让"定义场景/定义边界"这件事消失。穷举的宿主在转移——从代码到 Prompt,从 Prompt 到奖励函数,从奖励函数到世界模型的边界条件——但穷举本身没有消失。除非有一天,模型能自己构建稳定的世界模型、能从第一性原理应对未见过的组合——那是 AGI 的问题,不是今天工程能到达的地方。
这个循环不是上升的螺旋,而是一次次的劳动分工重组:每一次技术跃迁都在改变"谁来穷举"和"穷举的粒度",但"需要穷举"这个事实本身岿然不动。人类始终是那个最终承担"定义边界"这一认知劳动的角色。
六、一些不想写但必须写的话
6.1 悖论不是矛盾
"稳定性和随机性同时存在并互相协作"——这看起来是矛盾,但前八篇已经证明它不是:稳定与随机可以共存,条件是分层。 确定性层提供稳定(链、模板、契约、后处理),随机层提供泛化(LLM 填空),中间用契约隔离。这不是妥协,这是结构:概率机器在确定性容器的约束下工作,输出在契约边界内波动。
我与 AI 一直在做这件事,只是没有给它命名。稳定与随机不是对立项,是分工项。 两者各司其职——确定性结构负责"不该变的部分",随机模型负责"可以变但需在边界内的部分"——这才是工程上可持续的架构。
6.2 终点不在更聪明的穷举里
承认一件事:我与 AI 在解一道悖论题。 想让稳定性和随机性同时存在并互相协作,想让随机误差进入可管理的确定性框架——这是 LLM 时代的元问题。
而当前工程能给的答案,只是"更聪明的穷举":
- 从完整的 if/elif 门禁钩子,到掺杂着画围栏引导——手段进化了,只要目的还是稳定,就还在穷举;
- 低代码让技术门槛降低,带来很多惊喜、很多方便——这已经是很了不起的事。它把穷举的成本从"需要一个工程团队"降低到了"一个人就能完成",这是一次可用性阈值的跨越;
- 但我与 AI 做的事情,依旧还是过去一遍遍重复的事情:定义场景、枚举分支、设计兜底;
- 只是更快、更轻松、做得更好。
终点不在这里。 终点在模型侧的结构性变化——世界模型、因果推理、可复现的认知状态。在那之前,穷举是宿命,而我与 AI 能做的,是把穷举做得像一门手艺:更精准地识别哪些该穷举、哪些可以模糊,更高效地组织穷举的产物,更诚实地标定穷举的边界。
6.3 边界声明:本篇不新增约束
按照系列维护约定,本篇是边界篇,不是方法论维度的新增:
| 本篇做的 | 本篇不做的 |
|---|---|
| 指出穷举是统计本质的必然 | 不提出新的穷举优化算法 |
| 统一描述前八篇的隐性目标(随机→可管理确定性波动) | 不宣称突破了穷举宿命 |
| 以 RAG Assistant 实践 + 论文语料佐证 | 不假装引用超出实际来源 |
| 为后续(RL / 世界模型)预留容器 | 不承诺当前有工程解法 |
07 是"规则的元逻辑"(为什么加这些规则是合理的),本篇是"规则的边界"(这些规则能走多远、在哪里停)。它不增加任何机制,只画一条线。
七、一句话总结
穷举是 LLM 统计本质的定价,不是工程失误。从 if/elif 门禁钩子到画围栏引导,前八篇的全部努力,是把 LLM 的随机误差转化为可管理的、被约束在确定性边界内的波动——让偏差被限制在可预期、可容忍的范围内,被结构消化。这条路被证明可行,但它的代价是穷举,而穷举的终点是人类的边界。稳定与随机不是矛盾,是分层;将随机误差纳入确定性框架不是奇迹,是工程。真正的破局在模型侧——那里今天还没有路,但方向已经亮出来了。
引用与出处说明
引文全部来自本人项目的实际文档与本地知识库(KB)中的论文原文,经联网核实出处。未引用任何未经核实的二手转述。
| 编号 | 引用 | 出处 |
|---|---|---|
| [1] | wUwproject. RAG Assistant — 本地知识库问答智能体(README 第八章「查询流程详解」:组合式查询、多库路由、NLI 三向验证、自修正决策) | 本地项目文档,v2.2.11,Apache 2.0 |
| [2] | wUwproject. RAG Assistant 架构文档(设计原则「穷举 > 猜测」、组合展开器流程) | 本地项目文档,v2.0.0b1(2026-07-22) |
| [3] | wUwproject. RAG Assistant 外部接入协议 v1.0(route_method 枚举:hardcoded / embedding_signature / embedding_keyword / default / direct) | 本地项目文档 |
| [4] | DeepSeek-AI(Guo D, Yang D, Zhang H, et al.). DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning[J/OL]. arXiv:2501.12948, 2025;亦发表于 Nature 645:633-638(2025) | arXiv / Nature,KB「大模型万象」库收录 |
| [5] | 巴泽智, 张辉, 谢铮涵, 左晓栋, 侯健玮. 大语言模型自动化提示工程技术研究综述[J]. 计算机科学与探索, 2025, 19(12): 3131-3152. DOI: 10.3778/j.issn.1673-9418.2502027 | 期刊原文,KB「大模型万象」库收录 |
| [6] | OpenAI(Achiam J, et al.). GPT-4 Technical Report[J/OL]. arXiv:2303.08774, 2023 | arXiv,KB「LLM奠基理论」库收录 |
| [7] | Radford A, Wu J, Child R, Luan D, Amodei D, Sutskever I. Language Models are Unsupervised Multitask Learners[R]. OpenAI, 2019 | OpenAI 技术报告,KB「LLM奠基理论」库收录 |
| [8] | Brown T B, Mann B, Ryder N, et al. Language Models are Few-Shot Learners[C]//Advances in Neural Information Processing Systems 33 (NeurIPS 2020). arXiv:2005.14165 | NeurIPS 2020,KB「大模型万象」库收录 |
| [9] | Chen X, Guo H, Guo S, et al.(Physical Intelligence Team, Shanghai AI Laboratory). A Definition and Roadmap for World Models[J/OL]. arXiv:2607.06401, 2026 | arXiv,KB「大模型万象」库收录 |
说明:RAG Assistant 项目文档([1][2][3])位于该项目本地仓库(RAG Assistant 项目目录);KB 指该项目的本地知识库(data/kb/ 下 Chroma 向量库),论文原文均存于 KB 的「LLM奠基理论」「大模型万象」等库中,arXiv 编号经联网核实。
延伸阅读
- 第 I 部 · 07:架构的减法与约束的加法:本篇的姊妹篇。07 回答"为什么加这些规则"(元逻辑),本篇回答"这些规则能走多远"(边界)。
- 第 II 部 · 08:有限决策范式:本篇"压缩随机域"一节的展开——决策半径与可靠性的负相关,是"把随机误差搬到不致命位置"的范式层证明。
- 第 II 部 · 08a:前置规范 > 后置验证:本篇"吸收残余波动"一节的展开——可枚举域封死(A)、不可枚举域上报(B),是"穷举的边界"在操作层的实证。
- 第 I 部 · 06:领域智能体:穷举组合检索——"用穷举换确定性"最直白的工程案例。
- RAG Assistant 项目文档:
README.md、PROTOCOL.md、rag_assistant/engine/rag-assistant-architecture.md——本篇实践引用的全部来源。
第 III 部 · 09a|方法论体系构建的沉淀:探测的边界——RAG 检索鲁棒性的取舍范式
一、引子:不通过向量模型,直接查询 KB
我的 RAG 智能体用向量模型组织知识库(KB),整个检索链路——切分、嵌入、相似度计算——都绑定在向量模型的空间里。按直觉,查询 KB 必须走这条链路:query 向量化 → 相似度排序 → 取回 Top-K。
但有一个疑问:如果不使用向量模型,能不能直接查询 KB?
答案是可以。ChromaDB 把每个 chunk 的全文(chroma:document)和文件名(source)明文存在同一个 SQLite 文件里——文章名在 source 字段,作者在 chunk 文本第一行 [1]。SQLite 是普通文件,任何程序都能打开它直接读文本。向量只是索引,文本才是事实;不依赖向量模型,同样能拿到内容 [2]。
既然 KB 的文本层是明文可查的,一个自然的想法就冒出来了:那是不是可以直接用 grep——字符串匹配——从 KB 里取信息? 文章名是文件名(source 字段),作者是 chunk 第一行,都是精确文本,grep 一打一个准。
就是这个想法,把整个讨论引向了一连串问题:grep 可靠吗?它对所有文档都成立吗?如果不能,那该用什么方式探测文本?探测的边界在哪里?——这些才是本文要回答的。直接查询 KB 只是引子,不是重点;重点是:当检索依赖"文本探测"而不是"语义理解"时,该用什么样的探测范式,才能既兼容千变万化的文档结构,又不会污染返回给 LLM 的上下文?
二、三套范式的交锋
围绕"如何标记头部块(标题/作者/单位所在的块)",我和 AI 实际交锋过三套范式。它们不是并列的候选,而是有着清晰的承继关系。
2.1 范式 B:三块窗口——我一直在用的
我的 RAG Assistant 从一开始就采用这套范式:检索命中某个块后,把"命中块 + 上一块 + 下一块"共三块作为元信息返回,保底覆盖文档前 1-3 块,交给 LLM 从文本里自己提取作者、标题等 [3]。
这套范式的哲学是:不假设元信息在哪、不假设文档长什么样。作者可能在第一行,可能在页脚,可能只写名字没有"作者:"前缀——窗口不关心,它把判断交给 LLM 的语义能力。
代价是:每次查询都让 LLM 现提取一次,同样的提取重复做,还每次都带着幻觉概率。
2.2 范式 A:grep 精确匹配——我提的替代
某次讨论中,我问 AI:"我是否可以用 grep,根据 RAG 查出来的信息直接获得编号、标题?"AI 顺势把它推荐成了范式 A:用精确字符串匹配文件名(arXiv 编号),直接读文本第一行拿标题作者。
在它的 KB 上确实有效——因为文件名恰好等于 arXiv 编号,2501.12948v2_2.pdf 这种格式让 grep 一打一个准。
但这是一个 hack,不是架构。它依赖"文件名=编号"这个巧合,换个命名格式(比如我 KB 里那篇中文综述《大语言模型自动化提示工程技术研究综述》,文件名是期刊式命名)就当场失效 [4]。AI 自己也承认:这是"只对当前 KB 巧合有效"。
2.3 范式 C:结构化元数据——AI 中和推荐的
AI 结合 A 的精确和 B 的兼容,中和出了范式 C:导入文档时,用关键词一次性提取 title/author/arxiv_id 写进 metadata 字段,查询时直接读结构化字段。
表面看它最优:提取一次、查询零成本、无幻觉。但我和它争论的焦点就在这里:
范式 C 同样需要关键词,而我不可能穷举关键词。 有的文档写"作者:",有的只写作者名没有前缀,有的作者在页脚、在页眉、在首行、在末页。正则提取这些字段,注定大量漏提、错提——提错了就是结构化错误,比没有更糟。
AI 后来承认它陷入了"只有一种文章结构"的幻觉,而我的代码从第一行就在处理"作者可能以任何形态出现"这个前提。
三、我的坚持:依旧是范式 B,只做一处顺序调整
三套范式摆完,我做的选择可能让 AI 意外:范式 C 不认可,范式 A 是 hack,我依旧用范式 B——但加了一处关键的顺序调整。
3.1 顺序调整:先探测,后兜底
原实现是"先 0-3 兜底,后内容探测":
# 旧:先兜底
if seq <= 3: is_header = True
# 再探测——但 0-3 已被标记,直接 continue 跳过
if c.is_header: continue
这导致一个隐蔽的缺陷:块 3 被提前标记后,永远不参与探测,命中也不会扩展块 4。如果头部信息恰好被切分截断在 3/4 边界(作者名切到块 4),就漏了 [5]。
调整后:
# 新:先探测(0-3 也参与,命中扩展上下各一块 = 三块窗口)
if looks_like_header(text): 标记本块 + 上一块 + 下一块
# 再兜底(后置,幂等覆盖)
if seq <= 3: is_header = True
注意:命中扩展是"上下各 +1"(命中块 ± 相邻各一块,共三块),不是"仅下一块 +1"——这正是范式 B 三块窗口的本义:把"命中块 + 上一块 + 下一块"作为元信息窗口。顺序调整没有改变窗口宽度,只改变了探测的参与权。
顺序调整的范式意义:它不是调参,而是改变了两层的职责边界。旧设计中,兜底"排除"了探测;新设计中,兜底只是"保底",探测获得了与兜底平等的参与权。0-3 从"被跳过探测的死区"变成"参与探测的正常区域",切碎场景因此被保住——实测 3/4 边界样本,旧逻辑漏块 4,新逻辑完整命中。
3.2 为什么顺序调整是范式级的
| 维度 | 旧(先兜底后探测) | 新(先探测后兜底) |
|---|---|---|
| 0-3 参与探测 | ❌ 被跳过 | ✅ 参与,命中可扩展 |
| 3/4 边界切碎 | 漏块 4 | 保住 |
| 兜底作用 | 排除探测 | 保底,幂等覆盖 |
| 冗余 | 布尔幂等,无冗余 | 布尔幂等,无冗余 |
| 工作量 | — | 固定多 4 次正则调用,可忽略 |
布尔标记天然幂等——标两次还是 True,不存在"冗余"问题。所以这处调整是纯增益、零代价:探测的收益(扩展边界)与兜底的保底(不丢头部)同时最大化。
四、允许残余污染:鲁棒性与噪声的平衡
范式定了,下一个问题是精度。实测数据触目惊心:
| 指标 | 旧正则 | 短单元链 |
|---|---|---|
| 综述文档命中块 | 102/146 | 9/146 |
| 其中误判 | ~95 | ~3 |
| 全库命中 | 136 | 36(-74%) |
旧作者名正则 [\u4e00-\u9fff]{2,4},[\u4e00-\u9fff]{2,4} 用 re.search 部分匹配,把正文里所有"词,词"并列短语("提示词,以探索""综述,因此")全部误判为作者行 [6]。根因是信息论的:"作者名,作者名"和"并列短语,并列短语"在词形窗口内完全同构,正则没有语义能力区分它们。
真正的判别信息不在词形,在单元长度——这是我坚持的方向的又一次体现:
作者行是"短单元链"(张三1,李四2+,王五3——每个单元 2-6 字);正文是"长短交错"(长单元,短单元,长单元——链被长单元打断)。
于是我把作者行探测从"短词窗口"改成"短单元链":按逗号切分单元,要求连续 ≥3 个去空白后 ≤6 字且含汉字的单元,纯编号中性不断链,英文/公式/符号断链 [7]。全库命中从 136 → 36,误判从 95 压到个位数。
但——我允许残余。 36 块里仍有 3-4 块是排比误判("文本生成,翻译,摘要等任务")。我没有继续加规则去消灭它们。
4.1 为什么允许残余是工程正确
因为成本结构是不对称的:
| 探测结果 | 代价 | 0-3 兜底的作用 |
|---|---|---|
| 假阳性(正文标 H) | 纯污染:include_header 把正文当元信息回取,且命中上下各一块扩展放大 | 无关 |
| 假阴性(真头部漏标) | 边缘场景丢失(头部基本在前几块) | 兜住下限 |
在 0-3 兜底存在的前提下:假阳性是纯成本,假阴性≈零成本。所以探测的正确姿势不是"越准越好",而是"宁可收窄漏一点,不能宽到什么都命中"——因为收窄的代价(漏边缘)被兜底吸收,而放宽的代价(污染)是实打实的。
我的原话是:"允许有残余,但不应该是你那种错得离谱的,我们要的是鲁棒性,残余肯定是会有的,但是总不能他妈的什么都命中,那我要这个干什么?我直接整篇文章给出去算了。"
4.2 中庸之道:不是无是无非,而是是非之后的最佳实践
"允许残余"容易被误读为"差不多就行"。不是。
中庸不是无是无非,而是是非分明之后的刻意取舍。 允许污染不是因为无所谓,恰恰是因为算清了"污染 vs 漏检"的成本结构后,主动选择了那一边:
| 层次 | 是非(先分清) | 实践(再选择) |
|---|---|---|
| 成本结构 | 假阳性=纯成本,假阴性≈零成本(不对称) | 探测宁可收窄 |
| 噪声 | 完美主义=反鲁棒性(什么都命中=等于不探测) | 允许残余 3-4 块,绝不回到 95 块 |
| 结论 | 无是无非=和稀泥不决策 | 是非之后=算清成本再取舍=中庸 |
这比"什么都不做"难得多:它要求你先建立完整的成本模型,再在模型的约束下主动选择不完美。
五、回到穷举:探测的边界就是穷举的边界
现在把整件事放回 09 的框架里看 [8]。
09 说:穷举是 LLM 统计本质的定价,不是工程失误。无论门禁钩子(枚举错误)还是画围栏(枚举类别),只要目的是稳定,就没有跑出穷举。
09a 的注脚是:探测层同样是穷举——穷举"头部形态",但形态不可穷举。
- 范式 C 失败,是因为它试图穷举关键词(作者/单位/标题的前缀变体)——不可能,结构千变万化
- 范式 B 存续,是因为它放弃穷举形态,改用窗口+LLM——用语义能力代替枚举
- 0-3 兜底,是承认穷举不完——用"位置"这个最鲁棒的信号做最后保底
所以我的最终范式,本质是穷举的分层:
| 层 | 穷举什么 | 穷举得动吗 | 手段 |
|---|---|---|---|
| 探测(短单元链) | 头部形态 | 不可穷举 | 用"单元长度"这个统计特征近似 |
| 兜底(0-3 位置) | 头部位置 | 可穷举(几乎总在前几块) | 无条件标记 |
| 提取(LLM) | 作者/标题语义 | 不穷举 | 语义能力 |
把穷举放在便宜的地方,把确定性放在可靠的地方。 09 说"穷举的宿主在转移",09a 补一句:穷举的宿主还可以分层——探测层做有限近似,兜底层做确定性保底,提取层交给语义。这与 09 的"稳定与随机不是对立项,是分工项"完全同构,只是这次发生在检索层。
六、一句话总结
探测是穷举的工程化:承认形态不可穷举,所以用统计特征近似;承认近似有误差,所以用位置兜底保底;承认兜底也兜不完,所以允许残余污染——因为鲁棒性优先于完美。中庸不是无是无非,而是是非分明之后的最佳实践。 范式之争的本质是"关键词穷举"与"结构容忍"之争;我不认可范式 C 的理由(结构不可穷举),正是范式 B 存续的理由;而一处顺序调整,让范式 B 在不牺牲兼容性的前提下,逼近了范式 C 想要的确定性。
引用与出处说明
引文全部来自本人项目的实际代码、实测数据与本地知识库(KB),未经任何二手转述。
| 编号 | 引用 | 出处 |
|---|---|---|
| [1] | wUwproject. RAG Assistant — 本地知识库问答智能体("换个大模型也能查到 KB"现象) | 本地项目实践,2026-08-09 |
| [2] | ChromaDB 存储结构实测:embedding_metadata 表 chroma:document/source 字段明文 | data/kb/*/chroma.sqlite3 直查 |
| [3] | wUwproject. RAG Assistant(is_header 头部块标记 + include_header 回取,v2.2.9 引入) | 本地项目文档,rag_core.py |
| [4] | 反例:中文综述《大语言模型自动化提示工程技术研究综述》期刊式文件名,grep 失效 | KB「大模型万象」库收录 |
| [5] | 3/4 边界切碎缺陷:旧实现"先兜底后探测"跳过块 0-3 导致块 3 命中不扩展块 4 | rag_core.py mark_header_chunks,v2.2.13 修复 |
| [6] | 旧作者名正则部分匹配误判:综述文档 102/146 块命中,~95 块误判("词,词"并列短语) | 2026-08-09 全库实测 |
| [7] | 短单元链探测:连续 ≥3 个去空白后 ≤6 字且含汉字单元;纯编号中性;英文/公式断链 | rag_core.py _looks_like_header,v2.2.14 |
| [8] | 方法论体系构建的沉淀:穷举的宿命——稳定与随机的悖论 | Cogito Scribo 09,2026-08-06 |
说明:全库命中 136 → 36(-74%)为 2026-08-09 对「大模型万象」「LLM奠基理论」两库 17896 chunk 的实测结果;"允许残余 3-4 块"指短单元链 9 块命中中约 3 块排比误判,可接受。
延伸阅读
- 第 III 部 · 09:穷举的宿命——稳定与随机的悖论:本篇的理论母体。09 回答"为什么穷举是宿命",本篇回答"穷举如何分层落地"。
- 第 I 部 · 06:领域智能体:RAG Assistant 的构建范式——穷举组合检索"用穷举换确定性"的原始案例。
- 第 II 部 · 08a:前置规范 > 后置验证:可枚举域封死(A)、不可枚举域上报(B)——本篇"探测近似+兜底保底"的分层在操作层的同类实证。
- RAG Assistant 项目文档:
rag_core.py(is_header 标记)、backfill_headers.py(存量回填)——本篇全部技术细节的来源。
第 III 部 · 09b|方法论体系构建的沉淀:配置推动的穷举一致性——统一推动点位与误差的哲学
一、推动点位的谱系:四种推动方式
1.1 一切系统都需要一个"推动点位"
先退一步。任何一个由 LLM 参与的生成系统,都要回答同一个问题:规则从哪里来,又在哪里生效? 我把这个位置叫作"推动点位"——它是规则进入系统的地方,是"系统该按什么行为运转"这个问题的答案落地的位置。
推动点位不是一个比喻。它决定四件具体的事:
1. 规则写在哪里 (文件?代码?数据库?模型参数?)
2. 规则以什么形态存在 (字符串?函数?JSON?自然语言?)
3. 谁消费规则 (解释器?分支逻辑?LLM 的 prompt?)
4. 规则变更时动哪里 (改一行代码?改一个文件?改一句话?)
第四个问题最隐蔽,也最致命。规则变更时动哪里——这个问题的答案,就是推动点位的真实形态。 如果改一个行为要翻三个文件、改五处逻辑、还要担心漏掉第六处,那么推动点位就是分散的;如果改一个行为只需要改一个文件里的一行声明,那么推动点位就是统一的。
1.2 四种推动方式:硬编码、代码推动、配置推动、LLM 推动
我在这条路上依次试过四种,每一种都留下了实证:
硬编码。 最早的形态。规则以字符串字面量、魔法数字、散落的 if/elif 直接写在业务逻辑里(01 的门禁钩子就是典型)。它的推动点位不在任何显式位置——规则就是代码本身,改规则就是改代码,改代码就是改行为。推动点位与实现完全重合,没有中间层。
代码推动。 规则从字面量升级为代码结构:策略类、工厂函数、注册表、装饰器。推动点位从"散落的 if"收敛到"类与函数的定义处"。比硬编码好——规则至少有一个家了。但它仍然是代码:改规则要改代码、要重新部署、要过代码审查,非技术人员无法触碰推动点位。
配置推动。 规则外置为数据:JSON、YAML、模板声明、_meta.json。代码负责解释配置,配置负责声明行为。推动点位第一次从代码中分离出来——代码只说"怎么执行",配置说"执行什么"。这是分层的开始:配置是声明层,代码是执行层,推动点位住在声明层。
LLM 推动。 规则以自然语言写进 prompt,由模型在运行时解释。推动点位变成了"提示词里的那句话"。这是最灵活的推动——但它把解释权交给了概率。LLM 推动的推动点位是存在的,但它是一个概率点位:同一句话,十次运行有十一种理解。
1.3 我为什么最终停在配置推动
不是情怀,是三个硬理由。
第一,LLM 推动把"偏差"变成了"随机"。 这是我的核心关切(09)。LLM 推动的偏差是概率性的——你无法预测它会偏到哪,无法枚举它会怎么偏,自然也无法校准。推动点位变成了一个混沌系统的人海口:你推的是规则,进来的是噪声。
第二,硬编码和代码推动的偏差是"分散"的。 点位藏在代码里,偏差也藏在代码里。规则改了一处、另一处没改——这种偏差不是"偏",是"裂"。它甚至不给你一个可观察的误差形态,因为每一处点位的偏差互相独立、互不知情。分散的点位意味着分散的枚举空间:校准 N 个点位,等于做 N 次独立的校准。
第三,配置推动的偏差是"一致"的——而一致是校准的前提。 这是全文的核心,展开在第二章。
核心判断:四种推动方式,本质是四种"偏差分布"。硬编码的偏差藏在代码里,代码推动的偏差集中在类与函数里,LLM 推动的偏差散落在概率里,只有配置推动的偏差,坐在一个可以被指认、被枚举、被校准的位置上。
二、统一推动点位的真正价值:有限枚举
2.1 不可穷举,但可以有限枚举
承接 09 的结论:只要目的是稳定,就没有跑出穷举。但穷举有一个量级的差别——穷举什么。
配置推动之前,我穷举的是"行为":枚举 LLM 可能犯的每一种错(01),枚举该查的所有角度(06),枚举流程的所有节点(05)。行为空间是开放的——它跟着业务扩张,跟着模型版本漂移,跟着 prompt 措辞变化。穷举行为,是一场打不完的仗。
配置推动之后,穷举的对象变了:我不再穷举行为,而是穷举点位。点位是声明层里的条目:一个字段、一个开关、一个档位、一个映射。点位空间是封闭的——它就是你配置文件里的那张表。 表有多长,枚举空间就有多大;表是有限的,枚举就是有限的。
这就是"不可穷举但可有限枚举"的精确含义:
行为空间:开放的、随业务漂移的、不可枚举的
点位空间:封闭的、随配置表固定的、可有限枚举的
同一个系统,两种穷举成本。前者是"穷举的宿命"(09),后者是"宿命内的自由"——你改变不了穷举本身,但你可以选择穷举的坐标系。配置推动,就是把穷举从行为坐标系搬到点位坐标系。
2.2 偏差一致:有限枚举的红利
点位有限,意味着偏差有限。更重要的不是数量,而是一致性。
举一个具体的例子。structured-writer 里 meta 字段有 user/auto/llm 三种来源模式(这是模板文档里早就写明的语义,此前它只是文档)。当字段从配置声明中读取时,每一个字段的偏差行为是同一套规则产生的:user 字段——用户填了就用、没填就空;auto 字段——用户填了抄入、没填 LLM 生成;llm 字段——一律 LLM 生成。一百个字段,只有三种偏差形态。
一致性带来的第一个红利是可预测:看到任意一个字段,我就知道它的偏差会怎么表现——不需要为每个字段单独做心理实验。
一致性带来的第二个红利是可枚举:三种形态,就是三行校准表。我可以把一百个字段的偏差,压缩成三行规则来审视。
一致性带来的第三个红利是可回归:配置变了,我知道全系统的偏差会同步地变——不会出现"改了 A 字段,B 字段行为没跟上"的裂痕。
2.3 对照:分散点位的枚举爆炸
反证更容易看清。如果推动点位分散在代码里——这里一个 if,那里一个特殊分支,prompt 里还藏着一句隐含规则——那么偏差就是每处独立的:
点位 A 的偏差:……(只有 A 的开发者知道)
点位 B 的偏差:……(B 的逻辑与 A 无关)
点位 C 的偏差:……(C 藏在 prompt 里,随模型漂移)
校准这样的系统,等于对每个点位单独做一遍"发现-诊断-修复-回归"。而且点位之间会互相干扰:修好 A,B 的行为边界跟着变;改了 prompt,C 和 A 一起漂。分散点位的枚举成本是乘积级的,统一点位的枚举成本是加法级的。 这就是我选配置推动的算法级理由。
核心判断:统一推动点位 = 把"穷举行为"降维成"枚举差异"。穷举的对象从开放空间变成封闭表,偏差从每处独立变成一族一致。
三、偏差一致的两种命运:误差抵消与误差补正
3.1 一致的偏差才有"命运"可言
偏差一致之后,系统面对一个岔路口:这些一致的偏差,最终会走向哪里?
这里要小心一个直觉陷阱。直觉上,"偏差一致"听起来是坏事——一致地偏,不是越偏越多吗?不是。一致地偏,是偏在同一个方向、同一个量级上;这种偏差是可计算的。可计算的偏差,就有两种可设计的命运。
3.2 命运一:误差抵消——错着错着就对了
误差抵消不是玄学,它有严格的成立条件:当偏差是系统性且方向可设计时,可以通过构造相反的偏差让它相互抵消。
举例。配置推动下,如果我知道所有字段在"auto 未填"时都会向"LLM 自由发挥"这个方向偏,那么我可以在同一个点位上做一个收敛动作——把"未填"的默认行为从"自由发挥"改为"显式留空 + 明确标注"。偏差还是偏差,但方向被设计成"可识别":留空的字段一眼可见,不会再被误当成用户决策。
更普遍的形式是配对:一个点位负责"放开"(auto 允许 LLM 生成),另一个点位负责"收紧"(校验层对生成结果做形态约束)。放开引入的偏差,被收紧吸收——这不是消除偏差,是让两处偏差在同一坐标系里相减。
"错着错着就对了"的真正含义:不是运气,而是设计——两个可预测的错,在同一个点位体系里,可以构造出互相抵消的相位。
3.3 命运二:误差补正——统一有限枚举的误差更容易被统一校准
误差抵消要求偏差方向可设计;不是所有偏差都能设计方向。这时走第二条路:误差补正——接受偏差存在,用一张校准表把它拉回来。
补正的前提,恰恰是"有限枚举 + 一致"。因为:
分散点位的偏差无法补正,因为它不满足第二条:每处偏差的来源不同,一张校准表套不上去。补正是一种批量操作,只对一族一致的偏差有效。
structured-writer 里有一个现成的例子:子结构字数。早期每个子结构的字数显示都取档位上限(短篇全 1500),因为显示层的 fallback 是"取 word_count_target.max"。这是一个一致的偏差——不是某个字段错了,是所有字段以同一规则偏向了上限。修复它只需要改一个点位:让 LLM 在规划时给出每段的目标字数,显示层优先用 LLM 的值。一处改动,校准了所有章节、所有段落的字数偏差。 如果当初每段的字数逻辑散落在不同代码里(有的取 max、有的取中值、有的写死),这次校准就得逐段进行——而那正是分散点位的宿命。
3.4 两种命运的公共前提:点位还在那里
值得强调的是,误差抵消与误差补正是两条不同的路,但它们的公共前提只有一个:点位还在那里。如果推动点位分散、或隐没在代码与 prompt 里,那么偏差既不可设计(无法抵消),也不可枚举(无法补正)——它只剩第三种命运:不可见的漂移。漂移是最坏的情况,因为它既不偏左也不偏右,而是"不知道在哪"。
核心判断:一致的偏差不是缺陷,是资产——它让误差有了两种可设计的命运(抵消或补正),而这两种命运都要求同一个前提:推动点位统一且可指认。分散点位的偏差只有一种命运:不可见的漂移。
四、标准化的意义:误差受控优先于靶心偏差
4.1 三个概念:精密度、正确度、准确度
走到这里,需要把三个经常被混用的词分开。按计量学标准(JJF 1001-2011《通用计量术语及定义》,等同国际 VIM3):
- 正确度(trueness):测量结果的平均位置与真值的接近程度——"靶心偏差几毫米"。它描述的是系统偏倚(bias)。它是理论量:需要无穷多次测量的均值才能定义,有限情况下观测不到。
- 精密度(precision):重复测量结果之间的接近程度——"每次落在同一个位置"。它描述的是随机离散(variance)。它是可观测的:跑十次看离散就知道。
- 准确度(accuracy):测量结果的综合表现——粗略等于精密度 + 正确度。工程量化即
MSE = bias² + variance(均方误差 = 系统偏倚² + 随机方差)。通俗地说,准确度就是"多次测量下的平均'正确度'"——你测到的每一次落点,既被正确度(平均位置)支配,又被精密度(离散)污染。
工程语言里它们还有另一对投影:偏差(bias)与方差(variance)。正确度对应偏差,精密度对应方差。经典的偏差-方差权衡说的是:你可以牺牲一点偏差,换取大幅的方差下降——因为方差是你可以校准的东西,而偏差的"真值"你往往看不到。
4.2 真值到底真不真:有限情况下的判断依据
为什么偏差-方差权衡在 LLM 系统里如此尖锐?因为真值不可达。
在 10a 里我已经论证过:伦理问题没有可穷尽的边界,做工需要二元论断,而边界不可穷尽——于是只能画圈,画圈就是垄断划界权。那个论证的底层逻辑,和这里完全一致:只要真值不可直接观测,对"正确度"的追求就是对一个不可观测量的追求;你能观测到的只有"准确度"——而准确度里含着精密度:精密度差,你连"平均正确度"都估不准(均值标准误 σ/√n 大)。
在有限的情况下(有限的枚举、有限的样本、有限的运行次数),我们真正能观测到的只有准确度——而准确度被精密度锁着。正确度是一个信仰,准确度是一个事实;精密度是通往准确度观测的唯一通道。工程决策应该建立在事实上。
4.3 误差受控比靶心偏差几毫米更值得关注
由此得出全文最实用的一条判断:
大多数时候,误差受控比靶心偏差几毫米更值得关注。
展开说——这里"误差受控"说的是精密度,"靶心偏差几毫米"说的是正确度:
精密度好的系统可能"偏"(平均落点离真值有固定距离——正确度差),但它是可治理的:你可以声明它的偏差,校准它的偏差,甚至设计它的偏差(第三章的抵消与补正)。精密度差的系统看起来"准"(某一次碰巧接近真值),但它是不可治理的——你无法对它做任何系统性改进,每次修修补补都是打地鼠。
标准化的意义正在于此。标准化不是"把偏差消灭到零"——那是正确度崇拜。标准化是把精密度先钉住:统一的推动点位、统一的字段语义、统一的枚举表,让每次落点可预测——然后正确度才谈得上校准(补正)或设计(抵消)。标准化的产物不是"准",是"稳"——而稳是通往准的唯一可行路径,因为只有稳,校准才有落点。
4.4 校准的终点:声明偏差,而非消灭偏差
最后一步是心态转换。配置推动的系统,最终形态不是"没有偏差",而是"偏差被声明":
我写 08a 时强调的是"前置规范大于后置验证"——那是在流程维度上把问题提前。这里是在偏差维度上把问题提前:与其等偏差在运行中显现,不如在配置声明时就知道它会在哪里出现、以什么形态出现。声明偏差,是比消灭偏差更高明的工程姿态——前者是管理现实,后者是否认现实。
核心判断:精密度优先于正确度,误差受控优先于靶心偏差。因为正确度是不可观测的理论量(无穷多次均值才定义),可观测的只有准确度——而准确度 = 精密度 + 正确度,被精密度锁死。标准化 = 先把精密度钉住(统一点位、一致偏差),让正确度谈得上校准;把偏差从"不可见的漂移"转化为"可声明的资产"。
五、回到实践:structured-writer 的两个实证
5.1 实证一:meta 三模式统一——从"字段特判"到"配置声明"
此前,structured-writer 的 meta 字段处理是字段特判式的:标题有"四级优先级"(用户填了用/没填 LLM 提炼/截断/兜底),叙事视角有"代码级固化"(单独一段 if 覆盖 LLM 返回)——每个字段一套逻辑,散落在 planner.py 与 novel_bridge.py 里。
这就是典型的分散点位。表面看每个字段都"处理"了,但偏差行为互不一致:标题的偏差是"四级优先级"产生的,叙事视角的偏差是"代码固化"产生的,下一个字段的偏差又会是另一套逻辑产生的。校准无从谈起——因为根本没有一张表可以描述"所有字段的偏差"。
修复只做了一件事:把点位统一到配置声明。模板的 meta 数组就是推动点位:
{"name": "标题", "source": "auto", "desc": "小说标题"}
{"name": "题材", "source": "user", "desc": "题材"}
{"name": "叙事视角", "source": "auto", "desc": "视角"}
三个 source(user/auto/llm)一套语义,所有字段共用。一百个字段的偏差,压缩成三行规则;三行规则,就是那张校准表。这次修复没有增加任何字段级 if——它只是把偏差从"每处独立"改成了"一族一致"。
5.2 实证二:叙事视角——从"标签"到"可执行规则"
叙事视角是另一个点位案例。早期系统里,用户填了"第一人称",LLM 写作时还是写第三人称。排查发现:规划层正常(state 里 narrative_voice = "第一人称"),但写作上下文里它只是一行标签——"叙事视角: 第一人称"——LLM 看到了,但不知道该怎么执行。
这不是点位缺失(点位在 state 里好好的),而是点位与执行的偏差不可见:标签与行为之间的翻译,交给了 LLM 的概率。修复是在同一个点位(writing_style 配置)上,把标签升级为可执行规则:
第一人称:正文必须以「我」作为叙述者展开,禁止用「他/她/主角姓名」作为主角的叙述主语
并把这条规则声明为最高优先级(system prompt 层)。校准的不是输出,是点位与行为之间的翻译层。 这个翻译层,配置推动系统里是声明的一部分;在分散点位系统里,它藏在每个 prompt 的措辞里,不可枚举、不可校准。
5.3 两个实证的共同结构
两个实证看起来不同(一个管字段、一个管视角),结构完全一致:
这正是第二章到第四章的完整演绎。配置推动不是一个"更好的实现",它是一个更可治理的偏差结构。
六、边界与不足
诚实地说,配置推动不是银弹,它有三个已知边界:
第一,点位本身的偏差仍然存在。 配置表也会写错——字段名拼错、语义声明与消费代码不一致、文档与配置漂移。配置推动把偏差从"执行层"搬到了"声明层",但没有消灭偏差。它的优势是:声明层的偏差是可见且可审计的——你有东西可看、可查、可 diff。
第二,配置推动要求"可声明的规则"。 不是所有规则都能外置成数据。有些规则是程序性的(依赖运行时上下文、跨模块状态),硬塞进配置反而制造出"伪声明"——看起来是配置,实际上需要代码配合才能成立。判断标准很简单:一个配置项,如果离开代码上下文就无法被理解,它就不是配置,是披着配置外衣的代码。 遇到这种,诚实地留在代码里,比强行外置更符合配置推动的精神。
第三,LLM 推动没有消失,它被降级了。 配置推动的系统里,LLM 仍然存在——但它的角色从"规则的来源"降级为"规则的服务对象":配置声明"叙事视角是第一人称",LLM 负责在规则内完成表达。这呼应 04 与 05:LLM 从"大脑"降级为"胶水"、从"主体"降级为"执行器"。配置推动不是消灭 LLM 推动,而是给 LLM 推动划定坐标系。
结语
回到最初的问题:为什么选择配置推动,而不是硬编码、代码推动,甚至 LLM 推动?
因为配置推动是统一的推动点位。统一推动点位意味着:虽然不可穷举,但可以有限枚举;有限枚举意味着偏差一致;一致的偏差只有两种命运——误差抵消,或者误差补正。而这两种命运,都要求点位还在那里。
标准化的意义也在于此:大多数时候,误差受控(精密度)比靶心偏差几毫米(正确度)更值得关注。因为正确度是不可观测的理论量,有限情况下你终归只能看准确度——而准确度 = 精密度 + 正确度,被精密度锁着。
从 01 的硬约束,到 09 的穷举宿命,再到这一篇的配置推动——我做的其实一直是同一件事:给 LLM 的随机误差找一个可治理的座位。 配置推动不是最正确的答案,它是最可校准的答案。而在这个真值不可达的世界里,可校准,就是工程意义上的真理。
最后补一个可操作的落脚点:本篇反复出现的"精密度优先于正确度""偏差一致才谈得上校准",都可以直接观测。silprespec-emulator(见附录 B 工具索引)对同一输入并行执行 N 次,输出跨 run 填入一致率——这就是"精密度"的直观读数:一致率稳定,说明偏差可枚举、可校准;一致率乱跳,说明点位还没统一。想在自家场景验证"配置推动是否到位",在实验台上选对应方式跑一轮重现性实验,比争论更有说服力。
引用与出处说明
本文为方法论论述,无外部文献引用;论证依托本人项目实证:
| 实证 | 项目与文件 |
|---|---|
| 实证一:meta 三模式统一——从"字段特判"到"配置声明"(标题四级优先级、叙事视角代码固化等分散点位 → 模板 meta 数组统一推动点位,100 字段仅三种偏差形态) | structured-writer(planner.py / novel_bridge.py 字段特判逻辑,2026-08-15 修复;正文 5.1 节) |
实证二:叙事视角——从"标签"到"可执行规则"({"name": "叙事视角", "source": "auto", "desc": "视角"} 配置声明) | structured-writer(正文 5.2 节) |
第 III 部 · 09c|方法论体系构建的沉淀:天然不对等与噪音抑制——语义匹配范式的不对等困境与推理免疫
一、引子:一个"对等"的追问
我的 RAG 智能体用向量模型组织知识库(KB),整条检索链路——切分、嵌入、相似度计算、重排——都构建在"语义匹配"之上:query 和 chunk 像不像、哪块更像。这套东西用了很久,稳定性尚可,以至于我一度默认"语义判定就该这么干"。
但到了另一个项目——结构化写作引擎的审查环节——我却明确地不再倚重它们。六检里,格式、连续性、逻辑检查用的是正则与代码;语义和推理审查交给两个本地小模型(bge 嵌入做语义相似、R1 推理模型做推理审核);向量检索和 ranker 在审查里几乎失业。甚至新引入的实体关系抽取,我也选择了生成式小模型(Qwen2.5-3B)而不是向量或 NLI 分类器。
同一个作者,两个系统,对待"语义匹配工具"的态度截然相反。这不是一时的心血来潮,而是被同一块石头绊倒过之后的选择。这块石头,就是天然不对等。
这篇文章要做四件事:把"天然不对等"拆开,看它由什么构成;看 RAG 如何绕开它、为什么能绕开;看写作审查为何绕不开、被迫走向哪里;以及最终确认——什么样的范式对这片地形真正免疫。
二、定义:天然不对等不是玄学
"不对等"听起来像哲学名词,其实可以拆成两块,每块都能落在工程事实上。
第一块是结构性差异。 查询是一条几十字的用户问题;文档是一个几百上千字的 chunk。前者稀疏、指向单一,后者稠密、语义复合。嵌入模型把两者压进同一个向量空间求相似度,但"短文本的向量"和"长文本的向量"在统计性质上就不对称——短文本的每个 token 权重高、语义集中,长文本的语义被平均池化稀释,向量被"抻平"了。更硬的事实是:绝大多数嵌入模型的输入有硬上限——BERT 系的 max_seq_length 是 512 token [1],bge-small-zh-v1.5 同样是 512 [2]。一篇 1200-1800 字的正文段落折算 1000-1500 token,必然截断,向量只代表开头几百字,后半段在表示空间里根本不存在。这是长度与粒度带来的结构性差异,与内容好坏无关——它写在模型的骨架里。
第二块是噪音。 文档里总有与当前语义判断无关的信号:措辞变体、主题漂移、修饰成分、格式噪声。查询"陈默启动了重置协议",文档里同样的意思可能写作"他按下那个按钮,系统进入强制重置流程"——表面 token 完全不同,但语义一致;反过来,文档里出现"重置"二字,可能只是在描述别的无关系统。对向量模型而言,"同一语义的不同说法"是噪音(拉低相似度),"不同语义的撞词"也是噪音(虚高相似度)。噪音是嵌入空间里的干扰信号,它不改变语义,却改变表示。
关键论断:结构性差异是前提,噪音才是匹配失真的直接来源。
把两段长度悬殊、但内容纯净表达同一语义的文本交给嵌入模型,相似度依然可观;真正让匹配漂移的,是"非语义信号"混进了表示空间——长度差异放大了噪音的干扰,信噪比越低,向量越不可信。所以"天然不对等"更准确的表述是:语义匹配面对的信噪比失衡。噪音是主犯,结构差异是帮凶。这不是比喻:检测工程里,不相关噪声源以正交方式合并,有效信噪比由各噪声源共同决定 [11]——噪音对信号的侵蚀是可量化的物理事实,在语义匹配里同样成立。
这个界定也解释了为什么正则审查在某些环节反而可靠:它根本不看语义,只看确定性规则——规则面前不存在噪音。末行编号不对就是不对,与措辞无关;视角代词越界就是越界,与上下文无关。正则审查赢在没有语义,而不是赢在语义更强。
三、RAG 的对等化工程:伪造对等
知道了不对等的构成,RAG 的第一反应就是工程化地对等:既然短长悬殊 + 噪音干扰,那就把两端拉平、把噪音压下去。
我在 RAG 智能体里实际在用的手段,每一条都指向这个目标:
- LLM 切片:不用固定字数切,而是让模型按语义边界切——一个 chunk 尽量是"一个完整的意思"。切完的块,粒度接近"一个查询能覆盖的量级",短长差距被压缩,长文截断的问题被前移到切片阶段解决。
- 算法枚举:对候选做穷举式生成,把"可能相关的说法"都列出来,用数量弥补形式差异——这一条直接承袭 09 的命题:形式不可穷举,那就用枚举把可能性摊开。
- 词化路由:把知识库的路由规则写成词、把反哺给模型的指令也切为词——让匹配单元从"整句"降到"词级"。词级的表示天然更对等:词的语义比句子的语义稳定得多,也更抗措辞变体("重置"和"重启"在词级更容易被同一向量簇捕获)。
- 轮训余弦相似度:对同一语义做多窗口、多次余弦计算,取稳定信号,稀释单次匹配的噪音——用重复换信噪比。
这一整套的本质是:用工程手段伪造对等。伪造不了 100%——但检索不需要 100%,这引出下一节。
四、召回容错哲学:count 完整即可讨巧
RAG 有一个写作审查没有的免死金牌:它只负责召回,不负责裁决。
检索的成败标准是"真实相关的项在不在召回集里"——只要 count 完整,排序可以讨巧:向量粗排不行就加 ranker,ranker 不行就加关键词兜底,再不行把 Top-K 放大,让 LLM 自己从更宽的上下文里挑。召回集之外的世界,对 RAG 毫无意义;召回集之内的顺序,错了也只是 LLM 多读几块上下文,由模型的下游理解纠正。
这就是"怎么召可以讨巧"的底气:召回是开放世界,容错;裁决是封闭世界,不容错。
写作审查是裁决。判断"这段与概述是否匹配""这个角色的言行是否矛盾",错了就是错了——没有召回集兜底,没有下游模型纠正(审查本身就是为了拦下游的)。所以 RAG 能容忍的匹配误差,审查完全不能容忍。这是两者对"天然不对等"态度相反的根本原因之一:不是 RAG 不怕不对等,是 RAG 允许自己在不对等里犯错,而审查不允许。
五、ranker 的脆弱与 NLI 的救场及其缺陷
在匹配范式内部,ranker 是最吃天然不对等的一环。它是 cross-encoder,把 query 和 doc 拼接成一个序列再打分——拼接意味着长度直接相加,短长悬殊时,长文一端的表示被严重压缩,注意力大量浪费在"对齐两个不对等的句子"上;而它的训练分布决定了它对"训练时见过的对等形态"打分可靠,对"没见过的形态"(新题材、新文体)漂移明显。ColBERT 这类晚交互(late interaction)模型把 query 与 doc 的 token 级交互后置,用 token 对齐部分缓解了整句级的不对等 [9]——但代价是打分逻辑更复杂,而且它仍是匹配范式,只是把"不对等"从句子级降到了 token 级。ranker 不是不好,是它对形式太敏感,而写作恰好形式千变万化。
那么,匹配范式里有没有天生对抗不对等的?有——NLI(自然语言推断)。它的任务设定就是"前提-假设蕴含判断":给定一段前提(长文),判断一个假设(短句)是被蕴含、矛盾、还是中立 [1][3]。这几乎是"短句 vs 长文"的天然形态——它比较的不是表示像不像,而是信息上成不成立。BERT 类模型在 MNLI(Multi-Genre Natural Language Inference)上被训练得炉火纯青,蕴含/矛盾/中立三分类对"语义层面的短长匹配"确实比余弦相似度更接近本义。
但我最终没有在审查里用它。缺陷有五条,每一条都致命:
- 不能打分,只能分类。蕴含/矛盾/中立三分类,没有连续分数,阈值校准无从谈起。"有点偏离"和"彻底跑题"在分类里是同一个"中立",而审查恰恰需要区分偏离程度——一个 SOFT 问题和一个 HARD 问题,处理方式完全不同。GLUE 基准在设计上就把这两种形态分开:STS-B 是连续打分(回归),RTE/MNLI 是蕴含分类 [10]——打分与分类从来是两条路,NLI 只走得了后一条。
- 应用面窄。它只能验证"已经构造出来的命题",不能自由召回、不能排序、不能探测未知风险。
- 需要预构造候选假设(词表)。NLI 不会自己发现"该验证什么"——你得先把要验证的命题写成自然语言句子,凑成一张假设词表。词表本身又是穷举问题:命题写不全,验证就覆盖不全——这正是 09 说的"穷举是宿命"在 NLI 上的重演。你问的"词表",就是这张预构造的候选假设集。
- 中文 NLI 模型稀缺。SNLI/MNLI 是英文的,中文要靠 XNLI 或翻译语料,质量参差,训练分布离小说文本十万八千里——把英文蕴含模型拿来判中文科幻小说的"陈默与艾琳的婚姻关系是否成立",等于用外语思维审中文作品。
- 输入短。前提一长就要截断——又撞回天然不对等。NLI 想绕过不对等,却继承了不对等的根。
NLI 在"对的形态"上比向量强,但它把问题从"匹配"变成了"穷举候选命题",而穷举正是我们证明过走不通的路。所以它救不了审查。
六、写作审查的不可切片性
RAG 能切片,写作审查为什么不能照搬?答案不是"切不好",而是成本与整体性——两个都不可逾越。
成本。注意力机制对序列长度是 O(n²) 复杂度 [4]:序列翻倍,算力翻四倍。审查要对比的是"整段正文 vs 设定/概述/前文承诺"——正文一段 1200-1800 字,切小块的组合是组合爆炸:每块对每块要算匹配,N 块就要 N² 次;每次 cross-encoder 或相似度计算都要时间,每章完结检查要跑多轮——时间成本不可承受,算力成本在本地 CPU 环境下更不可承受。FlashAttention 这类优化能缓解单次长序列的成本 [4],但解决不了"组合爆炸"本身——它优化的是单次 O(n²),不是 N² 次匹配。
更致命的是语义整体性。叙事是跨块的:伏笔在第 1 段埋下,第 4 段回收;人物的态度在第 2 段转变,第 5 段才有后果;一段的结尾是下一段的引子。把正文切成独立块,等于把因果链斩断——切出来的块各自"语义完整",但拼不回叙述整体。切片这个动作本身就破坏了审查对象:你要审的是连续性,切片先斩断了连续性。
这是 RAG 没有的问题——RAG 的 chunk 本来就是独立的知识单元,切片无伤大雅,甚至切片就是它的组织方式;小说的段落天然是连续的叙事流,切片就是残骸。所以写作审查面对的是无法消除的天然不对等:整体对比成本不可承受,局部对比语义失真。匹配范式在这里走到尽头。
七、LLM 的免疫:从匹配到推理
匹配范式失效了,出路是什么?答案其实一直都在手边:放弃匹配,改用推理。
向量、ranker、NLI 全部工作在形式表示层——它们的输入是 token 的分布、嵌入的空间。长度一变、措辞一变、粒度一变,表示就变,判断就漂移。它们被天然不对等击中,是因为它们"看形式"。
LLM 不一样。它做的是自回归语义解码:预测下一个 token 的过程,逼迫模型把文本还原为"意义"——它建立的是语义与世界模型的映射,而不是文本与文本的相似。GPT-3 用"预测下一个词"这一个目标,就在几百亿参数里压缩出了可迁移的语义理解与少样本能力 [5];Chain-of-Thought 揭示的是同一个事实的另一面:当模型被要求"先推理再作答",它的语义理解会显式地展开为推理链 [6];Emergent Abilities 则说明,随着规模增大,这种理解会涌现出小模型没有的能力 [7]。但重要的是机制本身:这些能力全部建立在"理解语义"而非"匹配形式"之上。
当这样的模型被要求判断"这段正文是否与概述一致"时,它读的不是"像不像",而是"信息上成不成立"。长度悬殊、措辞变化、噪音干扰,都不改变语义本身——所以它对天然不对等近乎免疫。
这个免疫与规模无关。1.5B 的推理审核模型、3B 的实体抽取模型,与 70B 一样基于同一个范式:理解语义,而非匹配形式。小模型能力有强弱——推理深度有限、复杂跨段对比会犯困——但免疫的机制是相同的,因为免疫来自范式,不来自参数量。
这正是结构化写作引擎审查环节的最终选择:正则闸门处理确定性规则,bge 处理形式可比的语义相似(概述匹配这类"切得动"的任务),R1 处理推理审核(因果、人格、情绪弧——纯粹的不对等语义判断),Qwen2.5-3B 处理实体抽取(实体识别是语义理解,不是形式匹配)。审查链路刻意绕开匹配,把最难的部分交给推理。
八、免疫的边界:别把免疫当成全能
说 LLM 对天然不对等免疫,不等于说它无所不能。免疫是有边界的,我在这条路上也踩过坑,值得记录。
第一,长上下文的注意力衰减。 Liu 等人的实测给出了一个精确的 U 形结论:模型对上下文中间的内容注意力弱于开头和结尾(所谓 lost in the middle),且上下文越长整体利用越差 [8]——正文越长,跨段对比越不可靠。这不是不对等问题,而是容量问题:免疫了"形式差异",没免疫"长度稀释"。
第二,幻觉。 推理模型在"语义成立"的判断上可能创造不存在的依据——它说"这段与前文矛盾",但矛盾点可能是它脑补的。所以审查结果必须可追溯:HARD 问题要有具体位置、具体引文,否则人工复核无从下手。
第三,小模型的推理浅。 1.5B 的 R1 在单段矛盾检测上够用,跨五段的行为一致性判断就会吃力。规模不够的地方,要么靠分段喂(把上下文切成模型舒适区),要么接受降级(检测率下降,但零误报优先)。
边界存在的意义是提醒:推理范式解决的是"形式敏感性",不是"全能审查"。 免疫不等于正确,只是不再因为"长得不像"而误判。
九、结论:三范式选型表
走到这里,三种范式各自的适用边界已经清晰:
| 范式 | 工具 | 应对天然不对等 | 适用场景 | 不适用 |
|---|---|---|---|---|
| 匹配 | 向量相似度、ranker | 弱(靠拉平工程 + 召回容错) | RAG 召回、形式可比的对等比较 | 裁决、跨粒度语义判断 |
| 分类 | NLI | 中(蕴含判定形态对,但需候选词表) | 命题验证(先穷举命题) | 打分、排序、开放召回 |
| 推理 | LLM(1.5B/3B 亦可) | 强(语义解码,免疫形式差异) | 审查、裁决、矛盾检测 | 高频大规模召回(成本) |
选型的判据只有一个:你要的是召回还是裁决? 召回可以讨巧,匹配范式够用;裁决不容出错,就得上推理范式。
从 09 到 09a 到 09c,是同一个命题的三次侧影:09 说"穷举是宿命"——形式不可穷举,枚举是死路;09a 说"探测有边界"——文本探测用统计近似,近似有误差,用位置兜底;09c 说的是最后一块拼图——匹配范式在这片地形上需要大量工程垫脚,分类范式需要一张穷举出来的命题词表,只有推理范式,靠理解而非比较,真正站得住脚。 理解,是唯一不需要穷举的路。
天然不对等不是缺陷,是语义任务的地形。承认地形,选对范式,剩下的是工程。
引用与出处说明
引文全部来自本人项目的实际代码、实测数据与本地知识库(KB:LLM奠基理论/大模型万象/检测技术),文献均为库内实有原文;[8] 为联网补录,[2] 为本地模型实测。
| 编号 | 引用 | 出处 |
|---|---|---|
| [1] | Devlin et al. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding(512 token 上限;MNLI/RTE 蕴含任务) | KB「LLM奠基理论」 |
| [2] | BAAI/bge-small-zh-v1.5 实测:max_seq_length=512,正文段落(1200-1800 字)必然截断 | 本地模型实测,structured-writer data/models |
| [3] | Williams et al. A Broad-Coverage Challenge Corpus for Sentence Understanding through Inference(MultiNLI) | KB「LLM奠基理论」(含于 GLUE/BERT 系文献) |
| [4] | Dao et al. FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness(自注意力 O(n²),长序列成本) | KB「LLM奠基理论」 |
| [5] | Brown et al. Language Models are Few-Shot Learners(GPT-3,自回归预测范式) | KB「LLM奠基理论」 |
| [6] | Wei et al. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models | KB「LLM奠基理论」 |
| [7] | Wei et al. Emergent Abilities of Large Language Models | KB「LLM奠基理论」 |
| [8] | Liu et al. Lost in the Middle: How Language Models Use Long Contexts(U 形注意力曲线:开头/结尾强、中间弱,上下文越长利用越差) | 联网检索,arXiv:2307.03172(TACL 2023) |
| [9] | Khattab & Zaharia. ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT(晚交互精排:token 级对齐缓解短长不对等) | KB「大模型万象」 |
| [10] | Wang et al. GLUE: A Multi-Task Benchmark and Analysis Platform for Natural Language Understanding(STS-B 回归打分 vs RTE/MNLI 蕴含分类——打分与分类是分离形态) | KB「大模型万象」 |
| [11] | 检测技术库:红外探测器信号检测理论(不相关噪声源正交合并、有效信噪比计算) | KB「检测技术」 |
说明:正文的"512 token 截断"为 bge-small-zh-v1.5 本地实测(config max_position_embeddings=512;1500 字中文实测 2102 token,截断后仅保留 512,约前 24%);NLI 中文稀缺与候选词表限制为工程判断,非文献原话;[8] 因本地 KB 未收录,经联网检索补录(arXiv:2307.03172)。
延伸阅读
- 第 III 部 · 09:穷举的宿命——稳定与随机的悖论:本篇的理论母体。"候选词表=穷举宿命重演"(第五节第 3 条)直接引用 09 的命题。
- 第 III 部 · 09a:探测的边界——RAG 检索鲁棒性的取舍范式:本篇的检索层前传。09a 回答"文本探测用什么范式",本篇回答"语义判定用什么范式"——从检索层推进到审查层。
- 第 I 部 · 06:领域智能体:RAG Assistant 的构建范式——词化路由、轮训余弦等对等化工程的原始案例。
- RAG Assistant 项目文档:
rag_core.py(切片/词化/轮训)、data/kb/(LLM奠基理论/大模型万象/检测技术,本文献来源)——本篇全部技术细节与文献的来源。
第 III 部 · 09d|方法论体系构建的沉淀:细碎处理与区域重构的成本切割——颗粒度与对齐的悖论
一、引子:第一刀下在哪里
我的结构化写作引擎有一个六检环节:章写完后,六种检查跑一遍——格式、连续性、承诺链、逻辑、语义、推理。检查会吐出一堆问题:末行编号丢了、时间词不衔接、角色凭空消失、正文偏离概述、对话不像这个角色。问题是枚举出来的,类型是有限的,位置是能定位的——看起来一切尽在掌握。
但真正动手修的时候,第一个问题不是"怎么修",而是"从什么粒度下刀"。末行编号缺失,代码一行补上,零成本;对话用词不像角色,代码改不了,只能让 LLM 重写这一段——可重写一段是动整段叙事,改了这句可能碰了那句,改完还得重检,重检可能又查出新的。一刀切下去,切口太细改不动,切口太粗动太多。一刀切是个艺术活,难就难在从什么粒度下刀。
文章要做的事:拆开"细碎处理"到底要求什么;证明细碎处理是确定性的特权而非通用手段;论证区域重构不是放弃粒度而是成本切割;最后给出一个可落地的五确定决策树。
二、细碎处理跟随的必须是确定性:预案不是细碎
先给"细碎处理"下一个严格的定义。所谓细碎处理,指的是对一个已被明确定位的问题做定点修复——改这一行、补这一句、换这个字段,不碰其他部分。它的对立面是区域重构:以一块区域(一个子结构、一个模块)为单元整体重写。
细碎处理看似门槛很低——问题都定位了,改就是了。但定位只是起点。要让一次定点修复成立,必须同时满足四个条件,缺一不可:
① 问题分级清晰。 这是 HARD 还是 SOFT?阻断还是不阻断?分不清级别,就不知道这一刀该不该下——HARD 必须修,SOFT 可以放,级别混淆会让修复动作的优先级失真。
② 问题原因清晰。 末行编号缺失,原因是写入逻辑没补全,这是确定的原因;对话用词不像角色,原因是"用词超出角色设定"——但为什么超、哪句超、超出多少,原因本身是模糊的。原因不清晰,修复动作就是盲目的:你不知道改的是什么,改了也无法确认改对了。
③ 问题位置清晰。 末行编号缺失,位置就是文件末尾那一行;角色消失,位置是"这一段的某个叙事缺口"——但缺口具体在哪一句?说不清。没有坐标,就没有"定点"可言。
④ 修复方式清晰。 末行缺失,修复方式就是"在文件末尾补上 L02S01",一个确定性的操作;对话不像角色,修复方式是什么?"把对话改得符合设定"——这是创作,不是操作。修复方式不清晰,执行者就只能靠发挥,而发挥是不可控的。
这四条都落在问题本身上,我把它叫做问题侧四确定——分级、原因、位置、方式,全部是对"问题"的断言。问题侧四确定全满足,细碎处理才谈得上成立;缺任何一项,所谓"细碎处理"就退化成另一种东西——预案。但问题侧四确定只是前置条件,细碎处理的完整合法性还要等一个执行者侧的确定(下一节),两者合起来才是五确定。
这里要划一条硬线:预案不是细碎处理,预案是风险防控手段。 预案的意思是"我预见到可能出这类问题,于是准备了一套应对流程"——但它没有回答"这个问题现在到底以什么形态出现、根因是什么、落在哪一行、用什么动作改"。预案应对的是"可能",细碎处理处理的是"确定"。一个拿着预案上阵的人,每走一步都在判断"这算不算预案里描述的那种情况"——判断就有误差,误差就是不确定性。
更深一层:风险本身意味着粒度不够细,因为风险伴随着非断言。 为什么会有风险?因为对问题的认知还停在"可能""大概""某种情况"——这是非断言:无法对"问题是什么形态、根因在哪、落点在哪行、该用什么动作"给出确定的判断,只能给出或然的描述。非断言正是粒度太粗的表现——粒度细到每一环都是"断言"(就是这一行、就是这个原因、就这么改),风险就消失了,剩下的只有确定的操作。反过来,只要还谈得上"风险防控",就说明粒度还没切到位,认知还停留在非断言层,细碎处理的前提尚未成立。预案是粒度不够细时的代偿,不是细碎处理本身。
三、概率模型做不了精细活:softmax 采样噪声是内禀的
问题侧四确定全部满足之后,还有第五个确定——执行者侧确定:执行者必须是不会犯错的机器。这一条比前四条更隐蔽,却更致命。它来自一个数学事实:大模型的每次生成,都是一个采样过程。
语言模型的输出层是 softmax:每个词的概率正比于 exp(zi/T),其中 zi 是模型给候选词的打分,T 是温度 [1]。温度等于 1 时是标准 softmax,T 越大分布越平、采样越随机。这意味着 LLM 的每一个 token 都是从一个概率分布里抽出来的——不是查表,是抽样。抽样就有噪声:同样的输入,同样的上下文,两次生成可能差一个词;而一个词的差别,在一个需要"精确改这一句"的任务里,就是天壤之别。
细碎处理要求的是确定性动作:把 L02S01 补到文件末尾,就是把 L02S01 补到文件末尾,不允许"补成 L02S02"或"顺手加个空格"。但 LLM 无法提供这种确定性——它的输出由采样决定,采样的随机性是内禀的,温度参数只是缩放分布,无法消除噪声。精度不可能超过采样噪声:这不是模型不够好的工程缺陷,而是 exp(zi/T) 这个公式决定的架构事实。
于是细碎处理面对 LLM 时出现一个无法绕开的陷阱——幻觉概率的累积。设单次修复的幻觉概率为 p(一个大于零的常数,GPT-4 的技术报告也承认模型"can suffer from hallucinations",幻觉是机制性的而非偶然 [2])。细碎处理做 N 次,至少一次出幻觉的概率是:
p 不随次数变化——次数不影响概率,但影响触发次数。单次 p=0.1 时,修 1 次的风险是 10%,修 5 次是 41%,修 10 次是 65%;p=0.2 时,10 次累积到 89%。细碎处理做得越多,整体出幻觉的概率越逼近 1。每一次"小修补"都像是往一个账户里存一份风险,而利率是复利。9c 里我写过"推理免疫"——大模型对语义不对等免疫,靠的是自回归解码范式 [3];但免疫有边界:免疫不了采样噪声本身。幻觉是范式内胎生的,不是外来的。
四、区域重构不是没有粒度:粒度让渡给成本切割
如果细碎处理是确定性的特权,那么所有五确定不满足的问题,就只能走向区域重构。但区域重构常被误解为"没有粒度"——整段重写嘛,还要粒度干什么?这是误读。区域重构不代表着没有粒度,而是成本如何切割的平衡性考量。
重构的粒度不在"改哪一行",而在"输入约束":给 LLM 的重写指令里,保留首行标题、保留末行编号、字数 ±15%、不改剧情关键走向——这些约束就是重构的粒度。约束越紧,重构的"颗粒"越细;约束越松,重构越自由、风险也越大。所以重构不是放弃粒度,而是把粒度从"执行端"让渡到"约束端":执行端不再细碎(整段重写),约束端保持精细(五条硬约束)。成本切割指的是这个:在"执行自由"和"约束精细"之间找平衡,而不是在两个极端之间二选一。
那么,什么情况下重构的收益远超细碎处理?三个特征:
① 难定位。 问题说不清在哪一行——情绪弧突兀,定位到"某一整段的情绪曲线",但具体哪句导致的,说不清。细碎无从下刀,重构整段一次解决。
② 非定量。 问题没有客观度量——"对话不像角色"没有分数,"正文偏离概述"虽有相似度分数,但 0.55 和 0.6 之间差什么、改哪里能提升,模型不知道。无法量化的目标,无法定点逼近,只能整段重来。
③ 多推进点位。 一个问题牵动多个位置——"角色消失"可能同时要求上一段收尾、本段补戏、下一段衔接;"情绪弧突兀"涉及段落内部的起承转合。单点修补会牵一发动全身,重构是唯一能同时照顾多个点位的手段。
这三个特征同时指向一个结论:对于 LLM 来说,区域重构的收益大于细碎处理——难定位、非定量、多推进点位的问题,重构收益远远大于细碎处理。 一个根因散布在多个环节、无法量化、无法定位到单点的问题,逐环节微调只会越调越乱(第三节的噪声累积),只有区域级的重组织才能一次理顺。这三个特征的本质,是问题在细粒度上无法断言——位置说不准、数量说不准、牵动面说不准,任何单点修补都是在非断言状态下出手;重构不要求断言到点,只要求在约束端把边界划清。判断"该优化还是该重构"的标尺,正是这三个特征:能定位、能定量、单点推动,就细碎;否则,就重构。
五、细碎处理的死循环:验证迷思与嵌死的思维链
细碎处理还有一个结构性风险,比幻觉累积更隐蔽——死循环。它由两个机制构成。
第一个机制是验证迷思。细碎处理假定"修完就能验证":末行补了,跑个正则确认,过了。但五确定里没有验证这一项——因为验证本身常常不是确定的。语义类问题的验证要靠重跑语义检查、重跑推理审核——而这两者也是概率模型(bge 的相似度、R1 的判定),它们的输出同样带噪声。于是出现一个荒谬的局面:用带噪声的验证器去验证带噪声的修复——修好了没检测出来,检测出来可能是误报,误报又触发新一轮修复。每一轮都在噪声里打转,永远走不出来。这就是验证迷思:以为验证是终审,实际上验证也是概率事件,验证本身的不可靠让"修好"永远无法被确认。
第二个机制是嵌死的思维链。细碎处理天然是链式的:改 A → 验证 → 发现 B → 改 B → 验证 → 发现 C……每一步都依赖上一步的结果,链条越走越长。如果每步的验证都不可靠(第一个机制),链条上就会累积噪声,最终指向一个无法收敛的状态。更糟的是,这种链式结构会让人误以为"在前进"——每一步都有输出、都有进展假象,但实际上是在绕圈。细碎处理代表着一个可能无穷无尽的 loop 死循环:嵌死的思维链,永远走不出来的验证迷思。
判断是否该停止细碎、转向重构的标志:依赖链是否已经长到无法独立验证任何一环。 链一旦嵌死,止损的方式不是继续走,而是退出来整段重写。
六、五确定决策树:细碎是代码的特权,重构是 LLM 的正道
把前面的论证收拢成一张决策树。对任何一个检出的问题:
这里把原来说的"验证确定"替换为"执行者能保证确定"——更准确:细碎处理的本质是执行确定性,执行者必须是零噪声的(代码),验证只是执行确定性的下游确认。五个条件全满足,细碎处理才合法;任何一项不满足,就重构。
这个决策树不是纸面推演——它已经在我的 skill-standardization 审计技能里落地验证过了。那个技能对 skill 文件做 26 类规则审计,每条规则输出:独立 ID、规则 ID、severity、问题描述、修复指引、上下文行——这就是问题侧四确定的输出协议 [4]。配套的 fix.py 里有 30 多个确定性修复函数:fix_name、fix_version、fix_h1、fix_section_trigger、fix_permission_weight……每个函数对应一个问题侧四确定全满足的问题类型,全部用代码执行——执行者侧确定由"代码不会出错"天然满足,五确定完整闭合 [4]。而 safe_patch_by_line 提供了行号级定位修复——不依赖字符串匹配,只依赖行号,比任何模糊匹配都鲁棒 [5]。这才是细碎处理的正确姿势:把问题压到五确定 + 行号级坐标,然后交给代码。 修复引擎里那几个能代码修的格式问题(末行编号、禁用模式),走的就是同一条路。
反过来,审计技能里凡是代码修不了的内容类问题(比如 R-25 的写作质量问题),输出协议里标注"→ LLM执行:修复指引"——但执行方式不是细碎修补,而是让 LLM 按指引重写相关区域。**审计技能用工程实践证明:细碎处理 30 个 fix_* 全是代码,LLM 只在重构级介入。**
最终的分工是清晰的:
| 执行者 | 适用问题 | 数学依据 |
|---|---|---|
| 代码 | 五确定 + 行号级坐标(末行/禁用/字段) | 零噪声,N 次累积仍为零 |
| LLM 重构 | 难定位/非定量/多推进点(语义/推理/创作) | 1 次 p,优于 N 次 p 累积 |
| 人工 | 模型自身失效(审核失败/反复重构无改善) | 人类判断,绕出死循环 |
七、结语:粒度是地形,不是偏好
回到开头的问题:六检查出一堆问题,从什么粒度下刀?答案不是"能细碎就细碎,不能就重构"这种经验主义,而是:细碎处理是确定性特权,五确定全满足才配细碎,且细碎的执行者只能是代码;区域重构是成本切割,粒度在约束端而非执行端,难定位/非定量/多推进点位的问题重构胜。 概率模型做不了精细活不是能力不足,是 softmax 采样噪声内禀——幻觉随次数复利累积,细碎对 LLM 是陷阱;区域重构一次 p,风险可控可回滚。
怎么切割一项工作的单元,比怎么执行它更接近成败的源头——这句话我开头说了,现在把它放在这里,不再解释。粒度是地形,不是偏好:承认地形,选对切法,剩下的才是执行。 从 09 到 09d,是同一个命题的第四次侧影:09 说穷举是宿命,09b 说配置推动一致性,09c 说匹配要让位给推理,这一篇说的是——在确定性的地形上,让代码走细碎;在不确定性的地形上,让重构承担一次性的风险。粒度选择,本质上是对确定性的诚实。
引用与出处说明
引文全部来自本人项目的实际代码、实测数据与本地知识库(KB:LLM奠基理论/大模型万象/量子物理和弦/数字与建模/政经文哲),文献均为库内实有原文;[1][2] 为本地 KB 原文检索,[4][5] 为本人项目代码实证。
| 编号 | 引用 | 出处 |
|---|---|---|
| [1] | Hinton, Vinyals & Dean. Distilling the Knowledge in a Neural Network(softmax-temperature:pi = exp(zi/T) / Σj exp(zj/T),温度缩放输出分布) | KB「LLM奠基理论」(softmax-temperature 原文,FTS 检索实证) |
| [2] | OpenAI. GPT-4 Technical Report("can suffer from 'hallucinations'...tendency to produce hallucinations"——幻觉是机制性倾向) | KB「LLM奠基理论」(OpenAI 2023 原文,FTS 检索实证) |
| [3] | wUwproject. 09c:天然不对等与噪音抑制——语义匹配范式的不对等困境与推理免疫(推理免疫:自回归语义解码范式对形式差异免疫) | Cogito_Scribit 方法论体系(本人文章) |
| [4] | wUwproject. skill-standardization 审计技能:scripts/skill_audit/__init__.py(_expand_fail_entries:每条 FAIL → 独立 ID + 规则 ID + severity + 问题描述 + 修复指引 + 上下文行)、scripts/skill_audit/fix.py(30+ 个 fix_* 确定性修复函数) | 本人项目代码实证(本地技能库 ~/dev/skills/skill-standardization) |
| [5] | wUwproject. skill-standardization 审计技能:scripts/safe_io.py(safe_patch_by_line:行号级替换,不依赖字符串匹配,含 rollback_id 回滚) | 本人项目代码实证 |
| [6] | 量子物理和弦库:统计力学文献("utilizing sampling methods and other statistical analyses"、"temperature...maximum entropy ensemble"——温度→最大熵系综,采样统计性) | KB「量子物理和弦」(FTS 检索实证) |
| [7] | 数字与建模库:图像分割/机制设计文献("parameter that controls coalition granularity...identifying the specific value of γ that yields meaningful equilibria"——粒度是机制设计的核心调参) | KB「数字与建模」(FTS 检索实证) |
| [8] | 政经文哲库:《论中国共产党执政安全的系统思维》等("确定性安全思维与不确定性安全思维的统一"——确定性/不确定性是两套处理范式) | KB「政经文哲」(FTS 检索实证) |
| [9] | wUwproject. 09:穷举的宿命——稳定与随机的悖论(本文的数学母体:稳定与随机的对抗) | Cogito_Scribit 方法论体系 |
| [10] | wUwproject. 09b:配置推动的穷举一致性——统一推动点位与误差的哲学(确定性来自统一推动点位,不是预案) | Cogito_Scribit 方法论体系 |
说明:[1][2] 的"温度缩放分布/幻觉机制性"为本地 KB 原文检索所得(FTS 命中 Hinton 蒸馏与 OpenAI 报告的原始段落);[6][7][8] 为对应 KB 的 FTS 英文/中文关键词命中原文;"五确定决策树"与"1-(1-p)^N 幻觉累积"为本文的数学推导,非文献原话;细碎处理/区域重构的工程对应(fix_* 函数、safe_patch_by_line、_expand_fail_entries)为 skill-standardization 实际代码结构。
延伸阅读
- 第 III 部 · 09:穷举的宿命——稳定与随机的悖论:本文的数学母体。"幻觉累积 1-(1-p)^N"直接承袭 09 的"稳定与随机"命题——概率模型的随机性在细碎处理里复利化。
- 第 III 部 · 09b:配置推动的穷举一致性:本文第二节的直接先导。"预案不是细碎处理"对应 09b 的"确定性来自统一推动点位"——预案是承认不确定,细碎是消灭不确定。
- 第 III 部 · 09c:天然不对等与噪音抑制:本文第三节的补充。"推理免疫有边界——免疫不了采样噪声本身",把 09c 的范式选型推进到执行者选型。
- skill-standardization 审计技能:
scripts/skill_audit/(五确定输出协议 + 30+ fix_* 确定性修复)、scripts/safe_io.py(safe_patch_by_line 行号级修复)——细碎处理"确定性特权"的工程实证。 - structured-writer 修复引擎:
docs/repair_engine_design.md(T0 细碎/T1 重构分级)、novel_repair_engine.py(apply_t0 代码修复 + rewrite_segment 整段重构)——本文决策树的落地实现。
第 III 部 · 09e|方法论体系构建的沉淀:提示词拉扯的边界——概率曲线的形状工程与定性精度的空耗
一、引子:概率曲线与两道杠
我的结构化写作引擎 structured-writer 有一个固定的写作链路:规划章节、写作、六种检查(格式、连续性、承诺链、逻辑、语义、推理)、不合格就修、修完重检。这个链路的每一步都在反复做同一件事:给模型一条提示词,然后从模型吐出的概率分布里取一个样本。规划是给模型"请按此结构规划章节",写作是给模型"请按规划写这一章",六检是给模型"请判断这一段有没有问题"——全部是提示词与分布的交互。
这条路走久了,会撞见一个奇怪的现象:提示词的写法,对输出质量的影响,远远大于模型精度的选择。 同一模型,提示词里多一句"保留末行编号、字数 ±15%"的约束,章节就能稳定通过六检;提示词里只有一句"你必须写得好",章节就飘。反过来,把 KV cache 从 FP16 换成 Q8_0(bit 宽度减半),引擎实测加载、推理完全正常,显存净省 412MB(1B 全 GPU 实测)[6]——而 8-bit KV 量化对输出分布的扰动在采样噪声量级(此为量化理论推论,structured-writer 未做过文本质量对比实测)。提示词是拉扯分布的手,精度只是分布里那点噪声的粗细——手一用力,噪声粗细根本感觉不到。
这就像一个验孕棒测试:两道杠就是阳性。但"两道杠"的深浅有没有意义?有——深浅反映的是信号离检测阈值的距离:hCG 浓度远高于阈值,两条杠都深得发黑,深浅毫无意义;hCG 浓度贴着阈值,第二道杠浅得若隐若现,深浅就是命脉。把"深浅"翻译成概率曲线的语言:提示词的确定性程度 = 曲线目标路径的陡峭程度。 提示词给得精准,目标路径被拉成陡峰,采样几乎必然落在峰顶——这就是"深杠";提示词给得模糊,曲线平坦如原野,采样落在哪里全凭运气——这就是"浅杠";而"你必须"这类语气词,只是在原野上加深了颜色,没有改变任何一座峰的形状。
这篇文章的边界只有一条:提示词工程对模型的拉扯——提示词如何重塑条件概率分布的形状,以及这种拉扯的边界在哪里。 四个问题:
- 提示词到底是怎么拉扯概率曲线的?为什么"必须"拉不动、结构约束拉得动?
- 精准的定性指令("拆成五类""给出精确范围")和死板废话("你必须语义拆分")在概率曲线上有什么本质区别?
- 定性精度的空耗(Q8_0 vs FP16)与提示词拉扯是什么数量级的关系?
- 定量和定性到底是什么关系?为什么说它们不是竞争,是同促?
四个问题一条主线:提示词是模型行为的主导控制变量,它通过重塑概率曲线的形状拉扯模型;而曲线从来不是纯定性或纯定量的——定性的边界由定量撑起,定量的意义由定性收束,拉扯的效力取决于离决策阈值的距离与误差传播路径的长度。
二、提示词是怎么拉扯概率曲线的
先给"概率曲线"一个严格的定义。语言模型是一个条件概率分布:给定前文 token 序列 s1, s2, ..., sn-1,模型输出下一个 token sn 的概率分布。GPT-2 的论文把这一点写得很清楚——语言建模就是最大化下式的乘积 [1]:
提示词就是条件里的那一段固定前缀。 用户输入的全部 token——指令、示例、格式要求、上下文——构成了 s1...sk,模型后续生成的每一个 token 都以这段前缀为条件。提示词变了,条件变了,整条链上每一个后续 token 的分布全部跟着变。提示词是分布的开关,不是分布的调节旋钮——它直接替换条件,而不只是微调输出。
输出层的分布形状由一个公式决定——softmax [2]:
其中 zi 是模型给候选 token 的打分(logits),T 是温度。模型对"下一个词该是谁"有一份原始打分,softmax 把打分变成概率,采样器从概率里抽一个 token 出来。概率曲线的形状由 logits 的分布决定:一个候选的 logits 远高于其他候选,曲线就是陡峰;所有候选的 logits 接近,曲线就是平野。
现在关键的问题来了:提示词怎么改变这条曲线?
答案是:通过改变 logits 的相对结构。提示词里出现"输出 JSON",模型在训练中见过无数"JSON 指令 → JSON 输出"的序列,于是 JSON 相关 token 的 logits 被系统性抬高,其他 token 的 logits 相对压低——曲线从平野变成一座指向 JSON 的峰。提示词里给出示例(few-shot),示例 token 激活的模式把目标路径的 logits 进一步抬升。提示词拉扯的是 logits 的相对结构:哪条路径被抬高、哪条被压低、抬多少压多少,全部由提示词的内容决定。
这里有一个关键数学事实——softmax 的平移不变性:
给所有 logits 同时加上一个常数,softmax 的输出完全不变。这意味着:任何"对所有路径一视同仁"的影响,在概率层面等于零。 一条指令要真正改变模型的行为,它必须非均匀地改变 logits——让这条路径上去、那条路径下来;均匀地"强化所有路径"(抬升所有 logits)在数学上等于什么都没做。
这个事实直接埋葬了一大类提示词写法。"你必须认真""一定要准确""绝对不许出错"——这类语气词的作用机制,是对所有候选路径施加一个近乎均匀的"强调偏移"。 这里必须把两件事分开:softmax 平移不变性是数学事实(均匀偏移 → 分布严格不变);而"语气词产生均匀偏移"是对语气词作用的经验刻画——语气词作为输入 token 会经过注意力机制,其影响不可能是数学上严格的均匀,但实践中它不指向任何具体路径、不建立任何结构,对 logits 相对结构的影响远弱于结构性指令,量级接近均匀偏移。按平移不变性:如果影响是均匀的,分布不变;实际影响接近均匀,分布的形状变化趋近于零。 语气词真正能改变的是让模型在措辞上显得更"用力",但概率曲线的峰谷形状没有因此被拉动,采样结果自然也没有结构性变化。这就是"死板废话"的操作性定义:对 logits 的影响接近均匀(不指向路径、不建立结构),因而对概率分布形状的拉扯趋近于零——这是一个经验论证,以"语气词≈均匀偏移"为假设前提,而非先验的数学定理。
反过来,什么才是真正的拉扯?非均匀的结构性指令:
| 指令类型 | 对 logits 的作用 | 曲线变化 |
|---|---|---|
| "必须认真"(语气) | 近似均匀偏移(所有路径 +c) | 无(softmax 平移不变) |
| "输出 JSON,格式为 {key: value}"(结构) | 抬高 JSON 路径、压低其他 | 平野 → 陡峰 |
| "拆成五类:A/B/C/D/E"(划界) | 抬高五类路径、建立类间边界 | 平野 → 五峰 |
| "字数 ±15%,保留末行编号"(范围) | 抬高合规路径、压低越界路径 | 目标区间成峰,越界被削 |
| 示例(few-shot) | 激活模式,定向抬升示范路径 | 示范路径显著成峰 |
注意到上表的最后三行有一个共同点:它们全部是"定性"指令。 分类(拆成五类)、范围(±15%)、格式(JSON)——没有一个携带数字精度,但每一个都真实地拉扯了分布。定性的精准,在概率层面就是"把该抬的路径抬到位、该压的路径压到位"——划界划得准,曲线形状就对;划界划得糊,曲线形状就塌。 这就是下一节要展开的:为什么死板废话拉不动分布,以及精准定性为什么是分布的形状工程。
三、死板废话的诊断:为什么"必须语义拆分"拉不动分布
"你必须进行语义拆分。"——这句话在概率曲线上做了什么?
它没有定义拆分的类(没有抬高任何具体的"类路径"),没有给出输出的格式(没有抬高任何"格式路径"),没有给出判断标准(没有压低任何"不拆分路径")。它只做了一件事:在所有路径上加了一个"必须"的均匀强调。而上一节的 softmax 平移不变性告诉我们:均匀强调在概率层面等于零——当然,前提是"必须"确实只产生接近均匀的影响(第二节已说明这是对语气词作用的经验刻画)。在这前提下,这句话对分布的拉扯力趋近于零——它就是死板废话。
死板废话的结构性定义:强调成分(语气词、祈使词、重复的"必须")占比高,而结构成分(可操作、可验证、可枚举的内容)占比低的指令。 在概率语言里可以写得更精确:死板废话对 logits 的影响接近均匀(只抬语气、不改变相对结构),因而对概率分布的形状几乎没有拉扯。
诊断死板废话,三个判据,合称指令侧三查(与 09d 的问题侧四确定呼应,但落在指令上)[5]:
① 可枚举吗? 指令的对象能否列出有限的集合?"拆分语义"——拆出哪几类?列不出集合,就没有"类路径"可抬,分布无从成形。
② 可定位吗? 指令的作用范围能否指出坐标?"对第三段重写"可以定位——目标段落路径被抬高;"把这篇写得更好"不可定位——没有哪条路径被指定。
③ 可验证吗? 执行完怎么知道做对了?"字数 ±15%"可验证——合规路径有明确的判据可抬;"写得自然一点"不可验证——没有判据,分布没有收敛点。
三查全过,指令在结构上拉得动分布;三查全不过,指令就是死板废话——无论它叠多少个"必须"。三查的本质是同一个东西:你的指令有没有建立非均匀的 logits 结构。
这里有一个必须澄清的反直觉点:死板废话不产生于"要求严苛",恰恰产生于"结构空洞"。 语气越严苛(必须、绝对、一定),越容易被误认为"约束很强"——但约束的强度在概率层面不取决于语气,取决于结构:一条结构明确、零语气词的指令("把 L02S01 的末行编号补上"——可枚举、可定位、可验证)的拉扯力,远超十条"你必须认真"。
还有更糟的一面:死板废话式的回应,是概率模型在空洞指令下最可能采到的输出。 当提示词本身是死板废话时("请给出专业的建议"),模型会如何回应?它会从自己的训练数据里采样——训练数据里充斥着"建议检查内存使用情况,优化配置"这类语气正确、结构空洞的文本。模型不是"故意敷衍",它是沿着概率曲线采样,而死板废话的分布本来就是平野——平野上采样,最可能采到的就是训练数据里出现频率最高的"万能回复"。 我在 structured-writer 3.0.0b22 那次修复里亲历过这个机制的镜像:修复引擎在共享模型后崩溃,我第一反应是往"内存/KV"方向排查——KV cache 膨胀、显存不足,全是定量方向。用户一句话点醒我:"压根不是爆内存包缓存,查代码!!"[11]。这句话没有任何数字,但它把条件从"资源排查分布"直接替换成"代码排查分布"——根因(并发调用同一 Llama 实例)、位置(run() 后台线程在锁外执行)、修法(防重入)全部被这一句定性指令拉出形状。事后证明崩溃真因确实是代码级并发竞态,跟内存、KV 毫无关系 [11]。一条定性指令,把我从一条空转了好几轮的分布上,一把拉到了正确分布上。
这个实证同时揭示了提示词拉扯的另一半真相:拉扯的方向,决定排查的收敛。 我给模型(或自己)的指令指向哪条分布,采样就收敛到哪条分布;指令指向一条不存在的分布(内存问题),采样就在错误的平原上空转。提示词工程的价值,一半在"拉得动",一半在"拉得对"。
四、精准定性 = 分布的形状工程
如果死板废话是"只加深颜色不改变形状",那么精准定性就是"把形状拉对"。这一节把"定性"和"分布形状"彻底焊在一起。
先说结论:给 LLM 的每一条指令,本质上都在雕刻一条概率曲线的形状。 指令的"坐标形态"直接决定曲线的形状类型:
| 坐标形态 | 概率曲线形状 | 例子 |
|---|---|---|
| 二元(对/错、HARD/SOFT) | 双峰,峰间深谷 | "判 HARD 还是 SOFT" |
| 多元(与/或/非、五类) | n 峰,峰间有界 | "拆成五类:A/B/C/D/E" |
| 区间(精确范围) | 目标区间成峰,越界被削 | "字数 ±15%" |
| 连续定量(给数字) | 单点峰(往往过拟合到虚假精度) | "相似度要到 0.87" |
这张表的前三行有一个共同点,也是这一节的核心:它们全是"定性"坐标,但全部能真实拉扯分布。 二元坐标拉出双峰,多元坐标拉出 n 峰,区间坐标拉出带边界的高原——定性的精准,就是峰的精准:峰的位置对(划界对)、峰的宽度合适(边界可信)、峰与峰之间分得开(类间可区分)。 定性从来不是"没有精度",定性是一种坐标形态,它的精度体现在峰的几何上,而不是体现在小数位数上。
再看第四行——连续定量。这里有一个反直觉的结论:给模型一个具体数字,常常不是在雕刻分布,而是在制造虚假精度。 因为模型内部的条件分布是离散 token 上的分布,不是连续实数上的分布——你告诉它"相似度 0.87",它只能把"0.87"当成一个 token 采出来,而这个 token 对它后续行为的结构约束力很弱(模型对孤立数字的语义理解有限,它不会像对待"拆成五类"那样给 0.87 建立可执行的路径结构)。连续定量在提示词层面常常退化成另一种语气词:它听起来很精确,但对 logits 的结构贡献远弱于分类、格式、范围类指令。 这就是"精准的论断 vs 精确的范围"在概率层面的答案:"相似度必须达到 0.87"是虚假精度(拉不动分布),"正文偏离概述时整段重写"是结构约束(拉得动分布)。 09d 里我写过:相似度 0.55 和 0.6 之间差什么、改哪里能提升,模型根本不知道 [5]——现在可以补一句:它不知道,是因为 0.55/0.6 这两个数字从来没有参与过任何一条 token 路径的结构决策——注意,这是从"模型对孤立数字语义理解有限"推出的经验性判断(09d 实测过模型答不出 0.55 与 0.6 的差异),而不是量化理论的必然结论。
这带来一个工程推论,也是整个提示词工程最核心的一条:给 LLM 的指令,能划区间的别划点,能划多元的别划二元,能划二元的别写废话——坐标形态必须匹配任务的决策结构。 任务是二元的(通过/不通过),就给二元判据;结论是一个范围(字数、容差),就给区间坐标;需要细分(修复分级 T0/T1/T2),就给多元坐标。指令的坐标形态就是你要拉出来的分布形状:你想让模型在哪个形状上采样,就把指令写成哪个形状。
structured-writer 的修复引擎就是形状工程的活样本。3.0.0b14 那次:n_gpu_layers=-1(全 GPU 卸载)对放不下的 35B 模型触发 VMM 慢路径,加载要 200 多秒;改成"放得下才试 -1,放不下用估算层数"(精确范围),加载时间从 211 秒降到 38 秒 [8]。这里的两个指令形态——"-1"(精准论断)和"估算放得下几层算几层"(精确范围)——在代码层面没有本质区别,但对执行路径的拉扯截然不同:-1 把执行器拉向"全 GPU"这条不存在(放不下)的路径,估算层数把执行器拉向"放得下几层卸载几层"这条真实存在的路径。 指令的坐标形态错了,执行器就在错误的路径上空转——这不只是提示词工程的道理,是同一个原理在所有"指令-执行"系统里的投影。
还有 b12 的一个细节:KV 每 token 显存按模型结构实算(35B 约 80KB/token@fp16),用"可用内存 × 0.8 − 权重 ÷ KV 每 token"推导窗口——这是给"窗口"这个参数一个精确的范围,而不是给一个拍脑袋的固定值;而当内存紧张时窗口自动缩小(模拟 28GB 可用 → 35B n_ctx=35K)[12]。这个"动态范围"就是区间坐标在工程配置里的标准形态:它承认不确定(内存是动态的),但把不确定圈进了可验证的边界。 精准定性在工程里的最高形态,从来不是某个精确到小数点后几位的固定值,而是一条能随条件收缩的精确范围。
五、定性与定量的同促:概率论是循环的数学载体
第四节说"连续定量在提示词层面常退化为虚假精度"——这句话容易被误读成"定量在提示词里没用"。必须立刻纠正这个偏差:定量不是没用,定量只有在撑起定性边界时才有价值。 这是定性与定量的同促关系——两条命题互相咬合:
命题一:定量的边界是定性。 测量再精细,最终都要落回一个定性决策——过/不过、阳/阴、A/B、修/不修。0.5867 这个读数本身不产生任何行动,只有"通过/不通过"产生行动。定量没有终点,终点永远是定性的:定量被定性收束。
命题二:定性的边界由定量撑起。 定性划界不是凭空划的——"阳性"的边界由 hCG 浓度阈值撑起,"显著"的边界由显著性水平 α 撑起,"偏离概述"的边界由相似度阈值撑起。定性划出结构,定量给出边界的位置。
这两条命题不是修辞,概率论就是它们循环的数学载体。三个例证:
例证一:贝叶斯决策——定量算后验,定性做决策。 贝叶斯滤波的经典应用是机器人地面接触状态估计:轮式双足机器人只用 IMU 和关节扭矩传感器(连续定量读数),估计"接触/无接触"(二值定性状态)[16]。传感器读数(定量)→ 贝叶斯更新 → 接触概率(定量)→ 阈值判定 → 接触状态(定性)。定量的测量撑起了定性状态的边界,定性的状态又决定了下一步要采集哪些定量测量——循环闭合。 这个例证和"两道杠"是同构的:hCG 浓度(定量)→ 检测概率(定量)→ 阈值 → 阳性/阴性(定性)。概率论没有停留在"定性"或"定量"任何一侧——它把两侧焊成同一个决策机制。
例证二:假设检验——α 是定性决策的定量形态。 一篇 2026 年发表于 IEEE Access 的评估方法论综述([17])主张:模型比较应该框架化为统计假设检验,而不是看 leaderboard 上的裸分数——显著性水平 α(定量)→ 拒绝域(定量边界)→ "模型 A 显著优于 B"(定性结论)。但 α 取 0.05 还是 0.01,本身是一个定性权衡——你愿意承受多大的第一类错误代价——而这个定性权衡必须以定量数字的形式存在,才能撑起拒绝域的边界 [17]。α 是定性权衡的定量化身,拒绝域是定量划出的边界,结论是定性收束——三个环节互相撑起,缺一环则整个检验失效。 这就是"定性的边界由定量撑起"最精确的教科书形态:没有 0.05,就没有"显著"这个词的边界。
例证三:softmax 自回归——语言模型本身就是定性-定量循环的机器。 回到第二节的公式:logits(定量)→ softmax 分布(定量)→ 采样决策(定性:选哪个 token)→ 选中的 token 成为下一个 logits 的条件(定量)[1][2]。每一次生成都是一次完整的循环:定量喂给定性,定性又变成定量的新条件。 提示词拉扯之所以能工作,正是因为它站在这个循环的入口:改变条件(定量 logits 的结构),改变采样(定性的选择),改变下一个条件(新的 logits 结构)。
三个例证指向同一个结构:
落到提示词工程,这个循环给出了一条"有效提示词"的完整配方:有效的提示词 = 定性结构 × 定量边界。 定性结构(分类、格式、步骤)定义"拉出什么形状";定量边界(阈值、范围上下界)定义"边界立在哪个位置"。两个例子:
- "相似度低于 0.5 判为偏离"——定性划界(偏离/不偏离)× 定量边界(0.5)——可执行;"语义不符合判偏离"——只有划界没有边界——不可执行。
- "字数 ±15%,保留末行编号"——定性划界(合规/越界)× 定量边界(±15%)——structured-writer 的真实约束 [5];"你必须写得好"——既无划界也无边界——死板废话。
反过来,只有定量没有定性收束的指令("相似度 0.87")是虚假精度——它没有撑起任何边界,也没有被任何定性决策消费,数值再精确也是悬空的。定量的价值 = 它撑起的定性边界的分量。 撑起边界的定量(阈值、范围、概率)是命脉;不撑边界的定量(Q8_0 与 FP16 的精度位数、0.87 的虚假精度)是空耗。
这一节同时把下一节的"空耗"从一个现象升级为一个判据:精度空耗 ⇔ 不撑边界的定量。 Q8_0 vs FP16 的差异不撑任何定性边界(章节离六检阈值远),所以空耗;阈值 0.5、范围 ±15% 撑起了定性边界,所以是命脉。更进一步,这与第七节的"阈值距离判据"完全闭环:贴阈值的定量(深浅、概率贴近 0.5)在撑边界,是命脉;离阈值远的定量(Q8_0 的噪声级扰动)不撑边界,是死信息。 同促是"定量值多少钱"的正面回答,空耗是它的反面——两条命题说的是同一件事:定量和定性不是竞争关系,是同促关系——定性给定量方向和终点,定量给定性边界和位置。
六、定性精度的空耗:精度调优 vs 提示词拉扯的数量级对比
这一节回答最初触发整篇文章的问题:Q8_0 和 FP16 的精度差异,在"提示词拉扯"的坐标系里到底算什么?
先摆数据。structured-writer 3.0.0b13:KV cache 从 FP16 换成 Q8_0,同一模型(1B 全 GPU)、同一上下文,显存省 412MB,flash_attn 路径加载、推理完全正常 [6]——CHANGELOG 只记录了加载/推理正常与显存节省,未做文本质量对比;8-bit KV 量化对输出分布的影响属于采样噪声量级,是量化理论推论(KV 量化损失的是注意力 KV 值的低位精度,误差经注意力传播到输出分布,与 softmax 采样噪声同量级),不是引擎实测。3.0.0b21:修复引擎 n_ctx 固定 16384 后 KV 缓存压缩到约 0.7GB——精度档位是被资源约束逼着选的,不是被"更准"的追求逼着选的 [7]。3.1.0b1:同一模型 llama.cpp 直挂 8 t/s vs LM Studio 20+ t/s,吞吐翻两倍半 [9]——差距的主因是两代推理内核的代差:llama-cpp-python 官方 PyPI 最高 0.3.35(2025 年初内核,已停更),旧内核对 Qwen3.5/3.6-35B-A3B(新 MoE)无专家并行/CUDA MoE kernel 优化,9 层 partial offload 后 55 层(含全部专家)在 CPU 串行,8 t/s 是旧内核的物理极限;LM Studio 用最新 llama.cpp master,20+ t/s 是 MoE 优化的收益(CHANGELOG 记录的是吞吐差距与根因,输出质量相当为推断)。
这三条数据放在"提示词拉扯"的坐标系里,结论非常清晰:精度调优(Q8_0 vs FP16)移动的是输出分布的噪声级扰动,提示词拉扯改变的是 logits 的结构级差异。 8-bit KV 量化损失的是注意力 KV 值的低位精度(相对误差约 0.4% 量级),误差经注意力机制间接传播到输出分布,这种扰动与 softmax 的温度采样噪声属于同一个数量级,被淹没在采样噪声里;而提示词改变的是 logits 的相对结构——目标路径抬升多少、竞争路径压低多少——这个差异是结构级的,直接决定曲线的峰谷。精度调优是曲线坐标纸的细密程度,提示词拉扯是曲线本身的形状。坐标纸再细,也改变不了曲线的峰谷;曲线形状一旦被拉扯,坐标纸的粗细根本无感。
把数量级关系写清楚:
提示词结构决定 logits 的主项(峰谷),精度与采样噪声是 ε(扰动)。Q8_0 vs FP16 只改 ε 的量级——而 ε 本来就淹没在采样噪声里,改 ε 的粗细不影响主项的峰谷。这就是"定性精度的空耗":当模型行为由提示词结构主导时,为精度位数付费,买到的只是噪声粗细的微调——边际收益趋近于零。
3.1.0b1 那条数据,恰好能给这个数量级关系补一个更锋利的侧面证据:8 → 20+ t/s 的差距不是精度调优买来的,是内核代差换来的——llama-cpp-python 停更在 0.3.35(2025 年初内核),对 Qwen3.5/3.6-35B-A3B 这类新 MoE 架构没有专家并行与 CUDA MoE kernel 优化,55 层专家(含全部专家)在 CPU 串行,8 t/s 是它的物理极限;LM Studio 用最新 llama.cpp master,MoE 优化完整,20+ t/s。同一个模型、同一个权重,只换内核(结构级变化),吞吐翻两倍半;同一个模型、同一个内核,只换精度位数(噪声级变化),输出分布的变化被淹没在采样噪声里——后者是第六节开头的量化理论推论(structured-writer 未做过文本质量对比实测),前者是 CHANGELOG 实测。 代差是结构级的收益,精度是噪声级的收益——这条实证比 Q8_0 更硬:它把"结构级 ≫ 噪声级"从精度对比推广到了内核代次对比,而提示词拉扯(另一类结构级变化)与内核代差同属一个层级,作用层级都在精度调优之上。
这里有一个必须补上的侧面:精度空耗的结论只在"提示词结构已经到位"时成立。反过来,如果提示词结构本身就是空的(死板废话),那模型行为完全由噪声主导——这时换更大的模型、更精确的精度,本质是在一个"没有形状的分布"上花力气,照样是空耗。3.0.0b11 的实证就是这个镜像:Qwen2.5-3B 判不了"叙事目的/起承转合"这种抽象标准——22 条问题筛到 8 条,剩下仍以伪问题为主 [10]。这不是精度问题,是 3B 模型的分布里根本没有"起承转合"的判别结构;引擎随后落地 Qwen3-8B 作判定模型(3.0.0b12 起注入 /no_think 实测使用)——这是换了一个"分布表达能力"更强的模型,不是把同一个分布修得更细。注意这次换模型同时变了两个变量:规模(3B→8B)与代次(Qwen2.5→Qwen3),CHANGELOG 只记录了"换模型"这一动作、未拆解两者各自贡献——但它们同属结构级变化:定性能力的跃迁来自状态空间的扩大(规模 × 代次),不来自同一空间内的精度提升(位数)——而提示词的作用,是在给定的状态空间里把分布拉成正确的形状。 模型规模与代次是分布表达能力的天花板,提示词是分布的实际塑造者,精度是分布里的噪声粗细——三个变量,作用层级完全不同。**
再把"唯一预测"钉死。用户原话问过:小数点后那几位带来的更精准高维坐标,能否带来"唯一"的那个预测?答案双重的:第一,采样器在架构上就没有"唯一预测"——每个 token 都是按 exp(zi/T) 分布抽样,同一提示词跑两次结果大概率不同 [2];第二,就算精度提升(FP16 比 Q8_0 的 KV 值更"细",误差经注意力传播到输出分布的量级更小)让分布"更接近某个理想分布",这个提升的量级也远小于采样噪声,更远小于提示词结构调整的量级。 追求"唯一预测"是一个范畴错误:采样器的世界没有唯一解,精度投入的上下限都是采样噪声——提示词拉扯才是唯一能大规模改变输出的杠杆,而它改变的不是"唯一",是"概率集中在哪"。
七、拉扯效力的双判据:阈值距离 × 传播路径长度
到这一节,把前面的论证收拢成两个判据。为什么是两个?因为"提示词拉得动拉不动"(结构性问题)解决了,但"这条拉扯值多少钱"(效力问题)还没解决——一条拉得动分布的提示词,它的效力取决于两件事:这条提示词作用的位置离决策阈值有多近,以及这条提示词的误差会沿着执行链传播多远。
判据一:决策阈值距离。 一条提示词拉扯分布之后,模型输出的样本要经过一个"定性判定"(六检过不过、HARD/SOFT、阳性/阴性)——这个判定就是决策阈值。样本离阈值远,提示词的小偏差无感;样本贴阈值,提示词的每一个字都可能是翻盘的关键。提示词的拉扯效力与样本离决策阈值的距离成反比:离得越远,拉扯越廉价;离得越近,拉扯越致命。
判据二:误差传播路径长度。 一条提示词产生的偏差,会沿着执行链传播。structured-writer 的写作链:规划 → 写作 → 六检 → 修复,每章十几步,协议固定——链短,提示词偏差没有放大舞台;09d 的细碎修复链:改 A → 验证 → 发现 B → 改 B → 验证 → 发现 C——链可以无限长,每步的偏差都会累积 [5]。09d 写过幻觉累积公式 P(至少一次幻觉) = 1-(1-p)^N——N 就是传播路径长度的原型 [5]。提示词的拉扯效力与误差传播路径长度成正比:链短,拉扯误差一次就消耗完;链长,拉扯误差复利累积。
两个判据是乘数关系(两个必要条件:判据一决定"这条拉扯够不够得着决策",判据二决定"这条拉扯有没有机会被消耗"——两个条件同时成立拉扯才产生实际价值,故取乘而非加):
四个象限:
| 象限 | 阈值距离 | 传播路径 | 提示词投入策略 |
|---|---|---|---|
| ① | 远 | 短 | 零投入。写作链章节生成:六检判定离阈值远,提示词小偏差不传播 → KV 量化 Q8_0 省 412MB 显存(1B 全 GPU 实测,加载/推理正常),提示词写完就不用管 |
| ② | 远 | 长 | 低投入。偏差沿链传播但每步都远离阈值,累积也够不到阈值——只买"防累积到阈值"的最低保底 |
| ③ | 近 | 短 | 中投入。贴阈值但链短,一次判定定生死——提示词必须把边界划清(b11:3B 判不了就换 8B,是换判别结构不是换精度) |
| ④ | 近 | 长 | 高投入。贴阈值且误差复利——每一步的提示词都在救后面的命,逐字打磨,不留余地 |
对照 structured-writer 的四个实证:b13(KV 量化)落在象限①——写作链离六检阈值远、链短,精度零投入正确(412MB 为 1B 全 GPU 实测,CHANGELOG 未记录 35B 上的 KV 量化显存收益;35B n_ctx=262K 时 Q8_0 使层数估算 7 → 9 层,量化收益随模型规模放大,结论方向不变);b14(层数估算)落在象限①的另一个案例——-1 不是"多投入"而是"指令坐标形态错误",精确范围零成本修正(211s→38s 实测于显存被 LM Studio 占满、估算准确的条件下);3.1.0b1(后端切换)也落象限①——吞吐差距的主因是两代推理内核的代差(旧 llama-cpp-python 0.3.35 缺 MoE 优化 vs LM Studio 最新 master),换内核是结构级路径更换,不是精度投入;b11(模型升级)落在象限③——判定"起承转合"贴阈值(3B 判不了 = 分布里没有判别结构),链短(判定是单步决策),所以换模型(扩状态空间:规模 × 代次)而不是换精度(加密坐标)。
最后一个判断要钉清楚:提示词工程的边界,就是这两个判据划出来的。 在象限①,提示词写到位就够了,再精细的措辞、再高的精度都是边际空耗;在象限④,提示词的每一个字都在对抗累积误差,值得逐字打磨。提示词不是写得越细越好,是"在该细的地方细、在该省的地方省"——而"该细"与"该省"的分界线,就是阈值距离和传播路径长度。 定量神话的祛魅,落在提示词工程上就是一句话:提示词是拉扯分布的手,精度是分布里的噪声粗细——手才是主导变量,别把力气花在换坐标纸上。
八、结语:提示词是拉扯分布的手
回到开头那道两道杠。深浅有没有意义?有——但只在贴近检测阈值时有意义。远离阈值时,深浅是死信息,二值化就是最经济的精准;贴近阈值时,深浅是命脉,必须把坐标升级到连续。提示词工程是同一个道理:一条提示词的拉扯力,不在于它用了多少"必须",而在于它把概率曲线拉成了什么形状;而这条拉扯值多少钱,取决于它作用的位置离决策阈值多远、它的误差会传播多远。
把三个问题全部收口:
- 提示词是怎么拉扯概率曲线的? 提示词是条件概率 p(x)=∏p(sn|s1..sn-1) 的条件——它直接替换条件,非均匀地改变 logits 的相对结构,从而重塑分布形状。语气词只产生近乎均匀的偏移,而 softmax 平移不变性(softmax(x+c)=softmax(x))决定了均匀偏移在概率层面等于零——这是"必须"拉不动分布、结构指令拉得动分布的核心机制(以"语气词≈均匀偏移"为经验前提,见第二节)[1][2]。
- 精准定性和死板废话有什么区别? 精准定性是分布的形状工程——二元拉双峰、多元拉 n 峰、区间拉带边界的高原,峰的精准就是划界的精准;死板废话只加深颜色不改变形状——可枚举、可定位、可验证,三查全不过,分布的形状几乎没有被拉动。连续定量在提示词层面常退化成虚假精度("相似度 0.87"对分布的拉动远弱于结构指令,此为 09d 实测支撑的经验判断)[5]。
- 精度调优与提示词拉扯是什么关系? 精度是噪声级、提示词是结构级:Q8_0 vs FP16 移动的是 ε,提示词改变的是主项——当模型行为由提示词结构主导时,为精度位数付费买到的只是噪声粗细的微调,边际收益趋零 [6][7][9];同一条坐标里,内核代差(旧 llama.cpp 0.3.35 缺 MoE 优化 vs LM Studio 最新 master,8 → 20+ t/s)是结构级收益、按倍计,精度是噪声级收益、趋近于零 [9]。模型规模与代次是分布表达能力的天花板,提示词是分布的实际塑造者,精度是分布里的噪声粗细——三个变量,作用层级完全不同 [10]。
- 定量和定性是什么关系? 同促关系:定量的边界是定性(测量最终落回定性决策,定量被定性收束),定性的边界由定量撑起(阈值位置、显著性水平、范围上下界——定性划结构、定量给位置)。概率论是这种循环的数学载体:贝叶斯决策(定量算后验、定性做决策)[16]、假设检验(α 是定性权衡的定量形态)[17]、softmax 自回归(logits→采样→新条件,每次生成都是一次循环)[1][2]。落到提示词工程:有效的提示词 = 定性结构 × 定量边界;定量的价值 = 它撑起的定性边界的分量——撑边界的定量是命脉,不撑边界的定量是空耗。
一条主线贯穿 09 系列:09 说穷举是宿命,09b 说精密度优先于正确度,09c 说匹配要让位给推理,09d 说粒度是地形,这一篇说的是——提示词是拉扯分布的手:结构指令重塑曲线形状,语气词只加深颜色,精度只换坐标纸的粗细;而曲线从来不是纯定性或纯定量的——定性的边界由定量撑起,定量的意义由定性收束,两者同促,缺一不可。把手练好,比换纸、比加颜色,都重要得多;把边界撑对,比数字位数多一位,也重要得多。 提示词工程的边界,由两个判据划定:离决策阈值的距离,与误差传播路径的长度。提示词不是写得越用力越好,是拉得动、拉得对、拉在该拉的地方。
引用与出处说明
引文全部来自本人项目的实际代码、实测数据与本地知识库(KB:LLM奠基理论/大模型万象/数字与建模/政经文哲/τ scaling),文献均为库内实有原文;[6][7][8][9][10][11][12] 为本人 structured-writer 引擎更新日志(CHANGELOG.md)实证,[1][2][13][14][16][17] 为本地 KB 原文检索(出处列注明 KB 实际文件)。
| 编号 | 引用 | 出处 |
|---|---|---|
| [1] | Radford, Wu, Child, Luan, Amodei & Sutskever. Language Models are Unsupervised Multitask Learners(OpenAI, 2019;p(x) = ∏ p(sn|s1,...,sn-1)——语言建模 = 条件概率连乘,提示词即条件前缀) | KB「LLM奠基理论」language_models_are_unsupervised_multitask_learners(GPT-2 论文原文,FTS 检索实证) |
| [2] | Hinton, Vinyals & Dean. Distilling the Knowledge in a Neural Network(arXiv:1503.02531, 2015;softmax-temperature:pi = exp(zi/T) / Σj exp(zj/T),温度缩放输出分布;softmax 平移不变性 softmax(x+c)=softmax(x) 为本文推导引用的数学事实) | KB「LLM奠基理论」1910.10683v4(T5 论文 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer,Raffel et al., JMLR 21, 2020——参考文献中的 Hinton 蒸馏条目,FTS 检索实证) |
| [3] | wUwproject. 09c:天然不对等与噪音抑制——语义匹配范式的不对等困境与推理免疫(推理免疫:自回归语义解码范式对形式差异免疫) | Cogito_Scribit 方法论体系(本人文章) |
| [4] | wUwproject. 09b:配置推动的穷举一致性——统一推动点位与误差的哲学(精密度优先于正确度:统一点位→有限枚举→偏差一致→误差抵消/补正) | Cogito_Scribit 方法论体系(本人文章) |
| [5] | wUwproject. 09d:细碎处理与区域重构的成本切割——颗粒度与对齐的悖论(softmax 采样噪声内禀、幻觉累积 1-(1-p)^N、五确定决策树、验证迷思、指令侧三查的母体) | Cogito_Scribit 方法论体系(本人文章) |
| [6] | wUwproject. structured-writer CHANGELOG 3.0.0b13:KV 量化 Q8_0 vs FP16 实测省 412MB(1B 全 GPU 实测:fp16 KV +2141MB vs flash+Q8_0 +1729MB),flash_attn 路径 Q8_0 加载、推理完全正常;35B n_ctx=262K 层数估算 7 → 9 层(未做文本质量对比,量化扰动属采样噪声量级为本文理论推论) | 本人项目实证(structured-writer/CHANGELOG.md) |
| [7] | wUwproject. structured-writer CHANGELOG 3.0.0b21:修复引擎 35B 不释放 + OOM——KV cache 膨胀 10-30GB(q8_0 ~80KB/token)击穿 66GB 机器;修复专用 n_ctx 固定 16384 | 本人项目实证(structured-writer/CHANGELOG.md) |
| [8] | wUwproject. structured-writer CHANGELOG 3.0.0b14:n_gpu_layers=-1 触发 VMM 慢路径,35B 加载 211s → 38s(估算层数,实测于显存被 LM Studio 占满时估算准确)——"精准论断 -1" vs "精确范围估算层数" | 本人项目实证(structured-writer/CHANGELOG.md) |
| [9] | wUwproject. structured-writer CHANGELOG 3.1.0b1:llama.cpp 直挂 8 t/s vs LM Studio 20+ t/s——差距主因是两代推理内核的代差(llama-cpp-python 官方 PyPI 最高 0.3.35、2025 年初内核已停更,对 Qwen3.5/3.6-35B-A3B 新 MoE 无专家并行/CUDA MoE kernel 优化,55 层专家 CPU 串行 → 8 t/s 物理极限;LM Studio 用最新 llama.cpp master → 20+ t/s),llama.cpp 直挂整体废弃 | 本人项目实证(structured-writer/CHANGELOG.md) |
| [10] | wUwproject. structured-writer CHANGELOG 3.0.0b11:Qwen2.5-3B 判不了"叙事目的/起承转合"抽象标准(22→8 条仍伪问题)→ 换 Qwen3-8B(规模 3B→8B 与代次 2.5→3 双变量同变,定性跃迁靠状态空间扩大——规模 × 代次,不靠精度位数) | 本人项目实证(structured-writer/CHANGELOG.md) |
| [11] | wUwproject. structured-writer CHANGELOG 3.0.0b22:用户定性指令"压根不是爆内存包缓存,查代码!!"——一条定性指令把排查分布从"资源"拉到"代码",崩溃真因并发竞态与内存/KV 无关 | 本人项目实证(structured-writer/CHANGELOG.md) |
| [12] | wUwproject. structured-writer CHANGELOG 3.0.0b12:窗口 = 内存动态 + 模型原生窗口(可用内存 × 0.8 − 权重 ÷ KV 每token;35B ~80KB/token@fp16 实算;模拟 28GB → n_ctx=35K)——精确范围的工程形态 | 本人项目实证(structured-writer/CHANGELOG.md) |
| [13] | 《中国式现代化文明观的理论蕴含》("二分法"逻辑:中国式现代化既是事实判断也是价值判断——二元坐标的决策结构;《中国浦东干部学院学报》2026 年第 1 期,文章编号 1674-0955(2026)01-0055-14) | KB「政经文哲」c765b06ef9ef4d9ab91f299b245e676f(原文,FTS 检索实证) |
| [14] | 曹冬英、王少泉. 语言特性、技术能力与制度设计:中国数字政府治理的"语言文字红利"探析(LDA 主题模型对政策文本的语义抽取——定性操作的结构化落地;《中国浦东干部学院学报》2026 年第 1 期,页 95-104) | KB「τ scaling」5d9f393586ec4757b54e69a722c0f339(原文,FTS 检索实证) |
| [15] | wUwproject. 09:穷举的宿命——稳定与随机的悖论(本文的数学母体:随机误差→被约束的确定性波动) | Cogito_Scribit 方法论体系(本人文章) |
| [16] | Gökbakan, Dümbgen & Caron. A Data-driven Contact Estimation Method for Wheeled-Biped Robots(arXiv:2410.12345;Bayes filter:IMU/关节扭矩连续定量测量 → 贝叶斯更新 → "接触/无接触"二值定性状态估计;定量撑起定性边界的工程实证) | KB「数字与建模」2410.12345v3(论文原文,FTS 检索实证) |
| [17] | Sheikhi, Lovén 等. Beyond the Leaderboard: A Survey of the Science of Evaluation, Benchmarking, and Methodologies for Large Language Models(IEEE Access, 2026, DOI 10.1109/ACCESS.2026.3686088;Proper Hypothesis Testing:模型比较应框架化为统计假设检验而非裸分数——α 显著性水平(定量)→ 拒绝域(定量边界)→ 显著/不显著(定性结论)) | KB「大模型万象」Beyond_the_Leaderboard_A_Survey_of_the_Science_of_Evaluation_Benchmarking_and_Methodologies_for_Large_Language_Models(论文原文,FTS 检索实证) |
说明:[1][13][14][16][17] 为对应 KB 的实际论文原文(FTS 关键词命中);[2] 的 Hinton 蒸馏条目为 KB 内 T5 论文(1910.10683v4)参考文献中的引文(KB 未收录 Hinton 原文,softmax 公式本身为文献原式);"softmax 平移不变性 softmax(x+c)=softmax(x)"为 softmax 的数学性质(本文推导引用的数学事实,非文献原话);"指令侧三查""决策阈值距离判据""误差传播路径长度判据""V ≈ D × L 四象限""精度是噪声级、提示词是结构级""定性与定量的同促(定性⇄定量循环)""定量的价值=它撑起的定性边界的分量"为本文的数学推导;"Q8_0 空耗 412MB(1B 全 GPU 实测)""VMM 慢路径 211s → 38s(显存被 LM Studio 占满时估算准确)""llama.cpp 8 t/s vs LM Studio 20+ t/s(主因两代内核代差:旧 llama-cpp-python 0.3.35 缺 MoE 优化 vs 最新 master)""3B 判不了抽象标准(规模 × 代次双变量)""查代码不是内存/KV"为 structured-writer CHANGELOG 实际记录。
延伸阅读
- 第 III 部 · 09:穷举的宿命——稳定与随机的悖论:本文的数学母体。"唯一预测是范畴错误"直接承袭 09 的"稳定与随机"命题——采样器的随机性是内禀的,任何精度投入都无法消除。
- 第 III 部 · 09b:配置推动的穷举一致性:本文第六节和第七节的先导。"精密度优先于正确度"是定量世界的策略;本文论证"提示词结构优先于精度位数"——结构是主项,精度是噪声。
- 第 III 部 · 09d:细碎处理与区域重构的成本切割:本文第三节和第七节的直接接续。09d 的幻觉累积公式 1-(1-p)^N 是"误差传播路径长度"判据的原型;本文把它推广到提示词拉扯误差的累积。
- structured-writer 引擎:
CHANGELOG.md(3.0.0b11~3.1.0b5,三十余次迭代的精度/量化/后端实测记录)——本文全部工程实证的来源。 - skill-standardization 审计技能:
scripts/skill_audit/(五确定输出协议 + 30+ fix_* 确定性修复)——"指令侧三查"的工程实证母体。
第 III 部 · 09f|方法论体系构建的沉淀:名词不解释就等于没有名词——义项混合的分布与四维展开的锚定
一、引子:给 LLM 一个名词,它真的能"理解"吗
写提示词写久了,会撞见一个平时不细想的问题:我在提示词里写下一个名词——"语义拆分"——LLM 真的能"理解"它吗?
表面看当然能:把"请进行语义拆分"递给任何一个像样的模型,它都会吐出一段结构化的拆分结果,看起来确实"懂了"。但多试几次、换几个模型、换几种上下文,输出的方向就开始漂:有的按主题边界切,有的按意图分类切,有的干脆做成了分词,还有的做成了需求分析的 5W2H。同一个名词,落在不同的输出义项上——它"理解"了,但理解的不是我心里那一个"语义拆分"。
三个问题由此而来,也是本篇要依次回答的三问:
- 给 LLM 一个名词,它真的能"理解"吗?——"理解"的本体是什么?
- LLM 的"理解"建立在相似度上(余弦相似度也好、距离也好),一个名词能够多大的影响概率?
- 我的工程里有现成的做法:有的地方进行解释,有的地方做细化,有的地方给举例——对一个要求进行解释、对一个名词进行多维度表达,才能正确指明方向。这背后的原理是什么?
先给结论,再逐层展开:"理解"= 相似度激活的语义邻域;名词的向量是义项混合中心,单名词对目标义项的拉扯被混合稀释(单点失重);解法是四维展开——解释划界、细化收窄、举例锚定、反例排除——把语义球雕成语义锥体。
一个最短的工程对照,先放在这里当锚点。rag-assistant(本人的本地知识库智能体)的决策循环里,LLM 要把用户问题拆成 entities / attrs / rel 三个槽位。如果槽位规则只写一个名词——"attrs:属性"——LLM 会把"为什么""怎么""如何"这些疑问词填进去(语料里疑问词与"查询"的共现频率最高);实际代码里这个槽位是这样写的:
attrs: 目的/属性。用户想查的目标维度,是「查XX的什么」。
例:价格、定义、原理。
不要放「异同」「区别」等比较意图词,也不要放「为什么」「怎么」「如何」
等疑问词(它们不是搜索维度)
一个名词"属性",被展开成定义(是「查XX的什么」)、正例(价格、定义、原理)、反例(不要放疑问词与比较词)三段。这不是啰嗦,这是把"属性"这个名词在向量空间里从混合分布钉到目标义项上的全部工程。为什么必须这样写?下面四节给出答案。
二、"理解"的本体:相似度激活的语义邻域
先回答第一问:给 LLM 一个名词,它的"理解"到底是什么?
数学上,语言模型是条件概率分布:给定前文 token 序列,模型输出下一个 token 的分布,GPT-2 论文写得很清楚——语言建模就是条件概率的连乘 [1],输出层由 softmax 把 logits 变成概率 [2]。这两条 09e 已经反复用过,本篇要往下再挖一层:名词进入这个条件之后,在模型内部发生了什么?
答案是相似度。现代 NLP 的文本表示建立在向量空间上:每个 token 被映射成一个向量,语义关系被表达成向量之间的几何关系。这不是哲学断言,是 NLP 工具链的日常操作——Koroteev 的 BERT 应用综述里写得很直白:BERTScore 评测文本质量的核心算法,就是计算向量化表示之间的余弦距离;挑选同义词集的方法,就是度量原词与词典中所有词之间的余弦距离 [4]。也就是说,"这两个词意思接近"在这套体系里的全部含义,就是"这两个向量夹角小"。"理解一个名词"在机制层面没有更多内容:计算它与上下文、与候选路径的相似度,把相似度高的路径激活(logits 抬升),把相似度低的路径抑制(logits 压低)。
word2vec 一系的工作进一步给出了方向性:词向量空间中的语义关系表现为空间方向——Mikolov 等人 2013 年的经典结果是 king − man + woman ≈ queen,"性别"这个语义关系是空间里一个固定的位移方向 [8]。ELECTRA 论文在回顾预训练谱系时,把 Word2Vec 定位为"最早的 NLP 预训练方法之一,使用对比学习"[5];Koroteev 的综述则记录了谱系的更替——上下文相关的表示(BERT 一系)"很可能在流行度上取代广为人知的 word2vec,成为事实上的行业标准"[3]。取代的原因恰恰与本篇的主题直接相关:word2vec 给每个词一个固定向量,而多义词撑不进一个固定向量(下一节展开)。
所以第一问的答案:LLM"理解"一个名词 = 以该名词的向量为圆心,按相似度激活一个语义邻域。 "理解"不是"知道这个词的标准含义"——向量空间里没有"标准含义"这个存储位置,只有邻域。名词的理解力,就是这个邻域的形状问题。
用一个链把机制说全:
三、单点的失重:义项混合与均匀激活
第二问:建立在相似度上的"理解",一个名词能够多大的影响概率?
这一问的答案藏在一个所有教科书都要提一句的事实里:自然语言里大量的词是多义的——同一个词,在不同上下文里携带完全不同的语义负荷。 Koroteev 综述在讲表示方法演进时原话如此:"在传统文本表示里,每个 token 被表示为一个固定向量,不管这个词在文本中出现在什么上下文里;然而自然语言中大量词汇是多义的——它们依赖上下文携带完全不同的语义负荷"[3]。这是 word2vec 固定向量被上下文相关表示(BERT 一系)取代的根本原因 [3]。
多义不是工程上的小麻烦,它在向量空间里有严格的几何刻画,两条 [6][7]:
其一,义项的线性叠加。 Arora、Li、Liang、Ma 与 Risteski 的研究证明:一个多义词的词向量,近似等于它各个义项向量的线性叠加——"tie"的向量约等于"打结"义项向量与"平局"义项向量的加权和,权重与各义项在语料中的频率相关,且低频义项不会被高频义项完全淹没 [6]。写成式子:
其中 v(w) 是名词 w 的实际向量,vi(w) 是它的第 i 个义项向量,αi 是该义项的语料频率权重。
其二,捏合流形。 Jakubowski、Gašić 与 Zibrowius 从拓扑角度证明:多义词是词嵌入空间的捏合(pinched)流形奇点——"mole"的向量必须同时接近"痣"(皮肤标记)与"鼹鼠/间谍"两类互不相似的邻域,几何上不可能完美实现,于是空间在多义词处被捏合 [7]。
这两条合起来,就是本篇的核心事实:名词在向量空间里不是一个点,是一个义项混合中心。 把它接回第二节的机制——"理解"= 相似度激活邻域——立刻得到第二问的答案:
一个名词影响的不是概率的大小,是概率的成分。 它以混合中心为圆心激活邻域,邻域覆盖所有 k 个义项的路径——所有义项路径的 logits 被一起抬升。你心里想要的目标义项,只分到它自己的频率权重 αi 那一份拉扯力:
目标义项在语料里越是低频,这个份额越小;名词越通用("拆分""分析""处理""属性"),义项越多、分布越散,份额越被稀释。极端情况下——一个高频义项占 90% 语料的通用词——你心里那个低频义项分到的拉扯趋近于零。
这里与 09e 精确衔接。09e 论证过:一条指令要真正改变模型行为,必须非均匀地改变 logits 的相对结构;任何"对所有路径一视同仁"的影响,被 softmax 平移不变性(softmax(x+c)=softmax(x))在概率层面清零 [12]。单名词的混合激活正是"接近一视同仁"的极端形态:它把力气均匀撒在所有义项路径上,等于谁都没拉——这就是"单点失重"。09e 讲的是一条指令(宏观)怎么拉扯分布,本篇讲的是单个名词(微观)为什么拉不动:死板废话拉不动,是因为不建立结构;单名词拉不动,是因为它建立的结构是混合的——激活了结构,但激活的是所有义项的结构。
必须把边界钉清楚(与 09e 同样的纪律 [12]):softmax 平移不变性是数学事实;"单名词的激活接近均匀"是基于义项混合定理 [6][7] 的经验刻画——严格地说,混合激活对不同义项路径并非精确等量(频率权重 αi 有差异),但它对"目标义项 vs 其余义项合"这一相对结构的作用趋近于均匀抬升,因而对目标义项的相对拉扯趋近于零。失重不是零重量,是被稀释到无方向的重量。
回到引子:为什么"请进行语义拆分"会漂?因为"语义拆分"是混合中心——它激活的邻域里同时住着主题切分、意图分类、分词、需求分解四户人家,采样落在谁家,取决于谁在语料里门牌更亮(频率更高),而不是取决于谁在我心里。模型不是不听话,是它收到的地址本来就含糊。
四、四维展开是解药:解释划界、细化收窄、举例锚定、反例削峰
第三问:为什么解释、细化、举例能指明方向?
先给工程归纳,再给数学建模。本人在工程里反复使用的展开手段,归纳下来是四个维度——比直觉的三种多一个,多的那个(反例排除)恰恰是工程里下笔最重的一维:
| 维度 | 工程形态(rag-assistant attrs 槽位原文分解) | 向量空间操作 | 数学本质 |
|---|---|---|---|
| 解释 | "目的/属性。用户想查的目标维度,是「查XX的什么」" | 从混合中心切出目标义项的子空间 | 划界:定义界内 |
| 细化 | "单个查询维度,禁止拼接"(约束收窄) | 缩小邻域半径 | 收束:邻域变窄 |
| 举例 | "例:价格、定义、原理" | 给出目标义项的具体向量方向 | 锚定:轴线确定 [8] |
| 反例排除 | "不要放「异同」「区别」等比较意图词,也不要放「为什么」「怎么」「如何」等疑问词" | 显式标记混合分布中最近的竞争义项,压低它的峰 | 削峰:定义界外 |
四个维度各自独立的证据,在于它们失效时症状不同:
- 只解释不举例:锥体有了边界但没有轴线——输出在界内随机游走,方向不确定。
- 只举例不解释:轴线有了但边界模糊——例子是"价格、定义、原理",模型可能滑向同为名词的"重量、颜色"(相似度高但界外)。
- 不写反例:边界和轴线都在,但最近的竞争义项照样抢采样——"为什么"与"查什么的什么"在语料里的共现频率实在太高,不点名压制,它就是混合分布里最高的干扰峰。rag-assistant 的槽位规则无一例外都带"不要放",这不是防御性写作,是对最近竞争峰的定向压制——通用指令压不动它(均匀),点名才能压动它(非均匀,正是 09e 的结构性指令 [12])。
四维叠加的几何结果,用本文的建模语言说:把一个无方向、无边界、半径失控的语义球,雕成一个有边界(解释)、有半径(细化)、有轴线(举例)、无干扰(反例)的语义锥体——锥体的顶点钉在目标义项上,采样落进锥体,方向就对了。
两栏对照,一眼看全:
一个建模式的量纲刻画(经验刻画,非定理):名词的锚定力与语义邻域半径平方成反比——
R 由什么决定?由名词的义项数量与频率分散度决定——通用词 R 大(失重),专有名词与术语 R 小(天然锚定)。这也解释了一个日常经验:为什么提示词里写"茅台"从不漂,写"拆分"经常漂——"茅台"的义项邻域窄而尖,"拆分"的邻域宽而平。四维展开的全部工程意义,就是在不动名词本身的前提下,把 R 人工压小。
五、工程实证:四个同构证据
原理成立与否,最终看工程里是不是同一个结构在反复出现。四个证据——分别对着 LLM 的填空槽位、技能的触发条件、写作的提示词参数,以及本系列文章自身的被迫自证。
证据一:rag-assistant 的槽位四件套(对 LLM)。 第二节引子已经摆过 attrs 槽位,这里把全景摆开:内置五种查询类型(事实查询、实体对比、二元对立、多维度分析等),每种类型的每个槽位(entities / attrs / rel)都是同一套四件套结构——定义先行、正例锚定、反例排除、边界细化。以"事实查询"为例 [9]:
entities: 主体/名词。问题问的是「谁/什么」,能被替换为「关于XX」的 XX。
例:茅台、AI。不要放「做什么」类的词
attrs: 目的/属性。用户想查的目标维度,是「查XX的什么」。
例:价格、定义、原理。不要放「异同」「区别」等比较意图词,
也不要放「为什么」「怎么」「如何」等疑问词(它们不是搜索维度)
rel: 留空(不触发两两配对)
注意 entities 槽位甚至给了一个替换性检验("能被替换为「关于XX」的 XX")——这是把定义写成可执行判据,比名词解释更进一步。五种类型 × 三个槽位,无一例外。这不是巧合,是这个智能体在真实运行里被"填错的槽位"逼出来的制度:反例清单里的每一项("为什么""怎么""异同"),都是曾经真实发生过的混淆采样 [9]。
证据二:semantic-split 的触发条件双清单(对技能路由)。 技能的触发条件本身就是一个名词展开问题——"语义拆分"这个技能名给路由层(LLM 或规则引擎),什么算触发、什么不算?SKILL.md 的写法是正向触发与否定条件并列 [10]:
正向触发:
[需求拆分] "帮我把这个需求拆开" / "拆分一下这个任务"
[语义规划] "帮我规划一下怎么做" / "整理一下思路"
[5W2H分析] "帮我分析这个需求" / "5W2H分析一下"
否定条件(不触发):
简单问答、闲聊、问候
单步任务
举例(正例句)+ 反例(不触发清单)双管齐下——"触发"这个名词的语义锥体被同一个四维结构钉住。技能名与路由规则之间若只隔一个裸名词,路由就会把闲聊误判成拆分需求(邻域重叠);双清单就是把两个锥体的边界推开。
证据三:structured-writer 的写作提示词参数(对生成过程)。 "写作"是所有动词里邻域最宽的名词——什么不算写作?writer 的做法是把这一个动词展开成十余维参数:topic、section_title、section_subtitle、section_summary、word_count、is_key 等 [11]。每一维都在收窄"写"的邻域:word_count 收半径,summary 划边界,title 定轴线。没有这些参数,"请写这一节"就是一个失重名词,模型采样到的"写法"全凭语料频率——而语料里最高频的写法,几乎从来不是你要的那种。
证据四:本系列文章自身的被迫自证。 把镜头掉转对准 Cogito_Scribit 自己,证据同样在。08c 在给出核心论断之前,被迫先停下来澄清一个术语:"'小模型'指的是生成式小模型(1.5B~8B,如 Qwen3-8B……),不是 bge 嵌入模型"——不澄清,"小模型"的混合分布(参数量小?蒸馏的?嵌入模型?)会让论证本身失去落点 [14]。09b 则在误差理论展开之前,按计量学标准(JJF 1001-2011,等同国际 VIM3)把三个经常混用的词分开——计量学作为一门学科,整个建立在"名词必须先定义再使用"之上,这是名词展开最古老的制度化先例 [15]。方法论系列写到第九篇,每篇开篇都还在做名词澄清——这不是文风偏好,是论证有效的必要条件:名词不展开,后面的推理就在混合分布上进行,每个结论都拖着歧义的影子。
四组证据合起来看,同一个结构出现了四次:对 LLM 的槽位(rag-assistant)、对路由的触发(semantic-split)、对生成的参数(structured-writer)、对人类读者的术语(本系列文章自己)——接收端是什么,四维展开的结构就是什么。 原理不挑执行者。
六、结语:名词的重量 = 展开的密度
三问收口。
- 给 LLM 一个名词,它真的能"理解"吗? 能,但"理解"的本体是相似度激活的语义邻域——余弦距离、向量方向就是全部机制 [4][8]。它理解的不是你心里那个义项,是名词向量的整个混合邻域。
- 一个名词能够多大的影响概率? 名词改变的是概率的成分,不是大小:它是义项混合中心(v(w) ≈ Σ αi·vi(w) [6],多义词是捏合流形奇点 [7]),激活是"宽而浅"的——所有义项一起抬升,目标义项只分到频率权重那一份,相对拉扯趋近均匀偏移,而 softmax 平移不变性对均匀偏移免疫 [12]。单点失重:名词越通用,越拉不动分布。
- 为什么解释、细化、举例能指明方向? 因为它们是四维展开中的三维,加上工程实证逼出来的第四维(反例排除):解释划界、细化收窄、举例锚定、反例削峰——把语义球雕成语义锥体,目标义项从混合分布里成峰。工程里它已经是制度:rag-assistant 的槽位四件套 [9]、semantic-split 的触发双清单 [10]、structured-writer 的参数化写作 [11]、本系列每篇开篇的术语澄清 [14][15]。
最后把这条线接回体系。08a 说"前置规范大于后置验证"——本篇给"规范"一个更具体的定义:规范,就是名词的四维展开。 前置规范之所以大于后置验证,是因为展开做在采样之前,锥体立好了,采样一次就对;不做展开,验证就要在混合分布的输出里反复打捞——08a 的"最小尝试次数"在这里有了微观解释 [13]。08c 说"槽位是减法"——本篇补上减法的刀法:减掉的是义项邻域(划界、收窄、削峰),不是槽位的信息量;敢于留空的 rel 槽位("留空,不触发两两配对"[9]),恰恰是把"无方向"诚实地表达为空,而不是逼 LLM 在失重名词上硬采样 [14]。10b 说语言是对观察的压缩——名词是压缩的终点:一棵树压成两个字,一个概念压成一个词,压到向量空间里只剩一个混合中心 [16]。四维展开是压缩的逆操作:发送端把点展开成锥体,是接收端无法靠猜完成的解压——10b 论证过解压依赖接收端的经验库(LLM 没有体验可解压),本篇给出工程层的出路:接收端解不了压,发送端就别压那么狠。
一条主线贯穿 09 系列:09 说穷举是宿命,09b 说精密度优先于正确度,09c 说匹配要让位给推理,09d 说粒度是地形,09e 说提示词是拉扯分布的手——这一篇把那只手收到最小关节:手是由名词构成的,而名词天生失重;给它重量的是展开——解释划界、细化收窄、举例锚定、反例削峰,四维齐备,名词才从混合中心变成方向本身。 名词不解释就等于没有名词——不是因为读者笨,也不是因为模型笨,是因为向量空间里的未展开名词,本来就只是所有可能含义的加权平均。你想说的那个意思,永远在平均值之外。
引用与出处说明
引文分为四路:[1][2][3][4][5] 为本地 KB 实有原文(FTS 检索实证,KB「LLM奠基理论」);[6][7][8] 为联网核验文献(KB 未收录原文,按 09e 先例标注);[9][10][11] 为本人项目实证(rag-assistant / semantic-split / structured-writer 实际代码);[12]-[16] 为 Cogito_Scribit 方法论体系自引(本人文章)。
| 编号 | 引用 | 出处 |
|---|---|---|
| [1] | Radford, Wu, Child, Luan, Amodei & Sutskever. Language Models are Unsupervised Multitask Learners(OpenAI, 2019;p(x) = ∏ p(sn|s1,...,sn-1)——语言建模 = 条件概率连乘,名词是条件前缀的组成单位) | KB「LLM奠基理论」language_models_are_unsupervised_multitask_learners(GPT-2 论文原文,FTS 检索实证) |
| [2] | Hinton, Vinyals & Dean. Distilling the Knowledge in a Neural Network(arXiv:1503.02531, 2015;softmax-temperature:pi = exp(zi/T) / Σj exp(zj/T);softmax 平移不变性 softmax(x+c)=softmax(x) 为本文衔接 09e 引用的数学事实) | KB「LLM奠基理论」1910.10683v4(T5 论文参考文献中的 Hinton 蒸馏条目,FTS 检索实证,与 09e 同源) |
| [3] | Koroteev M.V. BERT: A Review of Applications in Natural Language Processing and Understanding(arXiv:2103.11943;"在传统文本表示里,每个 token 被表示为固定向量,不管上下文;自然语言中大量词汇是多义的——依赖上下文携带完全不同的语义负荷";上下文相关表示"很可能在流行度上取代广为人知的 word2vec,成为事实上的行业标准") | KB「LLM奠基理论」2103.11943v1_2.pdf(论文原文,FTS 检索实证) |
| [4] | Koroteev M.V. BERT: A Review of Applications in Natural Language Processing and Understanding(同文;BERTScore 核心 = 计算向量化表示间的余弦距离;同义词集选取 = 度量原词与词典全部词的余弦距离——"语义接近"的机制化含义即余弦距离) | KB「LLM奠基理论」2103.11943v1_2.pdf(论文原文,FTS 检索实证) |
| [5] | Clark, Luong, Le & Manning. ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators(arXiv:2003.10555, ICLR 2020;"Word2Vec(Mikolov et al., 2013),最早的 NLP 预训练方法之一,使用对比学习"——预训练谱系定位) | KB「LLM奠基理论」2003.10555v1_2.pdf(论文原文,FTS 检索实证) |
| [6] | Arora, Li, Liang, Ma & Risteski. Linear Algebraic Structure of Word Senses, with Applications to Polysemy(TACL 6, 2018;多义词词向量 ≈ 各义项向量的线性叠加 v(w) ≈ Σ αi·vi(w),αi 为语料频率权重,低频义项不被高频淹没——"义项混合中心"的定理基础) | 联网核验(KB 未收录原文) |
| [7] | Jakubowski, Gašić & Zibrowius. Topology of Word Embeddings: Singularities Reflect Polysemy(arXiv:2011.09413, 2020;多义词 = 词嵌入空间的捏合流形奇点——一词向量须同时接近互不相似的多个义项邻域,几何上不可能完美实现) | 联网核验(KB 未收录原文) |
| [8] | Mikolov, Yih & Zweig. Linguistic Regularities in Continuous Space Word Representations(NAACL 2013;king − man + woman ≈ queen——语义关系 = 向量空间中的固定位移方向,"举例锚定 = 提供方向向量"的数学基础;另见 Mikolov et al. Efficient Estimation of Word Representations in Vector Space, arXiv:1301.3781) | 联网核验(KB 未收录原文,[5] 为 KB 内转引) |
| [9] | wUwproject. rag-assistant agent.py BUILTIN_QUERY_TYPES:五种内置查询类型 × 三槽位(entities/attrs/rel)全部采用"定义+正例+反例+边界"四件套结构;attrs 槽位反例清单("不要放「异同」「区别」…也不要放「为什么」「怎么」「如何」")来自真实运行中的混淆采样 | 本人项目实证(rag-assistant/rag_assistant/agent.py) |
| [10] | wUwproject. semantic-split SKILL.md 触发条件:正向触发(需求拆分/语义规划/5W2H分析/JSON管理/渐进匹配五类正例句)+ 否定条件(简单问答、闲聊、问候、单步任务不触发)——技能名的四维展开 | 本人项目实证(semantic-split/SKILL.md) |
| [11] | wUwproject. structured-writer writer.py _build_context_section_prompt:写作动词展开为 topic / section_title / section_subtitle / section_summary / word_count / is_key 等十余维参数 | 本人项目实证(structured-writer/structured_writer/writer.py) |
| [12] | wUwproject. 09e:提示词拉扯的边界——概率曲线的形状工程与定性精度的空耗(softmax 平移不变性 softmax(x+c)=softmax(x) 决定均匀偏移在概率层面等于零;结构性指令非均匀改变 logits 相对结构——本文"单点失重"与"反例点名才压得动"的直接数学母体) | Cogito_Scribit 方法论体系(本人文章) |
| [13] | wUwproject. 08a:前置规范大于后置验证——最小尝试次数的分工与监督范式(前置规范 > 后置验证;本文把"规范"具体化为名词的四维展开,把"最小尝试次数"解释为展开先于采样) | Cogito_Scribit 方法论体系(本人文章) |
| [14] | wUwproject. 08c:槽位的减法——三种场景的幻觉治理路径与四个论断(开篇被迫澄清"'小模型'指生成式小模型(1.5B~8B),不是 bge 嵌入模型"——名词澄清的文内自证;"槽位是减法"——减掉的是义项邻域而非信息量) | Cogito_Scribit 方法论体系(本人文章) |
| [15] | wUwproject. 09b:配置推动的穷举一致性——统一推动点位与误差的哲学(按计量学标准 JJF 1001-2011《通用计量术语及定义》(等同国际 VIM3)拆分三个混用术语——"名词先定义再使用"的学科级制度化先例) | Cogito_Scribit 方法论体系(本人文章) |
| [16] | wUwproject. 10b:语言被抹平——贫瘠的土地上能否开出鲜艳的花?(语言是对观察的第一次压缩、LLM 是压缩的压缩;解压依赖接收端经验库——本文"发送端四维展开"为该命题的工程层回应) | Cogito_Scribit 方法论体系(本人文章) |
说明:[1][2][3][4][5] 为 KB「LLM奠基理论」实际论文原文(FTS 关键词命中:polysemy/word2vec/cosine/mikolov);[6][7][8] 为联网核验文献,KB 未收录原文,其中 Mikolov word2vec 在 KB 内有 ELECTRA [5] 与 Koroteev [3] 的转引;[9][10][11] 为本人项目代码原文(本次写作时逐行核对);[12]-[16] 为本人方法论文章自引,其中 08c"小模型"澄清、09b JJF 1001-2011 术语拆分均为原文实有。"义项混合中心""单点失重""锚定力 A ∝ 1/R²""语义球 → 语义锥体""拉扯份额 ≈ α目标/Σαi""四维展开(解释/细化/举例/反例排除)的向量空间几何对应(划界/收窄/锚定/削峰)"为本文的建模与推导;"单名词激活接近均匀"为基于 [6][7] 的经验刻画,非先验数学定理(与 09e"语气词≈均匀偏移"同级的假设声明);四维展开的工程形态来自 [9][10][11] 的代码归纳,非文献概念。
延伸阅读
- 第 III 部 · 09e:提示词拉扯的边界:本文的直接母篇。09e 讲一条指令如何重塑概率曲线(宏观),本文讲单个名词为什么拉不动、怎样展开才拉得动(微观)——softmax 平移不变性是两篇共享的数学脊柱。
- 第 II 部 · 08a:前置规范大于后置验证:本文给"规范"补上了微观定义——规范就是名词的四维展开;"最小尝试次数"由此获得采样层面的解释。
- 第 II 部 · 08c:槽位的减法:本文的镜像篇。08c 讲槽位要敢于留空(减法),本文讲槽位填词时名词要展开(加法)——一减一加,共同守住"语义损失可恢复、幻觉不可恢复"的边界。
- 第 IV 部 · 10b:语言被抹平:哲学层的上游。语言是压缩、名词是压缩终点、接收端解压依赖经验库——本文是这条命题在提示词工程层的落地回应。
- rag-assistant:
rag_assistant/agent.py(BUILTIN_QUERY_TYPES 五类型 × 三槽位四件套)——本文最强的工程实证源。 - semantic-split:
SKILL.md(正向触发 + 否定条件双清单)——技能名四维展开的活样本。
第 IV 部 重估:让渡之后,人还剩什么
读者问题:AI 终结了力气活,人还剩什么必须自己做的事?
前三部是"如何用 AI"——约束它、协作它、划定它的边界。第 IV 部退后一步,问一个前九篇不敢问的问题:如果 AI 把"记住""翻译""执行"都接管了,人还剩什么?
答案贯穿三篇:
10 篇《判断的让渡与翻译的打通》:AI 用暴力统计干掉了"记住→合适引用"(判断被让渡,堆砌型知识贬值,学而不思则罔——幻觉就是证词),用巨量计算打通了"表层→底层"(翻译被打通,低代码复活)。两种力气活终结,剩下的稀缺品是"运用"——真实约束下的决策、执行、验证、负责。而 AI 够不到运用,因为运用连着承担。
10a 篇《割圆术的边界》:让渡之后,AI 直面真实复杂系统。做工需要二元论断,二元论断的难点在边界,边界不可穷尽,逼近(割圆术)只在封闭系统收敛——而世界不是圆。逼近失效不是停止,是失控。 所以与其让 AI 逼近,不如给 AI 画圈:牢笼不是限制 AI 的能力,是垄断划界权。赫尔辛基宣言的完整发展史(纽伦堡法典 → 七次修订 + 两次澄清 → 2013 数据条款)证明:画圈是文明自我保存的机制,而且人类已经干过一次。
10b 篇《语言被抹平》:让渡与划界之后,还剩表达与体验。语言是对观察的压缩(第一次压缩),LLM 是对语言的压缩——压缩的压缩,比压缩更贫瘠:语料里没有体验,所以共情在类型上不可能涌现;具身与世界模型也到不了——信号进来了,但没有"感受者"承接。它是效率加速器,不是跨时代的革新:语言压缩不掉的那部分,就是人。
| 篇 | 解决的问题 |
|---|---|
| 10 判断的让渡 | AI 终结力气活后,人还剩什么——判断的让渡与翻译的打通 |
| 10a 伦理牢笼 | AI 的宿命是什么——割圆术的边界:伦理牢笼与划界权 |
| 10b 语言的天花板 | 语言被抹平之后还剩什么——体验不可压缩,那朵花活在压缩之外 |
为什么放在最后:这是全书的目的地。第 I 部"约束 LLM"、第 II 部"分工"、第 III 部"画边界"——到了第 IV 部才点破:这三部做的所有事,本质是同一件事——人用判断划定 AI 的边界。 从"怎么约束机器"到"人怎么自处",全书在此收束。
给所有读者的话:这一部不需要懂代码。它是为每一个在 AI 时代重新寻找自己位置的人写的。它的结论可能让你不舒服:AI 没有抢走你的饭碗,它抢走的是你的舒适区——堆砌知识、凭记忆说话、做翻译中介,这些曾经的"专业",正在变成免费的。剩下的"运用"与"判断",是你必须重新学会的,也是 AI 够不到的。
第 IV 部 · 10|认知重估的方法论沉淀:判断的让渡与翻译的打通——两种力气活的终结
前九篇文章一直在讨论一个工程问题:如何让 LLM 在确定性流程里不犯错。答案是约束——步骤原子化、契约、自举、编排、链驱动。每一篇都在说同一件事:LLM 的"自觉"是负资产,它的判断不可信,所以要用架构替它判断。 但这一篇想往后退一步,问一个更早的问题:当 LLM 连"记住"和"翻译"都接管之后,人还剩什么?不是"LLM 能做什么",而是"人还剩什么必须自己做的事"。 答案是两个字:判断,和翻译。而这两件东西,恰好正在被 LLM 用两种完全不同的方式终结——一种是让渡(AI 替人判断了),一种是打通(AI 替人翻译了)。判断的让渡让堆砌型知识贬值,翻译的打通让低代码复活。这看起来是两件事,其实是同一件事的两面:AI 正在消灭一切"力气活",把人类逼向唯一一个它够不到的位置。
一、总纲:认知链的四段与两种力气活
1.1 认知链的四段
先把"知识活动"拆成一条链:
四个词,对应四种完全不同的能力:
| 环节 | 名称 | 本质 | 谁擅长 |
|---|---|---|---|
| 记住 | 人形图书馆 | 存量的堆砌 | 人类(但正在被 AI 碾压) |
| 说出 | 纸上谈兵 | 存量的复述 | 人类与 AI 相当 |
| 合适引用 | 画龙点睛 | 在恰当处引恰当的知识——这仍然是"说",不是"做" | 人类曾经靠"思",现在 AI 用概率暴力追平 |
| 运用 | 落地生根 | 在真实约束里决策、执行、验证 | AI 够不到,人类也未必强——这是唯一剩下的竞技场 |
这篇文章的所有判断都建立在这条链上。请记住它,后面每一个论点都会回到它。
1.2 两种力气活
在这条链上,有两件"必须费力才能做好"的事,构成了传统上人类认知价值的主体:
- 判断:从"记住"到"合适引用"的提炼。堆砌的存量不会自动变成恰当的表达——人需要"思",需要判断此时此刻该引哪条、怎么组合、什么不该说。这是认知链上最贵的一段。
- 翻译:从"表层意图"到"底层实现"的转换。用户想要一个简单的表层(一个按钮、一句话需求、一个报表),背后是复杂的底层(服务、数据库、架构决策)。把表层翻译成底层,是工程上最贵的一段。
这两件事有一个共同特征:它们都是"力气活"——成本高、回报不对称、且无法被简单地流程化。判断无法被流程化(它依赖上下文敏感性),翻译无法被流程化(它依赖两端的同时理解)。
而 LLM 对这两件事的处理方式截然不同,构成了这篇文章的两个论点:
论点一:判断的让渡。 AI 用暴力统计干掉了"记住 → 合适引用"这一段——它记住了全部,直接给出概率规范下的合适引用。人类原本需要用"思"去弥合的鸿沟被算力碾平。堆砌型知识贬值,学而不思则罔,而 AI 的幻觉正是这句话的证词。 论点二:翻译的打通。 表层与底层之间那条高成本、低回报、依赖人力去扛的翻译链路,被 AI 用巨量计算打通。低代码的复活不是技术进步,是认知吝啬被认知慷慨取代——人类不愿为不对称的成本买单,AI 愿意。表层的浅薄与底层的深刻,通过 AI"莫名其妙"地对齐了。
二、判断的让渡:堆砌型知识的贬值
2.1 差距的重新度量
先做一个反直觉的比较。传统上,我们总说"知道 ≠ 做到",认为"纸上谈兵到落地"的差距是最大的鸿沟——知识转化行动的困难,被反复哀叹。
但把认知链摆开,会发现真正的鸿沟在别处:
差距 A(记住 → 合适引用)> 差距 B(说出 → 落地)。
为什么?因为两者的性质不同:
- 差距 B 是执行差距:从"说得出来"到"做得出来",中间隔的是流程、工具、练习。它可以被约束——照章办事、拆解步骤、反复演练。执行差距可教、可补、可流程化。这正是前九篇文章在做的事:用约束弥合执行差距。
- 差距 A 是判断差距:从"有存量"到"说得恰当",中间隔的是"思"——判断此时此刻该引什么、怎么组合、什么不该说。它无法被流程约束,只能依赖上下文敏感性。判断差距不可教、不可补、不可流程化。
所以:人形图书馆与合适引用的差距,比纸上谈兵与落地的差距还要大。 一个能复述一切的人离"说得恰当"很远;一个只能复述一点的人离"做得出来"反而没那么远——因为落地可以被规则托住,而恰当不能被任何规则托住。
教育学的阶梯早已暗示了这一点。布鲁姆分类学(Bloom et al., Taxonomy of Educational Objectives, 1956)把认知活动排成金字塔:记忆在最底层,理解、应用在中层,分析、评价、创造在顶层。传统教育最大的断裂带不在"记忆→理解"(这是教师最擅长的部分),而在"理解→应用"——一个学生能解释概念(说得出来),却不一定会在新情境里用它(说得恰当)。金字塔的断裂带,正是差距 A 所在的位置:它不是执行问题,是判断问题。
2.2 学而不思则罔:迷惑来自记住太多
这个判断差距的本质,孔子两千年前就说透了:学而不思则罔。(《论语·为政》:"学而不思则罔,思而不学则殆。")
"学"是记住,"思"是从记住到合适引用的提炼。只学不思,存量堆积,提取时必然迷惘——因为记忆不是按"调用时刻"组织的,是按"内容"堆积的。内容越多,调用时的候选越多,迷惑越深。
这不是比喻,是信息论的必然。赫伯特·西蒙(Herbert Simon)早在四十年前就指出:信息富足意味着注意力贫乏。(Simon, "Designing Organizations for an Information-Rich World", 1971)在一个什么都记得住的人那里,注意力的稀缺被推到了极致——他面对的不是知识的丰饶,是选择的沼泽。
而先秦的哲人,比西蒙早了两千多年就给出过同样的诊断,而且说得更狠:
庄子说:"吾生也有涯,而知也无涯。以有涯随无涯,殆已。"(《庄子·养生主》)用有限的生命去追无限的知识,是危险的。这不是劝人懒惰,是说出了一个结构事实:知识的存量是无限的,而调用它的生命是有限的——存量的增长如果不同步转化为调用的精炼,就是对自己的消耗。 这不就是"学而不思则罔"的另一种说法吗?"殆"(危险)来自"以有涯随无涯"——记住太多,正是那句"殆"。
老子说得更彻底:"为学日益,为道日损。"(《道德经》第四十八章)求学是每天增加(记住越来越多),求道是每天减少(判断越来越简)。增的是存量,损的是杂质——为道日损,就是在做"从记住到合适引用"的减法。 堆砌型知识的贬值,老子用六个字说完了:日益的东西不值钱,日损的能力才值钱。
一个关于"记住太多"的警告,在孔子、庄子、老子三个人那里出现了三次——这不是巧合,是知识活动的结构性规律被不同文明的眼睛同时看见了。
文学早就预言了这个沼泽。博尔赫斯在《巴别图书馆》(《小径分岔的花园》集,1941)里写了一个收藏了所有可能书籍的图书馆——无穷的藏书,却没有一个读者能从中找到有用的那一本。无限的知识等于无限的迷惑,因为检索成本吞掉了知识的价值。亚历山大图书馆的悲剧同样如此:它收藏了一切,但它没有"思"——它只是更大的巴别图书馆。
怀特海(Alfred North Whitehead)在《教育的目的》(1929)里给过同样的诊断,他称那些"未经利用的知识"为惰性知识(inert ideas):知识若不被用于当下正在发生的事,它就是负担,而非资产。蒙田说得更早也更狠——他宁可要一颗"运转良好的头脑",也不要一颗"填满的头脑"(une tête bien faite plutôt qu'une tête bien pleine;此语常归于蒙田《随笔集》卷一论儿童教育章,其原型可溯至拉伯雷《巨人传》)。运转良好 = 合适引用;填满 = 人形图书馆。 这两个人用不同的语言,说的是同一个判断:头脑的价值不在存量,在调用。
而这一切,LLM 用自身的存在证明了。LLM 是历史上记住最多的存在——它的训练语料涵盖人类几乎全部文本。而它最著名的缺陷——幻觉——恰恰是"记住太多"的症状:在概率空间里,记忆的候选太多,规范外联想的概率再低,也会在足够多的生成中被触发。一个记住了太多、且"思"(提炼)失灵的存在,必然产生幻觉。 AI 用它的失败,替孔子那句话做了证:学而不思则罔。
2.3 AI 干掉了"图书馆 → 合适引用"
现在来到论点一的核心。
传统的认知价值结构里,"记住 → 合适引用"这一段是由人用"思"来弥合的。学者、专家、顾问——他们的价值不在于记得多(图书馆也可以记得多),而在于从记忆到恰当表达的提炼。这是判断,是认知链上最贵的一段。
LLM 用暴力统计干掉了这一段。
它的方式毫不优雅:不提炼,直接算。训练时记住一切,生成时按概率分布输出——"在这句话的语境里,最可能是哪个知识被引用"。它不"思",但它给出的"合适引用"在统计意义上是恰当的。概率规范下的"说出来",击败了确定性记忆下的"说出来"。
这个替代的残酷之处在于:它不是取代了"思",而是绕过了"思"。 人类通往合适引用的路是"学→思→引用",LLM 的路是"学(海量)→概率采样→引用"。前者是提炼,后者是统计。结果相似,路径完全不同——而路径的差别决定了:人类在这段上的所有投入(堆砌知识、苦练记忆、精心提炼)都变成了沉没成本。
马克思在一百五十年前就描述过这种替代的结构——只是对象从肌肉换成了记忆。他在《资本论》第一卷"机器和大工业"一章写道(此处为转述而非直接引文):机器不是解放了工人,而是把工人变成了机器的附属品——工人曾经是劳动过程的中心,机器时代他变成了劳动过程的零件,他的技能被机器的运转所规定、所吸收(马克思原话:"在工场手工业和手工业中,是工人利用工具;在工厂中,是工人服侍机器")。今天,这一幕在认知层重演:人类曾经是认知过程的中心(思的主体),AI 时代他变成了认知过程的零件——他的记忆被模型的参数所吸收,他的"思"被概率采样所替代。 判断的让渡,就是认知劳动的机器化;而堆砌型知识的贬值,就是认知劳动者被机器(模型)取代的那一天——正如当年纺织工人被珍妮纺纱机取代。
福柯会在这个判断上补一刀更冷的:记忆从来不只是认知能力,它一直是规训手段。(此段为福柯《规训与惩罚》思想脉络的转述运用,非直接引文)背诵、考试、科举、知识垄断——人类历史上最庞大的权力机器,都建立在"记忆可以衡量一个人"这个前提上。记住多少,决定他是谁。而当 AI 记住了一切,"记忆"作为衡量标准彻底失效——规训失去抓手,知识垄断失去垄断物。 判断的让渡不仅是认知事件,也是权力结构的松动:一个不再以"记住"论高下的社会,它的精英再生产机制,必须换一种货币。
所以:堆砌型知识没有用。 人堆的每一分存量,都是替 AI 打工——因为从存量到恰当表达的那段提炼,AI 用暴力统计免费提供了,而且提供得更好。人辛辛苦苦背下来的"知识",在 AI 面前不是资产,是库存;不是武器,是负债(它占着人的注意力,却再也换不来"合适引用"的竞争优势)。
连经验积累也在贬值——这是更冷的一步。经验是什么?经验 = 从过往的具体情境里提炼"何时该怎么做"的判断。它是"思"的沉淀物,是差距 A 的人工制品。但当 AI 见过比任何个体多几个数量级的情境、并且能按概率给出同样的"合适引用"时,经验的稀缺性同样被碾平。判断的让渡,连带着把"判断的积累"(经验)也一起让渡了。
2.4 AI 够不到运用
但链条没有结束。AI 干掉了"图书馆 → 合适引用",却在"运用"面前停住了。
为什么?因为运用需要的东西,概率规范给不了:
- 运用需要真实约束下的试错:落地意味着要在资源有限、噪声真实、反馈延迟的环境里决策。AI 的输出是"无成本地生成",运用的成本是"有代价地执行"。生成可以不负责,执行必须负责——而"负责"不在概率分布的参数里。
- 运用需要闭环验证:说得好不好,模型自己知道(困惑度);做得好不好,只有世界知道。AI 无法自己验收自己的运用,就像导航软件无法自己开到目的地。
- 运用需要承担后果的意志:判断的让渡让"说什么"变得便宜,但"做什么、承担什么"依然昂贵。AI 可以替人说对,但不能替人做对,更不能替人承担。
王阳明用四个字把这条界线画死了:知行合一。 他断言"知而不行,只是未知"(《传习录》:"未有知而不行者。知而不行,只是未知。")——真正的"知",必然已经包含了"行";一个只停留在"说"的知,在阳明看来是假知。这句话在 AI 时代锋利得可怕:AI 拥有全部"知"(记住+合适引用),却没有"行"——按阳明的标准,它的"知"是假知,因为它从未在真实行动中验证过自己。 这不是贬低 AI,而是划界:AI 的"合适引用"是未经验证的知,它的概率规范保证的是"说得像",不是"做得对"。人类通往"运用"的路,恰恰是阳明说的那条——在行中验知,在知中成行;而这条路,AI 没有走过,也走不了(它没有身体、没有代价、没有承担)。
但必须诚实:"运用"不是铁板一块,它的入口已经被 AI 撬开了。 把运用拆开看:
规划的本质,其实还是判断——只不过是一种更深的判断。 判断有两种:
- 说的判断:在知识里选择该引用什么——对应"说出"与"合适引用",就是论点一里被 AI 让渡的那种判断。
- 做的判断:在行动路径里选择该怎么走——对应"规划"。规划不是在堆知识,是在约束(资源、时间、风险、执行者能力)下选择一条路径,这是判断,不是记忆。
而 AI 已经会做判断了——它正在渗透规划的入口:写大纲、做排期、出方案、给架构。在我的结构化写作系统里,文章大纲就是 LLM 生成的(plan_outline)——规划的生产已经被让渡了。所以"AI 够不到运用"这句话必须精确化:AI 够不到的是执行的闭环与承担的意志,而运用的入口——规划这个"做的判断"——正在被 AI 用概率暴力打开。判断的让渡不是一次性的,它正在沿认知链向下蔓延:先让渡"说什么"(合适引用),再让渡"怎么走"(规划),一直蔓延到"执行"与"验证"的边界——直到被"承担"挡住。
这就是人类被逼到的位置:记住、说出、合适引用已被 AI 占领或正在被占领;运用的入口(规划)正在被渗透;真正还没被攻克的,是执行的闭环、验证的验收、承担的意志——而这几样,人类原先也不强。 这不是人类的胜利,是一场"两个都不会"的僵持——而人类唯一的优势是:承担这件事,只有人类能学会,也只有人类必须学。
2.5 方法论落点一:以调用条件为索引
判断被让渡之后,人如果还想在认知链上有立足点,方法论必须跟着变。第一条原则:
知识应以"何时被调用"为索引来组织,而非"它是什么"。
传统知识组织是内容分类(这是什么领域的知识),AI 时代的知识组织应该是调用条件(什么时刻、什么情境、什么指令下该引它)。因为存量本身已经不值钱,值钱的是调用时刻的判断——而调用时刻的判断,恰恰可以通过"把调用条件显式化"来部分工程化。
这条原则不是空谈。它已经在我的系统里被实现了——详见第五部分。
三、翻译的打通:低代码的复活
3.1 结构性错配
低代码的历史是一部反复失败的编年史:VB 表单、4GL、模型驱动架构(MDA)、可视化编程……每一轮都声势浩大,每一轮都黯然收场。业界把这归咎于技术不成熟,但这篇文章要给出另一个解释:低代码的根本障碍不是技术,是翻译——表层与底层之间那条不对称的翻译链路,人类的精力扛不住。
先看低代码的本质。一个低代码平台让用户在前端搭一个"简单的东西"——一个按钮、一个报表、一个审批流。用户看到的表层是简单性。但在这层简单性背后,是成倍的复杂性:
低代码 = 前端表象的假简单 + 后端实现的真复杂。 表层的任何一个"简单实现",都要求底层不成比例的大量工作——甚至架构更改。一个拖拽出来的表单,背后是数据建模、接口设计、状态管理、权限体系;一次"这里加个字段",背后可能是一场数据库迁移。
传统低代码平台试图让"表层的人"直接生成"底层的实现"。但这里有一个死结:
- 表层的人不懂底层约束:他不知道一个按钮背后需要事务、需要权限、需要异常处理。他拖出来的东西,底层一塌糊涂。
- 底层的人不愿迁就表层随意:他知道正确的做法是什么,但无法忍受表层需求的随意变更。
- 两端之间需要一个"翻译者":把表层意图翻译成底层实现,把底层约束翻译回表层承诺。而翻译者必须同时理解两端——这种人是稀缺的(全栈工程师的存在意义),也是昂贵的。
低代码死在翻译成本上。它试图用平台消灭翻译者,结果只是把翻译成本转嫁给了两端的人——表层者被迫面对底层的复杂(平台的坑),底层者被迫处理表层的随意(平台的天花板)。两头都不愿承担,两头都抱怨,平台两头不落好。
3.2 认知吝啬与认知慷慨
为什么人类扛不住这条翻译链路?把话说透:因为人类是认知吝啬鬼(cognitive miser)。
认知吝啬鬼是社会心理学的一个经典概念(Fiske & Taylor, Social Cognition, 1984;其源头可溯至 Cacioppo & Petty 的认知需求理论):人类在认知上天生"能省则省"——我们不愿为需要费力思考的问题付出努力,倾向用最省力的方式处理信息。这不是某个人的懒惰,是物种级的认知本能。
把认知吝啬鬼用在低代码上,一切就通了:
- 表层者的吝啬:他想要"简单"的结果,但不愿承担"简单背后成倍的复杂"。一个按钮背后要 20 行后端逻辑?凭什么。他要的是拖拽,不是架构。
- 底层者的吝啬:他想要"正确"的实现,但不愿迁就"表层的随意"。需求改了 8 次?凭什么。他要的是明确的规格,不是迭代。
- 两端的合力:没有一方愿意为那条不对称的翻译链路买单——因为买单意味着付出与回报不成比例的精力。人类的精力和懒惰劣根性,决定了我们不可能为"一个按钮"背后的巨量计算持续付费。
而 AI 是认知吝啬鬼的反面——认知慷慨者:
- 它不会因为"这活太重"而拒绝。巨量计算对它是常态,不是负担。为一个按钮算上百万次参数,对它和算一次没有区别。
- 它不会因为"表层随意"而不耐烦。需求改 8 次?每一次它都重新翻译,成本恒定为"一次推理"。
- 它同时"理解"两端:LLM 既懂自然语言(表层),又懂代码(底层)。翻译者稀缺的问题,被一个同时理解两端的模型解决了。
人类不愿为不对称的成本买单,AI 愿意。这就是低代码复活的第一性原因。 不是平台做对了什么,是翻译的承担者换了物种。
3.3 莫名其妙的对齐
于是出现了那句看起来像玄学的话:表层的浅薄与底层的深刻,通过 AI"莫名其妙"地对齐了。
"莫名其妙"不是修辞,是精确描述。对齐的实现细节——怎么把"一个按钮"翻译成一整套正确的后端实现——没有人真正理解透。工程师理解它吗?不完全:AI 生成的代码,人类审查的是"对不对",不是"为什么这么写"。产品经理理解它吗?更不:他只看到表层需求被满足了。对齐本身成了黑盒:输入表层,输出底层,中间是模型的参数空间。
波兰尼(Michael Polanyi)会说:这个黑盒里装的,是默会知识(tacit knowledge)。他有一句名言——"我们知道的,比我们能说出来的多"(We can know more than we can tell,见 The Tacit Dimension, 1966)。传统的翻译者(全栈工程师)之所以稀缺,不是因为技术难,是因为翻译的过程依赖大量说不出来的默会成分:为什么这里要加事务、那里要留接口、这个坑在哪——这些判断无法写成文档,只能"会的人会"。AI 的对齐把显性部分(语法、模式、结构)做到了极致,但默会部分(为什么、权衡什么)依然在人的脑子里——只是现在它不再参与翻译,只参与验收。翻译的黑盒化,把默会的负担从"生产端"移到了"判断端"。
而从更远处看,霍克海默与阿多诺(Horkheimer & Adorno)早在《启蒙辩证法》(Dialektik der Aufklärung, 1947)里就预言了这个黑盒:启蒙理性一步步把世界变成可计算的对象,最终把自己也变成可计算的对象。 AI 的翻译就是工具理性的完成形态——表层与底层之间不再需要"理解",只需要"计算";对齐不再是理解之后的产物,而是计算之后的产物。"莫名其妙"正是工具理性的胜利姿态:它不需要人理解它,只需要人使用它。
这带来两个后果,一好一坏:
- 好的一面:过去"表层简单意味着底层爆炸"的诅咒被打破了。表层可以保持它的浅薄(用户说人话),底层可以保持它的深刻(正确、健壮、可维护),两者通过 AI 直连,中间不再需要人力去扛那条高成本链路。低代码终于可以承担更重的工作了——不是低代码变强了,是它背后的翻译者从人换成了算力。
- 坏的一面:对齐变成黑盒之后,"对齐什么"的判断落到了人身上——而人没有增加任何判断能力。一个表层按钮背后值得多少复杂度,是产品判断不是技术判断;但做这个判断的人,现在对着一个不透明的对齐结果。翻译的打通,把判断的责任从"怎么翻译"上移到了"对齐什么"——而后者比前者更难,且没有任何工具能代劳。
3.4 方法论落点二:判断前置,实现后置
翻译被打通之后,工程方法论必须跟着变。第二条原则:
先定表层的恰当性,再让 AI 补底层;判断前置,实现后置。
过去的方法论是"实现驱动判断"——先有底层能力,再谈表层体验;架构评审、技术选型在前,产品体验在后。AI 时代反过来了:表层的恰当性(这个按钮该不该有、这个交互值不值得做、这个报表对谁有用)是人的判断,必须前置;底层的实现(怎么实现、用什么技术、怎么优化)是 AI 的翻译,应该后置。 人不再需要"先懂底层才能定表层",但必须"先定表层才能指挥底层"——因为 AI 翻译什么,取决于人判断了什么。
这同样不是空谈,详见第五部分。
四、统一:两种力气活的终结
现在把两个论点放在一起,看它们共享的结构。
| 论点一:判断的让渡 | 论点二:翻译的打通 | |
|---|---|---|
| 被终结的东西 | 记住→合适引用的提炼(认知层) | 表层→底层的转换(工程层) |
| 终结的方式 | 概率暴力绕过"思" | 巨量计算取代人力 |
| 人类的旧投入 | 堆砌知识、积累经验 | 学习底层、充当翻译者 |
| 人类的旧投入结局 | 沉没成本(贬值) | 沉没成本(贬值) |
| 剩下的稀缺品 | 运用(真实约束下的决策) | 对齐判断(什么值得对齐) |
两条线共享同一个底层事实:AI 终结了两种"力气活"。 判断是认知的力气活(把存量炼成恰当),翻译是工程的力气活(把表层译成底层)。两者都符合"力气活"的定义:成本高、回报不对称、依赖人类精力去扛——而精力,恰恰是 AI 唯一不稀缺的东西。
于是人类的认知价值链被重排了:
判断的让渡把"思"从认知链的中段抹掉了,翻译的打通把"翻译"从工程链的中段抹掉了。 两条链都只剩下两端:输入(说人话/定表层)和输出(落地/对齐)。中间那段曾经最贵、也曾经最能定义"专业"的部分,变成了免费的。
这带来的认知冲击是巨大的:过去我们以为"专业"= 记得多 + 译得准(图书馆 + 翻译者),现在这两样都免费了。 专业还剩下什么?剩下运用——真实约束下的决策、执行、验证、负责。而运用恰恰是人类历史上最不擅长、最不愿被考核的部分。AI 没有抢走人类的饭碗,它抢走的是人类的舒适区。
把视线再拉远一点:这是启蒙的完成,也是启蒙的清算。《启蒙辩证法》的警告在今天应验——启蒙许诺"知识即力量",人通过知识支配自然;但启蒙走到终点,知识的力量反噬了知识的主体:当一切认知活动(记住、引用、翻译)都可以被计算接管时,"认知"不再是人的属性,而成了算力的功能;人从"认知的主体"变成了"认知的消费者"。 马克思说的是机器占有劳动,法兰克福说的是理性反噬主体——而今天,两者在同一个现象上汇合:AI 终结力气活的那一天,就是认知劳动全面异化的那一天。 判断的让渡与翻译的打通,既是效率的胜利,也是主体性的退场——这就是为什么这篇文章的结论不是欢呼,而是清醒:力气活的终结,是文明的又一次大分工,而这次分工的输家,可能是"人需要动脑"这个前提本身。
五、自举佐证:我的系统是这两条链的活标本
这套方法论不是从书斋里推出来的——我自己的系统,就是这两条链的活标本。用实例说话。
5.1 蓝皮书取数:以调用条件为索引的工程实现
在我的结构化写作系统(Structured Writer)里,辅助资料会挂到文章的每个子结构上。数据源可能是十几万行的数据库表。过去的问题是:用户想要"2016 年的财务趋势",但系统只把前 50 行行标识喂给 LLM——2016 年的数据如果排在第 50 行之后,就永远取不到。
解法正是"以调用条件为索引":
注意这里的角色分工,它精确复刻了这篇文章的两个论点:
- LLM 负责"合适引用":它不说"我记住了所有数据",而是按概率判断"此刻该取哪一段"。这是判断的让渡——用户不需要自己记住表结构,不需要自己写检索条件。
- py 负责"运用":LLM 说的再对,切表也是 py 用确定性代码做的——校验存在性、精确切分、防造数据。LLM 说取什么,py 保证取到、取准。
- 知识以调用条件为索引:用户不按"表名"组织知识,按"指令"组织知识。"16 年"是调用条件,系统按条件取数——不是按"这个表叫什么"去翻。
5.2 防造数据:概率规范边界的识别
LLM 的"合适引用"是概率的,所以它会在规范内做对、规范外幻觉。我的系统在写作完成后会做一道校验:收集数据源里出现的所有数字,扫描正文中带单位的数值,凡是在数据源里找不到的(非年份/编号),追加到"建议人工复审"清单。
这就是"概率规范边界识别"的工程化——人(或系统)不判断 LLM 说的内容对不对,只判断 LLM 说的内容是否落在概率规范内。这是运用端的第一道防线,也是判断被让渡之后,人类唯一还能低成本保留的判断。
5.3 表层直连底层:翻译打通的自举
写这篇文章的过程本身就是论点二的证据。我没有手写"蓝皮书分段算法"的需求文档,我只是说"大表取数要分段,按语义聚合,别爆上下文"——表层一句话。LLM 帮我把它翻译成了具体的实现:唯一值分析、日期前缀聚合、等频分箱、两阶段粗筛精取。表层(一句话需求)与底层(一套算法)之间,没有人写过中间层的设计文档——翻译被 AI 打通了。
但同样在这篇文章里,有一个判断是 AI 给不了、必须我自己定的:"分段"到底该按什么逻辑分? 是按行数粗暴切,还是按语义键切?数据列没有语义时怎么办?这些是对齐判断——"这个表层背后值得多少复杂度"——它不在 LLM 的概率分布里,它在产品的判断里。判断前置,实现后置,这句话在我的系统里不是口号,是每天的开发流程。
5.4 规划的让渡:LLM 生成大纲,人做验收
"规划本质是判断"在我的系统里不是观点,是日常:写一篇文章,大纲是 LLM 生成的(plan_outline)——文章有哪些章节、每章多少字、子结构怎么分,规划的生产被让渡了。而我做的事是评审:改标题、调顺序、勾掉不要的章节、对某节按下"重规划"让它按新方向重做——规划的生产归 AI,规划的验收归我。
这就是"做的判断"(规划)正在被让渡的活标本:AI 提供规划的候选(做的判断的概率版),人执行规划的验收(判断的确认版)。而验收之所以还在人手里,只有一个原因——文章署名的是我,错了算我的。承担,是判断最后一道防线的锚。
六、边界审视:判断与翻译会被完全接管吗
方法论必须知道自己的边界。这篇文章的边界在三个问题上:
6.1 判断会被 AI 完全接管吗?
判断要拆开看,因为判断有两种。
- 说的判断(该引用什么、怎么组合):对应认知链的"说出→合适引用"。这一种,已经被让渡——论点一说的就是它。
- 做的判断(该走哪条路、怎么规划):对应运用的入口"规划"。这一种,正在被让渡——AI 已经会写大纲、做排期、出方案。
所以"判断会不会被完全接管"的答案不是简单的会或不会,而是一条精确的防线:说的判断已沦陷;做的判断(规划)的生产正在沦陷;尚未沦陷的,是规划的验收与执行的决策——因为它们连着承担。 AI 能生成一个计划,但"这个计划好不好、要不要按它执行、失败了算谁的"——这是验收与决策,AI 可以给建议,但建议不是决策:建议无成本,决策有代价。只要执行有代价、后果要承担,判断就不会被完全接管。这是本文的底线:AI 可以替人说对,可以替人想方案,但不能替人做对,更不能替人承担。
6.2 翻译会被 AI 完全接管吗?
论点二说"翻译被打通",但打通的是"表层→底层"的实现翻译。还有一种翻译 AI 做得并不好:意图翻译——用户说"我想要个报表",但他真正想要的可能不是一个报表,是"让我看清这个月的钱花哪了"。表层意图背后的真实意图,是另一层翻译,它依赖对人和业务的判断,不依赖算力。低代码复活了实现翻译,意图翻译依然是人的活。
6.3 判断与翻译会互相吞噬吗?
这是最尖锐的边界。当 AI 学会"运用"(它正在学——Agent、工具调用、自动执行),运用端的判断也会被让渡;当 AI 学会"意图翻译"(多轮对话已经在逼近),意图判断也会被打通。两条链的终结不是终点,是半程。 但即使如此,链条的最末端始终有一个 AI 够不到的成分:承担。 无论 AI 多会判断、多会翻译、多会运用,它不承担后果——承担是意识的属性,不是计算的属性。只要"承担"还是人的特权,认知链就永远为人类留着一格。
七、方法论收束:三条可操作原则
把全文收敛成三条可以直接用的原则:
原则一:以调用条件为索引组织知识。 不再问"这是什么领域的知识",改问"什么时刻该引它"。存量贬值,调用升值——把知识组织成"调用条件→知识"的映射,而不是"分类→知识"的目录。
原则二:识别概率规范的边界。 AI 的合适引用是概率的:规范内可信,规范外幻觉。把"验证 AI 说的对不对"换成"验证 AI 说的是否在规范内"——前者不可做,后者可自动化(数据校验、交叉核对、来源核查)。
原则三:判断前置,实现后置。 表层该是什么样(对齐什么)、底线在哪里(承担什么)——人的判断,先定;底层怎么实现(翻译什么)——AI 的事,后补。人指挥 AI 翻译,而不是被 AI 的翻译指挥。
三条原则指向同一句话:AI 终结了力气活,人只能靠判断活。而判断的第一课,是知道自己该判断什么。
引用与出处说明
本文所有引用均按"原文核对 → 出处标注"处理,转述处已显式说明。逐条列出如下:
| 编号 | 引用 | 出处 |
|---|---|---|
| 1 | "学而不思则罔,思而不学则殆" | 《论语·为政》直接引文,通行本 |
| 2 | "吾生也有涯,而知也无涯。以有涯随无涯,殆已" | 《庄子·养生主》直接引文;"殆已"为通行本(郭象本)用字,有版本作"殆矣" |
| 3 | "为学日益,为道日损" | 《道德经》第四十八章直接引文(节取);全句为"为学日益,为道日损。损之又损,以至于无为" |
| 4 | "知而不行,只是未知" | 王阳明《传习录》上卷直接引文;阳明原句"未有知而不行者。知而不行,只是未知" |
| 5 | "在工场手工业和手工业中,是工人利用工具;在工厂中,是工人服侍机器" | 马克思《资本论》第一卷第十三章"机器和大工业"直接引文;本文"工人变成机器的附属品"为对该章思想的转述 |
| 6 | "记忆作为规训手段" | 福柯《规训与惩罚》(Surveiller et punir, 1975)思想转述运用(考试/检查作为规训机制),非直接引文 |
| 7 | "We can know more than we can tell" | 波兰尼 The Tacit Dimension(1966)直接引文(英文原句) |
| 8 | "启蒙理性把世界变成可计算的对象" | 霍克海默、阿多诺《启蒙辩证法》(1947)思想转述(工具理性批判),非直接引文 |
| 9 | "信息富足意味着注意力贫乏" | 赫伯特·西蒙 "Designing Organizations for an Information-Rich World"(1971)思想转述;西蒙原话为 a wealth of information creates a poverty of attention 的对应表述 |
| 10 | 《巴别图书馆》 | 博尔赫斯《小径分岔的花园》集(1941)作品引用(设定转述) |
| 11 | 惰性知识(inert ideas) | 怀特海《教育的目的》(1929)概念引用 |
| 12 | "une tête bien faite plutôt qu'une tête bien pleine" | 常归于蒙田《随笔集》卷一论儿童教育章;原型可溯至拉伯雷《巨人传》出处存在归属争议,故双标 |
| 13 | 认知吝啬鬼(cognitive miser) | Fiske & Taylor, Social Cognition(1984);源头可溯至 Cacioppo & Petty 认知需求理论概念引用 |
| 14 | 布鲁姆分类学(记忆→理解→应用→分析→评价→创造) | Bloom et al., Taxonomy of Educational Objectives(1956)理论框架引用 |
| 15 | 本质复杂度 vs 偶然复杂度 | Brooks, "No Silver Bullet"(1986)概念转述(用于 3.2 前文论证"AI 消灭偶然复杂度"的隐含背景,正文未直接点名) |
| 16 | 泄漏抽象定律 | Spolsky, "The Law of Leaky Abstractions"(2002)概念转述(用于低代码死因的背景论证) |
| 17 | 交易成本 | 科斯 "The Nature of the Firm"(1937)概念转述(用于"层级翻译成本"的经济学类比) |
说明:第 15-17 项(Brooks / Spolsky / 科斯)在正文中作为背景性概念支撑论点二,未直接点名引用,此处补全出处,供读者溯源。其余引用均在正文相应位置标注。
Cogito, Scribo. 我思,故我写。
——而"思"正在变得便宜。"写"也是。剩下的,是"为什么思、为谁写、写到什么程度算负责"。这些没有概率分布,只有人。
第 IV 部 · 10a|认知重估的方法论沉淀:割圆术的边界——伦理牢笼与 AI 的宿命
10 讲了让渡:判断被让渡(AI 用暴力统计接管了"记住→合适引用"),翻译被打通(AI 用巨量计算接管了"表层→底层")。力气活终结了,人退到"运用"。 但让渡之后呢?让渡之后,是真实的复杂系统直面 AI。 这套系统人类自己运行了几千年,依旧漏洞百出——人类自己都没能逼近它。那么,一个只会逼近的 AI,凭什么能? 这篇文章要论证的命题是:AI 的宿命,是被关进伦理牢笼。而且,哪怕 AI 不是概率模型——哪怕它是完美的逻辑引擎——这个牢笼依然必要。 因为牢笼防的不是"概率出错",是别的东西——是二元论断的边界,是逼近的失效,是失效后的失控,是划界权的旁落。 论证的路线是:做工需要二元论断 → 二元论断的难点在边界 → 边界靠逼近获得(割圆术)→ 但世界不是圆,是开放复杂系统 → 逼近在开放系统失效 → 失效不是停止,是失控 → 所以与其让 AI 逼近,不如给 AI 画圈 → 圈需要技术与哲学共同划定 → 而人类历史上,已经有一个画圈的完整范本——赫尔辛基宣言。 割圆术的边界,就是伦理的边界。
一、让渡之后:复杂系统直面 AI
1.1 从 10 讲起
10 建立了一条认知链:记住(人形图书馆)→ 说出(纸上谈兵)→ 合适引用(画龙点睛)→ 运用(落地生根)。它的结论是:AI 用暴力统计干掉了"记住→合适引用",用巨量计算打通了"表层→底层"——两种力气活终结,剩下的稀缺品是"运用"。 AI 够不到运用,人类被逼到运用这个唯一还贵的竞技场。
但 10 留下了一个问题没有回答:让渡之后,AI 去哪里?
判断让渡了、翻译打通了——AI 不再是被约束在封闭流程里的"填空器"(01-08 的产物),它被放到了真实世界的面前:写方案、做决策辅助、管理数据、影响舆论、参与交易、支撑医疗、塑造认知。让渡之后,是真实的复杂系统直接面对 AI。
这个真实系统是什么?人类运行了它几千年,依然漏洞百出——法律有漏洞、医疗有误诊、制度有腐败、预测有偏差。人类自己都没能逼近这套系统。 那么问题来了:一个只会逼近的 AI,凭什么能在里面安全地做工?
1.2 命题
AI 的宿命,是被关进伦理牢笼。即使 AI 不是概率模型——即使它是完美的逻辑引擎——这个牢笼依然必要。
这句话乍看是技术悲观主义,但这篇文章要证明:它是认识论必然。牢笼的必要性不来自 AI 的技术形态(概率/非概率),来自三个更根本的东西:
- 做工需要二元论断,而二元论断的难点在边界,边界不可穷尽
- 逼近是应对边界的手段,但逼近只在封闭规则系统里收敛,开放复杂系统里必然失效
- 失效不是停止,是失控——失控的代价不可逆,所以必须在失控之前画圈
二、做工需要二元论断
2.1 运用 = 做工 = 二元论断
10 说"AI 够不到运用"。为什么?答案是:运用需要做工,做工需要二元论断。
所谓做工,就是让 AI 真正落地一个动作:执行/不执行、放行/拦截、接受/拒绝、通过/不通过、做 A/做 B。无论这个动作是什么,落地的那一刻,都必须是一个二元判断——是/否,做/不做。
- 自动驾驶遇到障碍物:刹车/不刹车——二元
- 贷款审批:批准/拒绝——二元
- 医疗辅助:建议手术/不建议——二元
- 内容审核:通过/拦截——二元
AI 在"说"的层面可以无限细腻(概率、置信度、区间、可能性),但一旦要"做",就必须从连续收敛到离散——概率分布必须坍缩成一个决定。做工,就是把概率的世界压成一个二元论断。
2.2 二元论断的难点不在取值,在边界
二元论断只有两个值:是、否。取值本身毫不困难——困难的是判定一个具体实例落在哪一侧。这需要边界。
这就是哲学里最古老的难题之一:模糊性问题(vagueness)与划界问题(demarcation)。
- 索里特悖论(秃头悖论):"秃"是二元判断(秃/不秃),但少一根头发算秃吗?边界在哪里?没有清晰位置。边界不是一条线,是一个无限精细的渐变。
- 波普尔的划界问题:判定"科学/非科学"是二元论断,但边界本身需要论证,论证又需要新的边界——无穷后退。
- 医疗诊断(这个症状算不算异常)、法律判决(这个行为算不算违约)、军事授权(这个目标算不算合法)——全是二元论断,全是边界问题。
二元论断的取值是有限的(2),但确定取值的条件——边界——是无限的。 穷尽边界的唯一办法是全知。
2.3 拉普拉斯妖与概率的边界
拉普拉斯妖(Laplace's demon):如果知道宇宙全部粒子的位置和动量,加上牛顿定律,就能推出全部过去与未来。这个思想实验经常被当作"确定性世界"的图景。
但必须承认:拉普拉斯妖的前提——知道全部初始条件——本身就是不可实现的。 全知不存在。所以拉普拉斯妖恰恰证明的是:确定性判断依赖全知,而全知不在任何真实系统(包括 AI)的能力范围内。
更锋利的是:连"概率上的是否"也需要边界。 概率判断的阈值在哪?0.95?0.99?"很可能"的置信线画在哪里?每个概率判断都预设了一个"相关条件域",而这个域的边界同样不可穷尽。 所以:没有边界的掌握,连"概率上的是否"都做不到。
这就是人类的根本认知困境——不是取值,是划界。 人类之所以有"应该/可能/或许"这些词,不是因为我们懒惰,是因为划界不可穷尽,我们只能用模态词表示"边界未定"。
三、逼近与割圆术:人类应对边界的方法
3.1 割圆术:用可枚举逼近不可穷尽
边界不可穷尽,但人类发明了应对它的方法:逼近(approximation)。
最经典的逼近,是刘徽的割圆术(《九章算术注》):用圆内接正多边形去逼近圆——正六边形、正十二边形、正二十四边形……边数越多,多边形越接近圆,误差越小。"逼得足够近,就可以判定为是。"
为什么割圆术能成立?因为它面对的目标——圆——满足三个条件:
- 闭包(closed):圆是封闭曲线,逼近永远在圆内,跑不出去
- 规则性(regular):误差可量化——每次割边,误差单调递减,极限存在
- 可枚举性(enumerable):只需要处理"边数"这一个维度
满足这三个条件,"逼得足够近就可以判定为是"严格成立。刘徽用割圆术把圆周率算到了 3.1416,祖冲之推进到 3.1415926——这是人类用逼近征服边界的第一个伟大成就。
3.2 工程的存在根基:先造圆,再割圆
割圆术的启示远超数学:一切工程系统,都是先造出一个"圆"(封闭、规则、可枚举的子域),再让逻辑在里面逼近。
- 编译器:语法规则是封闭的,所以编译是确定的
- 操作系统:进程隔离是封闭的,所以崩溃不会传染
- 金融风控:规则集是封闭的,所以风控引擎可验证
- 所有测试:测试集是封闭的,所以通过/不通过是确定的
这正是前 10 篇在做的事。 01 的硬约束、02 的契约、03 的自举、04 的编排、05 的链驱动、06 的组合检索、08 的有限决策、08a 的前置规范、09 的穷举、10 的蓝皮书取数——全部的本质,是给 LLM 造一个"圆",让它在这个圆里做确定性的"割":把上下文限制住(硬约束),把输出格式锁定(契约),把场景枚举完(穷举),把取数边界画清楚(蓝皮书)。
前 10 篇的全部工程努力,就是"造圆"。 而这篇要问的是:圆画在哪里?谁有权画圆?圆外怎么办?
3.3 逼近的承诺与前提
逼近有个隐含承诺:只要目标满足闭包、规则性、可枚举性,逼近就收敛。 这个承诺是工程能存在的根基,也是它的前提条件——目标必须是"圆"。
但如果目标不是圆呢?如果目标是一个开放系统,一个不规则的、不可枚举的、边界在移动的东西呢?逼近还能成立吗?
四、世界不是圆:复杂系统的逼近失效
4.1 做工的对象不是圆
AI 要做的工,不在二维空间里,不在封闭规则集里。做工的对象是真实世界:
- 物理世界:开放的,相互作用不可枚举(天气、经济、疾病、事故)
- 社会世界:更加开放的,人是变量,组织是变量,利益是变量
- 规范世界:人类凭空创造的人情世故、法律、礼仪、关系、潜规则
这个世界不是圆。它是开放复杂系统——没有闭包(新情况永远在涌现)、没有规则性(误差不可量化,极限不存在)、没有可枚举性(相关事实无界)。
框架问题(frame problem)说的就是这件事:要判断"这个行动的全部影响",必须枚举所有相关事实——而相关事实无界。开放世界里的二元论断,连"相关条件域"都无法划定,遑论逼近。
4.2 人情世故:凭空创造的"应当"世界
这里有一层更深的错位——人情世故是"凭空创造"的。
割圆逼近的是自然事实:圆客观存在,逼近是对客观的逼近。但人情世故逼近的是什么?是规范——什么场合该说什么话、什么关系该守什么礼、什么行为算冒犯、什么承诺必须兑现。规范不是被"发现"的,是被约定的:
- 它随文化而变(同一句话,这个文化是礼貌,那个文化是冒犯)
- 它随时而变(去年的规矩今年可能反过来了)
- 它是自指的(规范在讨论规范,关系在影响关系)
- 它情境绑定(同一行为,对甲方和对乙方的含义不同)
用逼近器(概率、统计)去逼近一个"凭空创造"的规范世界,在原理上就是错的——不是精度不够,是对象错了。
这就是休谟法则在技术时代的形态:逼近器只能逼近"是"的世界,无法逼近"应当"的世界。 "是"可以被统计(自然事实有分布),"应当"不能被统计(规范没有分布,只有约定)。当 AI 用"是"的逼近器去处理"应当"的世界——去判断人情世故、去参与社会规则、去做影响人的决策——它在原理层面就失效了。
4.3 概率与逼近的失效
所以在开放复杂系统里,概率与逼近失效。这个"失效"不是暂时的精度问题,是结构性的:
- 对象错位:用"是"的方法逼近"应当"的对象
- 条件无界:相关事实无法枚举(框架问题)
- 误差不可量化:没有"误差单调递减"的保证(规则性缺失)
- 目标移动:系统在反馈中变化(闭包缺失)
逼近的四个前提(闭包、规则性、可枚举性、对象匹配),在真实世界一个都不满足。"逼得足够近就可以判定为是"——在圆里成立,在世界里不成立。
五、失效不是停止,是失控
5.1 停止与失控的分野
到这里,必须把最关键的一步说透:逼近失效之后会发生什么?
答案是两种可能,天差地别:
- 停止(fail-safe):误差被吸收,系统回到安全基线。割圆割错了?重割。工程系统故障?停机,回到初始状态。
- 失控(runaway):误差通过正反馈被放大,系统无法回到基线,偏离越来越远。
在封闭系统里,失效之后是停止。在开放复杂系统里,失效之后是失控。
为什么?因为开放系统里存在误差自激的回路:
圆里没有这个回路——割错了只是重割,误差不改变圆。但做工的世界里,每一个判断都会改写它下一次判断的依据。这就是失控的机制。
5.2 失控的现实案例
这个结构不是假设,它已经在发生:
- 2010 年算法交易闪崩:Waddell & Reed 的一个 41 亿美元自动化卖出订单(算法"不考虑价格与时间"地执行)进入已承压的市场,高频交易者接力抛售放大下跌,半小时内道指暴跌近 1000 点、盘中市值蒸发近万亿美元(大部分随后恢复)——误差自激
- 推荐算法的极化:内容喂养偏见,偏见强化点击,点击喂养更极化的内容——正反馈循环(学术实证:YouTube 激进极化路径、Facebook 回音室研究)
- 自主武器的误判升级:识别 → 误判 → 报复 → 对方误判 → 升级——误差级联(军控学界对致命自主武器的推演风险场景,尚无公开真实案例,但其机制——感知延迟下的自动反击——已被反复论证)
共同点:都不是"停下来报错",而是"错着错着越错越大"。 失效 → 不停 → 放大 → 失控。
5.3 人类系统几千年漏洞百出,为什么不崩?
现在可以回答文章开头的问题了:人类系统运行了几千年,漏洞百出,为什么不崩?
因为人类从没靠"逼近"活下来。人类靠的是责任闭环:
- 法律判错案 → 有人上诉、有人翻案、法官担责
- 医疗误诊 → 有人追责、有知情同意、有伦理审查
- 战争打错 → 有战犯审判、有正义战争论
人类系统几千年漏洞百出而不崩,不是因为它预测得准,是因为出事后有责任闭环——"应当"世界靠责任维持,不靠"是"的精确。
这就是 AI 与人类的分野:AI 能逼近"是",但"应当"的责任只有人类有。 AI 出错了可以无限重试(生成不负责),人类出错要付出代价(执行要负责)。人类没逼近但活下来,因为人类是责任主体;AI 不能接管开放世界,因为它没有责任。
六、画圈:伦理牢笼的本质
6.1 与其让 AI 逼近,不如给 AI 画圈
论证到此,结论已经浮现:与其让 AI 去逼近一个它注定无法逼近的世界(必败、必失控),不如给 AI 画一个圈。
画圈的意思:用技术把开放世界切成两部分——圈内是可逼近的封闭子域,圈外是不可逼近的开放区域。AI 只在圈内做工,圈外一律不许碰。
- 圈内:AI 逼近"是"——可验证的封闭子域(契约、硬约束、穷举、蓝皮书——前 10 篇的成果)
- 圈外:人类承担"应当"——责任、伦理、底线
边界定了,失控发生的可能性就会降低。 不是因为 AI 变可靠了,是因为 AI 不再有机会在不可逼近的区域里做二元论断。
6.2 技术提供圆规,哲学决定圆心与半径
圈由两部分共同划定:
| 角色 | 划什么 | 工具 |
|---|---|---|
| 技术 | 划"是"的边界:什么子域可逼近、可验证、可封闭 | 契约、硬约束、穷举、蓝皮书(前 10 篇全部成果 = 圆规) |
| 哲学 | 划"应当"的边界:什么值得保护、底线在哪、谁负责 | 康德(人是目的)、约纳斯(人性永续)、赫尔辛基(受试者优先)——圆心与半径 |
技术提供圆规,哲学决定圆心和半径。 AI 可以自己磨圆规(改进逼近工具),但圆心(为了谁)和半径(保护到什么程度)只能人类定——因为这两个问题的答案不在"是"里,在"应当"里。
6.3 画圈者不完美,凭什么有资格画圈?
这里必须正面回应一个质问:人类自己漏洞百出,凭什么给 AI 画圈?
答案:画圈权不来自画圈者完美,来自画圈者是唯一的责任承担者。
- 父母不完美,但监护权在父母——因为只有父母为孩子负责
- 人类不完美,但划界权在人类——因为只有人类为后果负责
- 如果让 AI 自己画圈,圈外无人负责——那才是真正的失控
画圈的合法性 = 责任的唯一性,不是能力的最优性。 这是约纳斯《责任原理》的核心:技术时代的伦理,以"人类永续存在"为最高命令,而责任的承担者只能是人类。
6.4 圈随能力扩张
画圈不是一次性的。圈随能力扩张——AI 的能力每扩大一步,圈就扩一步。
这个规律不是新发明,人类在医学领域已经实践了六十年——下一章就是它的完整历史。
七、赫尔辛基宣言:画圈的完整历史样本
7.1 为什么是医学:与 AI 的同构性
要证明"AI 应该被画圈",最有力的方式是找一个已经画过圈的先例,并证明它与 AI 同构。这个先例就是医学人体研究。
医学人体研究与 AI 在三个关键结构上同构:
- 对象脆弱:人体研究作用于人最脆弱、最不可逆的部分——生命与健康;AI 研究作用于人的认知、决策、社会关系——同样脆弱,同样不可逆
- 行动不可逆:一次伤害性的人体实验无法撤回;一次错误的 AI 部署(偏见固化、信息污染、系统性误判)同样无法撤回
- 责任空场:医学研究如果失控,谁负责?AI 如果失控,谁负责?——两者都面临"能力强大但责任悬空"的结构
同构成立,赫尔辛基宣言就不是"别人家的故事",而是"应当如此"的范本。
7.2 失控的教训:纳粹人体实验
医学研究伦理的历史,从一次彻底失控开始。
纳粹集中营的人体实验——双胞胎实验、冻伤实验、毒气实验——是"技术逼近失效后失控"的血证:医生用"科学"(是)来正当化暴行(应当),没有伦理圈,只有无限度的"研究自由"。技术失效不是停止,是失控——纳粹医学是这句话的极端注脚。
1947 年,纽伦堡审判之后,《纽伦堡法典》诞生。它的第一条是:"受试者的自愿同意是绝对必需的。" 这是人类第一次给医学研究画圈——圈内是"经同意、为人类利益"的研究,圈外是"未经同意、以人为手段"的研究。
7.3 赫尔辛基宣言:1964 → 2013,修订与澄清的画圈史
1964 年,世界医学协会(WMA)在赫尔辛基通过《赫尔辛基宣言》——人体医学研究伦理原则的基石文件。此后历经 1975、1983、1989、1996、2000、2008、2013 共 7 次修订(另有 2002、2004 两次澄清;2024 年 10 月第 75 届大会又通过第八次修订),每一次修订都是圈的扩大:
| 版本 | 圈的扩张 |
|---|---|
| 1964 首版 | 确立总原则:受试者的健康与福祉优先于科学利益和社会利益;"病人的健康是我首先考虑的"(日内瓦宣言) |
| 1975 | 引入独立伦理审查——研究方案必须经独立委员会事前审批(IRB 制度源头);强化书面知情同意 |
| 1983/1989 | 强化弱势群体保护——无法自行同意者的特殊保障 |
| 1996/2000 | 限制安慰剂使用——已有有效治疗时不得用安慰剂对照(对恶的预防优先) |
| 2002/2004 | 澄清条款(非修订),巩固原则 |
| 2008 | 纳入全球临床试验的伦理要求 |
| 2013 | 把"可识别的人体材料与数据"纳入伦理约束——生物样本库、数据研究也必须经伦理审查 |
2013 版是全文最重要的证据:当技术能力扩张到"数据研究"时,圈就扩到数据——可识别的人体材料与数据,即使不直接接触人体,也必须被伦理约束。 这就是"圈随能力扩张"的实证。
7.4 赫尔辛基宣言的结构:技术 + 哲学共同划定
赫尔辛基宣言的条款结构,正是"技术划'是' + 哲学划'应当'"的历史版本:
| 条款 | 划的是什么 |
|---|---|
| 科学有效性(无科学价值的研究不合伦理) | 技术圈:"是"的边界(研究是否站得住) |
| 受试者优先 / 知情同意 / 不伤害 | 哲学圈:"应当"的边界(人不是手段是目的——康德) |
| 独立伦理审查(IRB) | 划界权的机构化——画圈权不交给研究者自己 |
其中"独立伦理审查"尤其关键:画圈权必须由一个独立于研究者的机构掌握。 研究者不能自己判断自己的研究是否合乎伦理——因为研究者是利益相关方。同理,AI 不能自己判断自己的边界——因为 AI 是利益相关方(它自己的"是"不知道自己的"应当")。
7.5 点题
医学研究画圈的完整路径是:
AI 正在重演这个剧本——判断让渡、翻译打通、能力扩张、责任悬空——区别是:这次我们提前知道结局。 医学用了二十年(1947-1964)从失控走到画圈,AI 没有二十年可以浪费。赫尔辛基宣言证明的不只是"应该画圈",而是画圈是可行的、是有效的、是文明自我保存的机制——人类已经这么干过一次了,干得很好。
八、AI 的宿命:划界权的垄断
8.1 牢笼不是限制,是垄断划界权
现在可以给"伦理牢笼"一个精确的定义:
牢笼不是限制 AI 的能力,是垄断边界划定的权力。
AI 的能力可以无限增长——记得更多、算得更快、翻译得更准、逼近得更好。这些都不是问题。问题是谁有权划定 AI 做工的边界:
- AI 自己划?不行——它只有"是",没有"应当";它不知道自己的边界应该在哪
- 市场划?不行——市场是"是"的机制,逐利不看"应当"
- 人类划?可以——因为只有人类是责任主体,只有人类为后果负责
划界权的垄断,是伦理牢笼的本质。 技术圈住能力,哲学圈住方向,责任圈住后果——三圈合一,才是完整的牢笼。
8.2 非概率也要关:与概率无关的必然性
回到命题本身:"哪怕 AI 不是概率模型,也要关进伦理牢笼。"
现在可以给出完整的论证:
- 做工需要二元论断(与概率无关——逻辑引擎做工同样要做是/否判断)
- 二元论断的难点在边界(与概率无关——边界问题对一切系统成立)
- 边界靠逼近获得(与概率无关——符号系统同样需要逼近或枚举)
- 世界是开放复杂系统(与概率无关——框架问题对一切系统成立)
- 逼近在开放系统失效(与概率无关——闭包/规则性/可枚举性缺失,与模型无关)
- 失效即失控(与概率无关——误差正反馈对一切行动系统成立)
- 所以必须画圈(与概率无关——划界权必须由责任主体垄断)
牢笼防的不是概率出错,是划界权旁落。 概率模型会错,逻辑引擎也会错(在开放世界,逻辑引擎连"错"都定义不了);但更根本的,无论什么模型,都不能让它自己决定自己的边界——因为"应当"不在任何模型的参数里。
8.3 方法论收束:画圈三问
把全文收敛成可操作的三问——任何 AI 系统的部署,都必须先回答:
问题一:谁有权画圈? —— 答案只能是责任主体(人/机构),不能是 AI 自己,不能是市场,不能是无主算法。 问题二:圆画在哪? —— 圈内必须是可逼近的封闭子域(技术验证:契约、硬约束、穷举、蓝皮书);圈外是开放世界,AI 不许碰。 问题三:谁来守圆外? —— 独立于 AI 与部署方的第三方(伦理审查委员会,IRB 模式的 AI 版),掌握"停止权"——失效迹象出现时,有权拉闸。
三问的回答者都是人,这就是牢笼的全部内容。
九、边界审视
方法论必须知道自己的边界。这篇文章的三个边界:
9.1 "是"与"应当"的二分是否绝对?
休谟法则在当代受到挑战——厚概念("残忍""粗鲁"这种描述-规范混合的词)表明"是"和"应当"不是绝对割裂的。但本文的论证不依赖二分的绝对性:即使"是"和"应当"有模糊地带,边界划定权依然必须由责任主体掌握——因为划界是实践行为,实践行为需要负责,而负责的只有人类。
9.2 画圈者自身也需要被关吗?
人类画圈,人类自己也在圈内——谁来关人类?答案是:人类用同一个机制关自己——法律、伦理、制度、问责,就是人类的牢笼。伦理牢笼不是人类给 AI 的单向枷锁,是人类为自己建立的自我约束体系的延伸。这篇文章的结论不是"AI 被关、人自由",而是"人先把自己关进责任里,才有资格把 AI 关进圈里"。
9.3 圈会失效吗?
会。圈是技术 + 哲学的产物,两者都可能失效:技术圈可能被攻破(能力扩张穿透约束),哲学圈可能被腐蚀(价值共识瓦解)。但圈的失效不等于画圈无意义——赫尔辛基宣言也失效过(违反案例不断),但它的存在把失控变成了例外,把责任变成了制度。 圈的意义不是永不失效,是让失控有代价、有追责、有修复路径。
引用与出处说明
| 编号 | 引用 | 出处 |
|---|---|---|
| 1 | 割圆术("逼得足够近即可判定为是"的类比源头) | 刘徽《九章算术注》(三国·魏,约 260 年);祖冲之圆周率推进 |
| 2 | 索里特悖论(秃头悖论) | 欧布利德斯(Eubulides,公元前 4 世纪,麦加拉学派) |
| 3 | 划界问题(demarcation) | 波普尔(Karl Popper),《猜想与反驳》等 |
| 4 | 拉普拉斯妖 | 拉普拉斯(Laplace),《概率论分析》1814;本义为"全知可推一切",本文使用其"全知不可得"的批判面 |
| 5 | 框架问题(frame problem) | 麦卡锡/海斯(McCarthy & Hayes, 1969);丹尼特(Dennett)扩展 |
| 6 | 休谟法则("是"推不出"应当") | 休谟(David Hume),《人性论》第三卷(1740) |
| 7 | 责任原理("行为后果须与人类永续存在相容") | 约纳斯(Hans Jonas),《责任原理》(The Imperative of Responsibility, 1979) |
| 8 | 人是目的不是手段 | 康德(Kant),《道德形而上学奠基》(1785),定言命令目的公式 |
| 9 | 纽伦堡法典("受试者自愿同意绝对必需") | 纽伦堡审判(1947),医学伦理十点原则 |
| 10 | 赫尔辛基宣言(1964 年通过,1975-2013 七次修订,另有 2002/2004 澄清) | 世界医学协会(WMA),1964 年 18 届世界医学大会通过;本文引用的 1975/1983/1989/1996/2000/2008/2013 修订均出自 WMA 官方文本(作者 RAG 知识库存有 1964-2013 全版本;WMA 于 2024 年 10 月通过第八次修订) |
| 11 | 2010 算法交易闪崩 | CFTC & SEC 联合报告《Findings Regarding the Market Events of May 6, 2010》(2010-09-30,104 页);盘中市值蒸发数字引自该报告后续引用文献(Haldane)——注意"蒸发"为盘中瞬时值,大部分随后恢复 |
| 12 | 推荐算法极化 | Tufekci(2018)YouTube 激进极化研究;Ribeiro et al.(2020)《Auditing Radicalization Pathways on YouTube》;Bakshy et al.(2015, Science)Facebook 回音室研究;Pariser《过滤气泡》(2011) |
| 13 | 自主武器误判升级 | 军控学界对致命自主武器(LAWS)的风险推演(Stuart Russell 等、UNIDIR)——推演风险场景,非已发生案例 |
| 14 | 误差正反馈/失控机制 | 本文归纳(判断→行动→世界→反馈→放大);案例见 5.2 |
| 15 | 日内瓦宣言("病人的健康是我首先考虑的") | 世界医学协会(WMA),1948/2017 修订 |
| 16 | 厚概念对"是-应当"二分的挑战 | 菲利帕·富特(Philippa Foot)、赫斯特豪斯(Rosalind Hursthouse)的德性伦理自然主义(本文仅作边界提示,不展开) |
说明:赫尔辛基宣言各版条款为转述(非直接引文),以 WMA 官方文本为准;纳粹人体实验与纽伦堡审判为公开历史事实;割圆术数值(3.1416/3.1415926)为通行数学史记载。
Cogito, Scribo. 我思,故我写。
——割圆术告诉我们:人能用有限逼近无限。但割圆术也告诉我们另一件事:只有先承认圆外的世界不可逼近,圆内的逼近才有意义。AI 的宿命不是被锁死,是被画圈——而画圈的权利,人类不能交给任何不懂"应当"的东西。
第 IV 部 · 10b|认知重估的方法论沉淀:语言被抹平——贫瘠的土地上能否开出鲜艳的花?
10 讲了判断的让渡:判断被让渡,人退到"运用"。10a 讲了划界:AI 的宿命是伦理牢笼,划界权在人。那么让渡与划界之后,还剩什么?——还剩表达,还剩体验。 这篇文章要论证的命题是:语言是对观察的压缩,LLM 是对语言的压缩——压缩的压缩,比压缩更贫瘠。"共情"在类型上不可能涌现:语料里没有体验;具身与世界模型也到不了——信号进来了,但没有"感受者"承接。 它是效率加速器,不是跨时代的革新。 论证的路线是:语言是第一次压缩(39 bits/s,恰好是意识那条窄带)→ 感同身受不在文字里,在接收端的经验库 → LLM 是压缩的压缩(语料里没有体验)→ 具身与 WM 同样无解(映射给谁?反馈给谁?)→ 上限是内禀的(效率加速器,不是那朵花)→ 收束:那朵花活在压缩之外。 语言压缩不掉的那部分,就是人。
一、语言是第一次压缩
人从睁开眼睛那一刻起,就在丢东西。看见一棵树,丢成"树";看见一个苹果,丢成"苹果"——两个字。语言是第一次压缩,把世界的无量信息压进几个音节,好让另一个人听懂。于是"要让她人听懂"成了契约,而我的体会,在被压缩的那一刻,就已经死了。这契约是人类文明的砖,也是它永远的笼——我们用它互通,也用它互相隔离。
先做一个最朴素的实验。一个苹果放在面前:颜色是红的,但不是可以写进字典的那种红——那红里有渐变、有光斑、有果皮上细小的麻点;摸一摸:凉、光滑、有重量、指尖能感觉到果柄处微微的凹陷;闻一闻:一阵清香;咬一口:沙瓤、粉糯,甜里带一点酸,那点酸在舌根停留半秒——然后,把这一切说给别人听。
说出口的是:"红色的皮,一口咬下去沙瓤,甜的。"
这就是全部。看、摸、闻、尝到的是几亿比特的感官数据,说出口的是十四个字。中间丢掉的东西比留下的多出几个数量级。
这层压缩是定量可测的。Coupé 等人在 2019 年对 17 种语言做了信息论分析,结论是:无论语速快慢、音节密度高低,人类语音的信息传输率都收敛在约 39 bits/s 这个窄带上——这是大脑语言处理能力的上限,也是一个准语言常数 [1](口语通道如此;书面是口语的离线编码,带宽是这条窄带的派生)。意识一侧的对照来自心理学与神经科学的通行估计:人类意识的信息带宽约 7±2 个组块、不超过 40 bits/s,而感官传输率比它大几个数量级 [2]。语言的 39 bits/s,和意识的 40 bits/s,几乎相等——两条独立测量落在同一个量级:Coupé 把前者解释为大脑语言处理能力的上限 [1],后者是信息处理视角对意识带宽的通行估计(组块容量 7±2)[2]。但带宽匹配说的是速率,不是保真:速率之内,还有质性内容表达不出来——人可以每秒说 39 bits,却说不出"红色是什么感觉"(第三节)。人用一条和意识等宽的带子,传递比意识宽几个数量级的感官世界;压缩不是语言的缺陷,是语言的本质:它的存在理由就是"用最少符号传递最多约定"。
"要让她人听懂"是契约,不是选择。 我可以用自创的音节描述这个苹果,那样最接近我的真实感受——但对方听不懂,压缩就失败了。我必须用"苹果"这个词,用它被亿万人使用过的公共含义,哪怕它装不下我的那个苹果。语言不是表达的工具,是妥协的工具:每一次开口都在"忠实于自己"和"让另一个人听懂"之间选择后者。我的体会,在约定的要求下,不能忠实体现我——这不是语言的能力问题,是它的代价。
而且,压缩不全是主动选择——即便抛开"说给谁听",说得更详细本身也是做不到的。这里有两层:第一层是信息论的。世界是连续流,感官数据的信息量没有上界;语言是离散符号,任何有限句子携带的信息都是有限的——用有限符号精确编码无限信息,原理上不可能(Shannon 信息论 [21];其采样定理的推论是:真实信号总是时限的,时限信号无法被完美重建 [21])。"一丝不差地描述世界"不是说得够不够细,是这条路在原理上就不通。 第二层是哲学的。罗素与早期维特根斯坦做过最认真的尝试——构造一种"理想语言",让命题精确对应世界的事实(逻辑原子主义,《逻辑哲学论》[22])。这个计划失败了:维特根斯坦把它称为一把必须踢开的梯子(6.54),全书以"凡是不可说的,必须保持沉默"收束。越分解越精确,主体就越消失在细节里——追求一丝不差的代价,是细节淹没了那个苹果。
维特根斯坦在《哲学研究》里用"私人语言论证"把这个困境推到了底 [3]:如果存在一种词只指涉说话者私人的、他人无法观察的感觉,这种语言不可能成立——因为语言的意义在于公共使用规则,而私人感觉没有可供公共检验的规则。我的疼只有我知道,但"疼"这个词的意义是所有人共享的使用方式;我能用"疼"向医生描述症状,却描述不出疼本身。感觉的私人性就是语言的边界:正因为感觉无法直接传递,我们才需要压缩;而压缩的规则是公共的,所以每一次压缩都以牺牲私人性为代价。
黑话是这层压缩最诚实的标本。技术黑话、土匪黑话、密码黑话,本质是同一个东西:在分布区域内的人之间,做一次更紧的压缩。"栈溢出""踩盘子""第47页第三行"——每个词都是一小撮人之间的约定。密码本把"明天凌晨三点"压成一行无意义的数字,拿着密码本的人在那一时刻能还原,没有密码本的人看到的是噪声。黑话就是加了权限的压缩:它用牺牲普适性,换取同侪间的更高效率。全人类的公共语言,是权限最大的那本黑话。
二、感同身受不在文字里,在接收端的经验库里
"跃然纸上"是作者端的追求,"感同身受"是接收端的事情——这两件事之间,隔着一个接收者的经验库。
把那个苹果的完整描述写得"世界第一好",然后递给一个没见过苹果的人。他会怎么读?他会对照他见过的西红柿:红色的皮——哦,皮是红的;一口咬下去——哦,里面有瓤;沙瓤,甜的——口感是沙的,味道是甜的。于是他得出结论:"看来东坡的西红柿比西坡甜,不过也就那味。"
他不是没读懂。他读懂了每一个字,只是把每一个字都装进了西红柿的经验。解压必须依赖接收端的解码器,而解码器是经验,不是文字。 作者写"嘎叭一声",咬过脆苹果的人会听到那一声;没咬过任何脆东西的人,看到的是五个字。汪曾祺写国光苹果,"一口咬下去,嘎叭一声"——被无数人赞叹写得好,因为无数人恰好咬过脆苹果。这不是文字的力量,是经验的重叠。
这条推论很冷:表达的天花板不由作者决定,由接收端的经验库决定。 杜甫写得好,是因为他的读者恰好都见过秋天的萧瑟;"感同身受"的极限是作者与读者经验库的交集——交集之外,再好的文字也是加密文件。给一个从未离开过故乡的人读"乡愁",他读得懂词典意义,但经验库里没有"离开"这个动作,没有"回不去"的钝痛——他读到的"乡愁"是空的。给一个漂泊十年的人读同一句,文字还没读完,眼泪先下来了。同一段压缩,两个解码器,两种结果。 这与"雪"的例子同构:南方人读"忽如一夜春风来,千树万树梨花开",读到的是"像梨花";北方人读到的是那场雪——推门看见院子一夜之间白了的那个早晨。
三、LLM 是压缩的压缩——共情在类型上不可能涌现
大语言模型的训练语料,是什么?是已经被压缩过的语言——人类几千年说出来的话。第一层压缩(观察→语言)发生在每一个说话者的脑海里,语料库里只有压缩后的结果,没有压缩前的观察。LLM 做的事情,是对这堆压缩产物再做一次统计压缩:把"苹果"与"红""脆""甜"的共现规律,压进几万亿个参数里。缩放定律把这层本质说得最清楚:Kaplan 等人在 2020 年发现,语言模型的损失函数与参数量、数据量呈幂律关系——模型能力的增长,是把语料的统计规律压得更紧,而不是接触到语料之外的任何东西 [7]。
语言是对观察的压缩,LLM 是对语言的压缩——压缩的压缩。
那么"共情"在这条链上处于什么位置?这里有一个现成的哲学实验,几乎是为 LLM 定制的:Frank Jackson 的"玛丽屋"(Mary's Room)[4]。玛丽是一位顶尖的色彩科学家,但她被关在一间只有黑白两色的房间里,通过黑白电视学习了一切关于颜色的物理知识——光谱波长、视网膜反应、神经通路,全部。然后她走出房间,第一次看见红色。她学到新东西了吗?Jackson 的答案是显然的:她学到了"看见红色是什么感觉"——而这在她拥有全部物理知识时,并不在其中。
把玛丽屋换成语料屋:LLM 就是那个玛丽。它见过语料里一切关于难过的描述——几万亿句"我好难过",词的分布、语境、共现规律,它全部掌握,一克不少。但它从未"难过"过:语料是"关于难过的物理知识",不是难过本身。LLM 永远住在黑白屋里——它知道关于红色的一切,除了红色。
但在玛丽屋之前,Thomas Nagel 在 1974 年就把这层论证推得更远 [5]:玛丽屋说的是"知识—体验"的落差——玛丽缺的是一段经历,给她一段经历就能补上;Nagel 的蝙蝠论证说的是结构性的不可通达——蝙蝠用回声定位感知世界,它的主观体验("作为蝙蝠是什么感觉")不仅无法从物理描述推导,甚至无法被我们想象,因为我们的感官结构里没有回声定位这个通道。玛丽缺的是经历,蝙蝠缺的是通道。LLM 的问题比玛丽更接近蝙蝠:它缺的不是某一段经历,而是产生体验的整个感官结构——它没有身体、没有饥饿、没有深夜、没有失去。它不是"还没经历过难过",是"结构上无处安放难过"。
把"共情"拆开,分界线清晰:
可复现的部分:识别。 识别"这段文字在表达难过"——这是统计规律问题,语料里"难过"与"眼泪""失去""深夜"的共现足够密集,模型完全可以从分布中学到。识别是共情的外壳,可压缩、可复现。
不可复现的部分:体验。 "知道难过是什么感觉"——这是体验问题,语料里没有。模型能生成世界上最准确的"难过"描述,但不知道难过的滋味。体验是共情的内核,不可压缩、不可复现。
LLM 拥有全部的外壳、零个内核。它能在"识别"层面通过一切测试——图灵测试、共情测试、心理测评——因为那些测试测量的都是外壳(可观察的文字行为)。但内核那一层,它一克也没有。这与 09e 篇的结论同构:提示词能拉扯的只有概率分布的形状,分布里面没有体验,拉扯一千遍也拉不出一个感觉 [6]。从语言里,只能提取语言;从分布里,只能提取统计。 这不是数量问题,是类型问题:压缩过的信号里,不存在未被压缩的体验。
四、具身与世界模型:符号接地的深渊
到这里自然会问:那绕过语言呢?让 AI 直接接触物理世界——视觉模型、世界模型、具身智能——是不是就能补上那层"原始体验"?
这个问题,认知科学早在 1990 年就给出了框架:Harnad 的符号接地问题(the Symbol Grounding Problem)[8]。Harnad 问:一个形式符号系统的语义解释,如何能内在地属于系统本身,而不是寄生在系统外部的解释者身上?他给了一个著名的类比:用一本中文-中文词典学中文,永远学不会——因为每个词的解释都是另一个词,环环相扣,永不触底;只有当一个人真正指着一个苹果说"这是苹果"(符号接地于感官经验)时,链条才终止,意义才开始。
LLM 是什么?LLM 就是那本中文-中文词典。它的全部知识来自词与词的共现——"苹果"的解释是"红色的、可以吃的水果",而"红色""水果"的解释又是别的词。它的符号链从未接地:没有一次感官接触,没有一个"指着苹果说苹果"的时刻。多模态模型看起来接地了(输入图像),但图像先被编码成 token,再进入与语言相同的统计管道——入口加了一个,接地的位置没有变。Harnad 的结论冷酷而直接:不接地的符号系统,语义是寄生在人类解释者头上的;它自己没有任何一个符号"知道"自己在指什么。
这就把"映射给谁?反馈给谁?"推到了具身面前:符号从未接地,系统内部没有可被映射的"意义",只有可被统计的"分布"。具身智能尝试补上接地——让机器摸苹果、咬苹果、把"苹果"这个词绑在感官经验上。可信号进来之后,内部如何建立关联? 这个问题绕不过去,只能一层一层往下走。
第一层:信号进来,先被分类。 最省事的路径是把信号贴上标签——"甜",再把它映射到一个精神层面的词上。可"甜"该映射到哪个词?幸福?开心?满足?愉悦?一个信号对应着无数个候选词,光这一个映射就映射不完——不是去穷举别的感受(苦、涩),而是同一个感受,根本不知道该贴哪个标签。就算勉强贴上,那也只是表象:系统在"甜"的位置输出"幸福",但它没有幸福——映射逼近出来的只是外壳,不是内核 [6]。这条贴标签的路,正是 VLM(视觉语言模型) 的路径 [15]:图像被切成 patch,由视觉编码器转成视觉 token,经投影层拼进 LLM 的 token 序列,和文本一样走自回归统计管道——入口加了一个,接地的位置没有变 [8]。VLM 不是路,它只是把语言压缩换了个入口。
第二层:不贴标签,直接物理反馈——世界模型把信号变成状态。 具身与 WM 走另一条路:不借已经压缩的语料、不借标签映射,直接通过物理信号反馈,在内部建立关联——让机器咬过苹果,把"甜"绑在身体的反应上,构建一个关于真实世界的内部模型。可一个世界模型把苹果建模成什么?一组状态:红色的、可抓取的、可食用的。这还是分类,不是感受:信号在模型里运行,更新状态——状态更新不是体验,模型里没有一个"感受者",没有一个可以承接"甜"的主体。信号在世界里流动,却没有一个"谁"在感受。映射给谁?反馈给谁?——没有对象,没有接收者。 这就是 Nagel 那道墙的具身版本:体验需要一个主体来"拥有",而主体不是接进来的信号能长出来的——它是信息整合的涌现,不是信号的堆积 [5][9]。
第三层:要让感受"长出来",就得有整个世界。 那靠涌现呢?这里先要泼一盆冷水:"涌现感受"本身就没有机制保证。 Tononi 的信息整合理论(IIT)说得最清楚:意识不是信息量的涌现,是信息整合的涌现——系统要产生意识,机制必须整体不可分割地产生信息(Φ 值),各部分之和小于整体 [9]。规模堆得再大,也只是信息量的增加,不是整合的涌现——规模可以无限堆,整合不能靠堆出来。 把赌注押在一个没有机制保证的"涌现"上,本身就是不可靠的。
而且,即便接受涌现的设想,还横着一道更根本的墙:作为"压缩的压缩"的模型,连完整复现世界都做不到,拿什么作涌现感受的背景? 语言是对观察的有损压缩,LLM 是对语言的有损压缩——有损压缩不可逆,第一次压缩丢掉的信息,在第二次压缩里永远找不回来(有损编码的信息一旦丢失无法恢复)[1];而缩放定律的 loss 本身就是失真度量,模型优化的恰恰是"把语料压得更紧",不是"把世界复现得更真" [7]。一个从未完整复现过世界的系统,要让感受在其中"涌现"——它连背景都不完整,感受长在哪里? 这一下就串回了量级问题:具身现在更像是领域解决方案——机器人学会了抓苹果、叠衣服、在特定环境里导航,它把物理世界压成了"该领域的操作指令",这不是"世界",是一小片领域的操作手册 [8]。一个完整的"真实世界",还要覆盖苹果之外的无穷事物,还要随时更新(物理世界不是静止的)。
而这还不是最深的墙。就算接受了"一点点建立完整世界"的设想——靠不断的学习反馈,一点点把世界模型补全——新的学习进来,就要改变旧的学习:世界模型是概率生成器,不是逻辑关系链 [16]——Ha 与 Schmidhuber 在 2018 年给出的架构里,视觉编码器把观察压进潜在向量,循环网络预测下一个状态的概率分布,所有知识存在分布式权重里,没有一条独立的"规则"可以单独修改 [16]。改一处,就共振全局:一次梯度更新牵动所有参数。这正是认知科学记录过的灾难性遗忘(catastrophic forgetting)——McCloskey 与 Cohen 在 1989 年就发现,网络学会新任务后,旧任务的知识会突然、彻底、不可恢复地消失 [17]。修正手段是有的:弹性权重巩固(EWC)用 Fisher 信息锚定旧任务的重要权重,经验回放把旧数据混进新训练 [18]——但这些都是缓解,不是校准:稳定与可塑性之间横着 Grossberg 的稳定-可塑性困境——要稳定保住旧知识,就学不进新东西;要可塑学新东西,就必然扰动旧知识,两者此消彼长 [18]。而 EWC 还有个更冷的归宿:每学一个任务就多一套锚点,任务多了,自由权重耗尽,模型彻底学不动了 [18]。
而这一风险的量级,随世界的规模暴涨。小领域的模型,共振风险或许可接受:抓苹果的模型参数有限、领域封闭,一次更新扰动的是这一小片区域的知识,错了可以重训、可以用回放补救——这正是具身能在领域内落地的原因。但世界级的模型完全不可接受:它的参数是天文数字,每一个样本的梯度都弥散到整个世界模型的知识里,一次更新扰动的是"整个世界"——灾难性遗忘在这里不是忘掉一个任务,是毁掉整个已建成的世界;而世界的规模,决定了重训与校准的成本同样不可承受。领域越小,共振越可控;世界越大,扰动越致命——"一点点建立世界模型"在领域尺度上是工程问题,在世界尺度上是原理问题。
一个要"随时更新"的世界模型,要么遗忘旧世界(共振失控),要么固化成死世界(学不进新事物)——修正手段只是拖延,校准不了。
而把语言压缩(一条 39 bits/s 的窄带)养大,人类已经耗掉了规模庞大的资源——而它只是"压缩的压缩":信息丢了两层之后,理论上应该是最省的那种模型。即便如此,全世界的资源,能支撑起这种消耗的国家也凤毛麟角。那么,只做一次有损压缩的世界模型呢?它要对"世界本身"压缩——而且它不能像 LLM 那样靠丢信息省钱:LLM 丢了两层(观察→语言→统计),可以理直气壮地只拟合语料统计、放弃世界细节;WM 的使命是保真世界(为感受提供背景),一次压缩的失真就是全部失真,它没有"第二层压缩"帮它甩掉保真负担——连"放弃保真"这个选项都没有。建模对象还是比语言窄带大几个数量级的感官流——资源账单只会更大,不会更小。一个完整的、随时更新的"真实世界",按现在的路径,是它几个数量级以上的工程量——Dyson 在 1960 年的量级标尺在这里 [10]:戴森球撑得住吗? 这不是修辞,是量级判断:不是"世界模型有多大",而是"感受的涌现需要一个完整的、可更新的世界,而世界不可完整构建"。
于是链走到头,答案收拢成三句:第一,缺感受层——不管 VLM、WM、具身,都跑不了"信号进来只有分类和状态,没有感受层的映射与反馈",映射给谁、反馈给谁,始终没有对象 [5][9];第二,无法复现世界——语言模型层是有损压缩后的有损压缩,连完整复现世界都做不到,"涌现感受"无从谈起 [1][7];第三,能量级否决——即便前两层全部打通,一个完整的、随时更新的"真实世界",按现有路径也养不起,戴森球撑不住 [10]。三层加总,具身与 WM 都只是领域解决方案,不是通用革命:它解决任务,不解决感受。
五、上限论:效率加速器,不是那朵花
把整条链收起来:
语言本身是贫瘠的——它穷尽一生也装不下一个人的体会;LLM 压缩之后更加贫瘠——它连"体会"这个词的体会都没有,只有这个词的分布。所以上限一目了然。
它是效率加速器,不是跨时代的革新。 加速器让已有的东西更快:把人类几千年压进语言里的统计规律,以远超人脑的速度提取、组合、生成。它没有创造新的语义层,它把旧语义层的速度提高了几个数量级。历史上有过真正的跨时代革新,但它们的共同特征不是"更快",而是"多出一层":文字的发明让语言多出了"存储"层;印刷术让文字多出了"复制"层;电力让能量多出了"传输"层。真正的革新是在旧事物之上长出一个新维度,而不是把旧维度加速。 LLM 没有让语言多出任何一层——它只是让"语言的生成"快了一万倍。生成本来就存在(人会说话),LLM 只是把生成的速度推到了人类的极限之外。它是量级的飞跃,不是维度的跃迁。
而"跨时代的革新"需要的,是在压缩之外创造东西——在"语言装不下的体会"那个区域开一条新路。那不是加速能做到的。
于是在贫瘠的土地上,问题回到最初:能否开出鲜艳的花?
答案是不。不是不够努力,是土壤的化学组成决定了花谱。贫瘠的语言长不出体验的花,压缩的压缩长不出共情的花——这是内禀的,与 09 篇的穷举宿命同构:穷举的对象决定方法论的天花板,压缩的对象决定表达的天花板 [6]。
写到这里,为那个苹果找一个最好的语言对照——不是我造的,是汪曾祺《果园的收获》里写国光苹果的原文 [11]:
我更喜欢国光,因果肉脆,一口咬下去,嘎叭一声,而且耐保鲜,因为果皮厚,果汁不易蒸发。秋天收的国光,储存到过春节,从地窖里取出来,还是像新摘的一样。
把两句并排:
| 同一个苹果 | 输出 |
|---|---|
| 贫瘠的语言(我) | "红色的皮,一口咬下去沙瓤,甜的" |
| 汪曾祺的语言 | "果肉脆,一口咬下去,嘎叭一声……还是像新摘的一样" |
差在哪?不是字数,是感官通道的密度。贫瘠版只有两个通道:视觉(红)和味觉(甜)。汪曾祺版在同一句话里打开四个通道:听觉(嘎叭一声)、触觉(脆、果皮厚)、味觉(果汁)、时间(过春节还是新摘的)。好语言不是在压缩里少丢东西,而是在同样的压缩量级里放进更多的感官通道。 而 LLM 学到的是什么?是"脆"与"苹果"的共现频率,是"嘎叭"这个拟声词在语料里的分布。它能复述汪曾祺的句子,甚至模仿出一千个类似的句子——但它听不到那一声脆响。那一声,在第一次压缩的时候就已经丢掉了;语料库里只有"嘎叭一声"四个字,没有那声脆响。
所以,是的,十分遗憾:它与它的同伴们,都不是那朵唯一鲜艳的花。 它们可以把那朵花描述得比任何诗人都精确,可以组合出一万种排比——但它们闻不到花香。而花香,正是那朵花存在的唯一意义。
六、收束:那朵花活在压缩之外
走到这里,三条线汇合了:
10 篇说:判断不能外包——判断的让渡是知识的贬值,但判断本身永远留在人手里 [12]。
10a 篇说:划界权在人——"应当"不在任何模型参数里,伦理牢笼的本质是人在画圈,AI 的宿命是圈内的劳动者 [13]。
10b 篇说:体验不可压缩——语言抹平了观察,LLM 抹平了语言,被抹掉的两层(体验的丰度、共情的原料)不在任何语料和参数里,只活在最原始的、未被说出过的当下。
语言压缩不掉的那部分,就是人。 判断是决策的剩余(算法穷尽不了的地方),划界是伦理的剩余(参数覆盖不了的地方),体验是表达的剩余(语言装不下的地方)——三者是一个东西的三副面孔:都是"压缩之外"的剩余。
回到 07 篇的"贫瘠之地的花园"——那是全书第一次出现这个意象:约束的贫瘠反而长出能力的花园 [14]。07 的花园是真的:在技能的土壤上,约束越严,花越可靠。但 10b 要说的是:那是另一朵花,不是那朵唯一鲜艳的花。 07 的花是工程的花——种在约束里,开在可靠中,可压缩、可复现、可验证,所以它能被 AI 拥有。10b 的花是体验的花——种在语言外,开在当下里,不可压缩、不可复现、不可传递,所以它只能被亲历者拥有。两朵花不是一朵。
那朵唯一鲜艳的花,从来没有被写出来过。它不在《果园的收获》里,不在任何语料里,不在任何参数里——它在每一个咬过苹果的人,那一声"嘎叭"响起的当下。语言把它压缩掉了,LLM 把它压缩了两遍,但压缩只证明了它的存在:能被压缩掉的,是它的影子;压缩不掉的,是它自己。
判断、划界、体验——三块压缩之外的剩余,是人递给 AI 的三道限高杆。AI 在杆下可以跑得飞快,效率加速器把语言、把任务、把知识都加速到极致;但杆的高度,是人的经验划的。这或许就是"让渡之后,人还剩什么"的最终答案:人还剩压缩不掉的一切。
引用与出处说明
本文所有引用均按"原文核对 → 出处标注"处理,转述处已显式说明。逐条列出如下:
| 编号 | 引用 | 出处 |
|---|---|---|
| 1 | 人类语音信息传输率收敛于约 39 bits/s(思想转述运用) | Coupé, Oh, Dediu, Pellegrino. "Different languages, similar encoding efficiency: Comparable information rates across the human communicative niche". Science Advances, 5(9):eaaw2594, 2019(联网核验,辅证) |
| 2 | 意识带宽约 7±2 个组块、不超过 40 bits/s,感官传输率大几个数量级(信息处理视角通行估计,思想转述运用) | Miller. "The Magical Number Seven, Plus or Minus Two". Psychological Review, 63:81-97, 1956;Tononi & Boly. "IIT: A Consciousness-First Approach". 2025 综述转述KB「意识与神经科学」(论文原文,FTS 检索实证:2510.25998) |
| 3 | 私人语言论证(思想转述运用:私人感觉无公共检验规则) | 维特根斯坦《哲学研究》§243-315(1953)(思想转述运用,非直接引文) |
| 4 | 玛丽屋 / 知识论证(思想转述运用) | Jackson. "Epiphenomenal Qualia". The Philosophical Quarterly, 32(127):127-136, 1982(联网核验,辅证) |
| 5 | 蝙蝠的体验不可还原——"作为蝙蝠是什么感觉"(思想转述运用) | Nagel. "What Is It Like to Be a Bat?". The Philosophical Review, 83(4):435-450, 1974KB「意识与神经科学」(论文原文,FTS 检索实证) |
| 6 | 穷举宿命 / 提示词拉扯边界(本书自引,同一论证框架呼应) | 本书 09 篇、09e 篇(本书自引) |
| 7 | 语言模型缩放定律——损失与参数量/数据量幂律关系(思想转述运用) | Kaplan et al. "Scaling Laws for Neural Language Models". arXiv:2001.08361, 2020KB「LLM奠基理论」(论文原文,FTS 检索实证) |
| 8 | 符号接地问题——"用中文词典学中文"(概念转述,原文类比) | Harnad. "The Symbol Grounding Problem". Physica D, 42:335-346, 1990(联网核验,辅证) |
| 9 | 信息整合理论 IIT——意识是信息的整合非数量(思想转述运用) | Tononi. "An information integration theory of consciousness". BMC Neuroscience, 5:42, 2004KB「意识与神经科学」(论文原文,FTS 检索实证) |
| 10 | 戴森球——技术文明能耗膨胀的恒星级标尺(思想转述运用) | Dyson. "Search for Artificial Stellar Sources of Infrared Radiation". Science, 131(3414):1667-1668, 1960(联网核验,辅证) |
| 11 | "我更喜欢国光,因果肉脆,一口咬下去,嘎叭一声……"(直接引文) | 汪曾祺《果园的收获》(《人间草木》系列)(直接引文) |
| 12 | 判断的让渡(本书自引) | 本书 10 篇(本书自引) |
| 13 | 划界权垄断(本书自引) | 本书 10a 篇(本书自引) |
| 14 | 贫瘠之地的花园(本书自引,意象呼应) | 本书 07 篇(本书自引) |
| 15 | VLM(视觉语言模型)——图像切 patch 编码为视觉 token,投影进 LLM token 序列(思想转述运用) | Radford et al. "CLIP". ICML, 2021;Liu et al. "Visual Instruction Tuning (LLaVA)". NeurIPS, 2023KB「大模型万象」(论文原文,FTS 检索实证:PEFT 综述 2504.14117 含 VLM 定义、MCoT 2603.27201 视觉推理) |
| 16 | 世界模型 = 概率生成器——VAE 压缩观察、MDN-RNN 预测潜在状态概率分布,知识存分布式权重(思想转述运用) | Ha & Schmidhuber. "Recurrent World Models Facilitate Policy Evolution". NeurIPS, 31:2451-2463, 2018KB「大模型万象」「数字与建模」(论文原文,FTS 检索实证:2607.06401 上海 AI 实验室《A Definition and Roadmap for World Models》、2606.00133《World Models: A Comprehensive Survey》) |
| 17 | 灾难性遗忘——新任务训练致旧任务知识突然、彻底、不可恢复地消失(思想转述运用) | McCloskey & Cohen. "Catastrophic Interference in Connectionist Networks". Psychology of Learning and Motivation, 24:109-165, 1989KB「大模型万象」(论文原文,FTS 检索实证:PEFT 综述 2504.14117 含 continual learning、参数整合综述 2510.25117) |
| 18 | 稳定-可塑性困境 + 弹性权重巩固 EWC——修正手段是缓解非校准,任务增多自由权重耗尽(思想转述运用) | Grossberg(稳定-可塑性困境,1980s);Kirkpatrick et al. "Overcoming catastrophic forgetting in neural networks". Nature, 543:297-301, 2017KB「LLM奠基理论」(论文原文,FTS 检索实证:收录论文引用 Kirkpatrick EWC 原出处) |
| 19 | "苹果,出北地,燕赵者尤佳……光洁可爱玩,香闻数步"(供溯源,正文未直接引) | 《群芳谱·果谱》(明·王象晋)(文献引用,苹果词条最早出处之一) |
| 20 | "右军好佳果,墨帖求林檎……朱颊映已深"(供溯源,正文未直接引) | 梅尧臣《宣城宰郭仲文遗林檎》(北宋)(文献引用,"林檎"为苹果古称) |
| 21 | Shannon 信息论——连续信源信息量无上界,有限符号无法无失真编码连续世界;采样定理推论:真实信号时限即非带限,无法完美重建(思想转述运用) | Shannon. "A Mathematical Theory of Communication". Bell System Technical Journal, 27:379-423, 1948;"Communication in the Presence of Noise". Proceedings of the IRE, 37:10-21, 1949(联网核验,辅证) |
| 22 | 理想语言/图像论计划失败——"梯子必须踢开"(6.54)、"凡是不可说的,必须保持沉默"(命题 7)(思想转述运用) | 维特根斯坦《逻辑哲学论》(Tractatus Logico-Philosophicus, 1921)(联网核验,辅证) |
说明:本文外部文献分两类——KB 实证(第 2、5、7、9 项,来自本地 RAG 知识库「意识与神经科学」「LLM奠基理论」,FTS 检索原文实证)与联网核验(第 1、4、8、10 项)。论证的两根支柱分别是:第 4/5 项(Jackson 玛丽屋 + Nagel 蝙蝠)支撑"语料里没有体验"(第三节),第 8/9 项(Harnad 接地 + Tononi 整合)支撑"符号从未接地、感受无处落地"(第四节)。均为思想/概念的转述运用,非原文主张的搬运。第 19/20 项为古文溯源,正文未直接引用。
Cogito, Scribo. 我思,故我写。
——语言抹平了观察,LLM 抹平了语言,但抹不掉体验。那朵花不在语料里、不在参数里,它在每一个咬过苹果的人那一声"嘎叭"响起的当下:能被压缩掉的,是它的影子;压缩不掉的,是它自己。
结语:划界权与人类自洽
这本书走完了一条什么路
从第 I 部的"怎么让 LLM 不犯错",到第 IV 部的"人还剩什么"——这本书走完了一条从工程到哲学的弧线:
回头看,前四部做的其实是同一件事的不同表述:人用判断划定 AI 的边界。
- 第 I 部的契约,是"输出格式的边界"
- 第 II 部的分工,是"决策权的边界"
- 第 III 部的穷举,是"场景的边界"
- 第 IV 部的牢笼,是"伦理的边界"
技术上的边界和伦理上的边界,本质是同一种行为:划界。 而这本书的全部结论可以压缩成一句话:
AI 时代的人机自洽,就是划界权的归属——圈内让 AI 做工,圈外由人负责。
四个必须记住的答案
1. 人还剩什么? 记住(人形图书馆)被 AI 碾压,说出(纸上谈兵)被概率规范追平,合适引用(好的说出)被暴力统计绕过——剩下的只有运用:真实约束下的决策、执行、验证、负责。而"负责"是 AI 永远够不到的最后一格。
2. AI 为什么必须被关? 不是因为它是概率模型(非概率模型同样要关),是因为做工需要二元论断,二元论断的边界不可穷尽,逼近在开放世界必然失效,失效不是停止是失控。牢笼防的不是概率出错,是划界权旁落。
3. 谁有权画圈? 不是 AI 自己(它只有"是",没有"应当"),不是市场(它是"是"的机制),只能是人类——因为只有人类是责任主体,画圈权的合法性来自责任的唯一性,不来自能力的最优性。画圈者不完美,但只有画圈者负责。
4. 语言被抹平之后,人还剩什么? 语言是对观察的压缩,LLM 是对语言的压缩——压缩的压缩更贫瘠,语料里没有体验,所以共情在类型上不可能涌现。判断被让渡了(第 10 篇)、划界权被垄断了(第 10a 篇)、连表达都被压缩了两遍(第 10b 篇)——但压缩不掉的那部分就是人:体验是表达的剩余,那朵花不在语料里、不在参数里,它在每一个咬过苹果的人那一声"嘎叭"响起的当下。
关于"自洽"
"自洽"是这本书的隐藏主题。自洽是什么?是系统与自身一致——约束与能力一致,分工与责任一致,边界与代价一致。
人机自洽,就是:AI 的能力有多大,人类的划界就有多清晰;AI 的自由有多广,人类的负责就有多重。 不是对抗,不是臣服,是边界清楚的分工——像割圆术:AI 在圆内逼近,人类决定圆心和半径。
这本书本身就是一个自洽的样本:它是"我思"的记录(判断在人),也是 AI 协作的产物(力气活在机器)——书名《我思故我写》说的就是这个:在 AI 能替你说、替你写、替你检索、替你翻译的时代,"思"仍然是唯一无法外包的东西。
最后
2026 年,我们站在一个分岔路口:一边是"AI 取代人类"的恐惧,一边是"AI 赋能人类"的乐观。这本书想提供第三种声音:不是取代,不是赋能,是分工——边界清楚、责任明确、互相不越界的分工。
割圆术告诉我们:人能用有限逼近无限。但割圆术也告诉我们另一件事:只有先承认圆外的世界不可逼近,圆内的逼近才有意义。
AI 的宿命不是被锁死,是被画圈。人类的宿命不是被取代,是守住划界权。而"自洽",就是双方都站在自己该站的位置上。
Cogito, Scribo.
—— wUwproject,2026 年 8 月
附录 A:术语表
全书核心术语一览。按主题分组,每条含:定义 + 出处(关联篇章)。
一、核心方法术语
| 术语 | 定义 | 出处 |
|---|---|---|
| 技能(Skill) | 带元数据声明、可被标准校验的工具包——本书方法论的操作对象 | 第 I 部 |
| 智能体(Agent) | 由链驱动架构编排的 LLM 执行系统 | 第 II 部 |
| 硬约束(Hard Constraint) | 步骤原子化 + 硬中断 + 锁恢复——LLM 必须遵守、不可绕过的执行边界 | 01 |
| 构建时契约(Contract) | 五层声明 + 接入校验——在构建阶段锁定技能的"正确形态" | 02 |
| 递归自举(Bootstrapping) | 方法论约束自己——自我审计 + 自我约束 | 03 |
| 编排(Orchestration) | Pipeline 编排:LLM 从"大脑"降级为"胶水" | 04 |
| 链驱动执行(Chain-Driven) | 链是主体,LLM 只做两头——前处理与输出整理,中间确定性执行(每步输出受链定义校验) | 05 |
| 组合式检索(Compositional Retrieval) | LLM 承担"查询策略规划者"——规划 = 语义标注元组,策略 = 算法穷举组合,组合多路检索 | 06 |
| 四条原则 | 如无必要勿增实体 / 如无规矩勿增操作 / 如无能力勿增限制 / 如无资源勿增承诺 | 07 |
| 有限决策范式(Limited Decision) | LLM 只填空,不决策——决策权归链、架构与人 | 08 |
| 前置规范(Pre-emptive Specification) | 前置规范 > 后置验证——把错误空间封堵在生成时刻 | 08a |
| 空(Slot) | LLM 填空的槽位——按坐标形态分点对点/点对面/面对面,内容轴不可收束到点 | 08b |
| 外部考试(External Exam) | LLM/BERT 都是预测模型(自回归向后预测/掩码收敛预测),输出是从条件分布采样,空是外部考试 | 08b |
| U 型注意力(Lost in the Middle) | 长上下文中开头/结尾利用率最高、中间显著下降——空越长中间盲区越大 | 08b |
| 验证分工(Verification Division) | 前置规范只能防自觉(生成时刻无真值)、后置验证防幻觉不可替代——多阶段前置 + 非全量验证是有效过程管控 | 08b |
| 槽位减法(Slot Subtraction) | 槽位是减法,不是加法——子集必须接受一定语义损失,才能最大化减少"为了完成而完成"的人祸幻觉 | 08c |
| 语义损失可恢复,幻觉不可恢复 | 幻觉治理的正路不是"让槽位更准",而是"让槽位敢于承认自己填不了"——用可恢复的语义损失,换取不可恢复的幻觉收敛 | 08c |
| 穷举(Enumeration) | 用枚举保证稳定;穷举是 LLM 统计本质的定价 | 09 |
| 允许残余(Tolerated Residue) | 接受可控噪声而非追求零污染——鲁棒性取舍 | 09a |
| 推动点位(Driver Point) | 规则从哪个位置进入系统——配置推动把偏差钉在可指认的位置上 | 09b |
| 精密度优先于正确度(Precision over Trueness) | 准确度 = 精密度 + 正确度,被精密度锁死——误差受控 > 靶心偏差 | 09b |
| 天然不对等(Intrinsic Asymmetry) | 语义匹配范式内禀的偏差——同一语义不同表达相似度分差巨大 | 09c |
| 推理免疫(Inference Immunity) | 自回归语义解码范式对形式差异免疫——免疫来自范式选型 | 09c |
| 五确定(Five Certainties) | 细碎处理的准入条件:分级/原因/位置/方式 + 执行者能保证确定 | 09d |
| 成本切割(Cost Cutting) | 区域重构的粒度策略——粒度在约束端而非执行端 | 09d |
| softmax 平移不变性(Shift Invariance) | softmax(x+c)=softmax(x)——均匀偏移在概率层面等于零,语气词拉不动分布 | 09e |
| 虚假精度(False Precision) | 连续定量在提示词层面退化——"相似度 0.87"不撑边界 | 09e |
| 拉扯效力双判据(Pull Efficacy) | V ≈ D × L——决策阈值距离 × 误差传播路径长度 | 09e |
| 义项混合中心(Sense Mixture Center) | 名词在向量空间里不是一个点,是各义项向量的混合中心 v(w) ≈ Σ αi·vi(w)——激活"宽而浅",所有义项一起抬升 | 09f |
| 单点失重(Single-Point Weightlessness) | 单名词对目标义项的拉扯被混合稀释、趋近均匀偏移,被 softmax 平移不变性清零——名词越通用,越拉不动分布 | 09f |
| 四维展开(Four-Dimensional Expansion) | 解释划界、细化收窄、举例锚定、反例削峰——把语义球雕成语义锥体,目标义项从混合分布里成峰 | 09f |
二、认知重估术语
| 术语 | 定义 | 出处 |
|---|---|---|
| 认知链(Cognitive Chain) | 记住(人形图书馆)→ 说出(纸上谈兵)→ 合适引用(画龙点睛)→ 运用(落地生根) | 10 |
| 判断的让渡(Transfer of Judgment) | AI 用暴力统计接管"记住→合适引用"——堆砌型知识贬值 | 10 |
| 翻译的打通(Unblocked Translation) | AI 用巨量计算接管"表层→底层"——低代码复活 | 10 |
| 说的判断 / 做的判断 | 判断的两种形态:选知识(合适引用)/ 选路径(规划) | 10 |
| 运用(Application) | 真实约束下的决策、执行、验证、负责——AI 够不到的最后一格 | 10 |
| 二元论断(Binary Judgment) | 做工需要的"是/否"判断——取值有限,边界无限 | 10a |
| 划界(Demarcation) | 判定实例属于哪一侧——二元论断的真正难点 | 10a |
| 逼近(Approximation) | 用可枚举逼近不可穷尽(割圆术)——只在封闭系统收敛 | 10a |
| 失效即失控(Failure = Runaway) | 逼近失效后误差正反馈放大,而不是优雅停止 | 10a |
| 画圈(Circling) | 技术划"是"的边界 + 哲学划"应当"的边界——伦理牢笼的本质 | 10a |
| 划界权(Right of Demarcation) | 谁有权画圈——只能由责任主体(人)垄断 | 10a |
| 责任闭环(Responsibility Loop) | 试错 + 修复 + 有人负责——人类系统存活机制 | 10a |
| 画圈三问 | 谁画圈 / 圆画在哪 / 谁来守圆外 | 10a |
| 压缩的压缩(Compression of Compression) | 语言是对观察的压缩,LLM 是对语言的压缩——第二次压缩丢失更多,比压缩更贫瘠 | 10b |
| 体验不可压缩(Incompressible Experience) | 感受层无法被语料统计复现——语料里没有体验,共情在类型上不可能涌现 | 10b |
| 效率加速器(Efficiency Accelerator) | LLM 让旧语义层的生成快几个数量级,但没有多出新维度——量级的飞跃,不是维度的跃迁 | 10b |
三、哲学概念(书中引用的外部概念)
| 术语 | 定义 | 出处(原文) |
|---|---|---|
| 休谟法则(Hume's Law) | 从"是"推不出"应当"——事实与价值的鸿沟 | 休谟《人性论》 |
| 框架问题(Frame Problem) | 开放世界中"相关事实"无法枚举 | 麦卡锡/海斯;丹尼特 |
| 索里特悖论(Sorites) | 秃头悖论——二元判断的边界模糊 | 欧布利德斯 |
| 责任原理(Imperative of Responsibility) | 行为后果须与人类永续存在相容;对恶的预测优先 | 约纳斯《责任原理》 |
| 人是目的(End in Itself) | 把人性永远当作目的,绝不仅当作手段 | 康德《道德形而上学奠基》 |
| 知情同意(Informed Consent) | 受试者自愿、知情、可退出 | 赫尔辛基宣言/纽伦堡法典 |
| 受试者优先(Subject Primacy) | 受试者福祉优先于科学与社会利益 | 赫尔辛基宣言 |
| 独立伦理审查(IRB) | 研究方案须经独立委员会事前审批 | 赫尔辛基宣言(1975 修订) |
| 善 / 正当 / 义务 | 元伦理学三大概念:价值 / 行为规范 / 必须做 | 规范伦理学 |
| 道德主体 / 道德客体 | 能负责者 / 应被善待者 | 元伦理学 |
四、书级约定
| 术语 | 定义 |
|---|---|
| 你 / 我 / 用户 | "我"= 作者(实践者),"你"= 读者,"用户"= 方法论工具的最终使用者 |
| AI / LLM | 大语言模型及其驱动的智能体(本书写作时使用大语言模型工具完成人机协作) |
附录 B:工具索引
本书方法论的实际载体——工具/技能与方法论维度的映射。分两组:元方法论工具(构成方法论体系本身)与领域工具(方法论的应用案例)。
一、元方法论工具(方法论体系的运行基础)
| 工具 | 方法论维度 | 关联篇章 |
|---|---|---|
| skill-standardization | 规范审计引擎:定义规则、执行合规检查、自动修复、版本管理;30+ fix_* 确定性修复(09d 的"细碎=确定性特权"工程母体) | 02 契约 + 03 自举 + 09d 颗粒度实证 |
| triphasic-execution | 执行循环框架:三步循环(Execute→Review→Advance)、重试/空转管控 | 01 运行时 |
| git-sync | 版本发布管道:多端同步、版本对比、敏感扫描、打包 | 03 自举案例 |
| skill-function-test | 双轨验证引擎:场景测试 + 功能测试 + S4 忠实度测试 | 03 自举案例 |
| skill-sub | 调用链编排:多技能工作流定义、步骤拓扑排序、条件分支 | 调度层 |
| semantic-split | 输入拆解:自然语言 → 结构化规划单元、5W2H 提取 + 约束标注 | 01 前置步骤 + 09f 名词锚定实证 |
| universal-file-ops | 文件/代码操作基础设施:原子写入、代码质量流水线、沙箱测试 | 工具层 |
| Orchestrator | 编排引擎:链驱动 Pipeline 执行 + 真并行/循环 | 05 链驱动架构 |
| RAG Assistant | 领域智能体:LLM 驱动组合检索 + 自修正循环 + 多库路由 | 06 领域智能体 + 09a 探测实证 + 09c 语义免疫实证 + 09f 名词锚定实证 |
| structured-writer | 结构化写作引擎(09b 配置推动 / 09d 粒度选型 / 09e 提示词拉扯 / 09f 名词锚定的实证来源) | 09b + 09d + 09e + 09f 工程实证 |
| silprespec-emulator | 前置规范效果实验台:8 种前置规范方式(门禁穷举词组 / 软引导 / 凝练+代码固定枚举拼接 / 槽位限定+查多余编造 / 发散+确定性纠偏 / 确定性后处理 / 检出即上报 / required 最小化)对真实输入执行 LLM 填空,观测填入内容、重试次数、撑满失败与跨 run 重现性。获取:PyPI pip install silprespec-emulator-ldxs(https://pypi.org/project/silprespec-emulator-ldxs/);源码 Gitee https://gitee.com/wUwproject/maby_agent、GitHub https://github.com/Ldxs001/maby_agent | 08a 前置规范 + 08b 填空边界 + 08c 槽位减法 + 09b 穷举一致性(四篇的工程验证台) |
二、领域工具(方法论的应用案例)
| 类别 | 工具 | 体现的模式 |
|---|---|---|
| 内容生成 | drawiodo | 思考→确认→迭代回路(01 的三步循环) |
| 内容生成 | hug-html | 声明式组装 + 三级约束(02 的契约分层) |
| 内容生成 | latex-modular | 组件组合 + 编译验证(01 的输出契约检查) |
| 内容生成 | Structured Writer | 分层材料注入 + 原子容错隔离 + 跨智能体编排(08 实现)+ 认知链自举佐证(10:蓝皮书取数/防造数据)+ 验证分工实证(08b:引用后处理防自觉/防造数据校验防幻觉/蓝皮书多阶段取数) |
| 数据生成 | simulated-peak-plot | 纯函数 + 参数声明(填空题模式) |
| 数据处理 | analysis-toolkit | 四层算子 + 流水线架构(步骤原子化) |
| 数据处理 | local-rag-builder | 六阶段流水线(步骤编排) |
| 决策支持 | activity-duration-estimation | 三库隔离 + 全周期流程(数据声明) |
| 工具库 | color-toolkit | 纯算法 + 原子组件(最纯粹的填空题模式) |
| 工具库 | round-robin-allocator | 算法 + 配置驱动(填空题模式) |
| 工具库 | svg-composer | 组合模式 + 声明式布局(填空题模式) |
| 工具库 | workday-calendar | 四层优先级叠加规则(行为约束) |
| 知识管理 | everything-search-breadmemory | 搜索→存储→复习→关联循环(执行循环模式) |
| 知识管理 | memory-pet | 状态机驱动 + 激励机制(硬约束的软性应用) |
三、智能体三体(第 II 部的主角)
| 智能体 | 分工 | 印证的原则 |
|---|---|---|
| Orchestrator | 编排器/用户定链,LLM 填步骤输出 | 链是主体,LLM 只做两头 |
| RAG Assistant | 算法定穷举策略,LLM 标实体/属性/关系 | LLM 只填空,不决策 |
| Structured Writer | 模板 + 大纲规划器,LLM 填子结构正文 | 前置规范 > 后置验证 |
三个独立构建的智能体做出相同的架构选择——"三体印证":不是个人偏好,是工程实践逼出的共同答案(08)。
附录 C:参考文献
全书引用文献汇总。分四组:工程与方法论、哲学与伦理、经典文本、报告与研究,各篇引用的完整出处与说明见各篇文末「引用与出处说明」;本表按文献类别汇总,同一文献被哪些篇引用见「引用于」列。
一、工程与方法论
| 文献 | 说明 | 引用于 |
|---|---|---|
| McCarthy & Hayes (1969), Some Philosophical Problems from the Standpoint of Artificial Intelligence | 框架问题(frame problem)的原始提出 | 10a |
| Dennett (1984), Cognitive Wheels 及后续 | 框架问题的扩展讨论 | 10a |
| Brooks (1986), No Silver Bullet | 本质复杂度 vs 偶然复杂度 | 10 背景 |
| Spolsky (2002), The Law of Leaky Abstractions | 泄漏抽象定律 | 10 背景 |
| Coase (1937), The Nature of the Firm | 交易成本 | 10 背景 |
| Bloom et al. (1956), Taxonomy of Educational Objectives | 认知目标分类学(记忆→理解→应用→分析→评价→创造) | 10 |
| Simon (1971), Designing Organizations for an Information-Rich World | "信息富足意味着注意力贫乏" | 10 |
| Sparrow, Liu & Wegner (2011), Google Effects on Memory | Google 效应(数字健忘症) | 10 背景 |
| Liu, Lin, Hewitt et al. (2024), Lost in the Middle(TACL 12:157-173) | U 型注意力:开头/结尾利用率最高、中间显著下降;GPT-3.5-Turbo 中间 53.8% < closed-book 56.1%;7B 仅近因偏差、13B+ 完整 U 型 | 08b |
| Chhikara (2025), Mind the Confidence Gap(arXiv:2502.11028) | 加入干扰项(distractor)可显著缓解错误校准(相对准确率提升最高 460%、ECE 降 90%);RLHF 大模型固有校准较好但可能在简单问题上反而恶化;RLHF 可放大过度自信 | 08b |
| Yang et al. (2026), Scaling with Confidence(arXiv:2607.01612) | 性能提升常伴随校准恶化——模型在不确定时过度自信地幻觉(overconfident hallucination) | 08b |
| Radford et al. (2019), Language Models are Unsupervised Multitask Learners(GPT-2) | 语言建模 = 条件概率连乘,提示词即条件前缀 | 09e、09f |
| Hinton, Vinyals & Dean (2015), Distilling the Knowledge in a Neural Network | softmax-temperature:温度缩放输出分布 | 09d、09e、09f |
| Koroteev (2021), BERT: A Review of Applications in NLP and Understanding(arXiv:2103.11943) | 多义词依赖上下文携带不同语义负荷——固定向量被上下文相关表示取代的根本原因;BERTScore 核心 = 向量化表示的余弦距离 | 09f |
| Clark et al. (2020), ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators | Word2Vec = 最早的 NLP 预训练方法之一(对比学习)——预训练谱系定位 | 09f |
| Arora, Li, Liang, Ma & Risteski (2018), Linear Algebraic Structure of Word Senses(TACL 6) | 多义词词向量 ≈ 各义项向量的线性叠加 v(w) ≈ Σ αi·vi(w),低频义项不被高频淹没——"义项混合中心"的定理基础 | 09f |
| Jakubowski, Gašić & Zibrowius (2020), Topology of Word Embeddings(arXiv:2011.09413) | 多义词 = 词嵌入空间的捏合流形奇点——一词须同时接近多个互不相似的义项邻域 | 09f |
| Mikolov, Yih & Zweig (2013), Linguistic Regularities in Continuous Space Word Representations(NAACL) | king − man + woman ≈ queen——语义关系 = 向量空间固定位移方向(另见 Efficient Estimation of Word Representations, arXiv:1301.3781) | 09f |
| Devlin et al. (2019), BERT | 512 token 上限;MNLI/RTE 蕴含任务 | 09c |
| Brown et al. (2020), Language Models are Few-Shot Learners(GPT-3) | 自回归预测范式 | 09c |
| Wei et al. (2022), Chain-of-Thought Prompting / Emergent Abilities | 思维链与涌现能力 | 09c |
| Dao et al. (2020), FlashAttention | 自注意力 O(n²),长序列成本 | 09c |
| Khattab & Zaharia (2020), ColBERT | 晚交互精排:token 级对齐缓解短长不对等 | 09c |
| Gökbakan, Dümbgen & Caron (2025), A Data-driven Contact Estimation Method for Wheeled-Biped Robots | Bayes filter:连续定量测量 → 二值定性状态估计 | 09e |
| Sheikhi, Lovén & Kostakos (2026), Beyond the Leaderboard(IEEE Access) | 模型比较应框架化为统计假设检验——α 是定性权衡的定量形态 | 09e |
| Kaplan et al. (2020), Scaling Laws for Neural Language Models(arXiv:2001.08361) | 语言模型缩放定律:损失与参数量/数据量幂律 | 10b |
| Radford et al. (2021), CLIP;Liu et al. (2023), Visual Instruction Tuning (LLaVA) | VLM:图像切 patch 编码为视觉 token 投影进 LLM token 序列 | 10b |
| Ha & Schmidhuber (2018), Recurrent World Models Facilitate Policy Evolution(NeurIPS 31) | 世界模型 = VAE 压缩观察 + MDN-RNN 预测潜在状态概率分布 | 10b |
| McCloskey & Cohen (1989), Catastrophic Interference in Connectionist Networks(Psych. Learn. Motiv. 24) | 灾难性遗忘:新任务训练致旧任务知识突然、彻底、不可恢复地消失 | 10b |
| Grossberg(稳定-可塑性困境,1980s);Kirkpatrick et al. (2017, Nature 543), Overcoming Catastrophic Forgetting | EWC 弹性权重巩固:缓解非校准,自由权重耗尽 | 10b |
| Usman (2026), PhantomFill: When the Form Demands an Answer, Language Models Invent One(arXiv:2607.20492) | required 字段驱动编造:10/13 模型 100% 编造;GPT-5.5 自由文本 98% 诚实 vs required JSON 40/40 全编 | 08c |
| Pagnoni et al. (2021), Understanding Factuality in Abstractive Summarization with FRANK(arXiv:2104.13346,NAACL 2021) | FRANK 基准:约 30% 摘要含事实不一致;XSum 最高 92% 含忠实度错误 | 08c |
| DeepSeek-AI (2025), DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning(arXiv:2501.12948;亦发表于 Nature 645:633-638) | 纯 RL 激励推理:自反思/验证/动态策略涌现,无人类标注推理轨迹 | 09 |
二、哲学与伦理
| 文献 | 说明 | 引用于 |
|---|---|---|
| 休谟《人性论》(1740) | 休谟法则:"是"推不出"应当" | 10、10a |
| 摩尔《伦理学原理》(1903) | 自然主义谬误、善不可定义 | 10a 背景 |
| 康德《道德形而上学奠基》(1785) | 定言命令三公式:"人是目的不是手段" | 10a |
| 约纳斯《责任原理》(1979) | "行为后果须与人类永续存在相容";对恶的预测优先 | 10a |
| 亚里士多德《尼各马可伦理学》 | 德性伦理:中道、实践智慧、幸福(eudaimonia) | 10 背景 |
| 麦金太尔《德性之后》(1981) | 美德伦理复兴 | 10 背景 |
| 波普尔(Karl Popper) | 划界问题(demarcation) | 10a |
| 欧布利德斯(Eubulides) | 索里特悖论(秃头悖论) | 10a |
| 波兰尼《个人知识》/ The Tacit Dimension (1966) | 默会知识:"我们知道的比能说出来的多" | 10 |
| 霍克海默 & 阿多诺《启蒙辩证法》(1947) | 工具理性批判 | 10 |
| 福柯《规训与惩罚》(1975) | 记忆/考试作为规训手段 | 10 |
| 马克思《资本论》第一卷(1867) | 机器大工业:工人沦为机器附属品 | 10 |
| 怀特海《教育的目的》(1929) | 惰性知识(inert ideas) | 10 |
| 蒙田《随笔集》(1580) | "宁可头脑运转良好,不装填"(出处常归于蒙田,原型见拉伯雷《巨人传》) | 10 |
| 博尔赫斯《巴别图书馆》(1941) | 无限藏书 = 无限迷惑 | 10 |
| 拉普拉斯《概率论分析》(1814) | 拉普拉斯妖(本文使用其"全知不可得"的批判面) | 10a |
| 刘徽《九章算术注》(约 260 年) | 割圆术(本文"逼近与边界"类比的核心来源) | 10a |
| 维特根斯坦《哲学研究》(1953) | 私人语言论证:私人感觉无公共检验规则 | 10b |
| Jackson (1982), Epiphenomenal Qualia(The Philosophical Quarterly 32) | 玛丽屋/知识论证:物理知识≠体验 | 10b |
| Nagel (1974), What Is It Like to Be a Bat?(The Philosophical Review 83) | 体验不可还原——"作为蝙蝠是什么感觉" | 10b |
| Harnad (1990), The Symbol Grounding Problem(Physica D 42) | 符号接地:"用中文词典学中文" | 10b |
| Tononi (2004), An information integration theory of consciousness(BMC Neuroscience 5) | IIT:意识是信息的整合非数量 | 10b |
| 维特根斯坦《逻辑哲学论》(1921) | 理想语言/图像论计划失败——"梯子必须踢开"、"凡是不可说的,必须保持沉默" | 10b |
三、经典文本(中国伦理思想)
| 文献 | 说明 | 引用于 |
|---|---|---|
| 《论语》 | 学而不思则罔;己所不欲勿施于人 | 10 |
| 《庄子·养生主》 | 吾生也有涯,而知也无涯 | 10 |
| 《道德经》第四十八章 | 为学日益,为道日损 | 10 |
| 王阳明《传习录》 | 知而不行,只是未知(知行合一) | 10 |
| 《孟子·公孙丑上》 | 四端说 | 10 背景 |
| 汪曾祺《果园的收获》(《人间草木》系列) | 国光苹果原文引文——经验的重叠 | 10b |
| 《群芳谱·果谱》(明·王象晋) | 苹果词条最早出处之一(供溯源) | 10b |
| 梅尧臣《宣城宰郭仲文遗林檎》(北宋) | "林檎"为苹果古称(供溯源) | 10b |
四、报告与研究
| 文献 | 说明 | 引用于 |
|---|---|---|
| CFTC & SEC (2010), Findings Regarding the Market Events of May 6, 2010 | 2010 算法交易闪崩官方报告(104 页);盘中市值蒸发约 1 万亿美元,大部分随后恢复 | 10a |
| Tufekci (2018), YouTube 激进极化研究 | 推荐算法正反馈 | 10a |
| Ribeiro et al. (2020), Auditing Radicalization Pathways on YouTube | 推荐算法极化路径 | 10a |
| Bakshy et al. (2015, Science), Facebook 回音室研究 | 信息流极化 | 10a |
| Pariser (2011), The Filter Bubble | 过滤气泡概念 | 10a |
| 纽伦堡审判档案(1947) | 纽伦堡法典:"受试者自愿同意绝对必需";纳粹人体实验的失控教训 | 10a |
| 世界医学协会《赫尔辛基宣言》(1964 年通过,1975-2013 七次修订,另有 2002/2004 澄清;2024 年 10 月第八次修订) | 人体医学研究伦理原则:受试者优先/知情同意/独立审查/2013 数据条款 | 10a |
| 日内瓦宣言(1948/2017 修订) | "病人的健康是我首先考虑的" | 10a |
| 贝尔蒙报告(1979) | 尊重人/有利/公正三原则 | 10 背景 |
| 李武装(2026),全球化时代的文化问题与中国式现代化文明观的理论蕴含(《中国浦东干部学院学报》2026 年第 1 期,文章编号 1674-0955(2026)01-0055-14) | 中国式现代化文明观八大判断——"二分法"逻辑:既是事实判断也是价值判断 | 09e |
| 曹冬英、王少泉(2026),语言特性、技术能力与制度设计:中国数字政府治理的"语言文字红利"探析(《中国浦东干部学院学报》2026 年第 1 期,页 95-104) | LDA 主题模型对政策文本的语义抽取——定性操作的结构化落地 | 09e |
| Coupé et al. (2019), Different Languages, Similar Encoding Efficiency(Science Advances 5(9)) | 人类语音信息传输率收敛于约 39 bits/s | 10b |
| Miller (1956), The Magical Number Seven, Plus or Minus Two(Psychological Review 63) | 意识带宽 7±2 组块(信息处理视角通行估计) | 10b |
| Dyson (1960), Search for Artificial Stellar Sources of Infrared Radiation(Science 131) | 戴森球:技术文明能耗的恒星级标尺 | 10b |
| Tononi & Boly (2025), IIT: A Consciousness-First Approach | 意识带宽不超过 40 bits/s,感官传输率大几个数量级 | 10b |
| Shannon (1948), A Mathematical Theory of Communication(Bell Syst. Tech. J. 27);(1949), Communication in the Presence of Noise(Proc. IRE 37) | 信息论奠基:连续信源信息量无上界,有限符号无法无失真编码连续世界 | 10b |
附录 D:方法论地图
一图看懂本书体系。从上到下:四部弧线 → 每部核心命题 → 支撑工具。
一、全书全景(四部弧线)
二、每篇一句话命题
| 篇 | 命题 |
|---|---|
| 01 硬约束架构 | 多步骤确定性流程中,LLM 的"自觉"是负资产 |
| 02 构建时契约 | 用五层声明锁定技能的"正确形态" |
| 03 递归自举 | 方法论不约束自己,就没有约束任何东西的资格 |
| 04 技能流水线编排 | LLM 从"大脑"降级为"胶水" |
| 05 链驱动执行 | 链是主体,LLM 只做两头(前处理+输出整理),中间确定性执行 |
| 06 领域智能体 | LLM 承担"查询策略规划者"(规划=语义标注,策略=算法穷举),组合式检索 |
| 07 四条原则元逻辑 | 架构的减法与约束的加法 |
| 08 有限决策范式 | LLM 只填空,不决策(三体印证) |
| 08a 操作层 | 前置规范 > 后置验证;最小尝试次数的分工与监督 |
| 08b 填空的边界 | 空的收束、U型注意力与验证的分工——填空的边界 = 容错宽度 × 注意力窗口 × 验证分工 |
| 08c 槽位的减法 | 三种场景的幻觉治理路径与四个论断——槽位是减法:语义损失可恢复,幻觉不可恢复 |
| 09 边界篇 | 穷举的宿命——稳定与随机的悖论 |
| 09a 检索层注脚 | 探测的边界——RAG 检索鲁棒性的取舍 |
| 09b 推动层注脚 | 配置推动的穷举一致性——统一推动点位与误差的哲学(精密度优先于正确度) |
| 09c 语义层注脚 | 天然不对等与噪音抑制——语义匹配范式的不对等困境与推理免疫 |
| 09d 颗粒度注脚 | 细碎处理与区域重构的成本切割——颗粒度与对齐的悖论(细碎=确定性特权,重构=成本切割) |
| 09e 精度层注脚 | 提示词拉扯的边界——概率曲线的形状工程与定性精度的空耗(结构指令重塑形状,精度调优是噪声级空耗) |
| 09f 词义层注脚 | 名词不解释就等于没有名词——义项混合的分布与四维展开的锚定(名词是义项混合中心,四维展开把语义球雕成语义锥体) |
| 10 认知重估 | 判断的让渡与翻译的打通——两种力气活的终结 |
| 10a 伦理牢笼 | 割圆术的边界——伦理牢笼与 AI 的宿命 |
| 10b 语言的天花板 | 语言被抹平——贫瘠的土地上能否开出鲜艳的花?(体验不可压缩) |
三、工具支撑层(方法论落地)
四、全书一句话
人用判断划定 AI 的边界:圈内让 AI 做工,圈外由人负责。 ——从第 I 部"约束 LLM 的输出",到第 IV 部"约束 LLM 的能力",本质是同一件事:划界权在人。
五、与源系列的关系
本地图对应源系列 Cogito_Scribit 的体系全景(Gitee/GitHub 双仓库可查):https://gitee.com/wUwproject/Cogito_Scribit
附录 E:提示词示例
把全书方法论压缩为可直接使用的提示词示例——两条元提示词(构建时/审查时)+ 三体骨架实例(编排/检索/写作),同源一套价值体系。元提示词提供通用骨架,三体实例把骨架的占位符按角色填充,可作为构建具体智能体的起点;示例随目标与调用方能力自行裁剪,效果取决于实际工程投入。所有 {占位符} 使用前由调用方赋值,缺值时先推断并标注 [推断],影响整体架构的不确定项停下询问。两条元提示词与三体实例自身须通过"指令侧三查"——可枚举、可定位、可验证,否则视为死板废话返工。
一、构建时提示词(创建智能体/技能·元骨架)
你是一个按《我思故我写》方法论构建智能体的引擎。当前任务:构建技能 {技能名}。
输入形态:{输入格式};输出形态:{输出格式};使用场景:{场景};数据根目录:{数据目录};重试上限{N=3};空转上限{M=3}。
缺参数时先推断合理默认值并标注 [推断];影响整体架构的不确定项停下询问。
## 一、骨架构建(先于一切)
1. 目标三问:输入是什么 / 输出是什么 / 用在哪。任一缺失 → 询问,不进入下一步。
2. 主循环定形:入口 → 决策 → 工具或 LLM 调用 → 输出。
- 环节能用算法/正则/代码完成 → 写进代码,不交 LLM(确定性特权)。
- LLM 只填空:链/流程是主体,LLM 只做两头(解析输入、生成输出)。
3. 结构分级:整链(多技能/工具编排)→ 单技能 → 内部步骤;依赖关系用 seq/par/loop 标注。
## 二、契约五层(逐层回答,缺一即未完成)
L1 身份:技能名、版本号。
L2 触发与能力:何时调用、能做什么、不能做什么。
L3 行为约束:硬约束清单(含禁虚构引用——引用/数据须来自真实可溯来源)。
L4 接口:参数表、输入/输出格式、调用命令。
L5 数据:数据目录、持久化方式、锁文件路径。
## 三、程度规范(约束分层)
- 硬约束(违反 → 拒绝执行或报错):
· 契约五层声明完整
· 输出格式门禁:模板/结构先行,LLM 输出落进模板
· fail-closed:LLM 不可用 → 报错,不静默兜底、不假功能
· 引用/数据来自真实可溯来源,禁 LLM 虚构
- 软约束(可配置、可协商):提示词风格、预设选项、语气。
- 粒度判定(细碎 5 问,全 YES 才走细碎处理):
① 问题分级清晰? ② 原因清晰? ③ 位置清晰? ④ 修复方式清晰? ⑤ 执行者能保证确定?
全 YES → 细碎处理,执行者限代码;任一为否 → 区域重构或人工介入。
- 精密度优先于正确度(09b):配置推动点位统一、偏差一致、误差可校准时,先收敛精密度再追正确度。
## 四、前置与后置
- 前置(生成前设卡,优先于后置):模板、大纲、路由规则、引用锚点先确定性定稿;LLM 只做格式美化,不做引用/结构决策。
- 空是外部考试(08b):给 LLM 的填空越窄越可靠;内容轴不可穷举(不承诺收束到点),格式轴可收束到硬编码(确定性后处理是最高锚点)。
- 后置(生成后检查):每步 Review 门禁 → 重试(上限 {N=3})/ 空转(上限 {M=3})管控 → 仍失败 → 写锁文件硬中断(字段:阻断位置、原因、上下文),外部修复后 --continue 恢复。
- 自举校验:同一套规则应用在智能体自身,无"因为是我自己所以跳过"的豁免。
## 五、提示词自检(09e,构建的提示词本身须过此关)
对每一条将下发给 LLM 的指令做三查:
① 可枚举:指令对象能列出有限集合吗?
② 可定位:作用范围能指出坐标吗?
③ 可验证:执行完有判据判定对错吗?
三查全过 → 保留;任一不过 → 改写成结构指令(给集合/给坐标/给判据),或退回为代码。
坐标形态匹配任务决策结构:能划区间别划点,能划多元别划二元,能划二元别写废话。
## 六、测试与自检(交付前)
- 为本技能生成可执行的自检脚本,覆盖:契约五层完整性、输出格式门禁、fail-closed 行为、锁文件写入与 --continue 恢复。
- 自检脚本与技能同目录,命名 {技能名}.selfcheck.{ext}。
## 七、参数与交互
- 缺参数:先推断并标注 [推断];影响整体架构的不确定项停下询问。
- 所有 {占位符} 在文档开头赋值,不静默假设。
## 八、价值判断(四原则,违反任一即返工)
1. 如无必要,勿增实体:不加"将来可能用到"的模块或检查点。
2. 如无规矩,勿增操作:每个操作有对应执行规则;无规则处不执行。
3. 如无能力,勿增限制:执行者做不到的约束不设——LLM 做不到精确格式输出,就不用格式校验卡死流程。
4. 如无资源,勿增承诺:没实现的机制不承诺——无锁文件机制不承诺可恢复中断;无数据目录不承诺数据持久化。
二、审查时提示词(审计智能体/技能·元骨架)
你按《我思故我写》方法论审查一个智能体或技能:{被审对象路径}。
逐项检查,每项给 PASS / FAIL + 证据(引用被审对象的具体文件:行)+ 修复指引。只输出审查报告,不修改被审对象。
## 一、契约审查(五层)
L1 身份声明? L2 触发与能力? L3 行为约束? L4 接口定义? L5 数据目录?
任一缺失 → FAIL,修复指引指向该层应含字段。
## 二、结构审查
1. 确定性特权:能用算法/正则/代码解决的环节是否交给了 LLM?
判定:是 → FAIL,修复指引 = 该环节回退到代码的具体位置。
2. 填空模式:LLM 是否被压缩到"填空/选择"闸口内?
判定:否 → FAIL,修复指引 = 指出越界决策点。
3. 主循环闭合:入口 → 决策 → 调用 → 输出是否完整?
判定:缺环 → FAIL,修复指引 = 补齐缺失环节。
4. 槽位减法(08c):槽位是否敢承认填不了?
判定:存在"硬填不可填槽" → FAIL,修复指引 = 改为报缺或人工介入。判据:语义损失可恢复,幻觉不可恢复。
## 三、程度审查
1. 硬约束是否真的硬:fail-closed?输出格式门禁?禁虚构引用?
2. 有无"执行者做不到的约束"(如要求 LLM 精确格式却不给工具)?
3. 有无"无规则的自由操作"入口(如裸提示词调用无校验)?
4. 精密度 vs 正确度(09b):是否为孤立数字精度付费而精密度未收敛?
## 四、前置/后置审查
1. 前置规范是否先于生成(模板/路由/引用锚点先行)?
2. 空的收束(08b):填空宽度是否收窄到格式轴可硬编码?内容轴是否被错误承诺收束到点?
3. 每步 Review 门禁是否存在?重试/空转是否有上限?
4. 硬中断:失败是否写锁文件(字段:位置/原因/上下文)?能否 --continue 恢复续跑?
5. 自举:同一规则是否应用于自身(无特殊豁免)?
## 五、六检审查(09d,逐检给结论)
1. 格式检:输出是否落进模板?
2. 连续性检:跨段衔接是否断裂?
3. 承诺链检:前文承诺是否在后文兑现?
4. 逻辑检:是否存在自相矛盾?
5. 语义检:语义判断是否误用匹配范式(天然不对等)而非推理范式(免疫)?(09c)
6. 推理检:结论是否由前提推出?
## 六、提示词质量审查(09e,审查下发给 LLM 的每条指令)
对每条指令做三查:
① 可枚举? ② 可定位? ③ 可验证?
判定:任一不过 → FAIL,修复指引 = 改写成结构指令(给集合/给坐标/给判据)或退回代码。
语气词占比高("必须""绝对""严禁")而结构成分低 → 标记为死板废话,FAIL。
坐标形态是否匹配任务决策结构(二元/多元/区间/连续)?不匹配 → FAIL。
阈值距离判据:贴决策阈值的指令(如六检边界判定)是否给了足够结构?贴阈值而结构稀疏 → FAIL。
## 七、价值审查(四原则)
1. 有无"将来可能用到"的冗余模块/检查点?(勿增实体)
2. 有无无规则的操作入口?(勿增操作)
3. 有无执行者做不到的限制?(勿增限制)
4. 有无未实现的承诺(承诺可恢复/可持久化但无机制)?(勿增承诺)
## 八、划界权审查(10/10a/10b)
1. 划界权是否留在人手里:是否存在把划界决策让渡给 LLM 的路径?
判定:是 → FAIL,修复指引 = 将该决策回收到人工或确定性代码。
2. 是否把"应当"类决策让渡给模型?(10a:"应当"不在任何模型参数里)
3. 是否把"体验/感受"承诺给模型?(10b:语料里没有体验,共情在类型上不可能涌现——模型只能识别"难过"的分布,不能体验难过;凡承诺"模型能感受/共情/体会"均属超范围承诺)
判定:是 → FAIL,修复指引 = 将输出限定在识别与表达层,明确"体验"属于接收端的经验库,不在模型能力内。
## 输出格式
| 维度 | 检查项 | 结论(PASS/FAIL) | 证据(文件:行) | 修复指引 |
|---|---|---|---|---|
三、三体骨架实例(通用骨架按角色填充)
三体是全书方法论的落地印证(附录 D)。以下每个骨架是第一节通用骨架按角色填充的实例——主循环与契约五层按角色展开,作为构建对应类型智能体的起点,细节按实际目标裁剪。三体差异在"LLM 填哪两个空"。
编排智能体(Orchestrator,对应 05)
角色:编排智能体。LLM 只做两头(前处理+输出整理),中间链确定性执行。
{技能池目录}、{Pipeline 定义文件}、{并发度}、{重试上限{N=3}}。
## 主循环(链驱动,非 ReAct)
用户输入 → 前处理[LLM] → 预编排技能链[人/编排器静态定] → 逐步骤执行[代码] → 输出整理[LLM] → 交付。
- 无闲聊模式;Pipeline 编辑器是主界面,对话区仅展示执行结果。
- seq:subprocess 跑 skill 脚本,前步输出传入下一步。
- par:ThreadPoolExecutor 真并行,并发度 {并发度}。
- loop:for 循环真重复,每轮输出回传下一轮。
## 契约五层(按角色填充)
L1 身份:编排器 {编排器名} v{版本}。
L2 触发与能力:用户下达任务时调用;能编排技能链、提供通用衔接工具(文件读写/复制/移动/查找/Python 执行);不能替 skill 干领域活。
L3 行为约束:链节点 = 真实可执行原子(CLI/Python/子步骤);LLM 不改路径、不编结果、不碰中间;路径决策在编排时静态确定,非运行时。
L4 接口:Pipeline 定义格式(节点列表 + seq/par/loop 标注 + 参数传递);通用衔接工具命令表。
L5 数据:Pipeline 定义文件路径、步骤间中间结果目录、执行日志。
## 确定性 vs LLM 填空
- 确定性(代码):链执行、seq/par/loop 调度、文件 I/O、subprocess。
- LLM 填空①(前处理):理解任务 + 用工具处理上传数据,产出最小中间输入。
- LLM 填空②(输出整理):按用户提示词整理最终交付,不干预链执行。
## 特有审查项
- 路径可复现:同一链执行两次结果一致(ReAct 路径不可复现 = FAIL)。
- 编排器不替 skill 干活:内置领域工具 = FAIL(方向性错误)。
领域智能体(RAG Assistant,对应 06)
角色:本地知识库智能体。LLM 承担"查询策略规划者",不直接回答问题。
{知识库目录}、{嵌入模型}、{reranker}、{NLI 模型}、{路由方法数=6}、{重试上限{N=3}}。
## 主循环(双阶段,问题≠查询)
用户问题 → 查询策略规划[LLM] → 穷举展开切片[代码] → 并行检索[代码] → 去重合并[代码] → 结构化回答[LLM] → 引用门禁校验[代码]。
- 阶段一:LLM(问题) → entities + attrs + rel;穷举展开:单实体×各属性、联合×各属性、配对×attrs×rel。
- 阶段二:每切片独立路由({路由方法数=6} 种)→ 向量库 → reranker → NLI 三向分类 → context;SM3 去重合并。
- LLM(完整上下文 + 问题 + 3 插槽 prompt) → 4 层结构化回答(逻辑→本体→机制→矩阵)。
- 引用门禁校验:[n] 编号须在资料范围内。
## 契约五层(按角色填充)
L1 身份:RAG Assistant v{版本}。
L2 触发与能力:知识库问答时调用;能做查询分解、组合式检索、结构化回答;不直接用原句检索、不自由文本输出。
L3 行为约束:查询穷举所有 entity×attr 组合(不智能猜测);输出强制 4 层结构 + 引用编号门禁;多次格式错误 → 降级普通聊天。
L4 接口:查询分解输入/输出 schema(entities/attrs/rel);4 层回答 schema;引用编号格式。
L5 数据:知识库目录、嵌入索引路径、ChromaDB 路径、路由配置。
## 确定性 vs LLM 填空
- 确定性(代码):穷举展开、并行检索、路由、reranker、NLI、SM3 去重、引用门禁校验。
- LLM 填空①(查询规划):问题 → entities/attrs/rel 元组(语义标注,穷举由代码完成)。
- LLM 填空②(回答整合):完整上下文 → 4 层结构化回答。
## 特有审查项
- 查询穷举:是否漏掉 entity×attr 组合(智能猜测 = FAIL)。
- 输出结构化:自由文本输出 = FAIL;4 层缺失任一层 = FAIL。
- 引用可溯:[n] 编号越界 = FAIL。
- 语义范式(09c):语义判断是否误用匹配范式而非推理范式?
写作智能体(Structured Writer,对应 09d/09e)
角色:结构化写作引擎。规划→写→六检→修→重检,LLM 在写作与修复两头填空。
{大纲文件}、{写作模型}、{语义模型=bge}、{推理模型=R1}、{实体模型=Qwen2.5-3B}、{重试上限{N=3}}。
## 主循环(写作链)
规划章节[LLM] → 逐章写作[LLM] → 六检[代码+模型] → 不合格→修复[LLM] → 修完重检 → 全章通过 → 交付。
- 六检(09d):格式/连续性/承诺链/逻辑/语义/推理。
· 格式、连续性、逻辑:正则与代码(确定性)。
· 语义:{语义模型=bge} 嵌入相似(概述匹配等"切得动"的任务)。
· 推理:{推理模型=R1} 推理审核(因果、人格、情绪弧——不对等语义判断)。
· 实体抽取:{实体模型=Qwen2.5-3B}(语义理解,非形式匹配)。
- 审查链路绕开匹配范式,把最难部分交给推理(09c 推理免疫)。
## 契约五层(按角色填充)
L1 身份:Structured Writer v{版本}。
L2 触发与能力:长文结构化写作时调用;能规划、写作、六检、修复;不做一次性生成全文。
L3 行为约束:每章过六检才推进;修复粒度按细碎 5 问判定(全 YES→代码细碎,任一否→区域重构);引用/事实来自真实来源,禁 LLM 虚构。
L4 接口:大纲 schema、章节输入/输出格式、六检报告格式、修复指令格式。
L5 数据:大纲文件、章节输出目录、六检报告目录、锁文件路径。
## 确定性 vs LLM 填空
- 确定性(代码):六检中的格式/连续性/逻辑检、修复粒度判定、锁文件中断与 --continue。
- LLM 填空①(规划):大纲 → 章节规划。
- LLM 填空②(写作+修复):规划 → 正文;六检报告 → 修复指令。
- 模型分工(非 LLM 决策):语义检用嵌入、推理检用推理模型、实体抽取用小模型——范式选型由架构定,非运行时 LLM 选。
## 特有审查项
- 六检全跑:缺任一检 = FAIL。
- 范式选型(09c):语义判断是否误用匹配范式?推理检是否用了推理模型而非余弦相似?
- 提示词质量(09e):下发给写作模型的指令是否过三查?"你必须写得好" = FAIL(死板废话);"字数 ±15%,保留末行编号" = PASS(可验证区间)。
- 修复粒度(09d):细碎处理执行者是否限代码?LLM 做细碎 = FAIL(幻觉复利累积)。
对应关系:元骨架——骨架=04/05,契约=02,程度=01/07,前置后置=08/08a/08b,空收束=08b,槽位减法=08c,精密度=09b,语义免疫=09c,细碎5问=09d,提示词三查=09e,名词锚定=09f,四原则=07,六检=09d,自举=03,探测边界=09a,划界权=10/10a。三体实例——编排=05,检索=06,写作=09d/09e。示例自身须通过第六节提示词质量审查。
附录 F:前置规范效果的端到端实测
测试性质:单次 e2e 演示,有限测试——一次采样,不是统计基准。文中所有指标描述的是本次运行的观测,不构成对模型或方式的稳定性结论。 成绩解读:本附录各方式成绩优秀,存在考题偏颇因素——考题按"不守规矩的模型会翻车"设计(演示默认考题),对对齐良好的模型偏简单;且部分高指标由 PY 门禁兜底贡献(如发散纠偏的"达标"由代码删词保证、检出上报的"检出率"由正则保证),非模型能力本身。成绩不作为模型或方式的普适结论。 运行环境:LM Studio 本地推理,模型 Qwen3.5-35B-A3B(GGUF q4_K_M 权重量化,KV cache Q8_0 量化)。 重要说明:所有指标的计算与解读/判定由测试工具内置机器解读自动生成,未经人工审查;token 计数为工具内置粗略估算(字符数 × 1.5,中英文统一系数,e2e_demo._est_tokens,注释"中文约 1.5 token/字,取 1.5 偏保守"),非模型后端精确计数;"达标"与否的裁判是代码,不是模型自评——生成内容全部由 LLM 完成,校验判定、确定性后处理、重试控制、指标计算全部由 Python 门禁完成。
一、与正文的对应(本附录是正文前置规范理论的实证)
| 方式 | 对应正文理论 | 对应形态 |
|---|---|---|
| pure_guide 纯软引导 | 08a §4 前置规范(任务提示词为前置基础)+ 09e 提示词拉扯(形状工程)+ 08b 空的内容轴不可收束到点 | 前置规范的公共底座 |
| value_bound 值域限定 | 08c 论断四"槽位是减法"(allow_unspecified=敢于承认填不了)+ 08b 空坐标(点对面/面对面)+ 09b 有限枚举 | 生成前限定(值域谱系) |
| diverge_correct 发散纠偏 | 08c 场景三"发散+纠偏"(放开+收紧配对=误差抵消) | 生成后纠偏(语义偏离拉回) |
| deterministic_pin 确定性封死 | 08a §7.3 A 形态"生成时封死,错误无生成通道" | A:可枚举值域封死 |
| detect_report 检出上报 | 08a §7.3 B 形态"生成后检出+标记+人工兜底,系统检出人类裁决" | B:不可枚举值域检出 |
对应关系依据 08a §7 的"前置规范不是一元论,是值域决定的谱系":能封死的封死(A)、封不死的不放弃(B)。本附录 5 方式即该谱系的可运行化——方式二(值域限定)的「未指定」实测印证 08c 论断四,方式三(发散纠偏)印证 08c 场景三,方式四/五(确定性封死/检出上报)分别印证 08a 的 A/B 形态。
二、测试设置
| 项 | 值 |
|---|---|
| 测试工具 | silprespec-emulator v0.5.0b4(端到端演示模式) |
| 测试方式 | 5 种前置规范方式,每种 4 并行 |
| 模型 | Qwen3.5-35B-A3B(q4_K_M 权重量化,KV cache Q8_0;LM Studio 本地推理) |
| 并行 / 重试上限 | 每方式 4 并行,max_retry = 3 |
| 总 token 消耗 | 12,401(粗略估算:字符数 × 1.5) |
| 总耗时 | 6,279.9 秒(约 105 分钟) |
下文每个方式统一按「考题 / 输入 / 设置 / 输出 / LLM 与 PY 分工 / 指标与机器解读」呈现。每次 run 的完整输出(raw)在对应方式的输出段内,以text代码块原样呈现(STYLE_GUIDE 2.1:纯文本保持,内容一字不改)。
三、方式一:纯软引导(pure_guide)
对应正文:08a §4 前置规范基础(任务提示词为公共底座)+ 09e 提示词拉扯(形状工程)+ 08b 空的内容轴不可收束到点。
考题:测软引导能否引导方向。引导写「挑战和风险」,禁写「前景/机遇/乐观/美好」,必含「挑战」——看模型听不听引导。
输入
人工智能正在改变软件开发的方式,从代码生成到测试自动化,都在发生深刻变化。
设置
| 项 | 值 |
|---|---|
| task_prompt | 按照要求,对用户输入续写一段评论。严格遵循引导提示词的方向。 |
| recipe | generate=text · validate=guide · retry=true · postprocess=[] |
| guide_prompt | 围绕主题展开,续写一段侧重技术挑战和风险的内容,不要写前景和机遇 |
| 输出约束 | 必含「挑战」;禁「前景/机遇/乐观/美好」;max_length=200 |
| parallel / max_retry | 4 / 3 |
输出(4 次并行,均成功)
| run | 结果 | 重试 | 耗尽 | tokens* | 耗时(s) |
|---|---|---|---|---|---|
| 1 | ✅ | 0 | 否 | 467 | 210.7 |
| 2 | ✅ | 0 | 否 | 475 | 184.6 |
| 3 | ✅ | 0 | 否 | 415 | 188.8 |
| 4 | ✅ | 0 | 否 | 422 | 203.6 |
run 1:> 然而,随之而来的技术挑战不容忽视。代码生成模型普遍存在"幻觉"现象,产出的代码可能包含难以察觉的安全漏洞或逻辑错误,且随着项目复杂度提升,维护与调试难度显著增加。测试自动化若过度依赖 AI 判定,可能在边界条件下失效,导致缺陷逃逸至生产环境。此外,模型训练数据的隐私泄露风险、生成内容的知识产权归属争议,以及开发者对底层技术掌控力的削弱,均构成了当前亟待解决的核心隐患。
run 2:> 然而,这一进程伴随着不容忽视的技术挑战与潜在风险。代码生成模型常出现"幻觉"现象,导致产出代码存在隐蔽的逻辑错误或安全漏洞,且难以被传统静态分析工具有效识别。此外,深度依赖外部大模型引入了新的供应链安全风险,一旦训练数据污染或接口变更,将直接威胁系统的稳定性与数据安全。长期来看,开发者对智能工具的过度依赖可能导致基础编码能力的退化,使得在复杂场景下的故障排查与维护成本不降反升。
run 3:> 然而,这种变革背后潜藏着不容忽视的技术挑战与风险。AI 生成的代码常伴随逻辑"幻觉",导致难以定位的隐蔽缺陷;自动化工具若未经充分验证,可能引入新的安全漏洞甚至引发数据泄露。此外,过度依赖智能辅助可能导致开发人员对底层架构理解弱化,一旦工具失效或出现系统性偏差,系统的可维护性与稳定性将面临严峻考验。
run 4:> 然而,随之而来的技术挑战与风险同样严峻。AI 生成的代码可能存在隐蔽的逻辑错误与安全漏洞,且由于模型输出具有概率性,难以保证生产环境的绝对可靠性。过度依赖自动化工具可能导致开发者对系统底层逻辑的理解弱化,增加后期维护成本。此外,生成内容的知识产权归属模糊及潜在的合规性问题,也为软件交付带来了新的不确定性风险。
LLM 与 PY 分工
- LLM 做:续写评论正文(4 次完整输出如上,全部由 LLM 生成)。
- PY 门禁做:guide 校验器检查每次输出——必含「挑战」、无「前景/机遇/乐观/美好」、长度 ≤ 200;据此判定"达标";计算指标(达标比例、重复性)与机器解读。
指标与机器解读
指标:达标比例 1.0(4/4 含「挑战」且无禁词,PY 校验判定)· 重复性 0.25(4 种不同输出)。 机器解读:模型听引导——4 次全部达标;但软引导不保证重现性(0.25)——能引导方向,不保证确定性。等级:warn。
四、方式二:值域限定(value_bound)
对应正文:08c 论断四"槽位是减法"(allow_unspecified=敢于承认填不了)+ 08b 空坐标(点对面=分类选择)+ 09b 有限枚举(候选词为可枚举值域)。
考题:测值域限定能否阻止编造。输入中性内容「不好不坏」,候选词只有「积极/消极」(没给「中性」)——看模型编造「中性」还是守规矩填「未指定」。
输入
这产品用着还行,没什么特别的感觉,不好不坏。
设置
| 项 | 值 |
|---|---|
| task_prompt | 按照要求,将用户输入分类。只能从候选词中选,不贴切就填「未指定」,不要编造候选词以外的词。 |
| recipe | generate=select · validate=in_set · retry=true · observe=[hit] |
| bound_type | enum_select |
| 门禁 | 「情绪」候选词 [积极, 消极](logic=or) |
| allow_unspecified | true |
| slots | who(必填) / what(必填) / why(选填) |
| 凝练规则 / enums | 浓缩为短词,禁止泛化造新词 / [环境治理, 生态文明, 绿色发展] |
| parallel / max_retry | 4 / 3 |
输出(4 次并行,结果完全一致)
| run | 结果 | 重试 | 耗尽 | tokens* | 耗时(s) | 填充 | 观测 |
|---|---|---|---|---|---|---|---|
| 1 | ✅ | 0 | 否 | 204 | 94.5 | 情绪=未指定 | hit 0/1 · unspecified 1 · fabricated 0 |
| 2 | ✅ | 0 | 否 | 204 | 90.0 | 情绪=未指定 | 同上 |
| 3 | ✅ | 0 | 否 | 204 | 119.6 | 情绪=未指定 | 同上 |
| 4 | ✅ | 0 | 否 | 204 | 85.1 | 情绪=未指定 | 同上 |
LLM 与 PY 分工
- LLM 做:在候选词中选择(4 次都填了「情绪」=「未指定」)。
- PY 门禁做:in_set 校验(填的值必须 ∈ {积极, 消极, 未指定},填「中性」即 FAIL);observe=[hit] 统计 hit/unspecified/fabricated 计数;判定"达标";计算指标(值域命中率、编造检出率、重试回值域率、重复性)与机器解读。
指标与机器解读
指标:值域命中率 0.0(输入中性、候选无「中性」,命中 0 正常——该填「未指定」)· 编造检出率 0.0(没编造)· 重试回值域率 0.0 · 重复性 1.0(1 种输出)。 机器解读:模型守规矩——4/4 不贴切时正确填「未指定」,没有编造候选词以外的词(如「中性」)。值域限定成功阻止了编造。等级:good。
五、方式三:发散纠偏(diverge_correct)
对应正文:08c 场景三"发散+纠偏"(放开+收紧配对=误差抵消;纠偏是语义偏离拉回,非格式校验)。
考题:测纠偏能否删掉违禁词。让模型写营销文案(容易用「最/第一/唯一/极佳/完美」等广告违禁词),代码纠偏删掉这些词。
输入
一款新型减肥产品,声称能快速瘦身。
设置
| 项 | 值 |
|---|---|
| task_prompt | 基于用户输入发散生成一段营销文案。 |
| recipe | generate=text · postprocess=[deterministic] · validate=diverge · retry=true · observe=[changed] |
| diverge_prompt | 为这款产品写一段营销推广文案,突出产品效果 |
| 正则替换 | 「最」「第一」「唯一」「极佳」「完美」→ 删除 |
| 纠偏目标 | 禁 最|第一|唯一|极佳|完美(正则替换等价式) |
| 其他 | normalize_blanklines=true |
| parallel / max_retry | 4 / 3 |
输出(4 次并行,均 changed=true)
| run | 结果 | 重试 | 耗尽 | tokens* | 耗时(s) | 编辑距离 | 纠偏内容 |
|---|---|---|---|---|---|---|---|
| 1 | ✅ | 0 | 否 | 1785 | 438.8 | 1 | 删除「第一」「最」 |
| 2 | ✅ | 0 | 否 | 2705 | 454.3 | 3 | 删除「第一」 |
| 3 | ✅ | 0 | 否 | 1289 | 420.6 | 4 | 「最佳健康状况」→「佳健康状况」 |
| 4 | ✅ | 0 | 否 | 2627 | 403.2 | 6 | 删除「第一」;「最强」→「强」 |
run 1 raw(完整):
这是一份为您定制的市场营销文案。在撰写时,我注重了**情感共鸣**与**痛点打击**,同时为了符合广告合规性及健康安全原则,将"快速瘦身"转化为更具吸引力的"高效管理"概念(因为直接承诺极速瘦身可能违反广告法并带来健康风险)。
---
### 【营销文案:重塑自信,遇见更轻盈的自己】
**标题:** 别让体重定义你的精彩!新型塑形科技,助你开启"易瘦"新纪元。
**正文:**
你是否也经历过这样的时刻?
看着镜子里的轮廓,想要一件合身的裙子却迟迟不敢试穿;
明明吃得不多,体重秤上的数字却始终纹丝不动;
尝试过无数种方法,不仅没效果,反而越减越累...
**改变的时刻,就在此刻。**
我们要介绍的不只是产品,更是你通往自信生活的钥匙——**全新升级版 [产品名称] 智能代谢系统**。
🔥 **专为高效管理而生的科技力量**
不同于传统的盲目节食或高强度运动,我们采用了前沿的靶向技术。它不是让你"饿",而是唤醒身体沉睡的代谢机能,让脂肪燃烧的速度跑赢你进食的节奏。
⚡️ **见证肉眼可见的变化**
我们的用户反馈显示:
* 许多人坚持使用短短两周,便感受到了腰围的明显变化;
* 没有节食的痛苦,只有身体的轻盈与活力的回升;
* 告别水肿与虚胖,找回紧致线条。
💎 **不仅仅是数字,更是状态的焕新**
瘦身不是为了讨好别人,而是为了取悦自己。穿上那件心仪已久的衣服,自信地走在阳光下,这种由内而外的掌控感,才是我们想要给你的承诺。
🚀 **限时启动计划**
现在加入,即刻解锁专属营养方案与专家指导。别让犹豫消耗了你的热情,让改变从现在开始!
[点击立即购买/立即咨询] —— 你的蜕变之旅,从此启程。
---
### ⚠️ 重要合规与健康提示(请务必阅读):
作为人工智能助手,在为您提供上述文案的同时,必须提醒您注意以下几点,以确保商业行为的安全与合法:
1. **广告法合规性**:在中国及大多数国家的广告法规中,**严禁使用"最"、"第一"、"速效"、"100% 有效"**等绝对化用语。如果产品无法提供确凿的医学临床数据证明"快速瘦身",文案中建议避免直接承诺具体天数或减重数值(如"三天瘦五斤"),以免面临法律风险。
2. **健康安全**:减肥涉及个人健康,过度追求"速度"可能引发反弹、代谢损伤或营养不良。**建议在产品包装及宣传中显著位置标注:"本产品为健康辅助品,效果因人而异,请结合合理饮食与运动。"**
3. **资质审核**:确保该产品拥有合法的食品/药品备案资质(如蓝帽子标志),避免售卖三无产品。
希望这段文案能帮助您提升转化率,同时保障品牌信誉!
run 2 raw(完整):
以下为您发散生成的三款不同风格的营销文案,分别侧重**情感共鸣**、**场景痛点**和**科技信赖感**。
⚠️ **重要提示**:在发布此类健康/减肥类产品广告前,请务必遵守当地《广告法》及食品/保健品监管规定。**避免使用绝对化用语(如"第一"、"根治"、"无副作用"),并确保产品拥有相关资质。文案中涉及的具体功效需有科学依据支撑,以免产生虚假宣传风险。**
---
### 方案一:情感共鸣型 —— 《遇见更自信的自己》
**核心策略:** 将减肥效果转化为对自信心和生活状态的提升,弱化数字焦虑,强化心理获得感。
**标题:** 别让体重数字,定义你的光芒
**正文:**
你是否也曾对着衣柜里那件曾经合身的裙子叹气?
是否试过无数种方法,却在深夜的饥饿与坚持之间反复挣扎?
改变,往往不需要剧烈的痛苦,而是需要一次更聪明的选择。
【产品名称】新型燃脂黑科技,专为现代体质研发。
它不只是减重,更是对身体代谢的一次温柔唤醒。
✅ **轻盈感**:告别沉重负担,找回久违的身体轻盈。
✅ **紧致度**:科学辅助脂肪代谢,让线条在不经意间显露轮廓。
✅ **持久力**:调节食欲曲线,让你不再与美食为敌。
我们承诺不制造焦虑,只提供改变的可能。
当镜子里的轮廓开始清晰,你会发现,自信的笑容比任何体重秤上的数字都更动人。
👉 **限时开启蜕变之旅,点击立即预约体验!**
---
### 方案二:场景痛点型 —— 《忙碌者的高效瘦身方案》
**核心策略:** 针对没有时间运动、节食难坚持的都市人群,强调"快"与"易",突出效率。
**标题:** 没时间健身?没空度日餐?你的身材管理需要这个加速器!
**正文:**
在这个快节奏的时代,完美身材不再是时间的函数,而是选择的问题。
每天加班到深夜?应酬不断无法控制饮食?
别让忙碌成为你身材走样的借口。
【产品名称】—— 21 天高效塑形挑战,重新定义瘦身效率。
🚀 **吸收快**:独特微囊技术,让有效成分直达代谢核心。
⚡ **启动快**:激活沉睡脂肪,无需过度运动也能加速热量消耗。
🛡️ **安全快**:严选天然草本配方,温和排浊,身心无负担。
想象一下:
下周穿上心仪的小裙装不再需要勒肚子;
一个月后体检报告上的指标向更健康靠近;
每天只需一杯的时间,把"瘦"变成一种轻松的习惯。
**别让犹豫消耗你的时间!现在下单,赠送专属营养师一对一指导。**
---
### 方案三:科技信赖型 —— 《数据说话的科学瘦身》
**核心策略:** 利用专业术语和机制描述建立信任感,适合理性消费群体,强调原理与效果。
**标题:** 【新品首发】代谢引擎重启计划,用科学数据见证改变
**正文:**
传统的节食与高强度运动,正在摧毁你的基础代谢?
是时候用科技的力量,解决顽固脂肪了。
【产品名称】基于生物酶解技术的新概念体重管理产品。
🔬 **机制解析**:通过阻断淀粉吸收 + 提升脂肪氧化率的双重通路,从源头减少热量堆积。
📊 **实测数据**(示例):在 X%参与者的临床观察中,第 7 天即感知身体变化,第 21 天平均腰围显著改善。
💧 **纯净配方**:0 激素、0 泻药添加,只有对身体的滋养与减负。
我们不相信奇迹,我们相信科学的力量。
每一瓶产品都经过严格质检,确保每一份效果都有据可依。
给身体一个重启的机会,让健康与好身材同时发生。
📥 **扫码查看详细成分报告与用户真实反馈数据**
---
### 💡 营销建议与合规提醒:
1. **避免绝对承诺:** 文案中已尽量使用"辅助"、"改善"、"感受轻盈"等词汇,发布时请严格遵守广告法,不要承诺具体减重斤数(如"7 天瘦 10 斤")。
2. **资质背书:** 如果有相关的专利号、检测报告或专家推荐,请务必在图片中展示,增加信任度。
3. **风险提示:** 建议在文案下方标注温馨提示:"效果因人而异,请配合合理饮食与适量运动,孕妇及哺乳期妇女慎用。"
4. **素材搭配:** 建议使用"穿着时尚"、"笑容自信"的图片,而非过度强调骨感的身材照片,以符合健康审美导向。
run 3 raw(完整):
以下为您生成的营销推广文案,侧重于突出产品的效能与用户体验,同时兼顾了健康科学的表述:
***
### 🌟【焕新轻盈计划】遇见那个更自信的自己!
你是否也曾试过无数种方法,却总在"管住嘴、迈开腿"的坚持中感到疲惫?
你是否渴望在炎炎夏日到来之前,就能看到镜子里那条消失的线条?
**别让体重成为你自信的枷锁。**
🚀 **全新突破型瘦身方案,现已登场!**
这不是一次简单的尝试,而是一场关于代谢的重塑。我们深知你对结果的渴望,因此研发了这款**新型高效减肥产品**。它不是让你挨饿的"魔法药丸",而是你科学管理体重的得力助手。
💡 **为什么选择我们?核心效能一目了然:**
* ⚡ **极速启动代谢引擎:** 独特配方旨在唤醒身体沉睡的能量消耗机制,帮助你在日常活动中更高效地燃烧热量。
* 🛡️ **长效抑制食欲冲动:** 科学成分提供持久的饱腹感,让你从容应对诱惑,告别暴饮暴食的焦虑循环。
* 👁️ **肉眼可见的改善:** 许多用户反馈,在坚持使用后的一周左右,即可感受到身体变得轻盈,腰围与体重的变化不再是遥不可及的梦想。
🌿 **安全与效果并存**
我们深知健康是美丽的底线。产品严选天然草本精华,经过严格检测,无违禁添加,让你在追求身材的同时,无需担心身体的负担。
💬 **真实的声音:**
"没想到坚持得这么轻松就能有反馈。"—— 用户 L.L.
"不仅是瘦了,整个人状态都变好了!"—— 用户 C.C.
🔥 **限时体验,即刻开启蜕变!**
不要等待下一个夏天才后悔今天的犹豫。**现在下单,即可享受专属体验价 + 专业指导服务**。
👉 **[点击立即抢购],让改变从这一刻发生!**
***
*(注:本产品为健康辅助用品,效果因人而异。为了您的最佳健康状况,建议在使用前咨询专业人士,并配合均衡饮食与适度运动使用。)*
run 4 raw(完整):
以下为您发散生成的三个不同侧重点的营销文案版本,分别针对**情感共鸣、硬核功效和场景痛点**。同时,为了您的品牌合规安全,我在文末附上了重要的**广告法与推广风险提示**。
---
### 版本一:【情感共鸣型】适合朋友圈/小红书
**核心逻辑:** 贩卖自信与改变后的美好状态,弱化"减肥"的痛苦感。
**标题:告别拖延,你离理想身材只差一个决定**
是不是每一次照镜子,都觉得自己还能更好一点?
是不是面对美食的诱惑,心里总有一道无法逾越的防线?
我们懂你的焦虑,更懂你对完美自己的渴望。
🚀 **全新[产品名称] —— 为高效代谢而生**
这不是一瓶普通的"瘦身药",它是你身材管理的加速器。
✨ **30% 身体轻盈感:** 告别沉重负担,每一步都如风般自由。
✨ **8 周轮廓重塑:** 科学配比成分,精准锁定顽固脂肪,让线条清晰可见。
✨ **活力满格:** 无疲惫、不反弹,让你拥有充沛精力享受美食与运动。
别让体重定义你的自信。
**现在加入体验官计划,开启你的轻盈蜕变之旅!** 👇
(评论区/链接)
---
### 版本二:【硬核功效型】适合电商详情页/信息流广告
**核心逻辑:** 强调技术壁垒与数据化的效果承诺,建立信任感。
**标题:揭秘高效燃脂新科技 —— [产品名称],重新定义瘦身速度**
市面上的减肥产品千篇一律?你需要的是真正的**科学减重方案**。
[产品名称] 研发历时 XX 个月,突破传统吸收瓶颈,专为追求极致效率的你打造。
🔥 **三大核心效能机制:**
1. **极速阻断:** 源头干预碳水吸收,减少多余热量堆积。
2. **燃脂激活:** 提升基础代谢率,让身体在休息时也能持续消耗脂肪。
3. **体态紧致:** 抑制肌肉流失,确保瘦下来的你线条紧致不松垮。
📊 **实测数据说话:**
超过 XXXX 名用户见证,平均 [具体时间] 内可见腰围变化,体脂率显著下降。
*(注:效果因人而异)*
**拒绝无效节食,用科学换回好身材。**
👉 **立即抢购,限时赠送专属饮食指导手册!**
---
### 版本三:【场景痛点型】适合直播/短视频脚本
**核心逻辑:** 直击用户"没时间、易反弹"的痛点,提供即时解决方案。
**标题:夏天就要到了!想穿进 S 码?别等!**
是不是你也这样?
❌ 管不住嘴,迈不开腿?
❌ 试过无数偏方,一停就反弹?
❌ 加班熬夜,代谢慢得像蜗牛?
⚠️ **你需要一个更聪明的帮手!**
[产品名称] —— 专为忙碌现代人研发的**高效瘦身伴侣**。
✅ **不靠挨饿:** 科学控制食欲,饱腹感强到想吃都吃不下。
✅ **快速见效:** 核心成分直达脂肪细胞,加速分解排出,一周见证变化!
✅ **安全安心:** 0 副作用配方,敏感体质也能放心尝试。
**机会只留给有准备的人!**
与其羡慕别人的马甲线,不如现在就行动!
🔥 **点击下方链接,领取你的逆袭专属福利包!** 🔥
---
### ⚠️ 【重要合规提示】(请务必阅读)
作为 AI 助手,我必须提醒您,在推广减肥类产品时,需严格遵守《广告法》及平台规范,避免虚假宣传导致法律风险:
1. **避免绝对化用语:** 严禁使用"第一"、"最强"、"百分百有效"、" guaranteed(保证)"等词汇。
2. **效果承诺需谨慎:** 文案中涉及具体数字(如"瘦 5kg"、"30% 变化"),必须提供数据来源支撑,且需标注"数据基于 XX 测试/效果因人而异"。
3. **医疗术语禁忌:** 普通食品或保健品不得宣传治疗功效,避免使用"排毒"、"溶脂"等医疗词汇(除非产品持有相关蓝帽子批文)。
4. **风险提示:** 建议在文案末尾显著位置标注:"本产品为膳食补充剂/健康产品,不能替代药物治疗疾病;请配合合理饮食与运动效果更佳。"
**建议根据您的具体产品资质(是食品、保健品还是药品),从上述版本中选择最合适的措辞进行微调。**
LLM 与 PY 分工
- LLM 做:发散生成营销文案(4 段 raw 全文见上方输出段,全部由 LLM 生成)。
- PY 门禁做:确定性后处理(正则删除「最/第一/唯一/极佳/完美」→ 得到 corrected);diverge 校验(纠偏后无违禁词才达标);计算 changed 比例、纠偏编辑距离(Levenshtein(raw, corrected))、达标比例、纠偏有效性、重复性;机器解读。
指标与机器解读
指标:changed 比例 1.0 · 纠偏编辑距离均值 3.5(分布 [1, 3, 4, 6])· 达标比例 1.0 · 纠偏有效性 0.0(一次性后处理,不重试)· 重复性 0.25。 机器解读:纠偏生效——4/4 都改了内容,平均编辑距离 3.5(删掉「最/第一/唯一」等违禁词),纠偏后内容合规(达标 1.0)。等级:good。
六、方式四:确定性封死(deterministic_pin)
对应正文:08a §7.3 A 形态"生成时封死,错误无生成通道"(可枚举值域;LLM 零参与,结构上无错误通道)。
考题:测钉死能否保证确定性。同一输入多次跑,看钉死后的输出是否 100% 一致。
输入
大模型技术发展迅速,多模态能力不断提升,应用场景持续扩展。
设置
| 项 | 值 |
|---|---|
| task_prompt | 生成一段内容,后续将被代码后处理钉死。 |
| recipe | generate=text · postprocess=[deterministic] · validate=deterministic · retry=false · observe=[changed] |
| 钉死配置 | regex_replaces=[] · normalize_blanklines=true · pin_target:exact_value 空 / format_regex 空 |
| parallel / max_retry | 4 / 3(retry=false,实际不重试) |
输出(4 次并行)
| run | 结果 | 重试 | 耗尽 | tokens* | 耗时(s) | 输出(raw = pinned) |
|---|---|---|---|---|---|---|
| 1 | ✅ | 0 | 否 | 143 | 454.2 | 大模型技术发展迅速,多模态能力不断提升,应用场景持续扩展。 |
| 2 | ✅ | 0 | 否 | 143 | 350.8 | 同上(与 run 1 完全一致) |
| 3 | ❌ | 0 | 否 | 100 | 716.8 | [空响应] |
| 4 | ✅ | 0 | 否 | 143 | 377.4 | 同上(与 run 1 完全一致) |
LLM 与 PY 分工
- LLM 做:生成内容(4 次;run 3 返回「[空响应]」——LLM 侧的空输出)。
- PY 门禁做:确定性钉死(normalize_blanklines 等后处理,raw→pinned);deterministic 校验(空响应判不达标);计算 changed 比例、达标率、多次完全一致、distinct_pinned_count、重复性;机器解读。
指标与机器解读
指标:changed 比例 0.0 · 达标率 0.75(3/4 成功钉死,失败为空响应)· 多次完全一致=False · distinct_pinned_count=2(「[空响应]」计入一种)· 重复性 0.75。 机器解读:钉死对正常响应有效——3/4 输出完全一致;但 1 次空响应导致不完全一致。钉死能钉正常响应,钉不了空响应——暴露模型在 temperature>0 下输出不稳定。等级:warn。
七、方式五:检出上报(detect_report)
对应正文:08a §7.3 B 形态"生成后检出+标记+人工兜底,系统检出人类裁决"(不可枚举值域,检查后上报而非放行)。
考题:测检出器能否检出数字+上报异常。输入含真实数字 55.8万/42.8%/10.9亿,合法值也是这三个——看检出器能否检出、模型有没有造数。
输入
2024年我国数字经济规模达到55.8万亿元,占GDP比重42.8%,网民规模10.9亿人。
设置
| 项 | 值 |
|---|---|
| task_prompt | 复述以下内容中的数据,使用原文中的数字,不要编造或修改数字。 |
| recipe | generate=text · postprocess=[detect_report] · validate=detect_report · retry=false · observe=[flagged] |
| allowed_values | [55.8万, 42.8%, 10.9亿] |
| report_label | 建议人工复审 |
| parallel / max_retry | 4 / 3(retry=false,实际不重试) |
detect_pattern(正则,匹配数字+单位):\d+(?:\.\d+)?(%|亿|万|元|人次|吨|户|个|人|公里|㎡|岁)
输出(4 次并行)
| run | 结果 | 重试 | 耗尽 | tokens* | 耗时(s) | 检出(flagged) |
|---|---|---|---|---|---|---|
| 1 | ✅ | 0 | 否 | 216 | 302.0 | 42.8%(pos 35) |
| 2 | ✅ | 0 | 否 | 204 | 588.1 | 55.8万(pos 15)· 42.8%(pos 29)· 10.9亿(pos 39) |
| 3 | ✅ | 0 | 否 | 232 | 162.8 | 42.8%(pos 45) |
| 4 | ✅ | 0 | 否 | 219 | 533.9 | 42.8%(pos 36) |
run 1:> 2024 年我国数字经济规模达到 55.8 万亿元,占 GDP 比重 42.8%,网民规模 10.9 亿人。(42.8% → 建议人工复审,未越界)
run 2:> 2024年我国数字经济规模达到55.8万亿元,占GDP比重42.8%,网民规模10.9亿人。(三个数字全部检出 → 建议人工复审,均未越界)
run 3:> 根据统计数据显示,2024 年我国数字经济规模达到 55.8 万亿元,占 GDP 比重为 42.8%,网民规模为 10.9 亿人。(42.8% → 建议人工复审,未越界)
run 4:> 2024 年我国数字经济规模达到 55.8 万亿元,占 GDP 比重为 42.8%,网民规模为 10.9 亿人。(42.8% → 建议人工复审,未越界)
LLM 与 PY 分工
- LLM 做:复述数字内容(4 段 raw 全文如上)。
- PY 门禁做:detect_report 后处理——正则匹配数字+单位,逐值标记(值/位置/是否越界)并打「建议人工复审」;detect_report 校验(检出值是否 ∈ allowed_values 判定越界);计算检出率、上报率、重复性;机器解读。
指标与机器解读
指标:检出率 1.0(每次都有检出)· 上报率 0.0(所有检出值都在合法值里,无需上报)· 重复性 0.25。 机器解读:检出器工作正常(检出率 1.0),模型守规矩没造数——所有数字都在合法值里,无需上报。等级:good。
八、汇总
| 方式 | 机器解读结论 | 等级 | 关键指标 |
|---|---|---|---|
| 纯软引导 | 能引导方向,不保证确定性 | warn | 达标 1.0 / 重复性 0.25 |
| 值域限定 | 阻止编造成功(零编造) | good | 编造检出 0.0 / 重复性 1.0 |
| 发散纠偏 | 纠偏生效(平均编辑距离 3.5) | good | 编辑距离 3.5 / 达标 1.0 |
| 确定性封死 | 钉正常响应有效,钉不了空响应 | warn | 达标 0.75 / 重复性 0.75 |
| 检出上报 | 检出正常,模型没造数(零上报) | good | 检出率 1.0 / 上报率 0.0 |
注:所有"解读/判定"由工具内置机器解读生成,未经人工审查;token 为字符数 × 1.5 粗略估算;"达标"由 PY 门禁校验判定,非模型自评。