跳转至

Towards Self-Robust LLMs: Intrinsic Prompt Noise Resistance via CoIPO

会议: ICLR 2026
OpenReview: https://openreview.net/forum?id=TUd3c7Vr1z
代码: https://github.com/vegetable-yx/CoIPO
领域: 对齐RLHF / LLM鲁棒性
关键词: 提示噪声鲁棒性, 逆向DPO, 对比学习, 偏好优化, 互信息

一句话总结

本文提出 CoIPO(对比学习 + 逆向 DPO),让 LLM 在脏提示(拼写错误、词替换、句式扰动)下输出与干净提示尽量一致,不依赖任何外部预处理工具就把内禀鲁棒性练进模型,在自建的 NoisyPromptBench 上比当前 SOTA(CoIN)平均准确率高 3.64%。

研究背景与动机

领域现状:LLM 对提示极其敏感,尤其在数学解题、代码生成、JSON/XML 严格格式输出这类"开放度受限"的场景下,提示里一点点扰动就能让效果断崖式下跌(图 1 显示 Llama2-7B 在 TextFolder 扰动下从 55.10% 掉到 37.66%,跌了 17.44%)。而真实用户的提示几乎从不"完美"——拼错单词("clasify" 写成 "classify")、用词偏差(医疗任务里把 "diagnosis" 说成 "investigation")、加无关内容(在数学题后面附一句"有趣的是猫一生大部分时间在睡觉")都会拖垮回答质量。

现有痛点:以往工作主要走"提示预处理与修复"路线——上语法检查器、术语归一化系统,或者再叫一个 LLM 来重写提示。这类外挂方案有三个硬伤:① 额外的计算开销、金钱成本和部署复杂度;② 多级流水线会级联放大误差,让最终输出偏离用户原意;③ 它们始终把模型当成需要被"喂干净输入"的对象,完全忽略了模型自身处理脏输入的潜力。此外,现有噪声评测集(如 PromptBench)大多只支持单步扰动,难以模拟真实场景。

核心矛盾:把鲁棒性"外包"给前置工具,等于承认模型本身不鲁棒——这既增加成本又引入新的不确定性。真正该做的是让模型内禀地对噪声免疫,而不是不断在输入端打补丁。

本文目标:在不引入任何外部组件、纯离线后训练的前提下,把"对提示扰动免疫"这件事直接练进模型参数里。

切入角度:作者注意到——对于语义等价的干净/脏提示对,模型理想情况下应当给出几乎一样的标签预测分布。于是把鲁棒性问题转化为一个分布对齐问题:拉近"脏提示在正确标签上的 logits"与"干净提示在同一标签上的 logits",同时推远"无关任务提示"的 logits。

核心 idea:用"固定标签、比较不同提示"的逆向 DPO(Inverse DPO)配合对比学习,让模型学会"无论提示干净还是带噪,只要语义相同就给出相同的标签置信度"。

方法详解

整体框架

CoIPO 的输入是一个三元组——干净提示 \(\hat P_1\)、它的带噪版本 \(P'_1\)、以及一个来自不同任务的无关干净提示 \(\hat P_2\),三者分别与同一个标签 \(y_1\) 拼接后送入同一个 LLM,得到三组 logits(图 3 中的 Logits 1、Logits 1'、Logits 2)。训练目标是:以脏提示的标签 logits 为参照点,最大化它与同语义干净提示 \(\hat P_1\) 的相似度(preferred),最小化它与异语义提示 \(\hat P_2\) 的相似度(dispreferred)。相似度用标签 token 上的 KL 散度度量。整套流程纯离线后训练,推理时模型直接吃脏提示,不挂任何外部模块。

这套方法由三块支撑:先要有成对训练数据(怎么造干净-带噪提示对),再有逆向 DPO + 对比学习的损失(怎么把对齐约束写成可优化目标),最后有互信息解释(为什么这个损失等价于提升判别信息)。

