目录

一、上下文工程到底为什么重要

(一)从几个真实的工程症状说起

(二)为什么在 Agent 时代,上下文会取代 Prompt 成为核心问题

(三)为什么很多 Agent 项目在原型阶段顺利,在生产阶段失速

二、什么是上下文工程

(一)定义

(二)上下文的组成

(三)上下文的生命周期

(四)分层理解上下文

三、为什么上下文会成为 Agent 的第一性约束

(一)模型不是在思考世界,而是在思考你给它的世界

(二)上下文窗口不是唯一约束,注意力稀释更关键

(三)状态缺失,是很多 Agent 不稳定的真正原因

(四)知识、状态、记忆,三者必须分开治理

四、架构演进

(一)第一阶段:单轮 Prompt 驱动

(二)第二阶段:RAG 增强

(三)第三阶段:Tool Use 与 Memory 

(四)第四阶段:Planner、State、Workflow 

(五)第五阶段:上下文操作系统

五、主流方案

(一)直接拼接历史对话

(二)RAG

(三)Memory

(四)显式 State

(五)工具返回结果作为上下文

(六)工作流编排

六、主流架构的详细对比

(一)模型中心架构

(二)系统中心架构

(三)链式架构与图式架构

(四)单 Agent 架构与多 Agent 架构

七、生产实践

(一)把上下文组装器做成独立层

(二)上下文供给流程

(三)会话摘要

(四)知识召回

(五)工具结果

(六)可观测性设计

八、常见坑

(一)上下文膨胀

(二)记忆污染

(三)摘要失真

(四)把模型推理过程当长期资产保存

(五)权限和安全边界处理太晚


一、上下文工程到底为什么重要

(一)从几个真实的工程症状说起

如果一个团队只是做过几次 Agent Demo,通常会形成一种相对乐观的判断:现在的大模型已经足够强,只要补上函数调用、接一点知识库、再做一层工作流封装,一个可用的 Agent 系统似乎就差不多成形了。很多原型阶段的项目,确实也会给出这样的信号。用户提问,模型回答;用户下指令,模型调工具;接入私域文档后,业务回答看起来也比纯大模型更像样。

但系统一旦进入真实流量环境,很多问题会迅速浮出水面,而且这些问题往往并不零散,而是具有很强的一致性。

最常见的现象,是系统在短对话里表现不错,在稍长一点的任务链路中就开始漂移。用户前面明确提过的约束,在后面轮次被模型忽略;工具执行结果明明返回成功,模型下一步却继续重复调用;RAG 已经召回了正确文档,最终答案却建立在一段无关内容之上;会话越长,系统越慢,token 消耗越高,而回答质量并没有同步上升。更复杂一点的场景中,还会出现跨轮记忆污染、工具结果误解、任务状态丢失、多个 Agent 之间信息不一致等问题。

这些症状看上去分别属于不同模块:有些像检索问题,有些像记忆问题,有些像规划问题,有些像模型能力问题。但如果把这些现象放到同一条因果链上去分析,会发现它们的根部往往相同:模型每一次推理时,究竟拿到了什么信息,这些信息是如何被筛选、组织、裁剪、更新和传递的。

这就是上下文工程的核心。

它不是一个只关乎 prompt 写法的小技巧,也不是在已有 Agent 架构上再补一层装饰。对于真正进入生产的 Agent 系统来说,上下文工程决定了系统是否能够持续稳定地把对的信息,在对的时刻,以对的方式交给模型。

(二)为什么在 Agent 时代,上下文会取代 Prompt 成为核心问题

在传统软件系统里,程序状态通常是显式的。变量、数据库记录、缓存、事件消息、状态机节点,这些都以可计算、可验证、可追踪的形式存在。工程师知道系统当前处于哪个阶段,也知道某个结果是由什么输入和什么规则推导出来的。

但在大模型驱动的 Agent 系统中,真正做决策的引擎并不是一段确定性程序,而是一个高度依赖输入上下文的概率模型。对于模型来说,是否能做出正确决策,取决于本轮输入中包含了哪些事实、规则、状态和约束。这意味着,系统行为的稳定性很大程度上不再由代码逻辑直接保证,而是由上下文质量间接决定。

在单轮问答时代,提示词工程之所以重要,是因为 prompt 几乎就是模型的全部输入;而在 Agent 时代,prompt 已经只是上下文的一部分。系统提示词、用户输入、历史对话、RAG 召回结果、工具返回值、阶段计划、长期记忆、权限信息、运行策略、错误摘要,这些都可能进入模型的工作上下文。真正影响效果的,不再是某一句提示词写得是否优雅,而是这个上下文工作集是否被工程化地管理起来。

从这个意义上说,Prompt Engineering 更像是 Context Engineering 的子集。前者关注怎么写,后者关注写什么、何时写、写给谁、保留多久、出了问题如何追踪。

(三)为什么很多 Agent 项目在原型阶段顺利,在生产阶段失速

