Skip to content

03.2 注意力分布与位置效应

同一句话,放在不同位置,效果差好几倍。这一章解释为什么,以及怎么利用。

读完你能做什么:设计出一个"重要内容都在高权重位置"的上下文布局。


一、位置效应的经验形状

在长上下文中,模型对不同位置内容的有效利用率,大致呈现这样一条曲线:

text
利用率
  高 │ ●                                        ●
     │  ●                                      ●
     │   ●                                    ●
     │     ●                                ●
     │        ●                          ●
     │            ●                  ●
  低 │                ● ● ● ● ● ●
     └─────────────────────────────────────────────→ 位置
      开头            中段(衰减区)            末尾

这个现象在长上下文语言模型研究中被称为 "lost in the middle"(迷失在中段)。它不是 Claude 独有的,而是当前 Transformer 架构的普遍特征。

1.1 三个位置的实际含义

位置特点该放什么
开头高权重,且被后续所有 token 反复参照长参考资料、全局规则、角色设定
中段权重最低,最容易被"读到但没用上"次要背景、可选的补充材料
末尾最高权重,直接影响下一个生成的 token当前任务、输出格式、最关键的约束

二、为什么会这样(机制层面)

不需要理解数学,但需要理解三个直觉:

2.1 注意力是竞争性的

每一层注意力的权重之和是固定的(softmax 归一化)。上下文里有 10 个 token 时,每个平均能分到 10%;有 10,000 个时,每个平均只有 0.01%。

推论:往上下文里加内容,会稀释已有内容的权重。这就是为什么"塞更多相关资料"有时反而让效果变差。

2.2 近因效应来自因果结构

自回归模型是逐 token 生成的。生成第 N 个 token 时,第 N-1 个 token 是最直接的条件。距离越近的内容,在因果链上的路径越短,影响越直接。

推论:你最后说的话,权重最高。这就是"末尾重申关键约束"有效的原因。

2.3 开头有特殊地位

序列开头的 token 在训练中被赋予了特殊角色(形成所谓的 attention sink),它们往往获得较高的注意力权重。同时,系统提示词和早期内容会被后续每一个 token 参照。

推论:全局性、长期有效的内容放开头。


三、五条布局规则

规则 1:长文档在前,问题在后

text
✅ 正确布局
<document>
{80 页报告}
</document>

<task>
总结这份报告的三个核心结论。
</task>
text
❌ 错误布局
请总结这份报告的三个核心结论:

{80 页报告}

差异有多大:在长文档问答任务上,这一个调整通常就能带来明显的准确率提升。原因:问题在末尾时,模型生成第一个答案 token 时,问题就在它"眼前";问题在开头时,中间隔着 80 页内容。

规则 2:关键约束在末尾重申

text
<constraints>
- 所有金额用 BigDecimal
- 不引入新依赖
- 每个改动给出回滚方案
</constraints>

{……其他内容……}

<output_format>
{格式规范}
</output_format>

再次确认:金额计算必须使用 BigDecimal,禁止 double/float。

看起来啰嗦,但对最不能出错的那一条约束,重复的收益远大于成本。

规则 3:多文档时给每份加索引与标题

text
<documents>
  <document index="1" title="2026 Q1 财报" date="2026-04-15">
    ...
  </document>
  <document index="2" title="竞品分析" date="2026-05-20">
    ...
  </document>
  <document index="3" title="用户调研原始数据" date="2026-06-01">
    ...
  </document>
</documents>

<task>
回答问题时,必须标注信息来自 document index 几。
</task>

为什么有效indextitle 是稳定的检索锚点。当模型需要回忆"竞品分析里怎么说的",它有一个明确的标记可以定位,而不是在一大片文本中做模糊搜索。

规则 4:最重要的文档放最前和最后

如果你有 5 份文档,其中第 3 份最关键:

text
❌ doc1, doc2, doc3(关键), doc4, doc5
   → 关键文档正好落在衰减区

