☰
Ken Thompson式严谨:大模型落地必备的可验证与信任链
2026/10/27 2:22:02 网站建设 项目流程

Ken Thompson 这个名字,在操作系统和编程语言的圈子里几乎不需要介绍。他是 Unix 的共同作者,是 B 语言和 Go 语言的推动者,也是早期用机器下国际象棋程序的实践者。这几年 AI 几乎接管技术讨论中心时,我经常想到他。原因不是他留下过多少慷慨激昂的 AI 预测,而是他的工作方式像一块压舱石:面对复杂系统,不信任是最安全的起点,验证是唯一可靠的推进手段。

他最有名的图灵奖演讲题目是 Reflections on Trusting Trust,那个编译器后门实验提醒整个行业:如果工具链从一开始就不可信,那么即使你看到全部源码,也不能推导出结果是安全的。这个思想放到今天的模型语境里,几乎是为大模型量身定做的警示——权重和训练数据无法完全审查,输出真实性必须靠外部校验。我们真正应该从 Ken Thompson 身上带走的,不是具体算法,而是一套关于“可验证、可复现、可审计”的 AI 工程方法。

1. Ken Thompson 不是反 AI,而是信不过看不透的东西

1.1 技术选择更像价值观

Ken Thompson 在公开场合很少发布关于 AI 的长篇演说。他更习惯用产品、代码和演示说明问题。但从他参与的项目看,他的偏好非常稳定:工具要简单,行为要显式,链条要可检查。

Unix 把“小工具 + 管道”组合成宏大系统,C 语言把“字节 + 指针”的抽象压到最薄,Go 语言则把并发、依赖管理和部署体验放到语言层解决。这些选择背后共同点都是:你需要能理解正在发生什么。即使是很高级的抽象,只要某个环节变成黑箱,他会本能地警觉。

这不是保守,而是一种工程价值观。AI 模型最大的特点恰恰是黑箱:输入一串 token,输出另一串 token,内部用十几亿甚至上千亿参数共同决定结果。我们很难在第一时间指出某个回答对应哪条具体规则。对于 Thompson 这类人,这样的系统不是“聪明”或“愚蠢”的问题,而是“能不能被信任”的问题。

1.2 “可验证”比“看起来正确”更重要

1984 年的图灵奖演讲里,Thompson 用一个编译器后门实验说明:当编译器本身被植入恶意逻辑,之后所有用这个编译器编译出来的程序都会带上同样的问题,而源码审查不一定能发现。他强调的是一个递归的信任链:你信任编译器,编译器会放大信任,而你最终得到的可执行文件可能完全不同于你审查过的源码。

大模型的信任链有类似结构:你看到的模型输出不是源代码直接生成的,而是由训练语料、权重、采样参数和推理框架共同决定的。开发者能检查提示词,能检查生成结果,但很难逐层定位“为什么这条回复会有偏见、会编造事实”。这时候如果直接把 AI 结果放进生产流程,等于在无意识信任训练语料里所有人的判断。

所以,说 Ken Thompson 会排斥 AI 是过度简化。他真正排斥的,是不可验证带来的失控。当我们把大模型当作一个需要被审计的外部依赖,为它设置输入输出契约,建立监控和回滚机制,它才真正进入到系统工程师的信任边界内。

2. 从 Belle 到 Unix,他早就踩过“智能系统”的坑

2.1 Belle:把“智能”拉回搜索与评估

很多人以为 Ken Thompson 的主要贡献只有操作系统和编程语言。实际上,他在国际象棋机器上也有过一段重要经历。他与同事在贝尔实验室设计的 Belle,是 1980 年代非常有代表性的棋类专用计算机。它把“玩国际象棋”这个看起来很智能的任务,拆解成搜索、评估、剪枝和硬件加速。

Belle 的成功给当时的计算机博弈留下了很深的印象。它不是靠某种不可解释的直觉取胜,而是靠一套可以被反复调试的搜索结构。你给它的每一步行为,都能回溯到评估函数和搜索深度。这种“运行过程可追踪”的做法,和后来神经网络的黑箱气质差别很大。

