乐于分享
好东西不私藏

注意力机制是什么?为什么OpenClaw用太多Skill会「分心」?

注意力机制是什么?为什么OpenClaw用太多Skill会「分心」?

你有没有想过一个问题:AI 是怎么决定「该看哪里」的?


从「耳背」到「耳聪目明」

想象一个场景:你在嘈杂的咖啡厅里和朋友聊天。周围有人在打电话、咖啡机在轰鸣、背景音乐在循环播放——但你可以忽略所有噪音,只专注于朋友说的每一句话

这就是注意力——人类大脑最强大的过滤机制之一。

那 AI 呢?

早期的 AI 模型有个巨大的痛点:它不会「挑重点」。无论是翻译一句话、理解一段文本,它会「一视同仁」地看待所有信息。就像一个人竖着耳朵想听清咖啡厅里所有人的所有对话——结果就是什么都听不清楚。

直到 2017 年,Google 的论文《Attention Is All You Need》带来了 Transformer 架构,提出了注意力机制(Attention Mechanism)——从此,AI 学会了「集中注意力」。


⚠️ 先说清楚:「两个注意力」不是一回事

很多人会把「注意力机制」当成一个笼统的概念来聊,但实际上在 AI Agent 的上下文里,它出现在两个完全不同的层级上:

层级 位置 作用 是否能干预
第一层:模型内核注意力 Transformer 神经网络内部 理解文本语义、绑定长距离词语关联 ❌ 无法人为删减
第二层:Agent 任务侧注意力 Prompt 上下文(输入序列) 筛选技能、判断该调用哪个工具 ✅ 可以通过优化 Skill 配置来改善

关键点:这两层的数学公式完全一样(缩放点积自注意力),但一个是神经网络内部的「思考方式」,一个是你喂给模型的内容质量——后者才是我们真正能动手优化的地方。

下面先讲清楚底层机制,再说上层应用。


注意力机制到底是个啥?

一句话解释

注意力机制 = 让模型学会「该看哪里」

具体来说,当 AI 处理输入序列中的某个元素时,它会计算这个元素跟序列中所有其他元素的「关联度」,然后根据关联度加权汇总。

核心公式

Attention(Q, K, V) = softmax(Q × K^T / √d) × V

它的运作逻辑非常直观:

  • Q(Query):相当于「我想找什么」
  • K(Key):相当于「我有什么信息」
  • V(Value):相当于「信息本身」
  • softmax:把关联度归一化为权重(0~1 之间,总和为 1)

模型用 Q 去匹配所有 K,算出关联分数,然后用 softmax 转成权重,最后用权重对 V 做加权求和——注意力就这么完成了。

多头注意力:不止一双眼睛

大模型用的是多头注意力(Multi-Head Attention)——不是只关注一个维度,而是用多组 Q/K/V 从不同角度同时打分。

这意味着:少量冗余 Skill 会被部分注意力头自动过滤。比如一个头在关注「用户问的是不是搜索类问题」,另一个头在关注「有没有匹配的关键词」,第三个头在关注「文本长度是否异常」——多头协作下,少量无关 Skill 对整体决策的影响其实有限。

极端冗余时,再多头也会集体失效——就像一个团队,如果 80% 的会议内容跟你的工作无关,那不管分了多少个讨论组,整体效率都会被拖垮。

为什么 RNN 做不到?

在 Transformer 之前,主流模型是 RNN(循环神经网络)。它的结构是逐时序串行的:

词1 → 词2 → 词3 → … → 词N

这意味着信息必须沿着时间步逐级传递,梯度随距离衰减——既没法并行训练,又难以建立远距离词语关联。

Transformer 的注意力机制一次性看到所有词,彻底解决了这两个问题——这也是 GPT、Claude 等大模型能训练出来的根本原因。


回到现实:OpenClaw 的 Skill 系统

聊完注意力机制,我们来看看 OpenClaw。

OpenClaw 有一个强大的 Skill 系统——你可以给 AI 安装各种「技能包」。但这里有个关键的区别,很多人的理解是错的:

❌ 常见误区

「OpenClaw 每次发消息,会把所有 Skill 的名字和完整说明全部塞进上下文窗口。」

这不是 OpenClaw 的默认行为。

✅ 实际机制:三级渐进式披露(Progressive Disclosure)

OpenClaw 原生采用分层加载策略,不会一次性灌入全量详情:

第一级(常驻上下文 — 仅元数据名片)
  仅注入:技能名 + 一句话极简描述
  每个 Skill 仅 20~30 Token
  50 个 Skill 常驻约 1,000~1,500 Token
  └─ 例:「web_search」← 搜索网页