%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
    A["原始 FLAN 干净提示"] --> B["成对 FLAN 数据集构建<br/>字符/词/句级扰动造带噪对"]
    B --> C["三提示拼标签送入 LLM<br/>干净 P̂1 / 带噪 P'1 / 无关 P̂2"]
    C --> D["逆向DPO + 对比学习损失<br/>拉近同语义·推远异语义的标签KL"]
    D -->|理论支撑| E["互信息视角<br/>等价于最大化判别信息增益 ΔI"]
    D --> F["内禀鲁棒的 LLM<br/>NoisyPromptBench 直接吃脏提示"]

关键设计

1. 逆向 DPO:固定标签、比较不同提示

标准 DPO 比较的是"同一个输入 \(x\) 下不同输出"的对数概率差,按偏好信号优化模型。但鲁棒性问题里"输出(标签 \(y\))"是确定的,要比的恰恰是"不同提示在同一标签上的条件概率"——也就是把 DPO 的输入输出角色对调,作者称之为 Inverse DPO(invDPO)。形式上定义比较函数 \(D\),损失写为 \(L_{\text{invDPO}} = -D(\hat P_2 \| P'_1, y_1) + D(\hat P_1 \| P'_1, y_1)\),其中 \(\hat P_1\)\(\hat P_2\) 是两个不同任务的干净提示,\(P'_1\)\(\hat P_1\) 的带噪版本。直观含义是:让带噪提示 \(P'_1\) 在标签上的表现靠拢同语义的 \(\hat P_1\)远离异语义的 \(\hat P_2\)。这种"输入侧偏好"的设定是本文区别于常规偏好优化的根本一招。

2. 对比学习实例化 D:标签 token 上的 KL 散度

要把抽象的 \(D\) 落地,作者用 logits 分布的相似度当作概率的代理。对输入序列 \(S = P \oplus y\)(提示拼标签),模型前向得到 logits \(\ell_{1:T}(S) = g_\theta(S)\);再用一个掩码算子 \(M_y(\cdot)\) 只保留标签 token 对应的 logits、丢掉提示位置,得到每个标签 token 的条件分布 \(p^{(P,y)}_t = \mathrm{softmax}(M_y(\ell_t(P\oplus y)))\)。于是 \(D\) 被实例化为序列级 KL 散度 \(D(P\|P_{\text{ref}}, y) = \sum_{t\in T_y} \mathrm{KL}(p^{(P_{\text{ref}},y)}_t \| p^{(P,y)}_t)\)。最终损失把"参照点设为脏提示 \(P'_1\)"这件事写死:

\[L = -\sum_{t\in T_{y_1}} \mathrm{KL}\big(p^{(P'_1,y_1)}_t \,\|\, p^{(\hat P_2,y_1)}_t\big) + \sum_{t\in T_{y_1}} \mathrm{KL}\big(p^{(P'_1,y_1)}_t \,\|\, p^{(\hat P_1,y_1)}_t\big)\]

第二项缩小脏提示与同语义干净提示的标签分布差距(要小),第一项放大脏提示与异语义提示的差距(要大)。最小化 \(L\) 就同时实现了"对齐同语义、排斥异语义"的对比效果——这正是鲁棒性想要的:脏提示和它该等价的干净提示在标签预测上不可区分。

3. 互信息解释:最小化损失 = 最大化判别信息增益

作者进一步从互信息角度论证为什么这个损失有效,而不只是工程拼凑。把脏提示 \(P'_1\) 当参照,定义相对互信息增益 \(\Delta I = I(Y;\hat P_1 \mid P'_1) - I(Y;\hat P_2 \mid P'_1)\),衡量"正确干净提示比错误提示多提供了多少关于标签 \(Y\) 的判别信息"。展开条件互信息后化简为条件熵之差 \(\Delta I = H(Y\mid \hat P_2, P'_1) - H(Y\mid \hat P_1, P'_1)\)。由于真实分布未知,用模型在脏提示下的输出分布 \(q(y) = p_\theta(y\mid P'_1)\) 作经验参照,最终把经验互信息差写成两个 KL 之差 \(\Delta\tilde I_q = \mathrm{KL}(q\|p_\theta(\cdot\mid\hat P_2)) - \mathrm{KL}(q\|p_\theta(\cdot\mid\hat P_1))\),代入逐 token 分布后恰好得到 \(L_{\text{CoIPO}} = -\Delta\tilde I_q\)。也就是说,最小化 CoIPO 损失严格等价于最大化相对互信息增益——模型被引导从正确提示中提取更多判别信息、同时减少与错误提示共享的信息,且这一切都在"脏输入"语境下进行。这给方法提供了信息论层面的原理性支撑。

