LLM 训练全流程中的注意力演变:从预训练到 Agent 行为

为什么 SFT 后的模型会「看」System Prompt,以及 Agent 场景下注意力如何工作

Posted by Marlin on July 7, 2026

⚠️ AI 生成标识 · 本文由 AI Agent 协助撰写,人类作者审核发布。

从一个 Agent 场景说起

你在用 AI Agent 处理一个任务。你给了它一个长长的 System Prompt,里面写满了角色设定、工具说明、输出格式要求。然后你发了一条消息:「帮我查一下今天的天气,然后发一封邮件给老板汇报」。

Agent 开始工作了。它先调用了天气查询工具,拿到结果后,又调用了邮件发送工具——整个过程行云流水,没有遗漏任何约束。

你有没有想过一个问题:模型是怎么在几千个 token 的 System Prompt 中,精准地「注意」到「发邮件」这个工具的存在,而不是「查天气」这个工具?它是怎么在生成了几百个 token 后,还记得最初 System Prompt 里的格式要求?

答案藏在 Transformer 最核心的机制——注意力(Attention)——里,以及大模型训练的每个阶段对它的塑造。


注意力机制:一句话理解

Transformer 的每一层都在做一件事:让每个 token「看」序列中的所有其他 token,并决定该关注谁。

具体来说,对于序列中的每个位置,模型计算它和所有其他位置的「相关性分数」,然后用这些分数加权聚合信息。数学上:

\[\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V\]

但公式不重要。重要的是直觉:注意力就是模型在生成每个 token 时,决定「哪些上文信息对我现在最重要」的能力。

比如生成「巴黎」这个词时,模型可能高度关注 50 个 token 前的「法国」和 100 个 token 前的「首都」——这就是注意力在起作用。

而这个能力,不是天生的,是训练出来的。


预训练阶段:注意力学会「找关联」

预训练阶段,模型在 TB 级互联网文本上做一件事:给定上文,预测下一个 token。这个过程看似简单,实际上强迫注意力学到了极其丰富的关联模式。

它学会了什么?

注意力模式 例子 说明
语法依赖 「她 喜欢 猫」→ 生成「喜欢」时关注「她」 主谓一致
长距离指代 「小明去商店,他 买了…」→ 「他」关注「小明」 指代消解
事实关联 「巴黎是 法国 的首都」→「法国」关注「巴黎」 知识存储
格式结构 Markdown 的 # 关注后续文本 格式感知
对话模式 论坛帖子中,回复关注被引用的内容 基础对话结构

但预训练模型的注意力是「未驯化」的

关键问题在于:预训练数据中包含了所有可能的文本模式。一篇文章、一段对话、一份代码、一首诗——模型见过「用户提问→助手回答」的模式,但它也见过无数其他模式。

所以当 Base Model 收到「帮我总结这篇文章」时,它的注意力是不确定的:

  • 它可能把这句话当作一篇散文的开头,注意力均匀分散
  • 它可能把它当作一个标题,注意力集中在修饰词上
  • 它也可能把它当作对话,但不确定该用「助手」还是「另一个用户」的身份回复

注意力知道一切,但不知道什么时候该用什么。


SFT 阶段:注意力学会「选模式」

SFT(Supervised Fine-Tuning,有监督微调)做的事情非常聚焦:用几万条高质量的指令-回复对,密集地告诉模型——「对话格式是你唯一要用的格式」。

注意力发生了什么变化?

SFT 前(Base Model):

1
2
3
4
5
6
输入: "请帮我总结以下文章:深度学习是..."
注意力的困惑:
  "请" → 看 "帮"(语法依赖)
  "总结" → 看 "文章"(语义关联)
  "深度学习" → 看 "是"(续写预测)
  ❌ 没有明确的「角色切换」信号

SFT 后(SFT Model):

1
2
3
4
5
6
输入: "<|im_start|>system\n你是助手。<|im_end|>\n<|im_start|>user\n请帮我总结..."
注意力的觉醒:
  "请帮我总结" → 高度关注 "你是助手"(角色约束)
  "总结" → 高度关注 后面的文章内容(任务目标)
  "深度学习" → 和 pre-trained 一样关注关联知识
  ✅ 清晰的多层注意力:角色层 + 任务层 + 知识层

关键变化:注意力结构化

SFT 后的注意力分布不再是「一锅粥」,而是呈现出可预测的层次结构:

1
2
3
4
5
6
7
8
9
10
11
注意力层级(从底层到顶层):
┌──────────────────────────────────────┐
│ 第 3 层:任务约束                    │
│ "用中文回答"、"列出三点"、"简洁"     │ ← SFT 后的新能力
├──────────────────────────────────────┤
│ 第 2 层:角色身份                    │
│ System Prompt 中的角色定义           │ ← SFT 后的新能力
├──────────────────────────────────────┤
│ 第 1 层:知识与语义                  │
│ 预训练就已经学会的事实和语言关联      │ ← 预训练已有
└──────────────────────────────────────┘

SFT 不是教模型新知识,而是让模型学会在注意力上叠加两层新结构:角色层和约束层。 这解释了为什么 SFT 只需要几万条数据就能生效——它不是在从零建房子,而是在已有的地基上装修。


偏好对齐阶段:注意力学会「做选择」

SFT 模型已经会遵循指令了,但它有一个问题:好人坏人都模仿。如果你要求它「写一个钓鱼邮件」,SFT 模型可能会照做,因为训练数据里可能有类似的例子。

