“人非圣贤,孰能无过。”事实证明,犯错也是大语言模型 (LLMs) 的一个基本属性。
当我们尝试使用上下文学习 (In-Context Learning, ICL) 教 LLM 执行一项新任务时,通常会向它展示几个“黄金标准”示例——即完美的问题配上完美的答案。这就像通过只展示标准答案来教学生数学一样。虽然这种方法行之有效,但它忽略了学习过程中一个至关重要的环节: 分析错误 。
就像人类学生通过理解为什么微积分题算错了比光看正确解法学到的更多一样,LLM 也可以通过理解自身的错误模式来获得显著提升。最近的研究试图利用这一点,通过从错误中生成“原则”——即指导模型的经验法则。然而,这些方法通常存在两个极端: 要么过于通用 (对每个问题都应用相同的规则) ,要么过于狭隘 (无法涵盖可能出现的各种错误) 。
在本文中,我们将深入探讨一种名为 检索式上下文内原则 (Retrieved In-Context Principles, RICP) 的新框架。该方法提出了一种动态的教师-学生架构,模型不仅从正确答案中学习,还会主动检索源自过去失败经验的、具体的、定制化的原则,以确保它们不会在同一个地方跌倒两次。
问题所在: 用通用的建议解决具体的问题
标准的上下文学习 (ICL) 依赖于正向强化: “这是解决此问题的方法。”
最近的进展试图引入负面反馈。像 LEAP 或 TPD 这样的方法使用“教师”模型来分析“学生”模型的错误,并编写一系列原则 (例如,“始终仔细检查你的算术”) 。然后,学生模型在推理过程中使用这些原则。
虽然这是向正确方向迈出的一步,但它引入了两个主要局限性:
- 缺乏定制化: 这些方法通常会对每一个问题在提示 (prompt) 中输入相同的一组固定原则。如果一个问题需要逻辑推演,而你告诉模型“检查算术”,这其实是一种噪声,不仅混淆了模型,还浪费了上下文窗口的空间。
- 错误覆盖不足: 由于原则是固定的,它们只能覆盖一小部分常见错误。它们无法解决在复杂推理任务中出现的那些长尾的、具体的、细微的错误。
RICP 通过让原则动态化解决了这个问题。RICP 不再使用静态的规则列表,而是从庞大的错误分类库中检索与当前问题相关的具体建议。
RICP 架构
从本质上讲,RICP 是一个将原始错误数据转化为可操作智慧的管道。它采用教师-学生框架运行:
- 学生 (Student,例如 GPT-3.5 或 Qwen) : 我们希望改进的模型。
- 教师 (Teacher,例如 GPT-4) : 一个充当批评者和指导者的更强模型。
工作流程是循环和迭代的。教师观察学生的失败,编写“教案” (原则) ,然后学生利用该计划在新数据上取得成功。

如上图 1 所示,该过程从训练数据开始。当学生在推理过程中犯错时,教师会对其进行分析以生成原则。随后,当新问题出现时,系统会检索相关原则以引导学生得出正确答案 (复选标记) 。
让我们将方法论分解为三个不同的阶段。
第一阶段: 洞察生成 (Insight Generation)
第一步是“复盘”。我们需要生成一个错误语料库以及从中吸取的教训。
我们选取一个包含问题 (\(x\)) 和正确答案 (\(y\)) 的训练数据集 (\(D_{train}\)) 。我们要求学生模型解答这些问题。自然地,它会做错一些。我们将这些失败案例收集到“负面数据集” (\(D_{neg}\)) 中。

在这里,\(\hat{r}\) 代表学生生成的错误理由 (推理过程) 。
接下来,教师模型会查看每一个错误。它会获得问题、学生错误的推理以及正确答案。教师被要求生成两样东西:
- 原因 (\(R\)) : 对错误的高级分类 (例如,“计算错误”或“误解上下文”) 。
- 洞察 (\(I\)) : 关于如何在未来避免此错误的具体的、详细的建议。
这就创建了一个“洞察语料库”:

第二阶段: 原则制定 (Principle Formulation)
现在我们有一大堆具体的错误和洞察。由于上下文限制,简单地将所有这些都扔进提示中是不可能的。我们需要组织这些知识。
RICP 采用 层次聚类 (Hierarchical Clustering) 将这些洞察组织成两个抽象级别: 任务级 (Task-Level) 和 问题级 (Question-Level) 。
任务级原则
这些是适用于该类型任务的广泛、通用的规则 (例如,“在数学应用题中,始终验证单位”) 。
为了找到这些原则,研究人员对上一步生成的 高级原因 (\(R\)) 进行聚类。他们嵌入 (embed) 原因的文本并使用 K-means 聚类算法。

