Skip to content

上下文熵增与 Claude Code 架构拆解

Agent 在长线任务中"变笨"不是模型降级,而是缺乏上下文治理。本文拆解上下文熵增的三种污染机制,并以 Claude Code 为例解析工业级的上下文工程架构,适合关注 AI 编程工具设计和 Agent 系统工程的开发者。

目录


核心矛盾:上下文不是仓库,是工作台

上下文熵增(Context Entropy)

在一个缺乏状态管理的线性对话流中,随着信息堆叠,有效指令的权重会被迅速稀释。这就是「上下文熵增」。

关键认知:上下文的本质更像 CPU 高速缓存(L1 Cache),而不是底层机械硬盘。

             上下文的本质

  误以为:上下文 = 仓库(越大越好,能存多少存多少)
  实际上:上下文 = 工作台(面积再大,堆满杂物也一样干不了活)

  高速缓存的衡量标准从来不是容量
  而是「命中率」——核心指令能否被高效检索
类比 仓库模式(错误) 工作台模式(正确)
核心指标 容量大小 命中率(Hit Rate)
管理方式 无限堆叠 主动清理、分区
失败模式 空间不够 噪音淹没信号
扩容效果 线性提升 边际递减

为什么大窗口不是免死金牌

Anthropic 官方指南的核心原则:

"找到最小可能的高信噪比 token 集合,最大化期望结果的出现概率。"

Transformers 的自注意力(Self-Attention)机制决定了:每增加一个 token,都在消耗模型的「注意力预算」。上下文是有限资源,边际收益递减

上海交大论文的实证数据:当上下文窗口填充率超过 50% 时,AI 性能就会下降。


上下文熵增的三种污染机制

1. 指令权重衰减(Instruction Authority Decay)

对话线性增长时,最初定下的核心约束和项目边界会被中间交互层覆盖。模型的注意力机制有天然衰减上限,指令的有效权重一旦掉到决策基准以下,基准就开始漂移。

对话轮次:  1        10       20       50       100
指令权重:  ████████ ████░░░░ ██░░░░░░ █░░░░░░░ ░░░░░░░░
           ↑
           核心约束(如"只用 TypeScript")权重持续衰减

2. 工具输出熵增(Tool Output Entropy)

让 AI 调工具、跑脚本、查日志,返回结果动辄几千上万。如果系统不具备流量控制和摘要过滤,主线上下文瞬间被冗长数据和报错淹没,信噪比急剧下降。

3. 缓存结构失效(Cache Structure Invalidation)

推理引擎依赖前缀缓存(Prefix Cache)来降本提效,这要求开头部分保持稳定。在纯聊天场景里,新指令不断往后堆,旧的上下文可能被动态截断或重组——好不容易攒下的缓存命中率直接归零。

前缀缓存依赖稳定的 token 前缀

  理想情况:
  [System Prompt ──────][稳定的对话开头 ──────][新内容]
   ↑ 缓存命中区域                              ↑ 变化区域

  实际情况(无治理):
  [新指令插入][旧上下文被截断][系统重排 ────────]
   ↑ 缓存全部失效!算力成本飙升

三种机制的叠加效应

污染机制 直接后果 根因
指令权重衰减 Agent 偏离核心目标 注意力机制衰减上限
工具输出膨胀 信噪比暴跌 缺乏流量控制
缓存结构失效 算力成本灾难 前缀被破坏

所谓的「AI 幻觉」或「逻辑断层」,放到工程视角下就是一场典型的分布式系统事故


Claude Code 的三大治理机制

Claude Code(~512K 行 TypeScript,1,884 文件)的架构分析揭示:约 1.6% 是 AI 决策逻辑,98.4% 是工程约束体系。13 条设计原则围绕一个核心:上下文是最稀缺的资源。

机制一:CLAUDE.md — 不可变原指令注入

建立一套不可变的前缀指令注入机制。不管对话链条拉到多长,项目的核心依赖、目录结构和编码规范都会作为高优先级前缀强制注入。

                    Claude Code 上下文装配

  ┌─────────────────────────────────────┐
  │ CLAUDE.md(不可变前缀)               │  ← 始终在窗口顶部
  │ - 项目依赖、目录结构、编码规范          │
  │ - 编码约定、测试命令                   │
  ├─────────────────────────────────────┤
  │ Skills(按需加载)                    │  ← 匹配时注入
  │ - 领域知识、工具使用流程               │
  ├─────────────────────────────────────┤
  │ 对话历史(可控衰减)                   │  ← Compact 压缩
  ├─────────────────────────────────────┤
  │ 工具输出(摘要返回)                  │  ← 子代理隔离
  └─────────────────────────────────────┘