损失函数 / 训练策略

训练数据基于 FLAN,选 25 个答案确定的子集,每条先从预定义的规范指令模板里随机抽一个生成干净提示,再随机施加字符级/词级/句级扰动得到带噪提示,构成干净-带噪对(扰动类型随机选以增强泛化)。模型用 Alpaca(LLaMA-7B 指令微调版)和 Qwen2.5-7B,学习率 \(1\times10^{-4}\),batch size 64,最大序列长度 256,A100 上训练。

实验关键数据

主实验

在自建的 NoisyPromptBench(由 PromptBench 增强而来,选 5 个数据集 × 4 类扰动 DeepWordBug/TextFolder/CheckList/StressTest,覆盖字符/词/句三级,且对每类扰动多次随机采样模拟真实强度随机性)上对比 Base、SFT、CoIN、CoIPO。Acc 为准确率,Diff 为相对干净提示的掉点。

模型 方法 Clean Acc 扰动后平均 Acc 平均掉点 Diff
Llama Base 55.10 46.64 10.58
Llama SFT 57.28 54.72 3.20
Llama CoIN 61.87 58.60 4.08
Llama CoIPO 67.00 63.90 3.88
Qwen Base 75.25 72.24 3.76
Qwen SFT 77.94 76.85 1.36
Qwen CoIN 82.93 81.48 1.81
Qwen CoIPO 83.88 83.45 0.54

Llama 上 CoIPO 平均准确率超 CoIN 5.3%、超 SFT 9.18%、超 Base 17.26%;Qwen 上超 CoIN 1.97%、超 SFT 6.6%、超 Base 11.21%。Qwen 的掉点率仅 0.54%,是所有方法里最低。论文摘要给出的整体提升口径是"全噪声类型平均准确率 +3.64%,TextFolder 场景最高 +4.18%"。

消融实验

方法由 inverse DPO 和对比学习两部分组成,分别拆出 CL(只对比学习)、InvDPO(只逆向 DPO)与完整 CoIPO 对比(Avg 列为四种扰动平均)。

模型 配置 Clean Acc 扰动后平均 Acc 平均掉点 Diff
Llama SFT 57.28 54.72 3.20
Llama CL 61.87 58.60 4.08
Llama InvDPO 65.89 62.72 3.97
Llama CoIPO 67.00 63.90 3.88
Qwen SFT 77.94 76.85 1.36
Qwen CL 82.93 81.48 1.81
Qwen InvDPO 83.31 82.86 0.56
Qwen CoIPO 83.88 83.45 0.54

关键发现

  • 两个组件缺一不可,但 InvDPO 是主力:单独 CL 或单独 InvDPO 都打不过完整 CoIPO,但都明显强于 SFT 基线;其中 InvDPO 单独贡献已经很大(Llama 62.72% vs CL 58.60%),说明"固定标签比较不同提示"的偏好建模是核心,对比项再补一刀拉开异语义提示。
  • 既高又稳:CoIPO 不只在干净提示上准确率最高,扰动后掉点也维持在很小范围(Qwen 仅 0.54%)。SFT 虽然掉点也小(Llama 3.20%),但因其干净准确率本就低,整体鲁棒性有限——掉点小不等于强,要看绝对水平。
  • 解码半径更大:作者定义扰动半径 \(r\)(对干净提示的字符编辑数)和解码半径 \(R(a)=\sup\{r: \mathrm{Acc}(r)\ge a\}\)。图 5 在 MNLI 上显示,给定目标准确率 \(a\),CoIPO 的 \(R(a)\) 明显大于 Base,即能扛更多编辑才掉到同一水平。
  • 跨规模有效:在 Qwen2.5 的 7B/14B/72B 上 CoIPO 都稳定领先,且整体符合"模型越大越好"的 scaling 趋势。

