
我先说个结论过去两年里真正把大模型用出差距的团队没有一个是在写 Prompt上赢的全是在管上下文上赢的。Prompt 只是表象Context Engineering——上下文工程——才是那层决定模型输出质量的地基。这东西听起来玄乎拆开看就是四件事该给模型什么信息、以什么顺序给、给多少、以及怎么让它在多轮对话里不跑偏。我是在做企业知识库问答项目时被逼着系统的这套方法论。当时同样一组模型 API同样一套知识库团队的 A 同学搭出来的机器人像一个入职三年的专家B 同学搭出来的像一个刚毕业还忘带电脑的新人。差异不在 Prompt 文本上而在接入 Prompt 之前那堆看不见的上下文处理逻辑。这篇文章把我踩过的坑、总结的原则、落地的工具链完整写出来适合正在做 Agent、RAG 应用、或者想把 GPT/Claude 类模型稳定嵌入业务流程的工程师和产品经理参考。1. Context Engineering 到底在解决什么问题1.1 一个让我意识到Prompt 不是一切的真实案例先说那个让我彻底转变的案例。我们做的知识库问答机器人分类别是设备维修手册的问答操作工经常会问类似这台螺杆机的排气温度偏高该怎么办这种问题。最初版本的 Prompt 写得很漂亮逻辑严密限定条件一大堆结果模型回答的准确率始终卡在 82% 左右。后来我把输入给模型的内容完整打出来看了一遍发现问题很蠢Context 里塞了 12 条维修手册条目但真正和螺杆机排气温度相关的那条被排在了第 9 位。模型在生成时严重受上下文位置影响中后段的信息会被自然遗忘。我把相关条目重排到 Context 的最前面之后准确率直接跳到 91%。没有改动任何 Prompt 文本没有任何模型调参。从那天起我理解了一件事大模型是一个上下文驱动的概率系统你给它的上下文结构决定了它的能力上限。Prompt 只是在调用这个结构Context Engineering 才是决定这个结构长什么样的关键。1.2 Context Engineering 与 Prompt Engineering 的本质区别很多朋友把这两个概念混在一起。我做了个对比区别非常清晰维度Prompt EngineeringContext Engineering作用层模型输入的最后一段文字模型输入的全量信息空间核心命题如何把指令写清楚如何把信息组织成一个高信噪比的证据包处理对象指令文本指令文本 检索结果 历史记忆 外部数据 工具输出 用户个人数据常见技术动作细化指令、加示例、调措辞信息裁剪、排序、压缩、记忆持久化、防污染典型失败场景指令很清晰但结果还是错指令清晰、信息也在但信息的位置/顺序/相关度不对一句话概括Prompt Engineering 是房子的装修Context Engineering 是房子的地基和水电管线。装修出问题你顶多觉得丑管线出问题整个房子没法住人。1.3 为什么现在才需要这套方法论两个曲线的错位你可能会问为什么两年前没人提 Context Engineering现在突然成了热搜词原因挺现实的。第一模型本身的单次推理能力已经够强瓶颈从模型懂不懂转移到了模型有没有拿到对的信息。第二应用复杂度上来了。现在做的东西早已不是单轮问答而是带工具调用、带多轮记忆、带私有知识库的 AgentContext 的组装复杂度指数级上升。第三成本敏感度不一样了上下文越长推理延迟和费用增长越猛怎么在有限窗口里放入高价值信息直接变成成本竞争力的一部分。三条线叠在一起逼迫从业者从把 Prompt 写好走向把 Context 经营好。这也就是 Context Engineering 方法论最近被反复讨论的真实背景。2. 四阶上下文管线收集、策展、组装、注入2.1 一个核心转变上下文不是找出来的是建出来的传统 RAG 思路里我们常默认上下文 检索出的 Top-K 条文档拼一起丢给模型。这套做法最大的问题是没有策展。检索器返回的 Top-K 是基于语义相似度排序的而不是基于模型做决策需要什么排序的。我从做知识库问答的经验出发把上下文处理拆成一条四阶段管线每个阶段顺应一个核心动作收集Collection不只看检索结果还要把用户画像、会话历史、工具返回结果、时间信息、环境信息全部纳入候选池。策展Curation对候选信息做相关度过滤、去重、冲突消解、冗余压缩并按证据强度重新排队。组装Assembly按结构化模板把信息编排成适合模型消耗的格式包括指令区、事实区、对话史区、任务区。注入Injection在运行时把组装好的上下文注入模型输入并管理长度预算、历史裁剪、动态更新。2.2 每个阶段的具体动作与产出物收集阶段的重点是拓宽输入源。我见过太多团队把上下文窄化为文档检索结果结果模型无法回答需要结合用户历史、当前模式、上次诊断结论的问题。我的习惯是建一个候选上下文矩阵每一行是一类信息源用户当前问题、用户画像标签、近期会话摘要、当前模式/场景比如维保模式还是应急模式、知识库检索段、工具调用返回、系统时间/设备状态等。每个信息源先不进模型先落到结构化缓存里由下一步决定要不要用。策展阶段是全管线里最容易被跳过的部分也是投入产出比最高的部分。我在这阶段做了三件事相关度二次评分用轻量模型或规则对每个候选片段重新打分而不是直接信任向量检索的分数。证据冲突消解当两份资料说法不一致时优先选版本更新、来源更权威、与当前设备型号更匹配的那条必要时同时保留并让模型自行判断。压缩长段落用抽取式摘要压成 2-3 句话保留关键实体、数字、操作步骤去掉背景铺垫。策展的产出物是一个有序证据列表每一条都带着来源标签、可信度和时效性。这一步做完上下文质量已经提升一大截。组装阶段的核心是给模型一个清晰的认知地图。我会用显式的区段标识XML 风格标签或 Markdown 分隔把上下文分成若干语义区域。模型在长上下文里工作时明确的区域划分能显著降低信息混淆概率。具体模板我放在第 3 节讲。注入阶段解决的是窗口不够用的问题。我通常把上下文分成两部分必选区任务指令、核心证据、当前问题和弹性区历史记忆、背景知识、扩展案例。先注入必选区然后根据剩余 token 预算按优先级弹性注入其他内容。注入前还有一道工序检查历史区是否需要滚动裁剪基本原则是保留最近 2 轮完整对话 剩余部分的摘要。2.3 现实中的决策什么情况走全量管线什么情况走轻量版完整的四阶管线不是每个请求都要走的成本太高。我的判断标准是高频且低风险比如查询天气算个税费走轻量版直接组装跳过深度策展。中频且需要专业判断比如客服机器人回答售后政策走策展版二次评分 证据排序但不用复杂压缩。低频且高风险比如医疗建议、法律咨询、设备维修指导走全量版所有环节全开宁可多花 200ms 也要把上下文质量拉满。管线化之后Context 的构建不再是每次现场攒而是变成一套可配置、可测试的流程。这是它被称为工程的根本原因。3. 上下文窗口里的编排原则优先级、位置、淘汰3.1 必选区与弹性区给不同信息定身份我打磨到现在最稳定的一套上下文模板长这样task 这里是任务指令描述你要完成的目标和约束。 /task facts 这里是核心证据区放与当前问题直接相关的关键事实按相关度从高到低排列。 /facts format 这里是输出格式要求包括回复结构、语气、是否引用来源等。 /format conversation 这里是多轮对话历史仅保留最近 2 轮全文更早内容的一句话摘要。 /conversation extras 这里是扩展信息区放背景资料、可选案例、用户画像等弹性注入。 /extras这套模板的核心思想是分配注意力。模型在长上下文中存在显著的迷失中间现象开头和结尾的内容被关注得最多中间部分容易被稀释。所以我把最关键的证据放在facts区的开头整体位置的偏前段把约束条件放在format区靠后一点让模型在生成前再次看到格式要求。3.2 实验验证过的位置效应开头黄金区与结尾近因区我做过一组很粗糙但有效的实验把同一个故障诊断问题分别把核心证据放在 Context 的不同位置跑 50 次看准确率。结果是核心证据在整体位置前 20% 时准确率 89%放在 50% 位置降到 81%放在 80% 位置只有 76%。结尾位置又略有回升。这不是玄学是 LLM 注意力机制的自然倾向。所以我在组装上下文时的硬性规则是核心证据永远排在事实区前两条绝对不隔在中间段落。涉及多份文档时我宁可用一句以下内容中第 3 条最为关键请优先参考这种显式引导把模型的注意力拉过去也不要赌它自己在长文本里找。3.3 上下文淘汰机制别让历史记忆变成噪音多轮会话里最隐蔽的杀手是历史记忆。用户的早期意图、已修正的错误信息、已经过时的设备状态都会被模型当成有效上下文干扰当轮判断。我用三个规则做淘汰时间衰减超过 N 轮的历史不再保留原文只保留一轮摘要摘要也只提取结论和未完成任务。意图切换检测当检测到用户话题发生明显跳转比如从咨询价格变成投诉物流上一段对话史的优先级直接降级只保留一句用户此前咨询过价格问题后续可能重新提起。事实纠偏如果后续对话中用户修正了某个信息比如开始说设备型号是 A后来更正为 B系统必须主动生成一条冲突提示放在事实区顶部注意用户已确认设备型号为 B此前提到的 A 无效。这三条规则执行下来多轮对话的准确率和稳定性都有明显提升。很多团队只关心召回而不关心淘汰实际上一份过期的错误信息对模型的破坏力远大于三条新增的有效信息。4. 落地过程中的高频翻车点与对策4.1 翻车点一检索结果直接塞入没有做相关度重排第一次做知识库问答时我犯过最经典的错误向量检索返回 Top-K 直接拼进 Prompt。结果模型经常被不相关的段落带跑。有一次用户问液压油更换周期检索结果里混入了一条液压油型号选择标准两条内容都提到液压油但一个是周期一个是型号模型就把两张知识缝在了一起回答了一个看似合理但完全不存在的方案。这个问题在检索式系统里太常见了。向量相似度解决的是话题相近不是直接解题相关。液压油那条里一个讲周期一个讲型号embedding 距离可能确实不远但对当前问题价值完全不同。对策是加一道重排Rerank。我用过几种方式Elasticsearch 的 BM25 分数和向量分数做加权融合、小型 cross-encoder 模型对候选段做二元相关度打分、或者让 LLM 自己对 5-6 条候选做一次快速筛选。在知识库问答这种场景里cross-encoder 重排的性价比最高准确率提升 5-8 个点代价只是几十毫秒延迟。重排之后策展阶段的证据列表质量会明显改善。4.2 翻车点二对话历史整体保留旧错新对信息互相污染多轮对话场景里用户经常在中间过程推翻自己之前说的东西。比如开头说设备在车间 A几轮后改口不对其实在车间 B。我们的系统如果老老实实把整段对话历史都放在上下文里模型就会同时看到 A 和 B 两个矛盾信息然后给出一个模棱两可的回答甚至干脆搞错。我吃了这个亏之后专门做了一个事实一致性守望器在每轮对话结束时扫描当前 Context 里的用户陈述和之前的陈述做冲突检测。一旦发现矛盾自动生成一条修正指令插到上下文的facts区首行注意用户已更新信息设备位置为车间 B旧信息车间 A 仅供参考请以 B 为准。这里有个细节容易被忽略冲突消解不能只靠模型自觉要靠上下文显式声明。模型在执行任务时倾向于综合考虑所有信息你要主动帮它做断舍离。4.3 翻车点三只评估回答对不对不评估上下文有没有效我们初期做评估只看最终答案的准确率结果迭代了两版 Prompt指标纹丝不动。后来我把评估拆成两层第一层评估上下文质量证据覆盖率够不够、有没有冗余噪音、关键证据是否排到了正确位置、历史区有没有过期信息。第二层才是答案质量正确率、完整性、格式合规、引用准确性。第一层评估能做到的时候第二层指标的优化就变得有方向感了。比如我发现某类问题的证据排序总是把最关键的放在第 3 位那答案准确率就大概率会掉。评估上下文等于是在评估模型拿到手的东西比直接盯着最终答案更容易定位问题。4.4 一个隐藏成本坑上下文越长模型变笨速度越快有段时间为了把准确率拉满我把不限量地往 Context 里塞资料结果发现模型在某些任务上的表现不升反降。原因很简单上下文越长信噪比越低模型注意力被稀释的程度越严重。更现实的是长上下文的推理延迟和费用按 token 线性增长50 轮对话下来光历史 token 处理费用就不是小数目。我现在设定上下文预算的标准流程是先确定最小必要上下文——只放当前轮绝对要用的信息跑通然后逐步加扩展信息观察准确率是否有上升当准确率不再上升反而下降时就是预算上限。这个过程和机器学习里的调参找过拟合点很像本质是在找上下文的信息密度甜点区。5. 把方法论固化成一套可复用的工作流5.1 最小工程架构模板 缓存 组装器方法论能不能落地取决于你把它沉淀成什么样的工程构件。我现在项目里有一个非常精简的三件套结构模板注册表维护一个 JSON 文件集合每种任务类型对应一个上下文模板标明哪些区段必选、哪些可选、长度预算多少。模板内容本身就是工程资产改版可追溯可回滚。比如设备故障问答模板和多轮客服模板的conversation区策略就完全不同一个希望保留完整技术描述一个只保留意向摘要。证据缓存层把检索、重排、压缩后的证据片段存储在 Redis 里key 是用户意图类型 实体标签 时间窗口value 是已处理好的证据包。这样同一台设备再次报障时不需要重新走一遍收集和重排管线直接命中缓存大量节省延迟和成本。实测下来相同问题的第二轮咨询端到端耗时降低了 40% 左右。组装器一个 Python 写的发布-订阅式服务接收请求后从缓存读模板、从证据缓存读证据、从会话存储读历史然后按模板拼装成最终 Prompt。这个服务里还跑着上下文长度审计和冲突扫描器在拼装过程中自动执行淘汰规则。它输出的每一份 Context 都会记录版本号攒下来的日志是调优的重要数据源。5.2 上下文质量的日常体检清单现在每两周我会对上下文管线做一次体检项目组内部叫 Context Audit。清单如下随机抽 50 条真实请求检查组装后的文案中核心证据是否位于上下文前 30% 区域。统计每条请求的冗余度实际注入 token 数 / 有效信息估计 token 数冗余度超过 50% 的请求要标记复盘。检查 Top-10 高频问题的上下文里有没有过期信息、矛盾信息、非必要历史。检查缓存命中率如果命中率低于 30%说明 key 设计不合理或者用户问题太离散要调整意图聚合规则。做一次上下文消融把关键证据区整体拿掉看回答质量掉多少。如果掉了不到 10%说明原上下文里可能还有更关键的信息藏在其区段中需要重新梳理证据结构。这套体检机制的好处是把 Context Engineering 从个人手艺变成了团队流程。每次审计发现的典型问题都会回流到模板和缓存策略里去形成持续迭代闭环。5.3 进阶方向从规则走向模型自治我的下一阶段计划是让策展环节逐步自动化。现在的重排和冲突消解还依赖规则和轻量模型下一步打算在证据包进入组装器之前用一个评分模型对证据的相关度、时效性、矛盾度三个维度打分规则负责兜底。模型自治的前提是手里有一批标注过的上下文质量样本所以现在做 Context Audit 时我也在同步积累训练数据。这个方向走通之后上下文工程就成了一个可以自优化的数据飞轮每次请求的组装结果被记录评估结果反馈回来模型学会更好地策展证据。到那个阶段Context Engineering 的意义就彻底超越了写 Prompt成了整个应用系统里一个真正的智能模块。6. 一些值得长期养成的习惯做了半年多 Context Engineering 相关的项目最后分享几个我觉得值得长期养成的习惯第一永远打印一份组装后的完整 Context 来看。不要只盯着模型输出平时调试时把发给模型的原始输入完整 dump 出来你会很快建立对上下文质量的直觉。很多问题一眼就能在输入里看出来证据位置不对、历史太长、指令埋在深处。第二把上下文版本化。每版的模板、证据包、组装逻辑都打上版本号回答质量波动时可以快速定位是哪个环节变了。不要小看这条团队协作时这是效率利器。第三定期让上下文做减法。每隔一段时间刻意把 Context 里的内容删掉 30%观察模型表现。如果表现没掉甚至更好说明之前塞了太多噪音这个减法就是在帮你重新认识信息密度边界。这个习惯建立了之后整个系统的响应速度和成本都会持续受益。Context Engineering 的终极目标是让模型每次都拿到刚刚好的信息。多点浪费少点出错结构合理顺序正确——这套东西没有那么多高深理论但它对 LLM 应用质量的影响怎么强调都不过分。