如果你在大语言模型 (LLM) (如 GPT-4 或 Llama 2) 上花过时间,那你很可能熟悉提示工程 (Prompt Engineering) 这一“黑魔法”。我们要花数小时调整措辞,加上“让我们一步步思考 (Let’s think step by step) ”,或者重组段落,只为了让模型输出正确的答案。这个过程感觉不像是工程,更像是在施法——改一个词,魔法生效了;改另一个词,魔法就失效了。

但是,如果文字并不是唯一重要的东西呢?如果文字之间的空白空间也同样重要呢?

在一篇题为《Position Engineering: Boosting Large Language Models through Positional Information Manipulation》 (位置工程: 通过位置信息操纵提升大语言模型) 的引人入胜的新论文中,来自微软研究院的研究人员介绍了一种新技术,可能会让传统的提示工程看起来有些过时。他们证明,通过操纵 Token 的“位置索引”——本质上是在词语的位置上欺骗模型——他们可以在检索增强生成 (RAG) 等复杂任务中显著提升性能。

在这篇文章中,我们将解构这篇论文,解释“位置工程”背后的数学原理,并向你展示插入看不见的“幽灵 Token”是如何带来两位数的准确率提升的。

语言的坐标

要理解位置工程,我们首先需要退一步,看看 LLM 是如何阅读的。

当你向 LLM 输入一个句子时,它看到的不仅仅是一袋词汇。它看到的是一个序列。模型需要知道在句子“Man bites dog” (人咬狗) 中,“Man”出现在“bites”之前。为了处理这一点,Transformer 架构 (现代 LLM 的骨架) 将输入分离为两条数据流:

  1. 语义信息: 这个词意味着什么 (Token 嵌入) 。
  2. 位置信息: 这个词在序列中的位置 (位置嵌入) 。

模型的注意力机制结合这两部分信息来决定哪些词应该“关注” (focus on) 哪些其他的词。

标准方法: 提示工程

传统上,如果我们想提高模型性能,我们会修改文本。我们会添加新指令、改写句子或提供示例。这同时改变了语义信息和位置信息,因为添加一个词会将后面的所有内容向后推。

提示工程与位置工程的对比。

如上图 Figure 1 所示,提示工程 (顶部) 在物理上改变了文本。你添加了句子 3,段落就变了。

位置工程 (底部) 则不同。研究人员建议插入 占位符 Token (PH Tokens) 。 这些是“幽灵” Token。它们不包含任何文本,也不参与意义的计算。但是,它们确实占据了一个索引号码。

通过插入这些占位符,模型会认为“Sentence 2”距离“Sentence 1”非常远,即使实际上并没有文本将它们隔开。

核心方法: 它是如何工作的

这项技术依赖于破解注意力机制。让我们看看数学原理,明白为什么它能行得通。

在标准的注意力层中,模型为每个 Token 计算三个向量: 查询 (Query, \(q\)) 、键 (Key, \(k\)) 和值 (Value, \(v\)) 。

标准注意力的查询、键和值方程。

这里,\(e_m\) 是 Token 的嵌入,\(m\) 是它的位置索引。注意力分数 (\(a_{m,n}\)) 决定了位置 \(m\) 的 Token 有多在乎位置 \(n\) 的 Token。

注意力分数计算方程。

关键部分在于,注意力分数取决于查询 (\(q\)) 和键 (\(k\)) 的点积。

位置嵌入 (RoPE) 的作用

大多数现代模型,如 Llama 2 和 Mistral,使用一种特定类型的定位方法,称为 旋转位置嵌入 (Rotary Positional Embeddings, RoPE) 。 RoPE 不仅仅是将数字加到向量上,而是根据其位置索引在几何空间中旋转向量。

显示旋转矩阵的 RoPE 方程。

在上面的方程中,\(\mathbf{R}_m^d\) 是由位置 \(m\) 决定的旋转矩阵。这意味着向量的角度取决于词在句子中的位置。当模型比较两个词时,它会查看它们之间的相对距离 (\(n - m\)) 。

相对位置注意力方程。

这就是位置工程利用的机制。通过改变索引 \(m\) 和 \(n\),研究人员有效地改变了向量的旋转。这改变了最终的点积,从而手动调整了提示中不同部分之间的注意力权重。

“幽灵”函数

研究人员定义了一个位置编辑函数 \(\tau\),用于重新映射索引。

位置编辑函数方程。

如果你插入一个占位符 Token (一个“幽灵 Token”) ,注意力机制在计算值时会忽略它,但后续词语的索引会发生位移。

例如,如果你有一条指令 (Instruction) 后跟一个文档 (Document) ,通常文档紧接着指令开始 (例如,索引 10) 。如果你通过添加 100 个占位符 Token 来执行位置工程,指令在索引 9 结束,但文档现在从索引 110 开始。

对于模型 (特别是通过 RoPE) 来说,文档现在距离指令“很远”。正如我们将看到的,这种距离允许模型更独立地处理这些片段,从而减少混淆。

实验 1: 检索增强生成 (RAG)

作者首先在检索增强生成 (RAG) 上测试了这一点。在 RAG 中,通常有如下的提示结构:

  1. 指令 (Instruction) : “根据文档回答问题……”
  2. 文档 (Documents) : 检索到的文本片段。
  3. 问题 (Question) : 用户的实际查询。

RAG 的挑战在于,模型经常会“迷失在中间”,或者过度优先考虑指令而忽略文档的细微差别。

设置

