上下文工程导论:定义、范畴与设计哲学
第 1 章 上下文工程导论:定义、范畴与设计哲学
1.1 问题的提出:当"长上下文"成为新的系统瓶颈
2023 年至 2024 年间,几乎所有主流大语言模型厂商都将上下文窗口(context window)作为核心卖点进行宣传:32K、128K、200K、1M……窗口数字不断攀升,似乎"上下文"已成为一种可以无限叠加的资源。然而,工程实践迅速揭示了数字背后的一组系统性矛盾:第一,当输入长度从 8K 扩展到 128K 时,标准 Transformer 的自注意力计算量按 $O(n^2)$ 增长,单次推理的算力开销呈平方级膨胀;第二,KV-Cache(Key-Value 缓存)的显存占用随序列长度线性增长,128K 上下文对应的中间状态往往已逼近单卡显存的物理极限;第三,模型在长上下文中的有效利用率显著低于其在短上下文中的表现,所谓的"大海捞针"(Needle-in-a-Haystack, NIAH)测试在真实任务中往往难以复现。
这些现象共同指向一个被工业界长期低估的命题:上下文不是"越多越好"的资源,而是一个必须在算力、内存、延迟三重物理约束下被精心设计的系统对象。"上下文工程"(Context Engineering)正是为回应这一命题而诞生的独立学科方向。它不再把上下文视为模型隐式吸收的"提示语料",而是将其视为一种需要被显式建模、压缩、检索、调度与版本化的工程对象。
本章的核心问题是:在算力、内存、延迟三重约束下,如何形式化地定义"上下文",并建立通用的设计原则? 围绕这一核心问题,本章将依次完成四项工作:第一,给出"上下文"的形式化定义;第二,澄清上下文工程与提示工程、检索增强生成(RAG)、智能体(Agent)等相邻概念的边界;第三,从计算复杂性、信息论与认知科学三个视角论证长上下文管理的非平凡性;第四,提出贯穿全书的"五元组"分析框架——容量、密度、相关性、时效性、一致性。
1.2 上下文的本体论:一种工程导向的形式化定义
在自然语言中,"上下文"是一个被过度使用的词。它可以指代一段对话历史、一份文档、一组检索结果,甚至一段隐含的世界知识。这种语义上的泛用性给学术讨论带来了极大困扰。上下文工程的起点,正是对"上下文"作一次精确的形式化切分。
我们采用如下定义:上下文(Context)是大语言模型在一次前向推理中可直接访问的全部输入信号及其编码后的内部表示的集合,记为 $C = (X, K, V, M)$,其中 $X$ 为当前轮的原始输入文本序列,$K$ 与 $V$ 为自注意力机制中维护的键(Key)与值(Value)缓存,$M$ 为系统级元信息(包括系统提示、工具描述、权限声明、对话元数据等)。
这一定义有三点关键设计。第一,它不把上下文等同于"提示词"(prompt)。提示词只是 $X$ 的一个子集,而上下文还包括系统在 $X$ 之外注入的所有可被模型直接读取的信号。第二,它显式承认了 $K$ 与 $V$ 的存在。$K$ 与 $V$ 是模型在预填充(prefill)阶段生成、在解码阶段逐 token 复用的内部状态,其规模直接决定推理时的显存占用与吞吐能力,因此必须被纳入上下文的本体。第三,它把"系统级元信息"作为第一类公民独立列出。在多智能体、工具调用、权限管理等场景中,$M$ 往往比 $X$ 更难被压缩、检索与版本化。
基于上述定义,可以进一步给出有效上下文(Effective Context)与可用上下文(Available Context)的区分。可用上下文是模型架构所允许的最大输入长度,例如 128K tokens;有效上下文是模型在该长度下能够稳定、正确利用的输入子集,它由训练分布、注意力机制、位置编码与任务结构共同决定。大量经验数据表明,有效上下文 ≪ 可用上下文——例如多数模型在超过其宣称窗口的 20%–40% 之后,准确率便开始显著下降。这一区分是上下文工程区别于"提示工程"的关键:提示工程关心如何把任务写进 $X$,而上下文工程关心如何让 $|C|$ 在物理上可达、在语义上可用。
为支撑后续讨论,本书统一使用以下符号体系:
| 符号 | 含义 | 单位 | |------|------|------| | $n$ | 当前上下文长度 | tokens | | $n_{\max}$ | 模型最大上下文窗口 | tokens | | $d$ | 隐藏层维度 | dim | | $L$ | Transformer 层数 | 层 | | $H$ | 注意力头数 | 个 | | $\rho$ | 上下文信息密度 | bits/token | | $\tau$ | 信息时效性窗口 | 秒 | | $\kappa$ | 上下文一致性约束 | 命题集合 |
这套符号将在后续章节中被反复使用,是本书的"度量衡"。
1.3 边界辨析:上下文工程与四个相邻概念
一个新学科的成立,首先需要回答"它不是什么"。上下文工程最容易与四类已有概念混淆:提示工程(Prompt Engineering)、检索增强生成(Retrieval-Augmented Generation, RAG)、智能体(Agent)以及长上下文模型(Long-Context LLM)。本节逐一辨析。
与提示工程的区别。提示工程关注"如何写一句话让模型做对事",其操作对象是单轮的 $X$,优化目标是在固定的 $|X|$ 下最大化任务准确率。上下文工程则关注"在多轮、多源、有状态的环境中如何组织全部 $C = (X, K, V, M)$",其操作对象扩展到了整个上下文四元组,优化目标是在 $\text{compute} + \text{memory} + \text{latency}$ 联合约束下最大化端到端的可用性。一个直观的类比是:提示工程类似于"写一句 SQL",上下文工程则类似于"设计一个数据库 schema 并管理它的索引、缓存、归档与权限"。
与 RAG 的区别。RAG 是上下文工程中"检索"这一子模块的工程化实现,而非其全部。RAG 的核心动作是 $X \leftarrow \text{TopK}(\text{Retrieve}(q))$,即在推理时点查式地从外部知识库拉取若干片段注入 $X$。上下文工程则覆盖更广的算子集合:压缩($|C| \downarrow$)、摘要($X \to X'$)、分片($C \to C_1, C_2, \ldots, C_k$)、合并($C_1, C_2 \to C$)、版本化($C_t \to C_{t+1}$ 的可追溯映射)等。RAG 解决的是"如何找到相关内容",上下文工程还关心"找到之后如何放进去、放多少、放在哪、怎么淘汰"。
与智能体的区别。智能体是一种具备规划、工具使用、记忆与反思能力的系统范式,记忆系统是智能体的子模块之一。智能体中的记忆(Memory)本质上是一种特殊的 $C$:它通常具有持久性(跨会话存活)、可写性(可被智能体主动更新)、可检索性(按需加载)。但记忆只是上下文工程中"持久状态管理"的一个子问题;上下文工程还包括对临时上下文(如工具输出、网络响应、用户上传文件)的管理,而这部分在大多数智能体文献中被忽略。
与长上下文模型的区别。长上下文模型是指通过架构改进(如稀疏注意力、线性注意力、状态空间模型、Ring Attention)来扩展 $n_{\max}$ 的模型家族。上下文工程则不关心 $n_{\max}$ 如何被实现,它关心的是"在给定的 $n_{\max}$ 下如何更聪明地使用它"。一个只有 8K 上下文窗口的模型,配合精良的压缩、检索与状态管理,可能在端到端任务上击败一个 128K 但缺乏管理的裸模型。这一判断是本书立论的基础之一。
下表给出更精炼的对照:
| 维度 | 提示工程 | RAG | 智能体 | 长上下文模型 | 上下文工程 | |------|---------|-----|--------|-------------|-----------| | 主要操作对象 | $X$ | $\text{Retrieve}(q) \to X$ | Memory | $n_{\max}$ | $C=(X,K,V,M)$ | | 核心算子 | 措辞、示例、CoT | 检索、重排、注入 | 规划、工具调用 | 架构改进 | 压缩、检索、调度、版本化 | | 优化目标 | 任务准确率 | 事实准确率 | 任务完成度 | 窗口扩展 | 端到端可用性 | | 时间尺度 | 单轮 | 单次推理 | 跨会话 | 模型生命周期 | 跨多轮/多会话 | | 学科归属 | NLP 应用 | 检索系统 | 多智能体系统 | 模型架构 | 系统工程 |
可见,上下文工程既不是提示工程的扩展、也不是 RAG 的超集,而是一种系统级的、横切性的工程范式,它把上述四者作为可组合的子模块纳入自己的研究范畴。
1.4 复杂性的三重根源:为什么长上下文是非平凡问题
"把窗口做长"看似只是一个工程量问题,但任何真正尝试过的团队都会发现,长上下文的难点具有结构性根源。本节从计算复杂性、信息论与认知科学三个视角展开论证。
1.4.1 计算复杂性视角:$O(n^2)$ 算力下界与位置偏差
标准 Transformer 的自注意力计算可写为:
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right) V$$
对于长度为 $n$ 的序列,$Q, K, V \in \mathbb{R}^{n \times d}$,因此 $QK^\top$ 产生一个 $n \times n$ 的注意力矩阵,计算量与显存占用均为 $O(n^2)$。当 $n$ 从 8K 扩展到 128K,$n^2$ 增长为原来的 256 倍。这是为何"窗口扩展 ≠ 能力提升"的第一重原因:算力不是免费的,窗口扩展的直接代价是推理成本的平方级膨胀。
更隐蔽的问题来自位置偏差(positional bias)。研究表明,Transformer 注意力在序列的不同位置表现出显著不均匀的"关注分布":靠近序列开头(primacy 效应)与结尾(recency 效应)的 token 往往获得更高注意力权重,而中段信息容易被"稀释"。这种现象在 7B–70B 参数规模上普遍存在,并不随参数规模增加而线性消失。这意味着:即使物理上可达,模型对 $|C|$ 中不同位置信息的利用效率也极度不均。上下文工程的一个核心任务,就是通过位置编码改造、分片策略、注意力偏置等手段,主动重塑这种利用分布。
此外,KV-Cache 的存在使得解码阶段的每一步都需要对历史 $K, V$ 进行全量读取。设每层 KV-Cache 占用为 $2 \cdot n \cdot d \cdot \text{sizeof(half)}$,则 $L$ 层模型的 KV-Cache 总占用为:
$$\text{KV Memory} = 2 \cdot L \cdot n \cdot d \cdot 2 \text{ bytes}$$
以 $L=80, d=128, n=128\text{K}$ 为例,KV-Cache 占用约为 $2 \times 80 \times 128000 \times 128 \times 2 \approx 5.2$ GB,仅 KV-Cache 就已逼近消费级单卡的全部显存。这是为何"窗口扩展 ≠ 能力提升"的第二重原因:物理内存不是可线性扩展的资源。
1.4.2 信息论视角:带噪信道中的语义编码
从信息论角度,可把上下文工程建模为带噪信道中的语义编码问题。设真实世界信息为 $S$,$S$ 在 $t$ 时刻被编码为上下文 $C_t$,$C_t$ 在传输过程中会受到三类"噪声"污染:截断噪声($C_t$ 只能保留 $S$ 的一个子集)、老化噪声($C_t$ 中的部分信息因时间推移而失效)、冲突噪声($C_t$ 中不同来源的信息互相矛盾)。模型从 $C_t$ 中重建 $S$ 的能力,记为互信息 $I(\text{Output}; S \mid C_t)$,它受限于:
$$I(\text{Output}; S \mid C_t) \leq H(C_t) - H(C_t \mid S)$$
这一不等式揭示了一个反直觉的事实:单纯增加 $H(C_t)$(即把更多信息塞进上下文)并不必然提升 $I(\text{Output}; S \mid C_t)$,因为 $H(C_t \mid S)$——即上下文中的"噪声"——可能同步增长。当噪声增长快于信号增长时,扩展上下文反而会降低有效信息量。这一现象在经验上对应于"上下文污染"(context contamination)——当无关、过时或矛盾的信息被注入后,模型输出质量不升反降。
信息论视角对工程实践的直接启示是:上下文工程的核心指标不是 $|C|$,而是 $|C|$ 的"信噪比"。这就引出了后文五元组中的"密度"与"相关性"两个维度。
1.4.3 认知科学视角:人类长记忆的启示
认知科学对人类工作记忆与长时记忆的研究,为上下文工程提供了另一组参照。George Miller 的"魔数七"(The Magical Number Seven, Plus or Minus Two)指出人类工作记忆容量约为 7±2 个组块(chunk);Baddeley 的多成分工作记忆模型将工作记忆划分为语音回路、视空间画板与中央执行系统三个组件;Ericsson 的"刻意练习"理论则揭示了专家通过组块化(chunking)将工作记忆中的有限容量转化为对长时记忆的高效调用。
这些发现对上下文工程的启示是双重的。第一,当前 Transformer 的注意力机制在功能上更接近"工作记忆"而非"长时记忆"——它容量有限、且对所有内容一视同仁,不具备人类那种"自动将高频模式组块化"的机制。第二,真正有效的长上下文系统应当模仿人类"工作记忆 + 长时记忆"的双层结构——把核心、当前、相关的信息保留在"工作记忆"(即 $C$ 的活跃子集)中,把背景、历史、细节性的信息沉降到"长时记忆"(即外部知识库 + 检索系统)中,通过受控的"调入/调出"维持端到端的可用性。这一双层结构将贯穿本书第 6 章(检索增强)、第 9 章(记忆系统)、第 12 章(多智能体协作)等多个章节。
1.5 五元组抽象:上下文工程的分析框架
基于上述三重视角,本书提出一个贯穿全书的分析框架——上下文工程的五元组:
$$\mathcal{C} = \langle \mathcal{V}, \mathcal{D}, \mathcal{R}, \mathcal{T}, \mathcal{I} \rangle$$
其中 $\mathcal{V}$(Volume)表示容量,$\mathcal{D}$(Density)表示密度,$\mathcal{R}$(Relevance)表示相关性,$\mathcal{T}$(Timeliness)表示时效性,$\mathcal{I}$(Integrity)表示一致性。下面逐一展开。
容量(Volume, $\mathcal{V}$):指上下文 $C$ 在物理上可承载的信息量上限,由 $n_{\max}$、KV-Cache 显存预算与延迟 SLA 共同决定。容量维度的核心问题是:在给定硬件与延迟预算下,$|C|$ 最多能有多大?它决定了系统能否"放得下"任务所需的全部信息。第 2–4 章将深入讨论容量的物理边界与突破方法。
密度(Density, $\mathcal{D}$):指单位 token 所承载的有效信息量,定义为:
$$\mathcal{D} = \frac{I(\text{Output}; S \mid C)}{n}$$
密度维度的核心问题是:如何在不增加 $n$ 的前提下提升每个 token 的"信号浓度"?它对应于压缩、摘要、抽象、隐式编码等技术。第 5–7 章将系统讨论密度优化。
相关性(Relevance, $\mathcal{R}$):指 $C$ 中每条信息与当前任务的匹配程度,定义为:
$$\mathcal{R} = \mathbb{E}_{c \in C}[\text{sim}(c, q)]$$
相关性维度的核心问题是:如何在 $|C|$ 有限时选择"最相关"的子集?它对应于检索、重排、注意力偏置等技术。第 8–10 章将系统讨论相关性管理。
时效性(Timeliness, $\mathcal{T}$):指 $C$ 中每条信息相对于当前时刻的"新鲜度",可形式化为信息 $c$ 的剩余有效时间 $\tau_c$ 与当前任务对 $c$ 的需求时窗 $\tau_q$ 的比值。时效性维度的核心问题是:如何在动态环境中保持 $C$ 的"现势性"?它对应于增量更新、TTL、版本化、缓存失效等技术。第 11–12 章将系统讨论时效性管理。
一致性(Integrity, $\mathcal{I}$):指 $C$ 内部不包含相互矛盾的命题,定义为:
$$\mathcal{I} = 1 - \frac{|\{p_i, p_j \in C : p_i \vdash \neg p_j\}|}{\binom{|C|}{2}}$$
一致性维度的核心问题是:如何在多源、长时程、并发写入的场景下保持 $C$ 的内部自洽?它对应于冲突检测、版本合并、写入仲裁等技术。第 13–14 章将系统讨论一致性管理。
与 CAP 定理的类比。熟悉分布式系统的读者会立刻注意到,五元组与 Brewer 的 CAP 定理(Consistency, Availability, Partition tolerance)存在结构上的相似性。CAP 定理揭示了在网络分区不可避免时,一致性与可用性之间存在不可调和的张力;类似地,上下文工程的五元组之间也存在结构性张力:
- **容量 vs 密度**:在 $n$ 固定时,扩展容量只能通过引入更多低密度内容(噪声),从而降低密度。
- **相关性 vs 时效性**:强相关性的内容往往是历史内容,强时效性的内容往往与当前任务弱相关。
- **一致性 vs 容量**:维护强一致性需要对每条写入执行冲突检测,开销随 $|C|$ 增长。
- **密度 vs 相关性**:提升密度往往依赖摘要与抽象,但摘要会丢失细节相关性。
这种多维权衡正是上下文工程区别于单一优化问题的本质特征。后续每一章在讨论具体技术时,几乎都会回到五元组上做"取了什么、舍了什么"的显式标注。
1.6 范式转移:从短提示到长上下文
上下文工程的出现标志着一场范式转移。短提示范式(Short-Prompt Par