这是一个非常典型的现象。原型阶段的数据量小、任务短、用户耐心高、场景约束弱,团队往往能通过堆 prompt、堆示例、堆工具快速做出一个惊艳的交互原型。此时,系统的大部分问题都还没有显形。

但生产环境会强行放大上下文工程中的短板。用户请求不再标准,历史上下文开始累积,工具返回结果不再总是干净,知识库变得庞大且重复,安全权限边界开始显得重要,系统成本与延迟也进入约束条件。原型阶段靠大上下文拼接和模型自由发挥解决的问题,在生产里会逐渐暴露为系统性的不可控。

这也是为什么很多团队会产生一种错觉:模型升级了,效果却没有显著变好;RAG 加上了,复杂任务还是不稳定;Memory 做了,Agent 反而开始胡乱记忆。问题并不在于这些能力无效,而在于它们如果没有统一纳入上下文治理框架,就只是增加了新的信息源和新的复杂性来源。

二、什么是上下文工程

(一)定义

如果用一句更工程化的话来定义,上下文工程就是围绕模型推理所需工作集而展开的设计、组织、传递、压缩、更新和治理体系。

这里的关键不在于上下文这个词,而在于工作集。工作集意味着,进入模型输入的内容不是简单的信息堆积,而是一组在当前任务阶段真正需要被模型消费的材料。它们必须兼顾完整性、相关性、时效性、结构性与成本约束。

因此,上下文工程不是做一段长 prompt,也不是把所有可能有用的信息全塞进去。它关心的是,系统如何判断什么信息应该进入当前上下文,什么信息应该保留在外部状态中,什么信息应该以摘要方式呈现,什么信息必须保持原始精度,什么信息应该完全禁止进入模型。

这种视角的变化非常重要。因为一旦把上下文看成工作集,而不是看成输入文本,系统设计思路就会从文本拼接转向信息治理。

(二)上下文的组成

很多刚接触 Agent 的开发者,在提到上下文时,想到的通常只有两类东西:历史对话和检索文档。这当然是上下文的一部分,但离真实系统的全貌还差得很远。

在一个成熟的 Agent 系统里,上下文通常至少包含以下几层内容。

一类是规则与指令层。这包括系统提示、角色设定、行为边界、合规要求、输出格式、工具使用约束、冲突处理规则等。它们决定模型应该如何行动。

一类是任务与状态层。这包括当前任务目标、阶段计划、已完成步骤、待确认事项、失败重试记录、用户确认结果、节点间传递变量等。它们决定模型当前身处哪里、接下来应该做什么。

一类是事实与知识层。这包括用户当前输入、历史事实、RAG 检索结果、数据库查询结果、工具返回值、业务实体属性、组织知识和实时环境数据。它们决定模型可以基于什么信息进行判断。

一类是个性化与长期记忆层。这包括用户偏好、历史行为画像、组织常用规则、稳定习惯和跨会话持久信息。它们决定系统是否能够在长期交互中形成连续性。

一类是控制与安全层。这包括权限、可用工具白名单、租户隔离信息、脱敏策略、审计标识和风险等级。它们决定哪些信息和能力可以被模型看到和使用。

如果这些内容都混在一段自然语言里交给模型,系统很快就会变得不可解释、不可维护。上下文工程的职责,恰恰就是把不同性质的内容分层处理,并在必要时对不同层采用不同的表达形式。

(三)上下文的生命周期

理解上下文工程,一个很关键的切口是生命周期。很多设计失败,不是因为单次上下文组装得不好,而是因为没有意识到上下文本身会在系统中流动、累积、变形和失效。

一段上下文从产生到消亡,通常会经历几个阶段。它首先被生成,可能来自用户输入、知识检索、工具执行、模型推理或者系统规则。生成之后,并不会全部进入模型,而是要经过筛选和排序。进入当前模型上下文后,部分信息会被保留原文,部分被压缩摘要,部分被结构化提炼。模型完成本轮推理后,又会产生新的中间信息,这些信息中有一部分会写回状态系统、记忆系统或日志系统。随着任务推进,原先的上下文可能变得无效甚至有害,必须被替换、降权或删除。

所以,上下文工程更像是一个循环系统,而不是一个单次模板。

如果没有这个生命周期视角,团队就很容易把所有注意力放在入口,拼命思考如何把更多信息送给模型,却忽略了更重要的问题:哪些信息不该继续留在系统里。

(四)分层理解上下文

为了让上下文治理具备可操作性,实践中通常需要做分层。一个非常实用的分法,是把上下文区分为瞬时层、会话层和长期层。

瞬时层服务于当前一步决策。它往往包括当前用户输入、当前任务节点指令、最近一次工具结果、当前阶段必要的状态变量,以及本轮最相关的检索片段。它的特点是相关性最高、时效性最强、生命周期最短。瞬时层最怕噪声,因为它直接影响当前决策。

