

聊到与大模型(LLM)交互,你可能首先想到的是 “提示工程”(Prompt Engineering)。但今天,我们要聊一个更深、更广的概念——“上下文工程”(Context Engineering)。简单来说,如果说 提示工程 主要研究 如何巧妙地向模型提问,那么 上下文工程 则关注的是 如何为模型构建一个完整的信息环境,从而决定它在回答问题时到底 “知道些什么”。根据学术界和业界大牛们的观点,上下文工程可以被定义为:“一门设计和构建动态系统的学科,旨在为人工智能模型提供完成任务所需的所有信息和工具”。划个重点,它的目标是打造一个动态、全面的信息供给系统,而不仅仅是优化几句静态的指令。
Context Engineering 之所以在当前阶段的重要性被放大,其主要背景是如何更好的解决大模型自身存在的一些根本性局限问题。我们可以把这些局限归纳为以下几点:
LLM 都有一个类似计算机内存(RAM)的“工作记忆区”,也就是它的上下文窗口。这个窗口的大小是有限的,意味着模型能同时处理的信息量存在上限。在长对话或复杂任务中,信息会迅速堆积,很容易导致窗口溢出,不仅拖慢响应速度(延迟),还会让成本飙升。LLM 的知识储备被“冻结”在了它训练数据截止的那一刻。这意味着它的信息会不可避免地过时,无法掌握最新的知识动态。而上下文工程的核心技术之一——外部知识检索,恰好能连接实时的外部信息源,从一定程度上缓解这个问题。LLM 有时会产生“幻觉”,也就是我们常说的“胡说八道”。上下文工程通过引入事实依据,将模型的输出“锚定”在可靠的外部知识上,从而提升其回答的准确性和可信度。上下文窗口是 LLM 架构中的一个根本性约束。想要玩好上下文工程,就必须先理解它的技术原理、内在缺陷,以及它所带来的性能与成本的博弈。
上下文窗口的长度限制,主要源于 Transformer 架构中自注意力(self-attention)机制的计算复杂性。简单来说,计算量与输入序列长度(n)的平方(O(n²))成正比。

这意味着,上下文长度每增加一倍,所需的计算资源和内存就会指数级增长。这种指数级的增长,无论在训练还是推理阶段,都构成了巨大的性能瓶颈和成本压力。尽管业界已经探索出一些优化方案(如分组查询注意力),但这个基本约束在当前主流模型中依然牢固存在。
模型在上下文窗口内处理信息的能力也千差万别。比如 LLM 在处理长文本时,会表现出一种“中间遗忘”(Lost in the Middle)的现象,模型更容易记住和利用位于上下文开头和结尾的信息,而中间部分的内容则常常被忽略。这个现象在“大海捞针”(Needle in a Haystack)测试中得到了充分印证:当把一个关键信息(“针”)藏在一大堆无关信息(“草堆”)的中间时,模型很难找到它。这颠覆了 “上下文窗口越大,模型性能就越好” 的简单认知,也揭示了单纯加长窗口并不能保证性能的同等提升。
上下文的长度,与系统的运营成本和响应速度直接挂钩,而且通常是负相关。更长的上下文,意味着更慢的响应和更高的API调用成本(Token消耗)。这迫使开发者必须在 “提供更全面的信息以提升质量” 和 “维持可接受的用户体验及成本” 之间,做出艰难的平衡。
因此,上下文工程的核心挑战,正是在信息丰富度与系统效率之间找到那个最佳平衡点。这也解释了为什么业界对百万级 Token 上下文窗口的狂热追求,可能在某种程度上偏离了实际应用的核心。更大的窗口提供了更大的 容量,却不保证更优的 利用率,甚至可能因为引入过多无关信息而导致 “上下文干扰” 或 “上下文过载”,反而拉低了模型性能。
最初的设想是,更大的窗口能塞进更多信息,结果自然会更好。但 “中间遗忘” 等现象表明,上下文的数量与质量并非简单的正相关。同时,成本和延迟这两座大山也让开发者倾向于使用“小而美”的上下文窗口。所以,高级上下文工程的焦点,必须从简单粗暴的 “填塞提示词”,转向开发更精细化的信息检索、过滤、排序和压缩系统。其目标是为模型提供一个精炼、紧凑且高度相关的信息包。这使得动态管理上下文的技术,其重要性远超单纯依赖模型自身的窗口长度。
为了系统地设计和理解上下文,我们需要把它拆开看看。一个完整的上下文信息包,通常由以下几种不同类型的信息动态组合而成:

System Prompts)、角色定义(如“你是一个专业的医疗顾问”)和高级目标描述。API 响应。API,包括这些工具的用途和参数。JSON schema,以确保输出的结构化和可解析性。上下文工程的范畴虽然说是不限于单个 prompt 的撰写,但结构化和优化后的 prompt 仍然是构建高质量上下文的基础。
这是上下文工程的基本功。在实际的工作中,我们会通过不通的角度来 PUA 模型,比如 使用明确的分隔符来区分上下文的不同部分;清晰地划分角色(系统、用户、助手);使用祈使动词来精确定义任务 等等。
此外,还有一个更高级的概念叫 提示校准(Prompt Calibration)。 提示校准(Prompt Calibration) 的目标是消除因提示词的 格式、措辞或示例顺序 等因素给模型带来的内在偏见。

模型往往会因为提示词的表述问题导致结果的差异巨大,常规方式就是通过一些技术手段(如批量校准)来调整模型。
ICL 通过在 prompt 在提供示例来引导模型的行为,这种方式的好处在于无需更新模型权重。
RAG系统之间的一个过渡桥梁。CoT 是提升模型在复杂推理任务(如数学、逻辑推理)上表现的一项关键技术。
CoT 的核心思想是引导模型将一个复杂问题分解为一系列中间的、连续的推理步骤,模拟人类的解决问题过程 。这种分解允许模型将更多的计算资源分配到每一步,从而减少推理错误,得出更准确的结论。CoT 可以通过两种方式实现。CoT 并非万灵药,它的效果与模型规模高度相关。在大型模型(如千亿参数以上)上,它能带来显著的性能飞跃;但对于小型模型,它反而可能因为生成不合逻辑的推理链条而导致性能下降。由于 LLM 本身是无状态的,记忆系统是实现个性化和跨会话连续性的关键。记忆系统分为 短期记忆(会话内) 和 长期记忆(跨会话)。

img
短期记忆管理智能体在单个会话中的 “工作记忆”
write_to_scratchpad()和read_from_scratchpad()等工具,使其能够显式地决定何时写入或读取信息。这种方法易于调试,因为记忆操作是智能体推理轨迹中的明确步骤,但会因工具执行而引入延迟。STM 形式,用于管理对话历史。诸如 LangChain 之类的框架提供了多种实现策略:ConversationBufferMemory:最简单粗暴,存储完整的聊天记录。优点是简单,缺点是很快就会超出 Token 限制。ConversationBufferWindowMemory:只保留最近的k轮对话,解决了长度问题,但有丢失早期关键信息的风险。ConversationSummaryBufferMemory(混合模型):这是一种先进的混合策略,它结合了窗口和摘要两种方法的优点。技术机制:维护一个近期消息的缓冲区,同时对超出预设 Token 限制的旧消息进行滚动摘要。当消息总长度超标时,最旧的消息会被一个(通常更小更快的)辅助 LLM 进行总结,然后并入一个不断滚动的总摘要中。这既保证了近期对话的完整性,又以压缩形式保留了长期历史的精髓。长期记忆允许智能体无限期地 记住 信息,克服了核心模型的无状态特性。这通常通过将记忆外部化到一个可搜索的向量数据库来实现 。
k个记忆片段。LLM 的提示中,为其提供相关的长期历史信息。Cohere Rerank)对结果进行二次排序,把最相关的记忆顶到最前面,提高信噪比。LLM处理长对话,然后直接从模型内部提取能够代表这段对话核心语义的向量表示并存储。这个“向量摘要”就像是对话的高度压缩的“语义指纹”,可用于后续快速恢复上下文。对于需要处理长对话或复杂任务的系统,必须采用动态管理策略来应对不断增长的上下文,以避免超出Token限制并控制成本。
压缩的目的是减少上下文的 Token 数量,同时保留其核心信息。
LLM 来压缩上下文。这可以在不同粒度上进行:LLMLingua这类方法,通过分析语言模型的困惑度来识别并移除不那么重要的令牌。LLM直接将上下文重写为更简洁的形式。Tmax(压缩前阈值):当总上下文大小达到 Tmax 时,触发压缩。Tretained(压缩后阈值):压缩后,上下文被减少到 Tretained 个 Token。这两个阈值之间的差距控制着压缩的频率和激进程度。过滤与剪枝的目标是主动移除不相关或冗余的信息,而不是对所有内容一视同仁地压缩。这有助于减少噪声,让LLM专注于最关键的信息。
LLM 的蒙特卡洛树搜索),模型可能会生成多个语法不同但语义等效的推理步骤。专门训练的“等效性剪枝器”(EquivPruner )模型可以识别并合并这些冗余的探索分支,从而节省大量计算资源。LLM 之前 “净化” 每个文档块。上下文工程的最终目标是构建能够主动与外部世界交互的智能代理。