研究人员引入了两个变量,\(\theta_A\) 和 \(\theta_B\),代表插入到提示中的占位符 Token (幽灵 Token) 的数量。

RAG 的位置工程图示,显示 theta_A 和 theta_B。

  • \(\theta_A\): 指令文档之间的间隙。
  • \(\theta_B\): 文档问题之间的间隙。

他们使用 Llama2-13B-chat 模型测试了从 0 到 2500 个 Token 的值。

结果

结果出奇地有效。仅仅通过调整这些看不见的间隙,模型在多个数据集 (NQ Open, TrivialQA 等) 上的准确率就显著提高了。

RAG 任务的结果表。

Table 1 所示,提升是巨大的。对于只有 1 个文档的“WebQuestions”数据集,准确率跃升了 15.4%

注意最佳值 (\(\theta_A^*\) 和 \(\theta_B^*\)) 的模式:

  • \(\theta_A\) (指令到文档的间隙) 倾向于较大 (1000–2000) 。
  • \(\theta_B\) (文档到问题的间隙) 倾向于较小 (300–500) 。

这表明,当指令被推得离文档很远时,模型的表现最好,这本质上是将通用规则与具体内容“解耦”了。

寻找通用的“最佳点”

有没有一个对所有情况都有效的神奇数字?研究人员汇总了他们的结果,根据 \(\theta_A\) 和 \(\theta_B\) 的值创建了一个性能热力图。

位置配置的平均百分位值热力图。

Figure 3 揭示了一个清晰的“安全区”。高 \(\theta_A\) (约 1900) 和中等 \(\theta_B\) (约 400) 始终能产生高性能。研究人员发现,这种特定的配置 (\(\theta_A = 1900, \theta_B = 400\)) 在不同的数据集上都普遍有效。

显示通用位置配置结果的表格。

为什么不直接删除指令?

你可能会想: 如果把指令推到 2000 个 Token 之外有帮助,是不是因为指令写得不好?我们应该直接删除它吗?

作者对此进行了测试。他们运行了完全没有指令部分的提示。

比较基线与移除指令的表格。

Table 3 所示,完全移除指令产生的结果与基线 (无位置工程) 相似。这证明指令必要的,但位置工程允许模型更有效地平衡指令的影响力与文档内容之间的关系。关键在于找到正确的“注意力距离”,而不是删除内容。

实验 2: 上下文学习 (ICL)

测试的第二个场景是上下文学习 (少样本提示) 。这是指向模型提供几个任务示例 (例如,“评论: 好电影 -> 正面”) 然后让它解决一个新任务。

提示结构包括:

  1. 指令
  2. 示例 (演示)
  3. 查询

研究人员在指令与示例之间 (\(\theta_A\)) 、示例与查询之间 (\(\theta_B\)) ,甚至在示例之间 (\(\theta_{mid}\)) 都引入了间隙。

ICL 的位置工程图示。

结果

位置工程再次提升了性能,尽管最佳设置与 RAG 不同。

对于 TREC 数据集 (问题分类) ,模型偏好示例之间有小间隙 (\(\theta_{mid} = 40\)) ,其他地方无间隙。对于 SST2 (情感分析) ,它偏好查询前有一个小间隙 (\(\theta_B = 100\)) 。

虽然收益小于 RAG (1.9% 到 3.6%) ,但这进一步证明 Token 坐在“哪里”与 Token “是”什么同样重要。

讨论: 注意力的物理学

为什么插入 1900 个“幽灵 Token”会让模型变得更聪明?

作者假设位置工程通过微调注意力权重起作用。在使用 RoPE 的模型中,随着 Token 之间相对距离的增加,注意力分数通常会衰减。这是一种被称为“长程衰减 (long-term decay) ”的特性。

通过人为地增加指令文档之间的距离 (使用较大的 \(\theta_A\)) ,我们本质上是在降低指令的注意力音量。我们并没有完全静音它 (这会导致性能不佳) ,但我们将它调低到了足以让模型更强烈地关注文档的程度。

同样,将问题放置在离文档适度近的位置 (较小的 \(\theta_B\)) ,确保了模型严重依赖检索到的文本来形成答案。

位置工程的优势

  1. 计算效率: 与添加实际单词或检索更多文档不同,位置工程不会增加计算负载。计算过程中会跳过“幽灵 Token”;只有真实 Token 的索引被改变了。
  2. 与提示工程正交: 你不必在重写提示和使用位置工程之间做选择。你可以两者兼得。
  3. 更简单的优化: 搜索最佳整数 (间隙数量) 在数学上比搜索最佳英语句子要容易得多。

结论

论文《Position Engineering》开启了我们与大语言模型交互的新前沿。它让我们从“文字雕琢”的主观艺术,转向“注意力管理”的更定量的科学。

对于学生和从业者来说,关键要点是:

  • 索引很重要: Token 的位置是一个独特的输入特征,可以独立于文本进行操作。
  • 空间创造焦点: 通过插入索引间隙来解耦提示的不同部分 (指令 vs 数据) ,可以减少干扰并提高准确性。
  • 通用设置: 对于基于 Llama-2 的模型的 RAG 任务,尝试在指令后插入一个大的索引间隙 (~1900) 。

随着模型不断向更大的上下文窗口演进,像位置工程这样的技术可能会成为开发者工具箱中的标准工具——让我们不仅可以通过我们所说的话,还可以通过我们将文字放置在广阔的注意力数学空间中的位置,来引导这些庞大的神经网络。