CH 06语言与意义:从维特根斯坦到词向量
这一章会解释一个你可能从没想过要解释的现象:为什么「向量相似」能代表「意思相近」,以及它什么时候会骗你。 更重要的是,它会给你一个关于提示词的哲学解释——为什么给小样本示例比写一段规则描述更有效。 答案来自维特根斯坦的「意义即用法」。这不是牵强的类比, 它解释了你在提示词工程里观察到的几乎每一个反常现象。
6.1指称论:名字如何指向东西
最朴素的意义理论是:一个词的意义就是它所指的东西。「苹果」的意义就是苹果这个东西。
这个理论直观上很有吸引力,但它很快撞上几个反例——而这些反例恰恰预告了今天在向量检索里遇到的问题。
| 反例 | 问题 | 今天的对应现象 |
|---|---|---|
| 没有指称的词 | 「独角兽」「福尔摩斯」不指向任何实际存在的东西,但我们显然理解它们的意思 | 模型能处理虚构实体,检索时也会匹配到虚构内容—— 向量空间里它们与其他词有正常的位置关系 |
| 指称相同但意义不同 | 「晨星」和「暮星」都指金星,但古人并不知道它们是同一颗。 「晨星是暮星」这句话有信息量,而「晨星是晨星」没有 | 同义不同词:向量检索会把它们判为相似(正确), 但如果你需要区分「用户说的是早上看到的还是晚上看到的」,它就无法区分 |
| 一词多指 | 「银行」在「河岸」和「金融机构」两个意义上指不同的东西 | 多义词问题:静态词向量会把两个义项混在一个向量里, 导致「这条河的银行」和「银行的利率」在空间里靠得过近 |
第三行是你在 RAG 里会实际遇到的。静态词向量对多义词的处理是把所有义项平均—— 这恰好是它的一个结构性弱点。上下文相关的表征(如 Transformer 的中间层)能缓解这个问题, 但不会消除它,因为「哪个义项」往往依赖世界知识和语境,而这两者都有覆盖不到的情况。
6.2弗雷格的涵义与指称
1892 年,弗雷格用一个区分解决了「晨星/暮星」问题。这个区分是语言哲学里最重要的工具之一。
| 概念 | 德文 | 含义 | 例子 |
|---|---|---|---|
| 指称 | Bedeutung | 词指向的对象 | 「晨星」和「暮星」的指称相同 —— 都是金星 |
| 涵义 | Sinn | 对象被呈现的方式(mode of presentation) | 「早晨出现在东方的那颗星」vs「傍晚出现在西方的那颗星」—— 涵义不同,所以两句话信息量不同 |
涵义是介于对象和符号之间的东西:同一个对象可以被不同的方式给出,而这些方式本身是有意义的。
—— 弗雷格《论涵义与指称》(1892)的核心思路但反过来:用户问「合同里的违约金怎么算」,文档里两处都提到「违约金」, 一处是甲方的、一处是乙方的。指称相似、涵义完全不同—— 这是向量检索会失败的地方。因为「哪一方的」这个信息不在词本身的相似度里。
把这两类分开统计,你会知道该往哪个方向优化。大部分团队把它们混在一起,于是优化方向不明。
6.3维特根斯坦前期:图像论
维特根斯坦是这个领域最特殊的哲学家——他提出了两套完全对立的理论, 而且后一套是对前一套的自我否定。了解这个转折,对你有直接价值, 因为它跟 AI 的两条路线之争是同一个结构。
《逻辑哲学论》(1921):语言是世界的图像
命题是实在的图像。命题与它所描述的事实共享逻辑形式。
—— 前期维特根斯坦的核心主张(大意)他的想法是:语言能描述世界,是因为语言和世界具有相同的逻辑结构。 一个命题里的要素排列方式,对应着世界上的对象的排列方式。 所以「语言如何可能描述世界」这个问题,答案是:因为两者同构。
他还推出一个惊人的结论:凡是不能被这样结构化表达的东西(伦理、美学、生命意义), 都无法被言说——只能被「显示」。这本书最后一句非常有名:
对于不可言说之物,必须保持沉默。
—— 《逻辑哲学论》第 7 节这条思路今天仍在:知识图谱、形式化验证、结构化输出校验。 它的力量在需要精确性的场合;它的弱点是覆盖不了那些「没法被清晰结构化」的知识—— 而后者恰恰是人类知识的大部分。
6.4维特根斯坦后期:意义即用法
1953 年出版的《哲学研究》(遗著)里,维特根斯坦推翻了自己前期的立场。 这个转折是本节核心。
不要问一个词意指什么,要问它怎么被使用。 一个词的意义,就是它在语言中的用法。
—— 《哲学研究》的核心主张(大意,§43 附近)语言游戏
他提出「语言游戏」这个概念:语言不是一套固定的「词—对象」映射, 而是嵌在具体活动中的、有规则但规则不明确的一系列实践。
他举了个著名的例子:一块石板、工人喊「石板!」—— 这个词在这个场景里是命令,不是描述,也不是命名。 换一个场景(建筑师在讨论材料清单),同一个词的功能完全不同。
你会下棋,但你说不出完整体现棋类规则的那个规则集(包括所有关于「怎样算认真下棋」的默契)。 你遵守规则,但规则不是你脑子里的一个明确清单。
这一点延伸出一个著名难题:遵守规则的悖论—— 没有任何一种行动方式不能被称为「符合规则」,如果允许对规则做足够灵活的解释的话。 那是什么决定了我们该这样而不是那样用词?维特根斯坦的答案是共同体的实践, 不是个人的内在规则。
这在方法论上与「意义即用法」高度一致:不是先给定义再学用法, 而是从用法中归纳出意义。 这解释了为什么统计学习能处理大量词汇语义——它抓住了用法的规律性。
同时也解释了它的弱点:它只能学到被写下来的用法。 没有被文字化的用法(默契、语境、身体经验)它学不到。
6.5家族相似性:概念没有本质
维特根斯坦还提出了一个对 AI 分类任务很有启发性的看法:很多概念没有共同的本质。
棋类、牌类、球类、奥林匹克、儿童拍手游戏、单人纸牌……它们有什么共同点?
如果你去找一个所有游戏都具备、且只有游戏具备的特征,你会发现找不到: 有些有输赢,有些没有;有些有竞争,有些没有;有些有规则,有些很随意; 有些是娱乐,有些是职业。
但它们之间像家族成员一样相互相似——两个人可能都不像第三个, 但都能通过一串中间相似关系连起来。
维特根斯坦的结论:这个概念是由相似性的网络构成的,它没有「本质」。 你不需要先给出一个完备的定义才能正确使用这个词。
这个对应关系非常深:维特根斯坦说概念由相似性网络构成, 而向量空间正是这种网络的一个可实现形式。这也是为什么向量检索在「模糊的、没有清晰边界的」 语义任务上表现很好。
但它同时揭示了弱点:当一个任务需要清晰边界时 (比如「哪些文件属于必须留存的合规材料」),相似性网络给不出硬判定—— 你需要额外的规则层。
6.6蒯因与翻译的不确定性
1960 年,蒯因在《语词与对象》里提出了一个思想实验,它对「语义等价」这个概念本身提出了挑战。
你作为语言学家来到一个完全陌生的部落。一只兔子跑过,当地人指着它说「gavagai」。
「gavagai」是什么意思?最自然的猜测是「兔子」。但同样一致的解释还有:
- 「兔子」
- 「兔子的某个部分」(比如兔子的耳朵)
- 「兔子的出现」(一个事件,不是物体)
- 「兔性」(一个抽象性质,像「红色」那样)
- 「未经分离的兔子部分的总和」
蒯因的论点:无论你收集多少观察,这些假设都与证据完全一致—— 因为你可以相应调整其它词的解释来保持整个系统自洽。 所以「指称」(reference)是在观察上不可确定的。
它的两个后果
| 后果 | 内容 | 对 AI 的意义 |
|---|---|---|
| 指称的不可测性 | 你无法从行为中唯一确定一个词指的是什么 | 「模型内部的符号指向什么」在原则上无法从行为判定—— 这为第 5 章的争论提供了另一个视角 |
| 整体论 | 信念不是逐个面对检验的,而是作为一个整体面对经验。 任何单个信念都可以通过调整其他信念而保住 (这个观点常被称为迪昂-蒯因论题) | 这解释了为什么「失败复盘」常常无法定位原因—— 一个方案失败时,你总能调整其它解释(数据、参数、实现细节)来保住主假设。 这是第 3 章波普尔讨论里提到的那个问题的更深根源 |
当你做 A/B 测试或消融实验时,「改了 X,效果变了」这个结论是不牢靠的—— 因为效果变化可能来自 X 与其它变量的交互,而不只是 X 本身。 整体论说的是:假设不是单独被检验的。
应对方式:做消融而不是只做增量。不要只测「加了 X 之后怎样」, 也要测「拿掉 X 之后怎样」;而且要在不同的其它配置下重复测一次。 如果结论在不同配置下不稳定,说明你抓到的不是 X 的独立效果。
6.7【工程锚点】词向量与分布假设
现在把上面所有东西落到最重要的一个工程点上。为什么「向量相似」能代表「意思相近」?
词语的意义由它的上下文决定。你可以通过一个词与谁相伴出现来认识它的意义。
—— 分布假设。Harris(1954)系统阐述;Firth 的这句表述流传最广这个假设在哲学上恰好就是「意义即用法」的可计算版本: 用法 = 上下文分布。所以词向量不是工程师的临时发明,它是一个哲学立场的数学实现。
| 对照 | 维特根斯坦(1953) | 词向量(现代) |
|---|---|---|
| 意义来自 | 用法 | 上下文分布 |
| 表示方式 | 相似性网络,无清晰边界 | 高维空间中的位置与距离 |
| 能否给定义 | 不能,也不需要 | 不能,也不试图 |
| 边界情况 | 边缘案例由共同体实践决定 | 由距离阈值决定(这里就出问题了) |
用一个数字去切一个本来没有清晰边界的东西,必然会在某些地方出错—— 而错在哪里,取决于你的数据分布,不能靠理论预判,只能靠观察失败案例。 这解释了为什么检索阈值几乎总是需要按场景分别调,没有一个通用值。
分布相似的四种失效模式
下面是你在 RAG 里实际会遇到的(建议按这四类整理你的失败案例):
| 模式 | 例子 | 对策 |
|---|---|---|
| ① 语义对立 | 「这个方案可行」和「这个方案不可行」—— 只差一个否定词,向量相似度极高,但意思相反 | 否定词敏感的处理;把否定信息作为额外特征; 关键是别用相似度做「是否支持」的判断 |
| ② 多义混淆 | 「撤销订单」和「撤销权限」——动作相同、领域不同, 检索时容易跨领域串味 | 元数据过滤(按领域/模块分区)、分库检索 |
| ③ 领域术语 | 通用模型不认识你们内部的缩写、代号、历史项目名 | 同义词表/business glossary;对这些词做额外映射;考虑领域微调 |
| ④ 数量与否定细节 | 「满三年 10 天」和「满五年 10 天」——差别只在一个数字, 但这类细节往往是用户最关心的 | 向量检索对数字极不敏感。 对含数字、日期、金额的查询,加规则检索或结构化过滤作为补充 |
根本原因:向量空间编码的是「语义」,而数字的具体值在语义上的差异很小—— 「三年」和「五年」在语义上都是「一段时间」。但对用户来说, 这正是他问的那个唯一重要的东西。
通用教训:向量检索擅长「大致是这类话题」,不擅长「精确的数值约束」。 凡是涉及数字、日期、版本号、代码标识符的查询,都需要额外的精确匹配通道。
6.8【工程锚点】提示词工程的哲学读法
这一节是本章最有实操价值的部分。它能解释你在提示词调试中反复遇到的那些「不讲道理」的现象。
核心洞察:你在教一个「语言游戏」,不是在写规格说明
如果你把提示词当成写给程序的规格说明(「如果输入是 X,就输出 Y」), 你会持续困惑——因为它不按规格说明的方式工作。
如果你把它当成在建立一个语言游戏(维特根斯坦意义即用法)—— 你在通过示例和语境,告诉模型「在这个场景里,什么样的话是合适的」—— 那么它的行为就变得可预测了。
所以「写清楚规则」经常不如「给三个例子」有效——这不是模型的缺陷,它与语言运作的方式一致。
四个由这个视角解释的现象
| 你观察到的现象 | 用「语言游戏」解释 |
|---|---|
| 换个说法效果差很多 | 你在无意中把提示词放进了不同的「游戏」。 「请总结」和「提取要点」在语料里对应的用法模式不同, 触发的是不同类型的输出。措辞不是包装,措辞就是语义输入本身。 |
| 明确的规则被无视 | 禁忌式的规则(「不要提到 X」)本身就是一种引入 X 的用法—— 你在提示词里建立了一个关于 X 的语境。 更好的做法是示范正确行为,而不是宣告禁止行为。 |
| 角色设定有效 | 「你是一位有 20 年经验的审校编辑」不是在描述一个身份, 而是在指定一个语言游戏——它锚定了大量「这类人会怎么说话、 关注什么、什么话不会说」的隐含约定。这些约定没法被逐条写出, 但可以被一个标签唤起。 |
| 示例顺序会影响结果 | 示例是用法示范,而用法示范的顺序构成了语境。 最后出现的示例往往影响最大(就像对话里的最近上下文)。 这是「语境决定意义」的直接体现。 |
- 示例质量:示例是否覆盖了边界情况?是否前后一致?
- 示例一致性:如果两个示例的处理方式矛盾,模型会学到混乱的用法
- 回归测试:改提示词必须重跑测试集——因为语义是整体性的(见 6.6 的整体论)
- 版本管理:提示词是有语义的代码,必须像代码一样管版本
一句话总结:把提示词当作「有语义的产物」而不是「自然语言写的配置」, 你就会自然地去做回归测试和版本管理——因为语义的改动会有非局部的影响。
一个实用推论:为什么「改一处」经常让别处坏掉
这是提示词维护中最常见、也最令人沮丧的现象。用整体论(6.6)来解释非常清楚:
所以你在末尾加了一句约束,可能改变模型对前面所有内容的理解—— 因为整段提示词构成了一个语境,而语境里的每一部分都参与决定「用法」。
这就是为什么提示词的调试必须配回归测试集: 你无法通过阅读提示词来预测改动的影响,因为影响是整体性的。 唯一可靠的办法是改完跑一遍。
6.9动手练习
-
给检索失败案例分类。收集你项目里 20 个检索失败的案例,按 6.7 节的四种模式归档:
语义对立 / 多义混淆 / 领域术语 / 数值细节。
产出:四类各占多少 + 针对占比最高的那类的改进方案 -
做一个「示例 vs 规则」对照实验。选一个你现在的提示词任务,写两个版本:
① 用文字详细描述规则 ② 给 3 个输入输出示例(不给规则)。
在同一个测试集上比较。
这个实验会让你直观理解「意义即用法」:大多数情况下示例版会更好 -
做一个否定词的极端测试。取 20 对「意思相反但用词高度相似」的句子
(「支持 X」/「不支持 X」、「需要审批」/「无需审批」),
看你的检索和模型能否可靠区分。
如果区分率低,说明你的系统在否定/极性上不可靠,这在合规、安全类场景是硬伤 -
给提示词建版本和回归集。把当前提示词固定为一个版本号,
建一个 20–30 条的代表性测试集(含边界案例),改提示词必须重跑。
这是把「提示词是语义产物」这个认识落地的最直接方式 - 检查数值类查询。列出你系统里所有「用户会问具体数字」的场景 (天数、金额、比例、版本号、期限),检查它们是否有精确匹配通道, 还是完全依赖向量检索。
6.10自测题
Q1. 弗雷格的「涵义」和「指称」怎么区分?它在检索里对应什么问题?
指称是词指向的对象;涵义是对象被呈现的方式。 「晨星」和「暮星」指称相同(金星)但涵义不同,所以「晨星是暮星」有信息量。
检索里的两个对应问题:
- 同指不同说法(用户说「降低延迟」,文档写「优化响应时间」)—— 向量检索的强项,可以解决。
- 说法相似但所指不同(甲方违约金 vs 乙方违约金)—— 向量检索的弱项,因为「属于哪一方」不在词的相似度里, 需要元数据或结构约束。
Q2. 「意义即用法」为什么能解释 LLM 的工作方式?
因为语言模型的训练完全不依赖词典定义——它只看词在真实文本中如何被使用, 用上下文分布来刻画意义。这正是「意义即用法」的可计算实现: 用法 ≈ 上下文分布。
同时这个视角解释了它的弱点:它只能学到被文字化的用法。 那些没有被写下来的默契、语境依赖、身体经验,它学不到。
Q3. 家族相似性对 AI 分类任务有什么启发?
很多概念没有共同本质,而是由交叉重叠的相似性网络构成。 人们不需要完备定义就能正确使用这些词。
启发有两个方向:
- 正面:这解释了为什么向量空间(用距离表达相似性)能很好地处理模糊语义任务—— 它天然是「相似性网络」的实现形式。
- 反面的:当任务需要清晰边界时(合规判定、安全分类、 责任归属),相似性网络给不出硬判定,需要额外的规则层。 试图用一个相似度阈值来做需要硬边界的判定,是常见的架构错误。
Q4. 为什么给示例常常比写规则描述更有效?
因为模型的训练方式是从用法中归纳意义,而不是从定义中推导行为。 你给示例时在给出用法,你写规则时在给出定义。
这与维特根斯坦的论点一致:学一个词的意思,是看它在哪些场合怎么用, 而不是背定义。定义永远不完整,用法才是标准。
实用推论:当提示词效果不佳时,先怀疑「我没说清」不如先怀疑「我没示范」。 加两三个边界情况的示例,往往比再加一段规则说明更有效。
Q5.【动手题】用户反馈「问年假天数,答案经常不对」。你的排查顺序是什么?
第一,判断是不是检索问题——先看检索到的片段里有没有正确的数字。 如果没有,问题在检索层(这是最常见的情况)。
第二,如果检索错了,检查是不是「数值不敏感」(6.7 第四类)。 用「满三年 10 天」的查询去检索,看返回的是不是包含了「满五年」的段落。 这类失败几乎必然出现,因为向量空间对具体数字不敏感。
第三,检查是不是「多段拼合」问题。 制度文档里年假条款常常分散在几处(基本规则、特殊情况、例外), 如果只检索到其中一段,答案就会不完整—— 而模型很可能会补全缺失的部分(这是第 3 章的忠实性幻觉)。
第四,如果检索正确但答案错,检查是不是模型在做补全(忠实性幻觉)。 用第 3 章的方法:把答案拆成句子,逐句检查能否在检索到的材料里找到支持。
最后,针对根因给方案:
- 数值不敏感 → 加规则检索/结构化过滤通道,把含数字的条款单独建索引
- 条款分散 → 把年假相关的所有条款预先聚合成一个完整块,而不是让检索去拼
- 模型补全 → 加「只使用提供材料」的强约束 + 答案引用检查
注意这个排查的特征:每一步都在缩小可能的原因, 而不是直接猜「改个提示词试试」。这种结构性排查比试错快得多。
- 能说清「意义即用法」和「分布假设」的关系——它们其实是同一个主张的哲学版与可计算版。
- 能解释为什么向量检索擅长模糊语义、不擅长精确数值。
- 完成检索失败案例的四类归档,并针对占比最高的一类给出方案。
- 做过一次「示例 vs 规则」对照实验,能说出哪个更有效以及为什么。
- 能解释「为什么改提示词一处会让别处坏掉」——用整体论,而不是用「模型不稳定」。
- 所有涉及数值、日期、标识符的查询,都有精确匹配通道。