示例放进上下文,就变成了"可变数据"
提示词里的示例(few-shot ✔)本意是"教格式" ✔,但它同时会被模型当成**可用素材** ✗:
如果示例里写了"北京 25℃" ✔,用户问上海天气时,模型有可能把示例里的数字搬出来 ✔ ——
这就是**示例污染** ✔。
**根因**:示例与真实数据在上下文里**长得一样** ✗ —— 模型无法区分"这是示例"与"这是本次数据" ✔。
一、四个防护手段
1. **显式标记** ✔:示例放在专门的区域并加标记(例如包在 `<examples>` 里 ✔),
并在指令里写明"示例仅用于说明格式,**不得引用其内容**" ✔;
2. **示例内容中立** ✔:用无意义的占位值(`<城市A> 25℃` ✔)而不是真实城市 ✔;
若必须用真实的,选一个**与本次任务无关**的领域 ✔;
3. **示例放前面、数据放后面** ✔(顺序也能减少混用 ✔ —— 与"稳定在前"的前缀缓存原则一致 ✔);
4. **后处理校验** ✔:检查答案里是否出现了"只在示例中出现过"的实体或数字 ✔ → 命中就报警或重跑 ✔。
第 4 条最关键 ✗:它是**可自动检查**的 ✔(把示例里的数字/专名做成黑名单 ✔)。
二、什么情况下最容易污染
三、与"该拒答"的关系
污染常常**伪装成成功** ✗:答案格式漂亮、数字具体 ✔,但数字来自示例 ✔。
所以评测里要专门加一类样本 ✔:**输入信息不足** ✔ → 期望"明确说不知道" ✔
(见拒答与澄清那篇 ✔)。
四、怎么验证
```
① 造 10 个"输入不足"的样本 → 看是否编造(应拒答 ✔)
② 检查答案中是否出现示例独有值(自动 ✔)
③ 对照组:把示例去掉再跑同一批 → 若答案反而更准,说明示例在污染 ✔
```
一条判据
> 把示例里的**所有具体值**列成黑名单 ✔,跑一遍评测 ✔ —— 答案里出现了几个 ✔?
> 出现 ≥1 个,就说明示例没有被当成"只能看不能抄"的东西 ✗。