⚠️ 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 场景 以上所有能力的综合调度 长上下文注意保持、
多轮切换、工具编排