亮点与洞察

  • 把 DPO 的输入输出角色对调是最巧的一笔:常规偏好优化比"同输入不同输出",本文比"同输出不同输入",恰好把"提示扰动鲁棒性"自然写成偏好信号,无需额外奖励模型或人工偏好标注——偏好天然由"同语义 vs 异语义"给定。
  • 鲁棒性从输入端搬到参数里:不靠任何前置语法检查/重写工具,纯离线后训练就让模型内禀免疫,省成本、无级联误差、可独立部署,思路上从"修输入"转向"修模型"。
  • 损失有信息论闭环\(L_{\text{CoIPO}} = -\Delta\tilde I_q\) 这个等式让"最小化对比损失"严格等价于"最大化判别信息增益",不是事后凑的解释,可迁移到其他"希望某类输入扰动不改变输出分布"的任务(如代码注释改写、口语化指令)。
  • 只在标签 token 上算 KL 而非整段输出,把对齐约束聚焦到真正影响答案的位置,避免被提示本身的措辞差异干扰。

局限与展望

  • 任务范围偏窄:实验集中在分类/NLI 类"答案确定"的 FLAN 子集(MNLI/MRPC/QNLI/QQP/SST2),标签是离散短序列,KL 对齐天然好用;对开放式生成(长文本、代码、推理链)这套"标签 token KL"是否还成立、怎么定义"标签",论文未充分验证。
  • 需要成对数据 + 异语义负例:训练必须构造干净-带噪对并采样无关任务提示,数据工程有成本;负例 \(\hat P_2\) 的选择策略(随机抽取 vs 难负例挖掘)对效果的影响没深入讨论。
  • 扰动半径用字符编辑数定义偏粗糙,句级语义扰动(CheckList/StressTest)未必能用字符编辑数很好刻画,解码半径分析主要在 MNLI 单数据集上给出。
  • 改进思路:把 invDPO 推广到生成式任务(用序列级一致性而非标签 token KL)、引入难负例提升判别边界、或在线生成扰动对做课程式训练。

相关工作与启发

  • vs 提示预处理(语法检查器 / LLM 重写 / BAT / RoP / PromptAgent): 它们在输入端外挂工具检测修复脏提示,本文把鲁棒性内化进参数,省去外部组件、避免流水线级联误差、推理零额外延迟;代价是需要离线后训练且改了模型权重。
  • vs CoIN(当前内禀鲁棒 SOTA): 同样走"提升模型自身鲁棒"路线,但 CoIPO 用逆向 DPO + 对比学习的标签 KL 对齐,并配互信息理论解释,平均准确率在两个模型族上分别超 CoIN 5.3%(Llama)和 1.97%(Qwen)。
  • vs 标准 DPO: 标准 DPO 优化"同输入下不同输出"的偏好;CoIPO 反过来固定输出标签、比较不同提示,是把偏好优化框架迁到"输入鲁棒性"问题上的一次角色互换。

评分

  • 新颖性: ⭐⭐⭐⭐ 逆向 DPO 这一"固定输出比输入"的视角转换简洁有效,且配上互信息闭环论证。
  • 实验充分度: ⭐⭐⭐⭐ 两模型族 × 4 扰动 × 5 数据集 + 消融 + 7B/14B/72B scaling,但局限于分类类任务。
  • 写作质量: ⭐⭐⭐⭐ 动机清晰、理论推导完整,图 3 框架直观。
  • 价值: ⭐⭐⭐⭐ 提供了不依赖外部工具的内禀鲁棒方案 + NoisyPromptBench 基准 + 成对 FLAN 数据,工程可落地。