本质:给 Agent 设一个「认知底座」,防止在海量交互中发生方向性漂移。

机制二:子代理(Subagent)— 物理层隔离

子代理(Subagent)拥有独立的上下文窗口和执行循环,主线 Agent 只接收处理完的高纯度结论,而不必亲自跳进垃圾堆里检索。

                    子代理的信息隔离模型

  主线 Agent(干净的上下文)        子代理(承受噪音)
  ┌──────────────┐              ┌──────────────────┐
  │ 核心目标清晰  │  ← 摘要返回 ← │ 翻日志、查源码     │
  │ 高信噪比     │              │ 跑测试、读大量文件   │
  │ 缓存稳定     │              │ 噪音被隔离在此层    │
  └──────────────┘              └──────────────────┘

  对比:
  ❌ 无隔离:主线上下文 = 工具输出 10,000 行 → 信号被淹没
  ✅ 有隔离:主线上下文 += 摘要 50 行    → 信号清晰

子代理 vs 自定义 Slash Command 的选择框架:

选子代理 选 Slash Command
生成的内容与当前对话不相关 生成的内容应该在当前对话中
不需要洞察执行过程 需要可见的执行过程
上下文昂贵的任务 轻量操作

机制三:Compact — 有损压缩与状态快照

当对话过长时,系统对当前任务状态进行重建而非简单截断

Compact 的状态重建逻辑

  输入(膨胀的对话历史)          输出(结构化状态快照)
  ┌────────────────────┐      ┌─────────────────────┐
  │ 100+ 轮对话         │      │ 当前目标是什么?       │
  │ 大量工具输出         │  →   │ 已验证的路径是什么?    │
  │ 重复的报错          │      │ 失败的路线是什么?      │
  │ 无关讨论            │      │ 关键文件列表(最近5个)  │
  └────────────────────┘      └─────────────────────┘

这不仅是解决上下文拥挤——更重要的是通过固定关键指令的前缀结构,优化了缓存命中概率。在生产级场景里,算力延迟和推理成本才是系统持续运转的关键。

三大机制 vs 三种污染的对应关系

污染机制 Claude Code 解法 设计原则
指令权重衰减 CLAUDE.md 不可变前缀注入 Context as scarce resource
工具输出熵增 子代理物理隔离 + 摘要返回 Isolated subagent boundaries
缓存结构失效 Compact 状态快照 + 前缀稳定化 Append-only durable state

读取密集 vs 写入密集:大窗口的适用边界

大窗口在特定领域确实是刚需,但需要区分两种截然不同的场景:

场景选择决策树

大窗口适合你吗?
│
├─ 你的任务是?
│  ├─ "一次读取几万行源码做全量审查" → 读取密集型
│  │   ✅ 大窗口 = 救命稻草,全塞进内存提升全局理解
│  │
│  └─ "真实开发,边读边写" → 写入密集型
│      ⚠️ 窗口越大 × 无治理 = 噪音越多
│      ✅ 大窗口只是入场券,不是免死金牌
维度 读取密集型 写入密集型
典型场景 代码审查、合同分析 日常开发、系统迁移
信息流向 单向(读入) 双向(读 + 写 + 错误)
上下文增长 可控 指数级膨胀
大窗口效果 显著提升 无治理反而更差
关键需求 容量 治理机制

行业判断:上下文工程决定 Agent 上限

从 Prompt Engineering 到 Context Engineering

AI 能力演进路径

  Prompt Engineering(选对词)     →  一个 turn 内的准确率
  Context Engineering(管好信息)   →  连续 100 次 turn 的稳定率
  State Management(维护状态)      →  Agent 长期运行的可靠性

  核心转变:
  "AI 不再是陪你扯淡的秘书,而是一个需要被精密管理的独立进程"

决胜点判断

  • 模型能力决定他能答对一轮题
  • 上下文工程决定他能连续稳定运行 100 次接口调用
  • 未来被淘汰的绝对不是笨模型,而是只懂往上下文塞 token,不懂清理和分区的产品

最佳实践清单

  • ✅ 用 CLAUDE.md / 项目规范文件建立不可变的认知底座
  • ✅ 高噪音任务(翻日志、跑测试)通过子代理隔离
  • ✅ 定期 Compact,保持上下文高信噪比
  • ✅ 工具返回结果做摘要过滤,不全量灌入
  • ❌ 把大窗口当仓库,无限堆叠信息
  • ❌ 混用不同场景:读取密集和写入密集需要不同策略
  • ❌ 期待子代理纠正不清晰的目标(先明确再委托)

参考资料

相关笔记

  • [[Claude Code]]
  • [[AI Agent]]
  • [[上下文工程]]