CH 02认识论 I:知识、信念与不确定性
这一章要回答一个看似简单的问题:当你的系统输出一句话时,它凭什么算「知道」? 这个问题不是修辞。它决定了你该怎么设计置信度、怎么处理拒答、以及怎么向用户解释系统的能力边界。 认识论(epistemology)是关于「知识是什么、我们如何获得知识、知识的限度在哪」的学问—— 它是全书地基,因为它管的正是「模型说的对不对」这件事的判据。
2.1认识论在问什么
认识论不问「世界的真相是什么」(那是形而上学),它问的是三个更收敛的问题:
| 问题 | 在问什么 | 直接对应的 AI 问题 |
|---|---|---|
| 知识是什么 | 什么样的状态才算「我们知道 X」,而不只是「我们猜 X」「我们相信 X」 | 模型答对了,算不算「知道」?蒙对的和真懂的区别是什么? |
| 知识从哪来 | 经验、推理、证言(听别人说)各自能提供什么类型的知识 | 训练数据是「经验」还是「证言」?从文本学来的东西能算第几手知识? |
| 知识的限度 | 哪些东西我们能够知道,哪些原则上不能,哪些只是暂时不知道 | 系统什么时候该说「我不知道」?「不知道」是应该被优化掉的缺陷,还是必须保留的功能? |
注意第三行。它的答案会直接改变你的产品思路: 如果你把「不知道」当成缺陷去优化掉,你会得到一个永远自信的系统;而永远自信的系统在关键场景里是危险的。
2.2知识的经典定义与葛梯尔反例
这是认识论最著名的一个小问题,它比看起来更要紧——它直接对应「蒙对和真懂怎么区分」。
知识是得到辩护的真信念(Justified True Belief,简称 JTB)。
—— 这个定义可追溯到柏拉图的《泰阿泰德篇》,两千多年里被当作标准答案拆开看,它要求三件事同时成立:
- 信念(Belief):你得真的相信 X。一个不相信 X 的人不可能「知道 X」。
- 真(Truth):X 事实上是真的。相信错误的东西不算知识,无论你多确信。
- 辩护(Justification):你有理由相信 X。瞎猜对了、或者被不可靠的传言说中,也不算知识。
哲学家埃德蒙·葛梯尔在一篇仅三页的论文里指出:这三个条件同时成立,仍然可能不算知识。 他给了两个反例,核心结构如下:
你有一把理由充分的确信——比如你看到同事每天开车来上班,因此相信「同事有车」。 这个信念为真(他确实有车)、你也有辩护(你天天看到)。但你的辩护恰好是基于一个错误的信息链: 假设其实是他只是顺路搭别人的车,而恰好他名下也有车——你猜对了结论,但你的理由是错的。
这类案例叫「得到辩护的真信念,但因运气而成真」。葛梯尔证明了 JTB 不是知识的充分条件。
关键问题:如果三个条件都满足还不算知识,那知识到底还需要什么?这个问题至今没有公认答案——六十多年过去,哲学界提出了几十种修补方案,但没有一种被普遍接受。
这个故事对 AI 的直接意义
把葛梯尔的结构套到模型上,你会发现它几乎是幻觉问题的形式化描述:
| JTB 条件 | 在模型上对应什么 | 葛梯尔式失败 |
|---|---|---|
| 真(Truth) | 输出内容事实上正确 | 输出正确,但原因不对 |
| 辩护(Justification) | 输出基于可靠的推理步骤或可靠来源 | 推理链看起来合理,但其中一步是编造的 |
| 信念(Belief) | ——(模型没有信念,这一点很关键) | —— |
应对方式:在评测里加一条「依据可追溯性」检查——要求模型给出引用来源或推理步骤, 然后人工抽检这些依据是否真实存在、是否真的支持结论。这一个动作能过滤掉大部分「蒙对」。
顺便回答一个常见问题:模型有「信念」吗
上面表格里第三行我留了空,因为这需要说清。在 JTB 的框架里,「信念」指一个可被持有、可被修正的心理状态。
模型有没有这个,取决于你的哲学立场(第 5 章会详细展开)。但在工程上你可以绕开这个问题: 无论模型有没有信念,它的输出都会表现出可测量的稳定性特征—— 同一个问题问十次答案是否一致?答案对上下文措辞是否敏感?换个说法会不会翻转结论? 这些是可测的,而且它们恰好是「信念稳固程度」的工程替代品。
2.3知识的三种来源
哲学史上关于知识来源的争论,对 AI 有一个非常具体的映射:你的模型的知识,是「经验」还是「道听途说」?
| 来源 | 主张 | 代表 | 在 AI 里的对应 |
|---|---|---|---|
| 理性主义 | 知识的根本来源是理性推理,经验只是触发 | 笛卡尔、莱布尼茨 | 符号推理、形式化方法、定理证明器 |
| 经验主义 | 一切知识来自经验,心智初始是白板 | 洛克、贝克莱、休谟 | 从数据中学习、端到端训练 |
| 康德式综合 | 经验提供材料,但心智的先天结构负责组织它 | 康德 | 架构先验:归纳偏置、注意力机制、归纳头 |
第三行是最容易被忽略、但对你理解模型最有用的一条。康德的洞察是:没有纯粹的「经验输入」——任何经验都必须被某种结构组织过,才能成为经验。
这个视角能解释一个常见困惑:为什么给模型更多数据,某些能力还是学不会? 因为数据只提供「经验材料」,架构决定「能从中提取出什么」。如果需要的规律无法被当前架构的表征方式表达, 再多数据也学不到——这不是数据量问题,是「形式」问题。康德的术语在这里意外地好用。
第四种来源:证言(Testimony)—— 它才是 LLM 知识的主要来源
哲学认识论里有一个专门分支讨论「听别人说」能不能产生知识。这个问题在 AI 时代忽然变得非常实际:
- 从海量文本里学到的——这些文本是别人写的。所以模型的知识本质上是证言,不是第一手经验。
- 它没有验证过任何一条知识的真伪。它学的是「人们在什么语境下会这样写」,不是「这件事是不是真的」。
- 所以它的默认姿态是「像真的一样说」——因为训练目标奖励的是「像人类文本」,而不是「符合事实」。
这一点是理解幻觉的关键前提(第 3 章会展开)。只要模型的知识来自证言而非验证,它就不可能天然具备「说真话」的倾向—— 「说真话」必须被额外训练出来,而且永远无法完全成功,因为它没有验证机制可以依赖。
2.4确定性是如何失去的
十七世纪的理性主义者相信,知识的根基可以是绝对确定的。这个信念在接下来的两百年里被逐步拆掉了。 了解这个过程对你有实际价值,因为它解释了为什么现代 AI 的评估方式长成现在这样。
2.5【工程锚点】概率是信念的度量,不是世界的属性
这个区分极其重要,而且大多数工程师在直觉上搞错了。
解读 A:概率是世界的属性(频率主义)
「这枚硬币正面朝上的概率是 0.5」意思是:如果无限次抛掷,正面的频率会趋近 0.5。
这是物理事实,与谁在观察无关。适合可重复实验的场景。
解读 B:概率是信念的度量(主观贝叶斯)
「这件事发生的概率是 0.7」意思是:我对此的信念程度是 0.7—— 这反映了我掌握的信息和我的推理,换个人可能给 0.5。
这是拉姆齐(1926)和德菲内蒂发展出的立场。适合不可重复的场景。
为什么这个区分对你重要?因为模型输出的「置信度」几乎总属于解读 B,而很多团队把它当解读 A 使用。
拉姆齐的判据:怎么测出一个人真实的信念度
哲学家弗兰克·拉姆齐给了一个非常实用的操作定义,它恰好是现代评估方法的原型:
要确定一个人的信念程度,就看他愿意在什么赔率下押注。
—— 拉姆齐 1926《真理与概率》的核心思路(大意)这个判据的精妙之处在于:它用行为(下注)替代了自我报告。 一个人嘴上说「我有 99% 把握」,但当被要求押上一个月工资时改口说「其实不太确定」——真实的信念度由后者暴露。
2.6【工程锚点】校准:模型说「有 90% 把握」是什么意思
校准(calibration)是把「主观信念度」和「客观正确率」对齐的问题。这个概念在哲学里是信念度理论,在工程里有一个非常直接的检验方法。
校准的定义与检验方法
注意这里说的是分组,不是说每一个预测。单个预测无所谓校准; 校准是统计性质——这就是为什么必须分桶检查。
具体做法(你可以今天就在自己的项目上跑):
- 收集一批带置信度的预测。让模型对每个问题同时输出答案和一个 0–100 的把握度, 或者读取它的 logprobs 换算成概率。至少 200 条,否则分桶后每组样本太少。
- 按置信度分成 10 桶(0–10%、10–20%……90–100%)。
- 算每桶的实际正确率。得到「平均声称把握度 vs 实际正确率」的对照。
- 画出来看偏差方向。如果 90–100% 这桶的实际正确率只有 60%,说明模型系统性过度自信。
- 拟合一个校正映射。把原始置信度通过一个单调函数(如保序回归 / Platt scaling)映射到校准后的值。
| 置信度桶 | 模型声称 | 实际正确率 | 诊断 |
|---|---|---|---|
| 90–100% | 95% | 62% | 🔴 严重过度自信 —— 高置信区不可信 |
| 70–90% | 80% | 71% | 🟠 偏乐观 |
| 50–70% | 60% | 58% | 🟢 基本校准 |
| 30–50% | 40% | 45% | 🟢 基本校准 |
| 10–30% | 20% | 33% | 🔵 略保守 —— 低置信区实际比它自己想的准 |
上图是一个非常典型的形状:两端偏差、中间尚可。 也就是模型在「很自信」和「很没底」时都不可信,在「中等把握」时反而比较准。
三类置信度来源,可靠性依次递减
| 来源 | 可靠性 | 说明 |
|---|---|---|
| 多次采样一致性 行为证据 |
✅ 高 | 同一问题采样 N 次(温度调高),看答案的分布。一致 → 大概率稳定;分歧大 → 大概率不可靠。 它不依赖模型的自我报告,因此不会因为提示词措辞而整体漂移。代价是 N 倍推理成本。 |
| Token 概率(logprobs) 内部信号 |
🟡 中 | 能反映模型「下一个 token 有多确定」,但序列级概率与答案正确性之间没有稳定关系—— 一句自信的错话,逐 token 概率可能都很高。且不是所有 API 都开放。 |
| 模型的自我报告 语言输出 |
🔴 低 | 「我认为这个答案的把握度是 90%」——这是生成的文本,不是读出的内部状态。 它受过训练、也受提示词影响。可用作排序信号,不可直接作阈值。 |
2.7【工程锚点】什么时候该说「我不知道」
在认识论里,这涉及「可废止性」(defeasibility):一个信念即使有辩护,也可能被新证据推翻。 一个理性的认知者会保留「我可能错」的空间。把这个要求工程化,就是弃权(abstention)机制。
三种「不知道」,处理方式完全不同
| 类型 | 特征 | 正确处理 |
|---|---|---|
| ① 能力外 | 问题超出系统设计范围(比如问笔记工具「今天股市怎么样」) | 明确拒答 + 说明边界。不要用通用知识硬答——那会让用户误判你的能力范围。 |
| ② 信息不足 | 在范围内,但现有资料里没有相关信息(RAG 检索为空或低分) | 说清缺什么:「我手头的资料里没有关于 X 的内容」,而不是笼统说「我不知道」。 后者让用户无法判断该补充什么。 |
| ③ 存在分歧 | 资料里有多种说法(真实世界中广泛存在,尤其人文社科) | 呈现分歧而非裁决:列出不同说法及其来源。 这一点极其重要——模型擅自裁决争议问题,是在伪造权威。 |
这看起来保守安全,实际上损害体验和信任:用户无法从中获得任何行动指引。 他不知道该换个问法、还是该补充资料、还是这个问题本来就没有答案。
对比一下——「我手头的课程资料里没有涉及 2025 年之后的研究,你可以补充相关文献,或者问我 2024 年之前的部分」 ——这句话同样是在说「我不知道」,但它给了用户一个可执行的下一步。
怎么在评估里正确对待拒答
这是本章最有实操价值的一节。用一个具体例子说明。
正确做法是把评估拆成两个正交的指标:
| 指标 | 定义 | 作用 |
|---|---|---|
| 作答准确率 | 在应该作答的题上答对的比例 | 衡量能力上限 |
| 拒答正确率 | 在应该拒答的题上正确拒答的比例 | 衡量系统是否知道自己不知道 |
| 误拒率 | 在应该作答的题上错误拒答的比例 | 防止系统「用拒答刷分」——这是拒答机制最常见的滥用 |
| 幻觉率 | 在应该拒答的题上编造答案的比例 | 最关键的安全指标,比整体准确率重要得多 |
- 只看准确率 → 模型学会乱猜。
- 只看拒答率 → 模型学会什么都拒答(拒答是最安全的策略,因为它永远不会错)。
- 只看幻觉率 → 模型学会一律拒答。
- 四个一起看,「乱猜」和「一律拒答」两种退化解都会同时被惩罚。
拒答的粒度问题:一个容易被忽略的设计点
「拒答」不是二值的。真实产品里至少有四档,而且选择哪档本身就是个伦理决定:
| 档位 | 行为 | 适用场景 |
|---|---|---|
| 硬拒答 | 直接说明无法回答,不给任何内容 | 高风险领域(医疗剂量、法律条款、财务建议) |
| 带限制的回答 | 给出内容,但明确标注不确定性和依据来源 | 中风险领域(参考资料、技术方案) |
| 降级回答 | 给出更保守的版本(更概括、更少具体数字) | 低风险但需要谨慎的领域 |
| 升级转交 | 转人工 / 提供其他求助渠道 | 涉及人身安全、心理健康等场景 |
这个表应该成为你产品文档的一部分,而且要对每个功能都填一遍。 如果你发现自己无法为某个功能确定该用哪档,这本身就是一个信号—— 说明你还没想清楚「这个功能出错时,谁会受损」。
2.8动手练习
-
做一次校准检查。准备 200 条你领域内的问题(可以混合「有答案」和「无答案」两类)。
让模型对每条输出答案和一个 0–100 的把握度。按 2.6 节的方法分 10 桶,比较声称把握度和实际正确率。
产出:一张表 + 一句话结论("高置信区偏乐观 X 个百分点") - 加一条稳定性指标。从上面 200 条里挑 30 条,每条用较高温度采样 5 次。 统计每个问题的答案一致率。把一致率与「是否答对」做交叉分析—— 你会看到「一致但错」和「不一致但对」这两类,它们的处理方式完全不同。
- 给「不知道」分档。用 2.7 节的三种类型和四档拒答, 给你的项目写一份拒答策略表:哪些功能用哪档、触发条件是什么。
- 检查你的指标在被谁游戏。写下你当前的主指标,然后问: 「一个不诚实的系统会怎么刷高这个分数?」如果答案很轻松, 你的指标设计有问题,需要配对指标来制衡。
2.9自测题
Q1. 模型的答案是对的,但推理链中间一步是编造的。用 JTB 框架分析,这属于什么问题?
这是葛梯尔式的失败:结论为真(Truth 满足)、模型给出了看起来合理的依据(表面上满足 Justification), 但真正的辩护链是断的——那一步编造使得「得到辩护」这个条件实际不成立。
工程上的意义:这类错误无法通过「只看最终答案」的评测发现。必须增加「依据可追溯性」检查。 而且这类错误比直接答错更危险,因为它伴随着看似可靠的推理过程,更容易说服用户。
Q2. 为什么说「模型输出 95% 置信度」不能直接当阈值使用?
因为它是主观信念度的语言表达,不是对世界的测量。作为一段生成的文本,它会受提示词措辞、上下文、训练偏好系统性影响—— 换一种问法可能整体偏高或偏低十几个百分点。
正确用法:把它当排序信号(用来比较两个答案哪个更可信), 经过基于数据的重新校准之后,才可以当阈值使用。
Q3. 团队只用一个「准确率」指标评估系统,会出什么问题?
它会奖励撒谎。在「本应拒答」的题上,编造答案有一定概率碰巧答对, 而诚实拒答必定不得分。所以优化这个指标会把系统推向「从不拒答」。
解法是至少配三个指标:作答准确率、拒答正确率、幻觉率。 它们互相牵制——任何两个指标的优化都会恶化第三个,因此系统无法通过退化解(乱猜 / 一律拒答)刷分。
Q4. 康德的「先天结构」和 Transformer 的架构有什么可比之处?
康德的论点是:经验必须被某种先在的结构组织才能成为知识,而这个结构不来自经验本身。
Transformer 的注意力机制、位置编码、归纳偏置同样不来自训练数据—— 它们是在训练开始前就固定下来的「认知格式」,决定了哪些规律可以被学到、哪些几乎不可能。 所以「换个架构」不是简单的性能调整,而是换了一套先验,会系统性地改变能力边界。
这解释了一个常见现象:某些能力加再多数据也学不会——不是数据不够,是当前架构的表征方式无法承载它。
Q5.【动手题】你的产品加了「使用时长提醒」(连续使用 60 分钟弹提示)。 用户反馈「很烦」,想把阈值提到 120 分钟。你怎么判断该不该改?
先拆成可测和不可测两部分。
可测部分:提醒的实际点击率、提醒后 24 小时内是否回流、抱怨用户占活跃用户的比例、 阈值 60 与 120 的 A/B 数据。这些能做实验。
不可测部分:这个提醒是为了谁的利益?这决定了整个判断的方向:
- 如果它服务于用户福祉(防止过度依赖),那么「烦」是设计上可接受的代价—— 用户反馈不应该直接决定它去留,就像戒烟提示也不受欢迎。
- 如果它服务于合规免责(我们提示过了,责任不在我们),那它就是形式主义—— 应该重新设计成真正有效的形式,而不是降低频率。
- 如果它服务于产品数据(避免单次时长过长导致的次日留存下降), 那阈值就该由留存数据决定,用户抱怨只是其中一个输入。
关键动作:把这三个目的明确写下来,选一个作为主目的,并承认放弃另外两个。 如果不做这个选择,「阈值该定多少」会变成无休止的立场争论—— 因为不同人心里想的是不同的目的,而会议上讨论的却是同一个数字。
- 能解释 JTB 三条件,并说明葛梯尔反例为什么构成挑战。
- 完成一次真实的置信度校准检查,能说出你的模型在哪个区间偏差最大。
- 能说清三种「不知道」的区别,并为你的项目写出四档拒答策略表。
- 能指出你的主指标「会被什么样的退化解刷分」,并给出配对的制衡指标。
- 理解校准是统计性质——单个预测无所谓校准,分桶才有意义。