通过将相似的原因分组,系统识别出整个数据集中的常见陷阱。然后,教师将每个集群总结为一个通用原则。
问题级原则
这些是针对问题语义内容的具体提示 (例如,“计算圆的面积时,记得对半径进行平方”) 。
为了组织这些原则,研究人员首先从数据库中检索与当前目标问题相似的问题。然而,这些相似问题的洞察可能会重复。为了解决这个问题,他们对 洞察 (\(I\)) 本身执行 K-means 聚类。

这确保了检索到的建议是多样化的,涵盖了问题的不同方面,而不是把同样的建议重复五遍。
从最初的错误到分层原则制定的整个流程可视化如下:

第三阶段: 原则利用 (Principle Utilization)
这是推理阶段——即“考试”。
当一个新问题出现时:
- 任务级检索: 系统注入与任务类型相关的高级原则。
- 问题级检索: 系统从数据库中检索 \(m\) 个最相似的历史问题。然后它对与这些问题相关的洞察进行聚类,并采样 \(n\) 个不同的洞察。
- 提示构建: 原始问题与这些检索到的原则 (“任务级原则” + “问题级原则”) 结合,形成一个增强的提示。
至关重要的是, 在此推理阶段不需要教师模型。 原则已经生成并存储好了。检索是一个轻量级的过程,这使得该方法比需要教师实时介入的方法在计算上更加高效。
实验结果
研究人员在涵盖三个不同领域的七个基准上评估了 RICP:
- 数学推理: GSM8K, SVAMP, MathQA, AQuA。
- 常识推理: CSQA, StrategyQA。
- 逻辑推理: LogiQA。
他们将 RICP 应用于各种提示策略之上,如标准提示 (Standard Prompting) 、零样本思维链 (Zero-shot CoT) 和 Auto-CoT。
性能对比
结果是一致的: RICP 全面提升了性能。

如表 1 所示,应用 RICP (标记为“Ours”) 带来了显著提升。例如,在使用 GPT-3.5-Turbo 的高难度 AQuA 数据集上, Zero-shot CoT 的准确率从 31.07% 跃升至 38.08%——相对提升超过 22%。
该方法在“零样本”基线上表现尤为强劲。这很有道理: 像 Few-shot CoT 这样的方法已经在提示中包含了示例,这有助于引导模型。零样本方法没有示例,因此 RICP 原则的加入提供了此前缺失的必要指导。
消融研究: 我们需要所有组件吗?
研究人员进行了一项消融研究,以验证“任务级”和“问题级”原则是否都是必要的,以及聚类机制是否真的有帮助。

图 3 说明了发现:
- w/o QP (无问题级原则) : 移除具体的、检索到的建议导致性能急剧下降 (由橙色线表示) 。这证实了通用建议是不够的;模型需要针对当前问题的具体提示。
- w/o TP (无任务级原则) : 移除通用建议 (绿色线) 也会损害性能,尽管有时不如移除 QP 严重。
- w/o HC (无层次聚类) : 移除聚类步骤 (蓝色线) 显着降低了结果。这突显了简单地检索原始洞察是无效的——它们需要经过组织和去重才能发挥作用。
定制化是关键
RICP 的核心主张之一是,“定制化”检索优于随机选择原则。研究人员通过将他们的方法与从池中随机选择原则的基线进行比较来验证这一点。

图 5 中的蓝色条代表“Ours Win”——即 RICP 优于随机选择的情况。在 GSM8K 和 AQuA 等基准测试中,定制化检索在绝大多数情况下获胜。事实上,使用随机原则有时甚至比根本不使用原则更糟,因为不相关的建议会混淆模型。
理解错误
最后,观察模型实际上修复了什么样的错误是很有趣的。

在数学推理 (图表 b) 中,逻辑错误和计算错误占主导地位。RICP 通过检索诸如“检查你的算术”或“注意单位转换”之类的原则,在此方面提供了显著帮助。在常识推理 (图表 a) 中,上下文错误则更为普遍。
结论
“检索式上下文内原则” (RICP) 框架代表了我们在处理上下文学习方式上的成熟。它超越了仅仅向模型展示“好”是什么样子,开始教导它们如何避免“坏”。
通过自动化教师的角色——分析错误、对其分类并在相关时检索它们——RICP 提供了一种定制化 LLM 行为的方法,而无需微调带来的巨大计算成本或人工介入造成的延迟。
对于 NLP 学生和从业者来说,RICP 强调了一个重要的教训: 数据策展很重要。 这不仅仅是拥有原则的问题;更是关于组织它们 (聚类) 并在正确的时间提供它们 (检索) 。随着模型的不断进化,能够自我反思并从自身错误历史中学习的系统可能会成为追求稳健 AI 推理的标准配置。
](https://deep-paper.org/en/paper/2407.05682/images/cover.png)