上下文工程:AI 的战略级内存 (RAM)
在生成式 AI 革命的早期,整个行业都沉迷于“参数量”。我们通过模型神经架构中数以十亿计甚至万亿计的权重来衡量进度。但到了 2026 年,共识已经发生了转变。站在 Gemini 3.0 和 Claude 4 的时代,我们意识到,如果没有高保真、低延迟的“工作记忆(Working Memory)”,原始的智能是毫无用处的。
欢迎来到**上下文工程(Context Engineering)**时代。如果说大语言模型(LLM)是 CPU,那么上下文就是 RAM。正如在传统计算中一样,我们管理这种“内存”的方式,定义了系统实际能够完成的任务上限。
引言:作为智能瓶颈的上下文
多年来,我们一直把上下文窗口(Context Window)当成“杂物抽屉”。如果一个模型支持 128K token,我们就试图将 128K token 的原始文本塞进去,然后祈祷最好的结果。然而,结果往往差强人意:幻觉、忽略指令以及“记忆中断”。
2025 年的“苦涩教训(Bitter Lesson)”教会了我们:智能不仅是模型规模的函数,更是**信息密度(Information Density)**的函数。如果一个拥有 200 万 token 上下文的模型必须在 190 万 token 的噪声中进行筛选,它并不会变得更“聪明”。上下文工程是一门外科手术般精确地组装最佳提示词状态,以最大化模型推理能力的学科。它是从“检索增强生成(RAG)”向“上下文优化推理(Context-Optimized Reasoning)”的转型。在这个新范式中,我们优先考虑提示词的信噪比(SNR),并认识到每一个无关的 token 都是对模型认知带宽的征税。
超越 RAG:长上下文语境学习(ICL)的兴起
在 2024 年,检索增强生成(RAG)曾是王者。我们将文档切成 500 token 的块,存储在向量数据库中,并检索最匹配的前 5 个块。这是源于当时较小的上下文窗口(8K 到 32K token)的权宜之计。
然而,由 Google 的 Gemini 1.5 Pro 开创,并在 Gemini 2.0 和 3.0 的 200 万+ token 窗口中日臻完善的**长上下文语境学习(Long-Context ICL)**的兴起,彻底改变了博弈规则。当你能将包含 50,000 个文件的整个代码库放入单个提示词时,传统的 RAG “切块(Chunking)”策略反而成了累赘。切块破坏了文件之间的结构化关系,丢失了代码库的“结缔组织”。
2026 年的视角:我们不再只是“检索切块”,而是“策划环境(Curate Environments)”。长上下文模型允许进行 RAG 永远无法实现的全局推理。例如,模型现在可以识别出前端 React 组件与后端 Go 服务之间微妙的架构不一致,因为它同时“看到”了两 者,而不是将它们视为孤立的碎片。这实现了我们所谓的“全栈调试(Holistic Debugging)”,即模型可以在单次推理过程中追踪整个技术栈的数据流。
“中间位置丢失”问题:注意力衰减分析
尽管 2026 年的模型拥有海量窗口,但 Transformer 架构的基本物理特性依然存在:注意力(Attention)是一种有限的资源。
来自 Anthropic(Claude 4)和 Google(Gemini 3)的研究确认,模型依然表现出“U 形”性能曲线。放置在上下文最开始(系统提示词)和最末尾(用户查询)的信息能得到高精度处理。然而,埋藏在中间的信息往往会遭受**注意力衰减(Attention Decay)的影响,这就是著名的“中间位置丢失(Lost in the Middle)”**现象。
从分析角度看,这是由于注意力机制中的 Softmax 归一化导致的。在一个 100 万 token 的序列中,中间位置的一个相关 token 必须与另外 999,999 个 token 竞争注意力权重的份额。此外,存储注意力状态的**KV 缓存(KV Cache)**随着序列长度的增加而变得越来越“嘈杂”。长程依赖必须跨越数百层自注意力,如果没有显式的强化,信号往往会消散。
工程解决方案:我们现在使用注意力感知排序(Attention-Aware Ranking)。我们不仅仅提供相关信息,还将最关键的“推理锚点(Reasoning Anchors)”——如核心 API 定义或关键约束——放置在上下文窗口的外围。通过将“沉重”的数据夹在开头和结尾的高重要性锚点之间,我们利用模型的架构偏置,确保注意力始终集中在最重要的位置。
上下文剪枝:算法级 Token 削减与噪声过滤
如果说上下文是 RAM,那么**上下文剪枝(Context Pruning)**就是我们的垃圾回收器。在 2026 年,我们不再向模型发送原始文件。我们使用“剪枝代理(Pruner Agents)”——轻量级模型(如 Gemini Nano 或专门的基于 BERT 的评分器)——在昂贵的推理模型看到内容之前过滤噪声。
常见的剪枝技术包括:
- 语义压缩(Semantic Compression): 将冗长的日志、重复的模板代码或冗余的单元测试替换为高层级的语义描述。我们发现,将 100 行日志描述为“无错误的 Standard OAuth2 成功流程”可以节省 95% 的 token,同时保留 100% 的有用信号。
- H2O (Heavy Hitter Oracle): 该算法识别“重击者(Heavy Hitter)”token,即在多个层中始终获得高注意力分数的 token。通过仅保留这些“架构级”token 并修剪“填充物”,我们可以在最小化推理准确率损失的情况下将序列压缩 5 倍。
- StreamingLLM 模式: 对于长对话,我们使用滚动 KV 缓存窗口,保留“锚点 token”(提示词的前几个 token)和最近的 N 个 token,确保模型永远不会丢失其基础指令或即时语境。
- 增量上下文(Delta-Contextualization): 与其发送整个文件,我们只发送相对于已缓存 版本的“差异(diffs)”。这类似于视频压缩(P 帧 vs. I 帧),极大地降低了输入 token 的成本。
层级化摘要:库与代码库的表达
如何在不耗尽上下文预算的情况下表达一个 100 万行的代码库?答案是层级化摘要(Hierarchical Summarization)。
在 AiDIY 项目中,我们实现了一种“摘要树(Tree-of-Summaries)”方法,提供信息的“渐进式披露”:
- L0 (根节点): 一个 100 token 的架构宣言,描述项目的技术栈和核心设计模式。
- L1 (模块级): 对每个主要模块的职责及其公共 API 表面的 500 token 摘要。
- L2 (文件级): 提取的“骨架”——函数签名、类定义和文档字符串,而不包含实现细节。
- L3 (局部级): 正在积极修改的特定文件或代码块的原始、高保真代码。
这允许 Agent 通过 L0-L2 拥有“全局感知”,同时通过 L3 保持“局部精度”。这种层级结构模仿了人类工程师导航代码的方式——我们并不记忆每一行,而是根据心理地图进行导航。当 Agent 需要某个 L1 模块的更多细节时,它会“向下钻取(Drill Down)”,按需将 L2 骨架替换为 L3 代码。