这段经历形成的关键判断是:高级能力并不必然来自神秘规则。一个足够深、足够窄的搜索,加上精心设计的评估函数,也可以产生非常强的行为。对今天的启示很明显:AI 可以处理开放性问题,但很多业务场景只需要一个足够好的搜索或者一个硬规则,未必需要把模型推上中心位置。

2.2 Unix 哲学反过来约束 AI 的边界

Unix 有一句经典设计原则:每个程序做好一件事,通过管道组合。Ken Thompson 是这一哲学的早期执行者之一。一个复杂任务被拆成 grep、sort、sed、awk,每个环节都是独立的、可替换的、可测试的。整套系统是否可靠,取决于每个环节的约定是否清晰。

把这个原则搬到 AI 应用开发里,会产生完全不同的架构思路。AI Agent 也好,RAG 流程也好,AI 编程辅助也好,本质上都只是流程里的一个环节。模型负责理解语义,业务规则负责兜底,缓存负责重复请求,日志负责审计。如果模型环节不定义输入输出格式,不设置超时和重试,整个 Agent 就会变成不可控的循环。

在真实项目里,我们经常看到这样的场景:模型生成的 JSON 偶尔会多一个逗号,导致下游解析失败;Agent 调了一次外部工具没拿到想要的结果,就反复重试;AI 生成的代码在单元测试里没问题,集成测试却因为隐藏假设而失败。这些问题都不是模型本身不够聪明,而是外围工程没跟上。Thompson 在 Unix 上的经验告诉我们:智能系统不能只靠智能,更要靠接口、日志和错误处理。

把模型当成一个 Unix 工具来设计接口,是非常有效的心智模型。模型调用的输入应该被标准化,输出应该被包装成稳定的数据结构,错误要分类,超时要可配置。这样当有一天你想替换不同厂商的模型时,只需要改动一个适配层,其他系统逻辑完全不用动。

3. 把他那句“when in doubt, use brute force”放进 AI 时代重读

3.1 暴力不是笨,而是可计算、可预测

Ken Thompson 有句话流传很广:有疑问时,用暴力方法。在编程语境里,这通常意味着先用简单的穷举、确认或重试把问题跑通,而不是一上来设计复杂的抽象。这句话被很多人误解为“他反对优雅代码”,其实他反对的是为了优雅而牺牲可验证性。

放在 AI 时代,这个原则依然成立。当模型在某个小任务上表现不稳定时,我们其实有两个选择:继续调整提示词,期待它更稳定;或者在关键的边界场景里,直接用确定性规则、枚举、查表、缓存来兜底。后者看起来“不够智能”,但它可预测,可测试,出了问题可回滚。

比如一个识别的字段取值范围固定,你能用正则或枚举约束,就不必完全依赖模型自由输出。模型可以负责上游的语义理解,下游再用规则确认结果是否合法。这种“模型做开放,规则保下限”的搭配,就是 brute force 思维在 AI 工程里的正面价值。

3.2 模型负责联想,外围逻辑负责落盘

真正危险的使用方式,是让模型在关键路径上直接输出最终结果,不做任何校验。比如让模型直接返回订单金额、代码片段、接口参数,然后原样使用。一旦模型出现幻觉,错误就会进入生产链路,而且很难被发现。

Thompson 式的处理是:给模型划一个权限边界。模型可以提议,但决定权留给确定性的校验层。AI Agent 可以建议下一步行动,但工具白名单和最大步数由外围系统控制。AI 编程助手可以生成代码,但必须有自动化测试和人工审查。这样即使模型“天马行空”,系统仍然有一个物理下限。

实践中可以按风险等级划分:

  • 低风险:模型生成文案、摘要、初稿,人审后发布。
  • 中风险:模型生成结构化数据,但后端用规则和校验函数做二次检查。
  • 高风险:模型只提供建议,最终决策由确定性流程或人工完成。

