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