✅ doc3(关键), doc1, doc2, doc4, doc5
   → 关键文档在高权重位

✅✅ doc3(关键), doc1, doc2, doc4, doc5, [重申 doc3 的核心要点]
   → 首尾双重加权

规则 5:让模型先"复述"再作答

text
<instructions>
1. 先在 <extracted_quotes> 中逐字摘录文档里与问题直接相关的原文,
   每条标注来源(document index + 章节号)。最多 10 条。
2. 然后在 <answer> 中,仅基于 <extracted_quotes> 作答。
</instructions>

这是对抗中段衰减最强的手段。

机制:摘录动作强制模型把注意力真正投向原文的具体位置。摘录出来的内容会出现在紧邻答案生成位置的地方 —— 相当于把埋在第 40 页的关键句,"搬运"到了权重最高的末尾区域。


四、在 Claude Code 中的应用

4.1 大仓库的读取策略

text
❌ 把 src 下 50 个文件全读进来再分析
   → 关键文件很可能落在中段衰减区

✅ 三阶段:
   1. 用 Glob/Grep 建立索引(只有文件路径和匹配行,成本低)
   2. 让它根据索引挑出 3-5 个最关键的文件精读
   3. 精读结果就在末尾,权重最高

对应的提示词:

text
<instructions>
不要一次读大量文件。按以下顺序:
1. 先用 grep 定位与"对账"相关的所有函数定义,只输出文件路径和函数签名
2. 基于这个清单,告诉我你要精读哪 3 个文件,以及为什么
3. 我确认后你再读
</instructions>

4.2 CLAUDE.md 的内部布局

markdown
# 项目名

<!-- 最重要的放最前 -->
## 绝对规则
- 金额一律 BigDecimal
- 禁止直接改 main 分支

## 构建与测试
```bash
npm run build
npm test
```

## 目录约定
...

## 编码规范
...

<!-- 最重要的在末尾重申 -->
## 提醒
再次强调:金额计算禁止使用浮点类型。

4.3 长会话中的"锚点重置"

当会话超过 30 轮,早期规则开始失效时:

text
> 停一下。重新确认一遍本次任务的三条硬性约束:
  1. 不修改 src/legacy/ 下的任何文件
  2. 每个改动必须有对应的测试
  3. 不引入新的 npm 依赖

  确认你理解后,继续刚才的工作。

这条消息处于末尾高权重位,能有效重置约束的权重。


五、一张布局速查图

text
┌──────────────────────────────────────────┐
│ 【开头 · 高权重】                          │
│  · 系统提示词 / 角色设定                    │
│  · 长参考资料(文档、代码、数据)             │
│  · 全局硬性规则                            │
├──────────────────────────────────────────┤
│ 【中段 · 低权重 —— 谨慎放置】                │
│  · 次要背景                                │
│  · 可选的补充材料                           │
│  · ⚠️ 不要把关键约束放这里                   │
├──────────────────────────────────────────┤
│ 【末尾 · 最高权重】                         │
│  · 本轮具体任务                             │
│  · 输出格式规范                             │
│  · 最关键约束的重申                          │
│  · 「先摘录再作答」的指令                     │
└──────────────────────────────────────────┘

六、一个可以自己验证的实验

想亲眼看到位置效应?做这个实验:

准备:找一份 30 页以上的文档,在第 15 页中间插入一句独特的话,比如:

text
注:本项目的备用联络代号是「蓝鲸七号」。

实验 A(中段):把文档整体贴进去,然后问「本项目的备用联络代号是什么?」

实验 B(末尾锚定):同样贴文档,但改成:

text
<instructions>
1. 先在 <quotes> 中摘录文档里所有提到「代号」的原文
2. 然后回答:本项目的备用联络代号是什么?
</instructions>

在文档足够长时,实验 A 的失败率会明显高于实验 B。这就是"先摘录再作答"的价值 —— 它不改变文档,只改变注意力的投放方式。


延伸阅读

基于 VitePress 构建 · 内容采用原作者授权