引言

想象一下,你正在试图教一个聪明但思维刻板的学生如何解决复杂的物理问题。你没有时间教给他们整本教科书。相反,你只能在期末考试前给他们展示五个具体的解题示例。

你会选择哪五个示例?

是选五个简单的?五个极难的?还是混合不同推理风格的?选错了,学生就会挂科;选对了,学生就能拿高分。

这正是研究人员在大型语言模型 (LLM) 的上下文学习 (In-Context Learning, ICL) 中面临的确切挑战。我们要知道,给 LLM 提供少量“样本” (演示示例) 能显著提升其性能,尤其是在数学或逻辑谜题等复杂推理任务上。这通常被称为“少样本提示 (few-shot prompting) ”。

然而,从数千个训练数据集中找到那个“完美”的示例子集是一个巨大的组合问题。以前的方法要么计算成本高昂——需要 LLM 评估数千种可能性——要么需要检查模型的内部置信度分数,而这对于像 GPT-4 这样的黑盒模型来说并不总是可行的。

在这篇文章中,我们将深入探讨 EXPLORA , 这是一篇提出了一种新颖、高效的样本选择算法的研究论文。EXPLORA 将提示词选择视为一个探索-利用问题,在大幅降低计算成本的同时,性能超越了最先进的方法。

背景: 上下文学习的艺术

在剖析算法之前,让我们先建立背景。上下文学习允许 LLM 仅仅通过查看提示中的示例来学习任务,而无需更新模型的权重。

思维链 (Chain-of-Thought, CoT)

对于复杂的任务,我们不仅提供输入和输出,还提供“理由 (rationale) ”。这就是所谓的思维链 (CoT) 提示。一个样本不仅仅是问题 (\(x\)) 和答案 (\(y\)) ;它是一个三元组: 输入、理由、输出

目标是选择这些样本的一个子集 (\(S\)) 附加到测试问题 (\(x_{test}\)) 上,以便模型生成正确的输出 (\(\hat{y}_{test}\)) 。

描述上下文学习过程的方程。

如上式所示,预测值 \(\hat{y}_{test}\) 是由 LLM 函数 \(f\) 基于提示 \([S, x_{test}]\) 生成的。后处理步骤 \(\delta\) (如正则表达式匹配) 用于提取最终答案。

静态与动态选择

关于如何选择这些样本 (\(S\)) ,主要有两派观点:

  1. 动态选择: 对于每一个新的测试问题,系统都会搜索数据库以查找与该特定问题最相似的示例。
  • *优点: * 上下文高度相关。
  • *缺点: * 非常慢且昂贵。必须为每个查询运行检索过程。
  1. 静态选择: 一次性选择一组“黄金”样本,然后对每个测试问题都使用这一组样本。
  • *优点: * 推理速度快 (运行时无需检索步骤) 且鲁棒性强。
  • 缺点: * 找到一组对所有*情况都有效的样本极其困难。

EXPLORA 专注于静态选择 。 研究人员认为,如果我们能找到一组涵盖多种推理模式的示例,就不需要为每个查询动态检索示例。

现有方法的问题

目前最先进的静态方法,如一种名为 LENS 的方法,依赖于“信息量 (informativeness) ”。它们将候选示例输入 LLM 并检查概率 logits (置信度分数) ,以查看模型从中“学到了”多少。

缺点是什么?

  1. 成本: LENS 需要调用 LLM 数千次来为训练数据打分。
  2. 访问权限: 它需要访问概率分布 (\(\mathbb{P}_{LLM}\)) ,而 Claude 或 GPT-4 等模型的 API 可能不会完全公开这些信息。
  3. 独立性: 这些方法通常单独对示例进行评分,无法捕捉示例在一个组内如何相互作用

EXPLORA 方法

作者提出了 EXPLORA (Model-based Exploration for Exemplar Subset Selection,基于模型的样本子集选择探索) 。其核心理念很简单: 我们应该最小化验证损失。

换句话说,我们要找到一个示例子集 (\(U\)) ,当我们将其用作提示词时,模型在一个小型验证集上犯的错误最少。