图片来源:https://arxiv.org/pdf/2507.13334
通过在 LLM 的上下文中提供一组工具(如API、函数)及其描述,模型就获得了执行动作、获取实时数据和解决超越纯文本生成范围问题的能力。这是构建现代 AI Agent 的核心机制。
LLM 来指导工作流程。给定一个查询,路由器会根据工具的描述决定哪个信息源或工具最合适,并以结构化格式(如 JSON)输出其决策,从而有条件地将执行流引导至下一个节点。尽管基于文本的检索很强大,但它在序列化过程中常常会丢失知识图谱等结构化数据中丰富的实体关系信息。一些前沿技术正尝试将知识图谱的结构化知识直接注入LLM的上下文。
LLM能理解的“结构化Token”。最后,将这些“结构化Token”与用户的自然语言查询拼接在一起,作为LLM的最终输入LLM能够进行比纯文本检索更复杂的符号推理,并且资源效率极高。为 LLM 应用选择正确的上下文优化策略是非常重要的;不同的技术在成本、复杂性和适用场景上存在巨大差异。
这三种方法是定制 LLM 行为和知识的主要途径,它们并非相互排斥,在实际应用中常常结合使用。
下表提供了一个全面的决策框架,帮助从业者根据具体需求选择最合适的策略。
表1:上下文优化技术的比较分析
因素 | 提示工程 | 检索增强生成 (RAG) | 微调 / PEFT |
|---|---|---|---|
主要目标 | 引导模型行为,优化单次交互 | 注入外部、动态的知识 | 调整核心技能、风格或专业领域知识 |
实现复杂性 | 低 | 中 | 高 |
成本与资源需求 | 极低(仅API调用成本) | 中等(需数据管道、向量数据库) | 非常高(需大量GPU、高质量数据集) |
数据需求 | 无 | 外部知识库(结构化或非结构化) | 高质量、已标注的训练数据集 |
知识更新能力 | 不适用 | 实时、便捷 | 困难,需要重新训练 |
事实准确性/接地性 | 低 | 高 | 中等 |
任务特异性 | 通用、灵活的任务 | 知识密集型任务(如问答) | 高度专门化的任务或风格模仿 |
典型用例 | 内容生成、快速原型验证 | 问答机器人、研究工具、客服助手 | 领域特定的聊天机器人、情感分析、代码生成 |
将上下文工程系统从原型推向生产环境,会遇到一系列严峻的挑战,主要围绕数据质量、上下文管理和系统成本展开。
上下文管理系统可能会出现多种失效模式。下表总结了常见的“坑”及应对策略。
表2:常见上下文失效模式与应对策略
失效模式 | 描述 | 技术缓解策略 |
|---|---|---|
上下文投毒 (Context Poisoning) | 一个错误信息(如来自错误的工具输出或被篡改的文档)混入上下文,污染了后续的推理。 | 输入净化与源标记:将所有外部信息视为“不可信输入”。在注入提示前进行净化处理,并使用XML标签等方式明确标记信息来源(如<retrieved_context>),创建逻辑边界,防止数据被误解为指令。 |
上下文干扰 (Context Distraction) | 大量上下文淹没了模型的原始指令,导致其“跑偏”,忘了最初的任务目标。 | 上下文摘要与剪枝:对累积的信息进行压缩或修剪,保留关键细节,移除冗余内容,确保上下文简洁且高度相关。 |
上下文混淆 (Context Confusion) | 多余或结构不良的上下文(如一次性提供了太多不相关的工具)对模型的响应产生负面影响。 | 基于RAG的工具选择:将工具描述存入向量库,根据当前任务仅检索最相关的工具,而不是把所有工具一股脑全塞给模型。 |
上下文冲突 (Context Clash) | 上下文的不同部分包含了相互矛盾的信息。 | 交叉验证与来源排序:实施一个“检测-选择-排序”的重排步骤,利用语义一致性识别并过滤掉冲突信息,并优先采纳来自更权威数据源的内容。 |
Token数量,可能导致运营成本高到无法承受。本文系统地剖析了上下文工程的理论、技术和实践挑战。核心结论是:上下文工程是一个从提示词技巧到系统级架构的多层次学科,其成功落地依赖于解决数据质量、上下文管理和成本效率等一系列复杂的工程问题。整个领域的核心,都在于驾驭上下文质量、数量、成本和延迟之间的复杂权衡。
未来的系统可能将不再依赖于人工干扰介入的上下文,而是通过代码来程序化地生成、管理和交付上下文。这涉及到构建更高级别的抽象,例如:
这种转变,代表着一种架构模式的迭代更新:我们不再将 LLM 视为应用的中心,而是将其看作一个组件(类似“CPU”),嵌入到一个更大的、有状态的、具备上下文感知能力的软件架构中。