第二级(按需加载正文)
  只有当模型判定「要调用这个 Skill」时,
  才把 SKILL.md 的详细说明临时载入上下文

第三级(参考文档延迟加载)
  配套的参考资料、代码示例等,
  只有在调用执行后才读取,不进初始 Prompt

以 50 个 Skill 为例:一级名片只占 1,000~1,500 Token,对现代大模型(128K 上下文)来说几乎可以忽略。只有把全部 SKILL.md 详情写进系统提示词——这才是错误配置,不是原生设计缺陷。

关于 FlashAttention

这里补充一个容易混淆的概念:FlashAttention 是显存访问优化,它加速了稠密注意力的计算过程,但不改变「所有 Token 两两计算」的稠密逻辑。它不等于稀疏注意力,不减少计算量。

稠密注意力 vs 稀疏注意力

不同大模型的注意力实现有差异:

注意力类型 原理 代表模型
标准稠密全局注意力 所有 Token 两两计算关联度 GPT-4(FFN 层为 MoE 稀疏路由,但注意力层仍是稠密全局)、Claude 全系(无原生滑动窗口)
稀疏/滑动窗口注意力 只计算局部窗口内 Token Longformer、BigBird、GPT-4o Long / Claude 3.5 Long(长上下文版本)

多数商用闭源大模型的默认基座是稠密全局注意力,不是稀疏注意力。所以:

  • 基础版模型 → 所有 Skill 名片 Token 都参与全量注意力运算
  • 长上下文版本 → 内置滑动窗口优化,局部窗口外的 Token 免于全量计算

这一差异意味着:在基础版模型下,冗余 Skill 的算力损耗更明显。


三种「分心」方式

🎯 决策噪音

假设你给 AI 配置了 100 个 Skill,每个名片 2030 Token,加起来约 2,0003,000 Token。AI 每次推理都要在这几千 Token 上做注意力运算——哪怕最后全都打了低分,算力已经被消耗了

但关键的分界点在于正确配置 vs 错误配置

【正确配置】三级加载 + 精简名片 + 分类路由
  → 200~300 个 Skill 也几乎不分心
  → 一级名片总 Token 约 4,000~9,000,大模型轻松处理

【错误配置】全量 SKILL.md 详情塞进系统提示词
  → 哪怕只有 10 个 Skill,每个详情几千 Token
  → 总 Token 轻松超过 50,000+,注意力必然爆炸

📊 行业实证参考:arXiv:2603.29919《SkillReducer》论文实测,绝大多数开源 Skill 的描述文本中,约 60% 是非有效、无动作的冗余内容(论文原文释义:单条 Skill 自身描述 60% 为冗余文本)。当这类冗余内容在整体输入中占比过高时,注意力才会被显著稀释。

📉 上下文被稀释

注意力计算有一个无法回避的特性:所有输入 Token 都必须参与 QK 点积、softmax 打分,再加权 V——即使某个 Token 的最终权重趋近于 0,全序列打分的矩阵运算开销已经产生。

这意味着:只要进了上下文,就得被算一遍。

好钢要用在刀刃上——把 Token 省下来给核心推理,而不是浪费在扫描几十个不相关的 Skill 名片上。

🤔 选择困难

有时候多个 Skill 看起来都能解决同一个问题。AI 可能会陷入「选择困难症」:

  • web_search 还是 web_fetch
  • image_generate 还是 video_generate

多加一个 Skill = 多一个决策分支。分支过多时,注意力被分散,决策质量确实可能下降。


一个类比:瑞士军刀综合征

想象你要开一个罐头:

  • 一把锋利的开罐器 → 直接解决问题 ✅
  • 一把 50 功能的瑞士军刀 → 先翻找半天,找到那个小小的开罐功能,可能还不好使 ❌

但注意——瑞士军刀不是越多越乱,而是需要分类收纳

如果你把 50 个功能都摊在桌面上乱糟糟堆在一起,确实会分心。但如果把它们整理好:

  • 开罐区 → 开罐器
  • 切割区 → 主刀、小刀
  • 螺丝区 → 各型号螺丝刀

分类收纳 + 分层加载的情况下,200~300 个 Skill 也不会分心。真正的问题永远是:「全部详情一次性灌入上下文」


如何优化?给 OpenClaw 做「注意力管理」

1️⃣ 标签路由(技能过滤)

分两种情况讨论:

【原生能力 — 单技能触发关键词】
每个 Skill 可以配置 trigger_phrases,当用户输入匹配时,该 Skill 优先激活。这是框架自带的基础能力。