EXPLORA 概览,展示了采样、评分和更新子集的迭代过程。

图 1 所示,EXPLORA 是一个迭代循环。它不会检查每一种可能的组合 (这是不可能的) 。相反,它使用一个评分函数 (Scoring Function) (绿色框) 来猜测一个子集有多好。然后,它定期使用真实的 LLM 进行检查以更新该评分函数。

1. 定义目标

研究人员将问题公式化为最小化验证集 \(\mathcal{V}\) 上的损失 \(L\)。

定义验证损失计算的方程。

上式计算了错误率。如果模型预测了错误的答案 (\(v_i \neq \delta(...)\)) ,损失就会增加。目标是找到使该损失最小化的子集 \(U^*\):

定义寻找最佳子集 U 的优化目标的方程。

2. 评分函数 (\(\sigma\))

计算实际损失 (方程 3) 非常昂贵,因为它需要运行 LLM。为了解决这个问题,EXPLORA 引入了一个代理评分函数 (\(\sigma\)) 。该函数无需调用 LLM 即可估计子集的优劣。

评分函数是一个基于相似度的线性模型。它假设如果一个训练示例在语义上与验证示例相似,那么它就是有用的。

评分函数 sigma 的方程。

让我们分解一下这个方程:

  • \(\sigma(\vec{\alpha}, S)\): 子集 \(S\) 的估计得分。
  • \(E_{ij}\): 训练样本 (\(x_i\)) 和验证问题 (\(u_j\)) 之间的相似度得分。这是使用小型、廉价的模型 (如 BERT) 计算的,而不是庞大的 LLM。
  • \(\alpha_i\): 样本 \(x_i\) 的权重 (参数) 。这就是算法要学习的内容。

如果 \(\alpha_i\)很高,意味着算法认为样本 \(i\) 对于解决任务非常重要。如果 \(\alpha_i\) 是负数,该样本可能会让模型感到困惑或产生有害影响。

3. 老虎机算法 (Bandit Algorithm)

我们如何找到 \(\alpha\) 的正确值?EXPLORA 使用了一种基于采样的多臂老虎机算法。这是一种常用于需要在利用 (exploitation) (使用已知有效的方法) 和探索 (exploration) (尝试新事物) 之间取得平衡的技术。

该算法维护两个子集集合:

  1. \(U_t\): 当前“最好”的子集 (低损失) 。
  2. \(V_t\): 其他候选子集的池子。

在每一轮 \(t\) 中,算法执行以下步骤:

  1. 更新参数 (\(\alpha\)): 它求解一个优化问题,找到使评分函数 \(\sigma\) 与我们目前已测试子集的实际 LLM 损失相匹配的 \(\alpha\) 值。

展示用于更新评分参数 alpha 的损失函数的方程。

此方程最小化了实际损失 (\(L(S, \mathcal{V})\)) 与预测得分 (\(\sigma(\vec{\alpha}, S)\)) 之间的差异。注意第二项: 它从 \(V_t\) 中采样“负”样本,以确保模型学会区分好子集和坏子集。

  1. 选择候选者:
  • 在候选池 (\(V_t\)) 中找到预测损失最低的子集 (最佳候选者) 。称之为 \(S^*_t\)。
  • 在当前“最好”的集合 (\(U_t\)) 中找到预测损失最高的子集 (最差的优胜者) 。称之为 \(\tilde{S}_t\)。
  1. 更新集合:
  • 如果新候选者 \(S^*_t\) 看起来比最差优胜者 \(\tilde{S}_t\) 更好,就交换它们!
  • 算法将新候选者添加到“最好”集合中,并移除最差的那个。

为什么这样效率高? 因为 \(U_t\) 和 \(U_{t+1}\) 通常只相差一个子集,算法可以使用缓存机制。它只需要为正在探索的少数几个新子集查询 LLM,而无需重新评估所有内容。

实验与结果

研究人员在几个复杂的推理数据集上测试了 EXPLORA,包括:

  • GSM8K: 数学应用题。
  • AquaRat: 代数问题。
  • TabMWP: 表格推理。
  • FinQA: 金融数值推理。
  • StrategyQA: 常识推理。

