换个说法 AI 就不会了?用泰勒展开揭开 LLM 提示词敏感性的数学真相
> 论文:*Understanding the Prompt Sensitivity* (ACL 2026) | 京都大学
> 作者:Yang Liu, Chenhui Chu
> 论文:arxiv.org/abs/2604.18389 | 代码:GitHub
---
一个让所有 AI 用户都头疼过的场景
想象你在用 ChatGPT 准备一场关于量子纠缠的演讲。你先问了一句:"请解释一下量子纠缠。"它给了你一个精彩绝伦的回答。你很满意,于是换了个说法:"能给我讲讲量子纠缠是怎么回事?"——意思完全一样,只是换了个表达方式。
结果呢?它给出了一个完全不同、甚至互相矛盾的回答。
你愣住了。这不合理啊——意思明明一样,为什么换个说法就不行了?
这不是你的错觉。这个现象在学术界有个名字:提示词敏感性(Prompt Sensitivity)。它指的是大语言模型(LLM)对输入提示词的精确措辞过度敏感,即使语义完全相同,微小的措辞变化也可能导致截然不同的输出。
过去几年,研究者们一直在测量这个现象——设计了各种指标来量化模型有多"敏感"。但一个根本性的问题始终悬而未决:为什么? 为什么 LLM 会对语义相同的提示词产生不同的反应?
京都大学的 Yang Liu 和 Chenhui Chu 在这篇 ACL 2026 的论文中,用了一个你可能没想到的工具来回答这个问题——泰勒展开。没错,就是你在微积分课上学的那个泰勒展开。
从一个类比开始:为什么 ResNet 能认出"同一类"的图片?
在理解 LLM 之前,让我们先看一个更直观的例子:图像分类。
假设你训练了一个 ResNet-101 来识别 CIFAR-10 数据集中的 10 类图片(猫、狗、汽车、飞机……)。当 ResNet 处理一张猫的图片时,图片会经过一系列网络层,每一层都会把图片转换成一个"特征向量"——一串数字,代表图片的某种抽象表示。
论文作者做了一个非常巧妙的实验:他们追踪了同一类图片在不同网络层中的特征向量距离。结果发现了一个清晰的模式:
- 在网络的早期层(Stage 1),同一类图片的特征向量散得很开
- 随着层数加深(Stage 2 → Stage 3),同类图片的特征向量逐渐聚拢
- 到 Stage 3 时,聚类效果最好,分类准确率也最高
这就像一个经验丰富的鉴定师:一开始他看到的是各种细节(毛色、姿态、光线),但随着观察深入,他开始抓住本质——"这是一只猫"。不同猫的图片在他的"心理空间"中越来越近。
用数学语言说,这叫类内紧凑性(Intra-class Compactness)。分类网络通过让同类样本在特征空间中越来越近,来实现准确的分类。
关键洞察: 分类网络之所以能工作,是因为它学会了"聚类"——把语义相同的东西在内部表示中拉到一起。
LLM:一个不会"聚类"的函数
现在回到 LLM。论文的核心思路是:把 LLM 看成一个多元连续函数。
具体来说,当你输入一个提示词时,LLM 会:
1. 把每个 token 映射成一个高维嵌入向量
2. 通过一层又一层的 Transformer 块逐步处理
3. 在最后一层,用最后一个位置的隐藏状态来预测下一个 token
如果我们把隐藏状态 h 看作函数的输入,下一个 token 的对数概率 log π(y_t | h) 看作函数的输出,那么 LLM 就是一个从 ℝ^D 到 ℝ 的函数。
现在,关键问题来了:当我们有两个语义相同的提示词 p_0 和 p_1,它们经过 LLM 后得到的隐藏状态 h_0 和 h_1,在特征空间中是聚在一起了,还是散开了?
论文的实验结果令人震惊:
> LLM 没有表现出任何聚类行为。 相反,两个语义相同的提示词的隐藏状态距离 ‖Δh‖ 从网络早期层的接近 0,逐渐增长到约 70。
这意味着什么?还记得 ResNet 吗?ResNet 会让同类样本越来越近。但 LLM 恰恰相反——它让语义相同的输入越来越远。
泰勒展开登场:把"为什么"变成数学
论文的精妙之处在于用泰勒展开建立了隐藏状态差异和输出差异之间的数学联系。
对于两个语义相同的提示词,它们产生的下一个 token 对数概率之差可以用一阶泰勒展开近似:
Δ log π(y_t | h) ≈ ∇_h log π(y_t | h_0)^T · Δh
这个公式的直觉是:输出概率的变化量 ≈ 梯度 × 隐藏状态的变化量。
就像你在山坡上走路——你在某个位置的坡度(梯度)乘以你走的距离(Δh),就近似等于你高度的变化量(Δ log π)。
然后,利用柯西-施瓦茨不等式,我们可以得到一个上界:
|Δ log π(y_t | h)| ≤ ‖∇_h log π(y_t | h_0)‖ · ‖Δh‖
这个不等式告诉我们:输出概率差异的最大可能值 = 梯度的范数 × 隐藏状态差异的范数。
罪魁祸首找到了:‖Δh‖ 的"失控增长"
现在一切都说得通了。让我们把所有线索串起来:
1. 梯度 ‖∇_h log π‖ 在网络早期层较高,后期层较低(这是正常的)
2. 隐藏状态差异 ‖Δh‖ 从接近 0 逐渐增长到约 70(这是问题所在!)
3. 上界 = 梯度 × ‖Δh‖,由于 ‖Δh‖ 不断增长,上界也不断增大
4. 上界太大 → 无法约束 |Δ log π| 趋近于 0 → 两个语义相同的提示词产生了不同的输出概率
用那个山坡的类比:即使坡度不大,但如果你走的距离越来越远(‖Δh‖ 从 0 增长到 70),你最终的高度变化也会非常大。
这就是提示词敏感性的根本原因:LLM 在逐层处理过程中,把语义相同的输入推得越来越远,导致输出概率的上界过高,无法保证一致性。
哪种"换说法"最容易翻车?
知道了原因,下一个自然的问题是:什么样的措辞变化最容易引发提示词敏感性?
论文设计了 7 种修改类型来系统测试:
| 修改类型 | 描述 | 风险等级 |
|---|
| 前半部分替换 | 替换提示模板前半部分的一个 token | 中等 |
| 后半部分替换 | 替换提示模板后半部分的一个 token | 中等 |
| 少量 token 错位 | 轻微改变 token 顺序 | 较低 |
| 大量 token 错位 | 显著改变 token 顺序 | 高 |
| 拼写错误 | 键盘级别的拼写错误 | 最高 |
| 排版错误 | 多余空格、大小写混乱等 | 中等 |
| 同义改写 | 用同义词替换部分词汇 | 最低 |
几个有趣的发现:
1. 拼写错误最危险。 这可能出乎很多人的意料。原因是拼写错误会严重干扰子词分词(subword tokenization)。比如 "quantum" 被拼成 "quntum",分词器可能把它切成完全不同的 token,导致隐藏状态产生巨大偏移。
2. 同义改写最安全。 因为同义词替换通常只影响少量 token,而且语义保持度高。
3. 模型越大,对前半部分的修改越敏感。 小模型(如 Pythia-1B)对后半部分的修改更敏感,但大模型(如 Qwen1.5-4B)反而对前半部分更敏感。这可能与大模型更依赖上下文开头的信息有关。
4. Token 错位比同义替换更危险。 改变 token 顺序比替换 token 内容更容易引发敏感性,因为 Transformer 的位置编码对顺序非常敏感。
一个反直觉的发现:模板比问题更重要
论文的第 4 个研究问题(RQ4)揭示了一个让人意外的结论:
> 在大多数 LLM 中,提示词模板(prompt template)对输出 logit 的贡献率显著超过了问题本身(question)。
换句话说,"请回答以下问题"这种模板措辞,比"什么是量子纠缠?"这个问题本身,对模型输出的影响更大。
研究者用方差分析(ANOVA)分解了 logit 的总方差,发现除了 GPT2-small 和 GPT2-medium 之外,所有模型中模板的贡献率都超过了问题。
这就像你去餐厅点菜——你点的菜(问题)反而不如服务员问你的方式(模板)重要。这显然不是我们期望的行为。
这个发现对提示词工程有重要启示:与其花大量时间优化问题的表述,不如先确保你用的提示模板是经过验证的。
工程洞察:如果你是 LLM 开发者
这篇论文对 LLM 的设计和训练都有实际指导意义:
1. 训练时引入"语义不变性"损失:可以在训练目标中加入一个正则项,惩罚语义相同但表述不同的输入在隐藏空间中的距离。让模型学会"忽略"表述差异。
2. 激活引导(Activation Steering):论文在附录中验证了一个方法——在特定层直接强制 ‖Δh‖ = 0,可以显著降低提示词敏感性。这为推理时的干预提供了思路。
3. 提示词设计原则:
- 避免拼写错误(影响最大)
- 选择稳定的提示模板比优化问题措辞更重要
- 对于大模型,特别注意模板前半部分的措辞
4.
评估模型时:不要只看平均准确率,还要看在不同提示模板下的方差。一个"平均 80 分但方差极大"的模型,可能不如"平均 75 分但方差极小"的模型可靠。
开源了,你可以自己玩
论文的代码完全开源,仓库结构清晰:
Understanding_the_Prompt_Sensitivity/
├── code/
│ ├── experimental_verifications/
│ │ ├── why_prompt_sensitivity.py # 核心实验:验证 RQ1
│ │ ├── misalignment.py # RQ2:错位分析
│ │ ├── factor.py # RQ4:模板 vs 问题贡献率
│ │ └── other_token_answer.py # 扩展分析
│ └── cifar10_example/
│ └── train.py # ResNet 聚类实验
├── input/ # 数据集和提示模板
├── plot/ # Jupyter notebooks 画图
└── results/ # 实验结果
核心代码 why_prompt_sensitivity.py 的实现很直观:
- 加载模型和数据
- 对每个问题,用 12 种提示模板分别计算梯度、隐藏状态、对数概率
- 计算任意两个模板之间的 Δ log π、‖Δh‖、梯度和上界
- 保存结果供后续分析
技术栈:PyTorch + Transformers,支持 Qwen、Llama、Pythia、GPT2 等多个模型系列。
我的思考
这篇论文最打动我的地方,是它用最基础的数学工具——泰勒展开——回答了一个困扰整个领域的问题。
很多时候,我们在面对复杂的 AI 系统时,习惯于用"试错法":换这个试试、改那个看看。但这篇论文提醒我们,回到第一性原理,用数学语言精确描述问题,往往能带来最深刻的洞察。
泰勒展开告诉我们:一个函数在某点的行为,由它的梯度和输入变化量共同决定。LLM 的问题不在于梯度太大(实际上梯度在后期层很小),而在于它没有学会让语义相同的输入在内部表示中保持接近。
这让我想到一个更深层的问题:LLM 真的"理解"了语义吗? 如果它理解了,为什么"请解释量子纠缠"和"给我讲讲量子纠缠"在它的内部表示中会越走越远?
也许答案是这样的:LLM 学会的是统计关联,而不是语义理解。它知道"请解释"后面通常跟着什么样的回答,"给我讲讲"后面通常跟着什么样的回答——但它并没有在内部建立一个统一的"量子纠缠"概念。
从这个角度看,提示词敏感性不仅是一个工程问题,更是理解 LLM 真正能力边界的一扇窗口。
---
论文 | arxiv.org/abs/2604.18389
代码 | github.com/ku-nlp/Understanding_the_Prompt_Sensitivity