【插件扩展 — 批量分类路由】
如果需要「按标签全局前置过滤」(如用户问搜索类问题→只载入搜索类技能),需要加装社区插件(如 Skill Quick Index / Auto Router),并非原生自带。

推荐做法:先用原生 trigger_phrases 管好高频技能,量大了再用插件做批量路由。

2️⃣ 精简描述标准化

统一格式,避免冗余背景介绍:

❌ 坏例子:「这个 Skill 可以用来搜索互联网上的各种信息,返回格式为……」
✅ 好例子:「搜索网页。」

对标 SkillReducer 工业级压缩规范:每个 Skill 元数据控制在 30 Token 以内。

3️⃣ 三级加载优化(原生能力)

层级 触发条件 内容
一级(名片常驻) 始终 技能名 + 一句话动作(20~30 Token)
二级(匹配后加载) AI 判断需调用某 Skill SKILL.md 详细说明
三级(失败后加载) 调用执行失败或需参考 配套文档 / 代码示例

4️⃣ 定期清理 + 技能拆分

除了常规的「弃用删除」和「重复合并」,还有一条容易被忽略的优化:

技能拆分: 一个大 Skill 拆成多个细分小技能,避免单条描述过长。

比如一个「数据处理」大 Skill,拆成「Excel 读取」「CSV 分析」「图表生成」三个独立 Skill,每个的元数据更短、匹配更精准,反而降低了单次输入的 Token 占用。


横向对比:OpenAI Function Calling 更容易「分心」

了解完 OpenClaw 的三级渐进披露设计后,把它和主流的替代方案做个对比,你会更清楚这个设计的价值:

方案 工具描述加载方式 每次推理 Token 消耗 分心风险
OpenAI Chat Completion API 全量工具 JSON Schema 进上下文 每次都是 全部工具描述的完整 JSON 🔴 高 — 原生易分心
OpenAI Assistants API 工具定义绑定助手实例,平台缓存 底层仍携带全量工具描述,不改变逐次推理需参与注意力运算的事实 🔴 同上
OpenClaw 三级披露 一级名片 → 按需 → 延迟 一级仅 20~30 Token/个 🟢 低 — 原生设计优势

为什么 Function Calling 更容易分心? 因为 OpenAI 要求把所有 Function 的完整 JSON Schema(名称、描述、参数结构、枚举值)一次性全部塞入 messages 的 tools 字段,没有分层加载机制。Assistants API 虽然缓存了工具定义,但底层推理时全量工具描述依然参与注意力运算。

市面上也有第三方工具对 Function Calling 做预处理筛选工具子集,但不属于 OpenAI 原生能力。

对比之下,OpenClaw 的三级渐进式披露就是针对这个问题做的设计优化——把「不分心」作为设计目标,而不是事后补救。


总结

维度 正确配置 错误配置
一级名片 Token 200300 Skill ≈ 6,0009,000 Token 10 个 Skill 详情 ≈ 50,000+ Token
分心风险 🟢 几乎不分心 🔴 注意力爆炸
关键 三级加载 + 精简名片 + 路由 全量详情塞进系统提示词
概念 核心要点
模型内核注意力 Transformer 内部稠密全局运算,理解文本语义,无法人为干预
任务侧注意力 Prompt 中的 Skill 描述影响模型筛选工具的决策质量
FlashAttention 显存加速优化,不改变「稠密全量计算」的算法逻辑
注意力计算特性 所有输入 Token 都必须参与全序列运算,权重趋零但开销已产生
OpenClaw 原生机制 三级渐进式披露,一级名片仅 20~30 Token/个,非全量加载
Function Calling 对比 Chat Completion API 全量传入,Assistants API 底层同理,都更容易分心
优化方向 精简名片、三级加载、原生 trigger_phrases + 插件路由

注意力是稀缺资源,无论是对于人类,还是对于 AI。

大模型的底层注意力机制是一个非常优雅的数学设计——它让 AI 学会了「动态聚焦」。但再好的聚焦能力,也架不住你往它面前堆满无关信息。

与其说是「注意力不够强」,不如说是「信息过载太严重」

这也是为什么 System 2 Thinking(慢思考)的核心之一就是先过滤,再思考——先把无关噪音去掉,再把宝贵的注意力留给真正重要的事情。

而 OpenClaw 的三级渐进式披露设计,本质上就是在做这件事:把正确的信息,在正确的时机,以正确的方式交给 AI


本文由 OpenClaw 研习社出品,带你用好 OpenClaw,用好 AI。 📮 关注我们,获取更多 AI 工具使用技巧。