会话层服务于一次任务或一次连续会话。它记录这个会话中已经确认过的内容、执行到的步骤、尚未解决的问题、阶段摘要以及关键用户选择。会话层的价值不在于保留所有原始对话,而在于维持任务连贯性和恢复能力。

长期层服务于跨会话复用。它更关注稳定信息,比如用户长期偏好、组织规范、常见知识、历史案例、长期业务关系和被确认过的重要事实。长期层最怕的是污染和过期,因为一旦写进去,它会在未来很多次任务中被反复使用。

一旦分层清楚,很多架构决策就变得自然了。瞬时层强调按需供给和严格预算;会话层强调结构化快照和可恢复性;长期层强调写入门槛、版本控制与过期机制。真正成熟的 Agent 系统,几乎不会把这三层混成一个统一的大 prompt。

三、为什么上下文会成为 Agent 的第一性约束

(一)模型不是在思考世界,而是在思考你给它的世界

这是上下文工程中最值得反复强调的一点。我们经常说大模型有推理能力、规划能力、总结能力和工具调用能力,但所有这些能力都有一个前提:模型只能基于当前可见的上下文做推理。它并不直接接触真实世界,而是接触你拼接给它的一个局部世界。

这个局部世界如果缺失了关键约束,模型就会在错误边界内做出看似合理的决策。如果其中掺杂了过期状态、冲突事实和无关噪声,模型也可能在错误信息之上保持高度流畅。换句话说,很多时候模型出错并不是因为能力不足,而是因为上下文让它在错误的地基上工作。

一旦接受这一点,就会明白一个重要结论:Agent 的可靠性不是单纯由模型上限决定,而是由模型上限与上下文质量的乘积决定。模型再强,如果输入世界是错的、乱的、过期的,输出也很难真正稳定。

(二)上下文窗口不是唯一约束,注意力稀释更关键

讨论上下文时,大家最先想到的常常是上下文窗口长度。窗口不够大,当然会限制系统能力,但在很多真实系统里,真正更棘手的问题并不是窗口装不下,而是装得下之后模型并没有更好地使用这些信息。

随着上下文变长,模型会出现注意力稀释。重要约束被埋在无关信息中,模型虽然从 token 数量上看到了它们,却未必在推理时赋予足够权重。特别是在多轮 Agent 场景里,前文聊天、检索碎片、工具日志、任务计划、系统规则同时存在,模型面对的是一个复杂的混合输入。此时问题已经不是容量,而是组织。

这也是为什么一个 30k token 的混乱上下文,效果常常不如一个 6k token 的精心编排上下文。上下文工程真正要解决的,是让模型把注意力放在正确位置,而不是一味追求更多 token。

(三)状态缺失,是很多 Agent 不稳定的真正原因

很多团队一开始会把 Agent 做成对话系统,认为只要保留聊天历史,模型就能维持连续性。短会话中这通常还能成立,但只要任务稍微复杂,问题就会出现。

因为对话历史是叙事性的,不是状态性的。模型可以通过对话推测当前任务到了哪一步,但这种推测本身并不可靠。任务已经确认的参数、已完成的步骤、需要人工审批的节点、失败后的回退位置、工具执行结果的最终状态,这些都更适合以显式状态形式存在,而不是留在对话中让模型自己回忆。

这也是为什么很多 Agent 表现得像一个聪明但不稳定的助理:它理解语言很好,但对流程和状态控制经常失误。原因不是模型不会理解,而是系统没有把状态显式交给它。

(四)知识、状态、记忆,三者必须分开治理

在很多落地失败的项目里,有一个非常典型的问题:知识、状态和记忆被混为一谈。结果就是系统越来越会存东西,却越来越不知道该怎么用。

知识通常是外部的、规模化的、按需召回的内容,比如文档、手册、政策、数据库记录。状态通常是当前任务进行中的结构化信息,比如步骤进展、已确认参数、待办事项、节点结果。记忆则更偏长期和跨会话,是被提炼后的用户偏好、业务关系、稳定事实。

这三者虽然都可能进入模型上下文,但它们的治理策略完全不同。知识重在召回质量与时效性,状态重在准确性与显式控制,记忆重在筛选、沉淀和防污染。如果不把它们拆开,系统就会既查不准资料,也存不好状态,还会把记忆搞成垃圾场。

四、架构演进

(一)第一阶段:单轮 Prompt 驱动

Agent 的最早形态,其实并不复杂。系统提示词加上用户输入,模型生成回答。如果需要格式化输出,就再加一点 Few-shot 示例和模板约束。这个阶段的优点是极其简单,链路短、开发快、效果可见。

但它的边界也十分明确。单轮 Prompt 本质上是一次性推理,模型无法持续维护任务状态,也无法可靠接入外部世界。所有能力都被压缩在一个输入窗口里,一旦任务涉及跨轮追踪、知识更新或工具协同,这种模式就很快到顶。

(二)第二阶段:RAG 增强