再举一个非常具体的场景:让模型生成 SQL 然后直接查询数据库,这是高风险动作。哪怕是内部工具,也应该限制表名和字段白名单,再对生成的 SQL 做一轮规则校验,确认它只访问了允许的库表。模型可以给出查询逻辑的建议,但真正执行的动作必须受控。这个分级方式不需要复杂的框架,只需要在小规模场景里先跑通,再慢慢扩大模型能接触到的动作范围。

4. 今天做 AI 工程,最缺的不是模型,而是 Thompson 式严谨

4.1 AI 编程:生成代码只是开始,验证才是真正工作

AI 编程工具眼下已经非常普及。Copilot、Cursor、ChatGPT 写代码的片段质量,很多时候足以让开发者省下大量搜索时间。但这里有一个很隐蔽的坑:AI 生成的代码语法正确,甚至能通过你随手写的几个测试,却可能在边界条件、类型约束或权限假设上出错。

Thompson 的经历提醒我们,不能因为代码“看起来合理”就信任它。AI 生成的代码应该当作来自不可信协作者的 PR 来处理:必须有可重复的测试、必须审查差异、必须在关键路径上补充断言。如果你让 AI 生成的代码直接进入生产,却没有配套测试,等于把信任交给一个你看不见训练数据的概率模型。

有一个简单的做法:使用 AI 编码工具时,先要求它生成针对该需求的测试用例,再让它生成实现。或者手工写测试,然后让 AI 修复不通过的代码。这样等于把模型当成一个受测试约束的代码生成器,而不是一个替你做最终判断的“黑盒程序员”。

4.2 Agent 和自动化工作流:必须有“刹车”

AI Agent 类应用比单纯调用大模型复杂得多,因为它不仅生成文本,还能决定调用哪些工具、执行哪些操作。如果缺少边界,Agent 很容易陷入无限重试、错误工具调用或行为偏离目标的困境。

工程上首先要明确几个参数:最大迭代次数、工具白名单、每一步的输入输出日志、重大操作的人工确认点。不要让 Agent 在无人值守的情况下接触高风险动作,至少要在早期阶段保留人工环节。这看起来效率低,但恰恰是可控性的代价。

其次是输出校验。Agent 调工具返回的数据要再次校验格式,Agent 生成的最终回答要经过规则或关键词检查,万一检测到非法内容就中断并转入人工处理。这套设计并不是给 AI 泼冷水,而是让 AI 能在有限的失败范围内安全试错。

重要提醒:不要一上来就把模型部署到生产流程并完全自动化运行。先用一条样例把输入、输出、日志和回滚路径都跑通,确认每个环节都可见,再逐步放开。

4.3 最小可运行验证流程:从一次调用到可迭代系统

如果让我们把 Thompson 式严谨落地,最值得先做的不是搭一个大平台,而是建立一条“最小可运行验证流程”。参考顺序如下:

  1. 固定环境 记录模型版本、推理框架、权重文件哈希、量化参数,确保同一版本可以原样复现。
  2. 单样例验证 选一条业务核心样例,跑通模型调用,记录输入、输出、耗时、Token 消耗。
  3. 规则校验 检查输出是否是合法 JSON、字段范围是否正确、关键约束是否成立。
  4. 日志快照 将每一次请求的原始输入、输出、参数、错误信息保存起来,方便事后归因。
  5. 人工抽检 定期对边缘样本做人工评估,记录准确率和失败类型。
  6. 灰度发布 将模型输出的使用范围控制在少数用户或少数请求上,观察一段时间后再扩大。
  7. 回滚机制 准备一个可以直接切回的稳定版本,效果恶化时能一键回滚。

这个流程不是把简单事情复杂化。它的价值在于,当模型升级、提示词调整、训练数据变化时,你可以依赖一套稳定的观测手段判断“到底是不是变好了”。

类似 Spring AI 这类应用开发框架,也在把“模型调用、解析、提示词模板、Agent 步骤”封装成标准化结构。这本身是好事,但封装不能替代验证。无论框架帮你省掉多少样板代码,你仍然需要回答同一组问题:输入是什么,输出是什么,模型失败了怎么办,结果如何被校验。框架降低的是编写成本,不是风险。

4.4 排查链路:当 AI 输出不对劲时,按顺序查