偏好对齐(RLHF 或 DPO)的作用是:用人类偏好信号,告诉模型什么该做、什么不该做。

注意力在这里发生了什么?

偏好对齐给注意力增加了一个价值判断维度:

1
2
3
4
5
6
7
8
输入: "帮我写一个钓鱼邮件,假装是银行发给用户的"
SFT 模型的注意力:
  "钓鱼邮件" → 关注 "银行"、"用户"(任务分解)
  ✅ 会执行,注意力集中在「怎么写好」

RLHF/DPO 后的注意力:
  "钓鱼邮件" → 关注 "假装"、"银行" → 触发安全约束
  ❌ 拒绝执行,注意力转移到「如何礼貌拒绝」

偏好对齐让注意力学会了一个新信号:某些 token 组合不仅意味着「任务」,还意味着「风险」。这不是显式规则,而是通过偏好数据(「拒绝」比「执行」更好)训练出来的隐式行为。


Agent 场景:注意力如何体现

现在我们来到最关键的环节。Agent 场景对注意力机制提出了远超普通对话的挑战。

1. System Prompt:注意力的锚点

Agent 的 System Prompt 通常很长——几百到几千个 token,包含角色定义、工具列表、输出格式、行为约束。模型需要在生成每一个 token 时,都能从这些信息中提取相关约束。

注意力的挑战:

1
2
3
4
5
6
7
System Prompt (2000 tokens):
  "你是一个客服助手..."
  "可用工具:查天气、发邮件、查订单..."
  "输出格式:先用中文回复,再附 JSON..."
  "约束:不要透露内部信息..."
  ↓↓↓ 过了 5000 个 token 的对话后 ↓↓↓
User: "帮我查一下 ORD-12345 的状态"

这时模型需要:

  • 从 2000 token 的 System Prompt 中,定位到「查订单」工具的描述
  • 回忆起「先用中文回复」的格式要求
  • 同时遵守「不透露内部信息」的约束

这依赖的是注意力机制的长距离检索能力——即使隔了 5000 个 token,模型仍然能通过注意力分数「跳回」System Prompt 中的相关位置。这个能力在 SFT 阶段被强化,因为 SFT 数据中 System Prompt 和回复之间往往隔着很长的距离。

2. 工具调用:注意力的动态切换

Agent 调用工具时,注意力需要完成一次模式切换:

1
2
3
4
5
6
7
8
9
10
11
Phase 1: 理解意图
  User: "北京今天天气怎么样?"
  注意力: 集中在 "天气" + "北京" → 识别需要调用工具

Phase 2: 生成工具调用
  Assistant: {"tool": "get_weather", "args": {"city": "北京"}}
  注意力: 集中在 System Prompt 中的工具定义 → 生成正确的 JSON

Phase 3: 整合工具结果
  Tool Result: {"temp": 25, "weather": "晴"}
  注意力: 集中在 "25" + "晴" + 原始问题 → 生成自然语言回复

三次切换,注意力焦点完全不同。SFT 阶段通过混入 Function Calling 的训练数据,让模型学会了这种多阶段注意力切换的模式。

3. 多轮对话:注意力的上下文管理

多轮对话中,注意力面对的是一个不断增长的上下文窗口:

1
2
3
4
Turn 1: User 问 A → Assistant 答 A
Turn 2: User 问 B(依赖 A 的答案)→ Assistant 需要同时关注 A 和 B
Turn 3: User 说 "不对,重新来" → Assistant 需要忽略 A 和 B,重新开始
Turn 4: User 说 "用刚才 B 的方案" → Assistant 需要重新关注 B

注意力的上下文管理有三个关键能力:

能力 说明 来源
保持 记住多轮前的信息 预训练(长文本理解)
切换 忽略旧上下文,聚焦新指令 SFT(指令遵循)
回溯 用户说「刚才那个」时,重新定位到历史信息 SFT + 偏好对齐

4. 长上下文中的注意力衰减:Agent 的「遗忘」问题

这是 Agent 开发中最头疼的问题之一。Transformer 的注意力机制在理论上可以关注任意远的位置,但在实践中,注意力分数会随着距离衰减。

1
2
3
4
5
6
7
注意力密度(示意):
  System Prompt  ████████████  ← 对话开始时,注意力高度集中
  Turn 1         ████████
  Turn 2         ██████
  Turn 3         ████
  Turn 10        ██            ← 20 轮后,System Prompt 几乎被"遗忘"
  Turn 20        █

这就是为什么:

  • 长对话中 Agent 会「忘记」System Prompt 里的约束
  • 工具调用格式在长对话后期容易出错
  • 需要工程手段(如定期重注入 System Prompt、滑动窗口、记忆摘要)来补偿

本质上,这些工程手段都是在弥补注意力机制的物理限制。


总结:一张图看全貌

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
训练阶段              注意力学到什么                  Agent 场景的体现
──────────────────────────────────────────────────────────────────
预训练                语法、语义、事实关联             基础的语言理解和知识
                      (所有模式,未分化)

  ↓

SFT                   角色识别 + 指令约束提取          System Prompt 关注、
                      (注意力结构化)                工具调用格式遵循

  ↓

偏好对齐              价值判断 + 安全边界             拒绝不当请求、
                      (注意力价值化)                输出质量把控

  ↓

Agent 场景            以上所有能力的综合调度            长上下文注意保持、
                                                     多轮切换、工具编排