随着企业知识问答需求大量出现,RAG 成为最先成熟起来的增强路径。系统不再把知识硬编码进 prompt,而是在用户提问时检索相关文档,将召回结果拼接到上下文中。这样既减轻了窗口压力,也提高了知识的新鲜度和扩展性。

这一步很重要,因为它把上下文从静态文本扩展成了动态检索结果。但要注意,RAG 解决的是模型知道什么,不是模型当前处于什么状态、应该做什么。很多团队在这个阶段误以为有了 RAG 就有了 Agent,结果在复杂任务中很快发现,知识丰富了,过程却依旧混乱。

(三)第三阶段:Tool Use 与 Memory 

当系统开始接工具时,Agent 的性质发生了明显变化。模型不再只是回答问题,还要根据当前上下文选择工具、解释工具结果、决定下一步行为。与此同时,记忆模块开始出现,用来保留多轮对话中的事实和偏好。

这个阶段的变化在于,上下文第一次具备了行为闭环。模型根据上下文决定行动,行动产生新的上下文,新的上下文又影响后续推理。系统已经不再是静态问答,而是动态执行。

但这一阶段也是很多系统最脆弱的时候。因为工具结果、历史对话、长期记忆开始共同作用于推理,如果没有明确治理,它们会迅速形成信息缠绕。看起来系统变强了,实际上控制面变弱了。

(四)第四阶段:Planner、State、Workflow 

再往后,复杂任务推动了 Planner、状态存储、工作流编排和图式执行框架的发展。大家开始意识到,靠模型在大上下文里自主规划并不稳妥,必须让系统承担更多控制职责。

于是,任务被拆成显式节点,状态被存入结构化存储,模型只在特定节点做局部推理,节点之间的跳转由工作流规则或状态机控制。这样一来,上下文不再是一次性堆给模型的全集,而是按节点供应的工作包。

这一步标志着 Agent 从模型驱动应用,演化为模型参与的系统。上下文工程也从输入组装,演化为上下文操作系统。

(五)第五阶段:上下文操作系统

真正成熟的生产系统,会进一步意识到,光有工作流还不够。因为即使节点划分清晰,节点内部仍然面临同样的问题:要向模型提供哪些知识,保留哪些状态,如何处理摘要,如何屏蔽无关信息,如何做权限隔离,如何追踪某次错误是如何被上下文放大的。

于是,架构开始出现一个更清晰的中间层:上下文编排与治理层。它既不同于底层存储,也不同于业务工作流,更不是简单的 prompt builder。它负责把外部知识、状态系统、记忆系统、权限系统、工具返回结果统一装配为模型可消费的工作集。

所谓上下文操作系统化,并不是一个夸张说法,而是在强调:在复杂 Agent 里,上下文已经不是附属物,而是一层需要独立设计、独立观测、独立演进的基础设施。


五、主流方案

(一)直接拼接历史对话

很多 Agent 最早的做法,是把最近若干轮对话直接带入上下文。这种方法之所以普遍,不是因为它最先进,而是因为它几乎不需要额外设计。对于聊天型产品、小型 Copilot 或任务长度很短的场景,它也确实有效,因为对话本身就包含了大量上下文线索。

它的优势主要体现在两个方面。其一是实现成本低。系统只需要维护消息列表并控制截断策略,就能让模型感受到连续对话。其二是语义自然。相比结构化状态,自然语言对话更完整地保留了语气、偏好变化和隐含背景,模型往往也更容易直接消费。

但它的问题也非常明显。最核心的问题,是对话历史是一种叙事载体,而不是状态载体。模型可以从中推测任务状态,却很难稳定地从中提取出精确、可复用的控制信息。对话越长,噪声越多;越靠前的关键约束,越容易被后续内容稀释。与此同时,历史对话里还会混入闲聊、误解、临时假设和已经失效的信息,这些内容原样保留并不总是有益。

所以,直接拼接对话历史适合短链路、低风险、以语义连贯性为主的场景,例如泛助手、轻咨询、陪伴式交互。但一旦任务涉及明确步骤、多次工具调用和状态恢复,仅靠聊天历史几乎一定会遇到稳定性瓶颈。

(二)RAG

RAG 之所以成为 Agent 体系中的基础能力,是因为它很好地解决了模型知识边界问题。对于知识密集型任务,把海量文档交给模型记忆显然不现实,也不经济;通过向量检索、关键词检索、混合检索等方式,在需要时把最相关文档送进上下文,是更合理的路径。

RAG 的工程优势很明显。它让知识从模型参数中解耦,具备更新性、可治理性和企业适配性。对于 FAQ、政策问答、合同分析、知识助手、文档搜索增强等场景,RAG 是几乎不可替代的底层能力。

但 RAG 也有非常明确的边界。它解决的是信息召回,不是任务控制。它可以告诉模型有哪些相关材料,却不会告诉模型当前任务执行到了哪里、用户在此前轮次已经确认了什么、这次工具调用结果该如何写回状态、当前阶段是否允许继续动作。很多团队把 RAG 接上之后,发现回答变得更专业了,但复杂任务还是不稳,原因就在这里。