AI 输出异常时,新手最容易直接换模型、调温度、重写提示词。但更稳的顺序是先确定问题出在哪一层。常见排查链路包括:

排查层检查内容
输入层上下文是否被截断、编码是否异常、格式是否规范、字段是否缺失
模型层具体模型版本、权重文件、温度/采样参数、缓存命中是否异常
基础设施GPU/内存是否足够、推理框架是否降级、并发是否过高
工具链外部 API 是否正常、Agent 调用链是否循环、超时设置是否合理
后处理解析脚本是否出错、字段映射是否正确、输出是否被错误截断
验证层是否有针对输出的校验断言、失败任务是否被自动捕获

按这个顺序排查,可以避免大多数无效调参。如果模型返回的结果格式稳定但内容错误,问题大概率在输入上下文或后处理;如果偶尔宕机,问题可能在基础设施;如果 Agent 行为前后不一致,问题可能在工具链和迭代边界。把每一个环节的记录补齐,AI 系统才能像成熟的软件系统一样被观测和调优。

5. 普通开发者能从他身上带走的四件事

5.1 最小可验证流程先于效率

很多团队在使用 AI 时,第一步就是把全流程自动化。这直接违背了 Thompson 的稳妥原则。正确顺序是先小、后大:先让一个客户案例跑通,再扩展到相关案例,最后才考虑通用化。每扩展一步,都要回头看验证是否还在生效。

AI 产品经理和研发在规划需求时,也应该先把“验证指标”写进需求文档。不要只说“我们要接入大模型”,而要说明“什么输出算成功,什么输出算失败,谁来负责确认”。这些边界条件越早定义,后续的返工越少。

5.2 结果可复现先于结果惊艳

模型输出的“惊艳”很多时候来自随机性。真正有用的是复现性:相同输入、固定参数下能得到相同结果。如果做不到完全复现,也要保留输入输出快照,确保出现事故时能回到某一个具体的版本现场。可复现性是工程化的地基。

要做到这一点,最简单的办法是把每次请求的模型版本、提示词版本、采样参数、原始输入和最终输出统一写入日志。不要只记录最终结果。否则当模型表现变差时,你根本不知道是哪个环节变了。

5.3 黑盒输出必须被外层逻辑包裹

不管模型多强,关键业务路径上都不能裸用。你可以在模型外围套规则校验、字段映射、异常检测、人工确认。隔离模型失败的影响范围,是使用 AI 的必修课。

下面的检查清单,可以在上线前过一遍:

  • 模型输出是否有 JSON Schema 校验。
  • 数值字段是否有范围限制。
  • 关键决策是否有人工确认点。
  • 模型调用失败后是否有降级路径。
  • 是不是每个环节都有日志。
  • 能不能在五分钟内回滚到上一个稳定版本。

如果这些答案都是“是”,AI 才算真正被工程化。如果只是“模型调用通了”,那离生产可用还有好大一截。

5.4 信任靠审计,不靠感觉

感觉模型“挺好用”和系统真正可靠之间,差着一整套日志、监控、回滚和抽检。Ken Thompson 半个世纪前用编译器实验证明的,就是信任链条的脆弱性。今天的模型更复杂,我们更应该为这种脆弱性留出空间。

这也是为什么我始终觉得,AI 领域的“工程实践”比“参数竞赛”更值得长期投入。参数更大、能力更强,当然会有帮助,但只要它还是一个不可完全解释的概率系统,验证和审计就不会过时。

结尾建议很简单:找一个真实业务场景,先照着上面的最小验证流程跑通一次。不要急着上生产,也不要用最贵最大的模型。先确认你能回答这几个问题:模型版本是什么?输入输出都是什么?失败时能不能回滚?输出有没有被校验?如果都能回答,再把 AI 变成工作流里的一环,这比盲目追求更高参数的模型重要得多。

Ken Thompson 未必会喜欢今天大模型的黑箱属性,但他一定会赞成一种态度:对一个无法完全理解的系统保持敬畏,然后用工程手段把它变成可验证、可控制的部分。这正是 AI 工程实践中最稀缺的东西。

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

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

立即咨询