他们将 EXPLORA 与动态方法 (KNN、MMR) 和静态方法 (LENS、随机选择、人工选择) 进行了比较。

性能对比

表格对比了 EXPLORA 与 LENS 和 KNN 等基准方法的性能。

表 1 所示,EXPLORA 取得了显著的成果:

  • 它在所有数据集上都超越了 LENS (以前最先进的静态方法) 。在 GSM8K 上,它展现了 12.24% 的提升
  • 它甚至在许多情况下优于 KNN 等动态方法,考虑到动态方法拥有在选择示例前看到测试问题的优势,这一点令人印象深刻。
  • 变体版本 (EXPLORA + Self-Consistency) 将性能推得更高。

效率: 高性价比的选择

EXPLORA 最关键的贡献在于其效率。因为它依赖于代理评分函数 (\(\sigma\)) 而不是为每个候选者查询 LLM,所以节省了大量的计算资源。

图表对比了 LENS 和 EXPLORA 的 LLM 调用次数和运行时间。

图 2 清晰地说明了这一点:

  • 上图 (LLM 调用次数) : EXPLORA (蓝色条纹) 所需的 LLM 调用次数明显少于 LENS (红色条纹) 。实际上,调用次数减少到了 LENS 需求的 ~11%
  • 下图 (时间) : 时间上的节省同样巨大。对于 GSM8K,过程从约 40 小时 (LENS) 降至约 7 小时 (EXPLORA) 。

迁移能力

一个有趣的发现是,使用较小、较便宜的模型 (如 Llama-2-7b 或 Mistral-7b) 选择的样本,当迁移到较大的模型 (如 GPT-3.5-turbo) 时,效果出奇地好。

表格展示了样本从小模型到 GPT-3.5 的迁移能力。

表 2 证明,使用 Mistral-7b (M) 选择提示词,然后在 GPT-3.5 上运行推理,其结果与直接在 GPT-3.5 上选择几乎相同。这使得研究人员可以在开源、本地硬件上执行优化过程,而只需为最终推理支付昂贵的 API 费用。

鲁棒性

最后,选定的子集表现是否一致?

表格展示了 EXPLORA 与其他方法相比的标准差。

表 3 显示了不同数据切分下性能的标准差。数值越低越好。EXPLORA 始终显示出比 KNN 或 LENS 等方法更低的方差,这表明它找到的子集是稳健可靠的,而不仅仅是运气好。

定性分析: EXPLORA 选择了什么?

为什么 EXPLORA 比 LENS 表现更好?作者分析了两种算法实际选择的问题。

LENS 倾向于根据单独的置信度分数来选择样本。这通常导致冗余 。 例如,在 AquaRat 数据集 (代数) 中,LENS 选择了两个主题重复的问题——都涉及措辞相似的“工作和时间”问题。

EXPLORA 因为对整个子集进行评分,隐含地鼓励了多样性。如果子集已经包含一个“工作和时间”问题,添加第二个同类问题降低验证损失的效果就不如添加一个“几何”问题那么好。

表格对比了 LENS 和 EXPLORA 为 AquaRat 选择的具体示例。

表 7 中,我们可以看到 EXPLORA 的选择 (底行) 涵盖了比例、级数、运动学和利息计算。对于 LLM 的上下文学习来说,这是一个更广泛的课程体系。

结论

提示词是新的编程接口,而选择正确的示例放入提示词中则是新的优化挑战。 EXPLORA 为这个问题提供了一个复杂的解决方案。通过将选择过程建模为子集优化问题,并使用老虎机算法有效地探索空间,它实现了提示工程的“圣杯”:

  1. 高性能: 击败最先进的方法。
  2. 低成本: 减少 90% 的 LLM 调用。
  3. 黑盒兼容: 不需要访问内部模型权重或 logits。

对于使用 LLM 的学生和研究人员来说,这就凸显了一个重要的转变。我们正在从“凭感觉的提示工程” (不断尝试直到奏效) 转向算法化提示工程 , 即我们使用严格的数学框架来发现 AI 系统的最佳输入。