此外,RAG 的效果高度依赖索引质量、分块策略、召回排序与上下文组织方式。很多人以为 RAG 问题主要出在 embedding 模型不够强,实际上工程上更常见的问题是文档切块不合理、召回结果重复、排序不感知当前节点语境,以及被召回内容进入上下文后没有重新组织,只是简单拼接。

RAG 适合承担事实性知识供给层,而不应被误用为状态管理层或记忆层。

(三)Memory

Memory 听起来非常符合直觉。人类助理之所以像助理,是因为会记住你的偏好、项目背景和历史决策。所以很多 Agent 系统一开始就会引入记忆模块,希望它帮助系统实现个性化和长期连续性。

从目标上看,这个方向是对的。没有长期记忆,Agent 很难真正形成用户感知中的连续服务能力。特别是个人助理、客服助手、CRM 场景、销售辅助、长期项目协作场景,没有记忆几乎不可能建立深度体验。

但 Memory 之所以难,不是因为存不进去,而是因为不知道该存什么、何时存、以什么形式存、什么时候删。很多系统把每轮对话都摘要写入记忆库,或者把模型推断出来的内容也一并长期保存。短期看像是在让 Agent 越来越懂用户,长期看却非常容易造成污染。一次误判、一次错误抽取、一次临时偏好,都可能在未来被反复召回,逐渐放大为系统性偏差。

因此,Memory 的核心不是存储,而是记忆治理。它需要明确区分稳定偏好与临时意图,区分确认事实与模型推断,区分高复用长期信息与一次性会话状态。真正成熟的 Memory 系统,通常会有写入门槛、置信度标注、来源记录、过期机制和冲突修正策略,而不是把它做成一个长期聊天摘要仓库。

(四)显式 State

如果说 RAG 是知识供给层,Memory 是长期连续性层,那么 State 就是复杂 Agent 真正的骨架。很多团队在做多步任务、工具执行和流程控制时,最终都会走到这一步:必须把状态显式存下来,而不能依赖模型从历史文本里自行恢复。

显式 State 的价值在于,它把任务当前的关键控制信息转化为结构化、可验证、可回放的对象。比如,当前步骤编号是什么,已确认参数有哪些,哪些子任务已完成,哪些待人工确认,最近一次工具调用是否成功,失败原因是什么,当前是否允许进入提交阶段。这些内容如果只存在于聊天历史中,系统永远处于模糊控制;一旦变成显式状态,工作流和模型都能围绕它稳定运行。

显式 State 的局限在于设计成本。它要求团队对业务任务有相对清晰的过程认知,能够抽象出状态字段和节点转移规则。这对探索期项目可能显得笨重,但对复杂生产任务而言几乎是必要条件。尤其是在需要重试、回滚、人工介入、审计追踪的场景里,没有 State 的 Agent 往往看起来灵活,实际上非常脆弱。

一个常见误区是把 State 做成另一个大 JSON,然后仍然无差别丢给模型。那样虽然形式上结构化了,但没有发挥 State 的真正价值。State 的重点不只是结构化,更是系统用它来控制行为和限制上下文范围。

(五)工具返回结果作为上下文

工具是 Agent 与外部世界连接的主要方式。无论是查数据库、下工单、发邮件、执行代码还是调用业务 API,工具都会生成大量外部事实。理论上,这些结果比模型自己的推断更可信,因此很多团队会把工具结果当成高优先级上下文直接回灌给模型。

这件事方向没错,但实践中最容易被忽视的问题,是工具结果往往不是为模型设计的。真实系统中的 API 返回通常包含大量元信息、内部字段、分页结构、错误码、埋点字段和与当前任务无关的数据。把它们原样塞进模型上下文,等于要求模型临时充当数据解析器、字段筛选器和业务语义转换器。

结果往往是两头失效:一方面模型消耗了大量注意力处理噪声;另一方面真正有用的字段被淹没在结构细节中,导致工具已经正确执行,模型却没有正确理解。

因此,工具结果不应该直接等于模型上下文。两者之间通常需要一个中间表示层,把原始工具结果翻译成业务语义明确、结构清晰、字段经过筛选和解释的上下文片段。对于高风险任务,甚至应该区分哪些工具结果只用于系统状态更新,哪些工具结果才有必要交给模型继续推理。

(六)工作流编排

当 Agent 开始涉及多步骤任务时,工作流编排看起来是天然答案。通过显式节点、条件分支、重试策略、人工审批和状态转移规则,系统终于从纯模型驱动走向了更可控的执行方式。

工作流编排确实能显著提升稳定性,特别是在流程明确、节点边界清晰的业务里,比如客服工单、审批流、生产运维 SOP、订单处理、代码生成流水线等。系统可以决定什么阶段调用模型、什么阶段调用工具、什么阶段必须人工确认,从而把模型限制在更可控的局部问题内。

但工作流并不会自动解决上下文问题。很多团队上了工作流之后,仍然在每个节点里拼一个巨大的上下文,让模型自行理解。这时工作流只是控制了节点顺序,并没有控制节点内部的信息供给。换句话说,工作流解决的是宏观过程控制,上下文工程解决的是微观决策输入。两者必须配合,缺一不可。

六、主流架构的详细对比

(一)模型中心架构

模型中心架构的思路很直接:系统把尽可能多的信息、工具描述和行为规则交给模型,由模型统一决定怎么理解任务、是否需要拆解、何时调用工具、工具结果如何解释、下一步如何继续。很多早期 Agent 实现、Auto Agent 风格原型,以及部分研究型系统都接近这一思路。

这种架构的优势主要体现在灵活性和开发速度上。由于系统控制逻辑较少,开发者可以快速验证新任务类型,不需要过早抽象状态模型或流程结构。对于需求快速变化、任务模式还不明确的探索期项目,这种方式非常有吸引力。模型本身拥有较大自主权,也意味着它可以在未知边界内展示出一定涌现能力。

但模型中心架构的问题同样明显。第一,它对上下文质量高度敏感,一旦信息组织混乱,模型行为会迅速漂移。第二,它很难做强约束控制,因为很多决策依赖模型自己遵守提示词和角色边界。第三,它不利于回放和调试。出现错误时,往往很难界定是检索问题、提示问题、状态问题还是模型自由发挥造成的问题。第四,它在成本和延迟上通常也不够友好,因为为了让模型具备足够全局感知,系统倾向于持续喂入大上下文。

因此,模型中心架构适合探索期、研究型系统、开放性创作任务、流程不确定任务,以及对严格可控性要求不高的场景。但只要业务开始强调稳定率、成功率、审计性和确定性,这种架构通常会碰到很强的天花板。

(二)系统中心架构

系统中心架构则采取相反思路。它把流程控制、状态管理、权限边界、工具调度和上下文装配更多地收回到系统层。模型仍然负责语义理解、局部判断、文本生成和模糊决策,但不再承担整个系统的全局控制责任。

这种架构的优势在生产场景中尤其突出。首先,它有更清晰的职责边界。系统负责确定性的事,模型负责概率性的事。其次,它更容易做可观测与调试。因为每个节点输入、状态变更、工具调用和模型输出都可以被追踪。再次,它更利于控制成本。不同节点只注入必要上下文,不必长期维持大窗口。最后,它也更利于安全治理,因为权限和脱敏可以在上下文装配之前完成,而不是事后依赖模型遵守规则。

当然,系统中心架构并非没有代价。它需要更高的前期设计投入,尤其是在复杂业务中,需要团队抽象任务节点、状态字段和转移规则。这意味着它不适合所有探索型项目,也不适合业务模式尚未清晰的极早期阶段。过早进行系统化设计,也可能导致架构僵化,限制模型的灵活发挥。

因此,系统中心架构更适合明确业务流程、对稳定性要求高、需要可审计与权限控制的生产任务。它不是万能架构,但在大多数企业 Agent 落地里,往往是更长期可持续的方向。

(三)链式架构与图式架构

很多 Agent 框架的早期实践是链式架构,也就是把一组模型调用、检索、工具调用按顺序串起来。链式架构的好处是理解成本低,适合表达较简单的线性任务,比如检索后回答、总结后分类、提取后填写表单等。

但现实任务很少严格线性。只要出现条件判断、循环重试、工具失败回退、人工介入、并行子任务或多路径决策,链式结构就会迅速变得难以维护。很多项目最开始看似是几步顺序调用,后面业务一扩展,代码里就开始出现大量 if-else、嵌套重试和分支拼接,最后演变成隐式工作流。

图式架构在这个阶段的优势就显现出来了。它把节点、边、状态和转移规则显式表达出来,使得复杂任务不再依赖代码中的隐式流程,而成为可视、可调试、可回放的状态图。上下文也可以围绕节点来设计,而不是围绕整条链路统一设计。

图式架构并不意味着一切都必须复杂化。它真正的价值在于,当任务复杂度超过某个阈值时,图式表达能显著降低整体系统的不透明度。特别是在需要多角色、多工具、多轮状态演进的场景里,它通常比链式架构更适合长期演进。

(四)单 Agent 架构与多 Agent 架构

多 Agent 架构这两年非常受关注,因为它看起来更接近人类组织协作:一个负责规划,一个负责执行,一个负责审查,一个负责调研。对于某些任务,这种分工确实有价值,尤其是角色边界清晰、知识域差异明显的场景,比如代码开发、研究分析、复杂内容生产。

多 Agent 的真正优势,是角色隔离和上下文局部化。每个 Agent 只看到与自己职责相关的上下文,这有助于减少单一大模型承担全部复杂性。同时,不同 Agent 可以采用不同的提示策略、工具权限和记忆策略,从而形成更有结构的协作。

但多 Agent 并不天然更好。它引入了新的系统复杂度:Agent 之间如何传递上下文,传递的是原文、摘要还是结构化状态;一个 Agent 的中间结论如何被另一个 Agent 验证;上下文冲突时谁裁决;共享记忆如何隔离权限;通信成本和延迟如何控制。这些问题如果没有设计清楚,多 Agent 很容易演变成多个不稳定单 Agent 叠加后的更大不稳定系统。

因此,多 Agent 适合角色边界清晰、任务天然可分解且协作收益显著高于协调成本的场景。而在很多企业流程里,一个显式状态驱动的单 Agent 加若干系统节点和工具节点,往往比引入多 Agent 更稳、更便于调试。


七、生产实践

(一)把上下文组装器做成独立层

如果项目已经进入生产落地阶段,我非常建议把上下文组装器从业务逻辑里抽离出来,做成清晰的独立模块。它不应只是一个 helper 函数,更不应散落在各个 Agent 节点里以字符串拼接形式存在。

一个更合理的总体架构,通常包括网关与会话管理、任务编排层、上下文组装器、检索层、状态层、记忆层、工具执行层,以及评测与观测层。模型只是其中的推理内核,而不是全部。

这个架构中,上下文组装器需要承担几类关键职责。它要根据当前节点识别上下文需求类型,向状态层、记忆层、检索层和工具层发起拉取;它要做相关性排序和预算分配;它要把原始数据转成模型可消费形式;它还要在调试时输出完整的上下文快照,便于回放和问题定位。

一旦上下文装配成为独立层,系统就从凭感觉拼 prompt,升级为可治理的信息供应链。

(二)上下文供给流程

在生产中,上下文供给最好不要一步到位,而是分阶段完成。

第一步是采集。系统从所有可能相关的来源获取候选信息,包括会话摘要、状态字段、检索结果、工具返回、长期记忆和系统规则。采集阶段不必过早裁剪,它的目标是建立候选池,避免关键事实漏掉。

第二步是筛选。筛选必须围绕当前任务节点,而不是只围绕用户表面问题。因为同一句话在不同任务阶段,其相关信息完全不同。筛选通常需要结合语义相关性、状态匹配、业务规则和优先级策略。

第三步是组织。组织不是简单排序,而是给信息分区。规则放哪,状态放哪,知识片段放哪,工具结果如何解释,记忆信息如何标注来源,冲突信息如何提示模型,都是组织阶段要解决的问题。

第四步是压缩。压缩的重点不是让文本变短,而是让信息密度更高。可以通过去重、字段抽取、表格化、模板化、摘要化等方式完成,但必须保证关键约束不丢失。

第五步是验证。对于高风险节点,系统还应在上下文送入模型前做一次基础校验,比如检查关键字段是否齐全、是否出现明显冲突、是否有越权数据、token 是否超预算。很多线上事故并不是模型回答错,而是上下文在进入模型前就已经不完整或不合法。

(三)会话摘要

会话摘要几乎是所有长对话 Agent 都会用到的技术,但它常常被做得过于粗糙。很多系统只是定期把一长段历史对话交给模型,请它总结成一段话。这在信息压缩上有帮助,但对复杂任务不够。

更稳妥的方式,是把摘要拆成两部分。一部分是叙事摘要,帮助模型理解会话语境和语义延续;另一部分是状态快照,明确记录当前任务的关键字段。例如,已确认目标、当前阶段、已完成动作、待决问题、外部依赖、失败记录、用户限制条件等。

前者保证对话自然性,后者保证系统可控性。两者缺一不可。只有叙事摘要,系统容易丢状态;只有状态快照,系统又容易丢失语义背景和用户表达中的隐含含义。

(四)知识召回

RAG 工程里最容易偷懒的一件事,就是把用户输入直接拿去做向量检索,然后把 Top-K 文档塞进模型。这种方式对简单问答还可以,但在 Agent 场景里,通常远远不够。

更有效的做法,是做任务感知检索。也就是说,检索 query 不是简单等于用户当前输入,而是由当前任务节点、已确认条件、业务实体、时间范围和用户权限共同构成。比如,在售后工单处理场景中,当前节点可能是判断是否可退款,那么检索时最相关的并不是用户整段抱怨文本,而是订单状态、退款政策、商品类目、支付方式和时效规则。

此外,检索结果进入上下文前,还应该经过去重、重排和引用标注。很多情况下,模型需要的不只是相关文档,而是被组织成可判断证据的文档。尤其在高准确要求场景中,给模型一个标注了来源和时间的知识片段,往往比给一大段未整理原文更有效。

(五)工具结果

工具结果回灌时,一个很实用的实践是双通道写入。原始结果优先进入状态系统或日志系统,作为权威记录;经过清洗、字段提炼和语义转译的结果,再进入模型上下文。

这相当于把工具结果的权威性和可消费性分开处理。系统层保留精确信息,便于回放、审计和后续业务逻辑判断;模型层只拿到当前任务真正需要的部分,减少认知负担。对于复杂 API,这种做法非常重要,因为原始结果往往对系统有价值,对模型却是干扰。

(六)可观测性设计

没有上下文可观测,就几乎不可能系统性优化 Agent。因为当回答错误时,你无法知道模型到底看到了什么、漏掉了什么、被什么干扰了。

因此,生产系统至少应保存以下几个层面的日志:一是模型调用前的最终上下文快照;二是各来源上下文的构成比例,例如历史、状态、RAG、工具、记忆各占多少 token;三是检索候选和最终入选内容;四是摘要前后差异;五是状态变更记录;六是关键节点的模型输出和系统裁决结果。

这套观测不是为了追求日志丰富,而是为了回答真正重要的问题:错误究竟发生在信息获取、信息组织、信息压缩,还是模型推理阶段。


八、常见坑

(一)上下文膨胀

这是最常见、也最容易被误判的问题。系统效果一旦下降,团队的直觉往往是再多喂一点信息,希望模型别漏掉关键背景。短期看,部分样例可能确实变好;长期看,这种做法往往会形成膨胀螺旋。

膨胀之后的上下文,一方面增加 token 成本和延迟,另一方面会稀释关键事实。模型不是一个无限专注的阅读器,它面对大而杂的上下文时,也会发生注意力分散和权重错配。很多时候,系统不是因为信息不够而错,而是因为信息太多、层次太乱。

真正有效的解决方式,不是无脑摘要,而是建立上下文准入制度和预算制度。哪些信息属于强制进入项,哪些是按需项,哪些必须在特定节点才能出现,哪些永远只保存在外部状态里,这些都要有明确策略。

(二)记忆污染

Memory 是最容易被过度乐观对待的模块。很多团队以为,只要把更多历史信息存起来,Agent 就会越来越聪明。但现实常常相反。没有筛选机制的记忆系统,最终会被临时偏好、错误抽取、模型误判、重复内容和过期事实填满。

记忆污染最危险的地方在于,它不像一次模型输出错误那样即时显现,而是会在未来不断被召回和放大。系统会显得越来越自信,但依据越来越不可靠。

因此,对 Memory 的治理应该像治理数据库主数据一样谨慎。记忆写入最好来自高置信度事件,比如用户明确确认、工具系统返回、长期重复行为模式,而不是模型的单次推断。记忆也要允许修正、撤销和过期,而不是永久追加。

(三)摘要失真

摘要是上下文压缩的重要手段,但如果过于依赖自由生成式摘要,它会在不知不觉中引入事实偏差。尤其是涉及时间、数字、条件、责任边界、例外条款等信息时,自然语言摘要很容易把原始精度磨平。

对于纯聊天型产品,这种问题也许可以接受;但对于合同、财务、审批、报价、工单、交易、运维等场景,摘要失真可能直接导致业务事故。因此,关键上下文不应只做生成式总结,而应配合抽取式字段保留、模板化摘要和结构化快照。

(四)把模型推理过程当长期资产保存

一些团队会把模型的长链条思考、试探性推理和中间分析全文保存在系统里,甚至在后续任务中继续回灌,希望这样能保留思考连续性。实验环境下,这种方式可能在某些任务上有效,但生产中风险很高。

因为模型推理过程本身包含大量假设、尝试和未验证结论。它适合辅助当前轮推理,却不适合作为长期状态或长期记忆。系统真正应该保留的是经过筛选后的决策结果、关键依据、待验证事项和失败原因,而不是完整思维链。

(五)权限和安全边界处理太晚

很多团队在设计上下文时,先考虑效果,最后才补权限和脱敏。这在企业环境里非常危险。因为一旦上下文组装时没有做权限隔离,敏感信息就已经进入模型输入链路,后面再想补救就只剩输出约束了。

正确做法应当是,把权限控制前置到上下文候选池阶段。模型能看到什么,首先由系统决定,而不是先把所有数据都给模型,再希望模型自己不说出来。这是上下文工程和安全工程必须融合的地方。


未来 Agent 系统的差异化,未必主要体现在谁先接入了多少工具、谁做了多少角色分工,而更可能体现在谁拥有更成熟的上下文操作系统。这个系统能够完成分层存储、智能召回、状态抽象、动态压缩、权限控制、质量评估和全链路回放,使模型始终工作在一个高质量、低噪声、强约束、可演进的上下文环境里。

当我们把问题看到这一层,就会明白,上下文工程不是给 Agent 应用锦上添花,而是在决定它能否从一个看起来聪明的原型,成长为一个真正可靠的生产系统。

如果说提示词工程解决的是如何让模型更会说,那么上下文工程解决的,就是如何让模型在复杂系统中持续说对话、做对事、并且在说错和做错时还能被定位、被修正、被进化。这才是 Agent 工程进入深水区之后,真正值得长期投入的核心能力。


~码文不易,留个赞再走吧~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