上下文工程(Context Engineering)

Context Engineering 是指精心设计”喂给模型的那段上下文”——决定放哪些内容、怎么组织排列、怎么压缩取舍,让模型在有限的上下文窗口里拿到最相关、最干净的信息,从而输出得更准、更稳、更省钱。

本质:模型每次推理只能看到上下文窗口里的东西,看不到窗口外的一切。所以”给它看什么、怎么给”直接决定它的表现。Context Engineering 就是管理这个”视野”的工程。

一句话定位:Prompt Engineering 是”把一句话问好”,Context Engineering 是”把整个上下文这盘菜配好”。 前者调的是措辞,后者管的是——检索来的资料、历史对话、工具返回、系统指令等所有内容如何取舍编排。

类比:模型像一个只能看到面前这张办公桌的专家。桌子(上下文窗口)大小固定,你把什么资料摆上桌、怎么摆、旧的什么时候撤掉,决定了他能不能把活干好。桌上堆满无关文件,他反而找不到重点。

为什么它是 Agent 的核心问题

普通聊天一问一答,上下文压力不大。但 Agent 要多轮循环(见 agent.mdloop_engineering.md),每一轮都往上下文里堆新东西:工具返回、观察结果、中间推理……很快就会:

  • 撑爆窗口:超过上下文长度限制,早期信息被挤掉(token 概念见 token.md)。
  • 注意力稀释:内容越多,模型越容易”迷失在中间”(lost in the middle,中间的信息最易被忽略)。
  • 成本飙升:按 token 计费,上下文越长每一轮越贵。
  • 被污染/干扰:无关或错误信息混进来,把模型带偏(也是提示词注入的温床,见 agent_security.md)。

关键认知:上下文窗口是稀缺资源,不是”越满越好”而是”越准越好”。 Context Engineering 的目标不是塞满,而是在有限预算里最大化”有用信息的密度”。

上下文里通常有哪些成分

成分是什么特点
系统提示 (System Prompt)角色、规则、总体指令常驻,最高优先级
用户输入当前的问题/任务必须保留
对话历史之前的往返记录会越积越长,需裁剪/摘要
检索内容 (RAG)从知识库/文档检索来的片段要选最相关的,见 embedding_model.md
工具返回 (Observation)工具调用的结果可能很长很杂,需精简
Skill / 记忆按需加载的方法论、长期记忆渐进式加载,见 skills.md

核心手段

把有限的上下文用在刀刃上,常见几类操作:

手段做什么解决什么
选择 (Select / Retrieve)只挑最相关的内容放进来(RAG、检索)避免无关信息占位
压缩 (Compress)摘要、去冗余、只留结论省 token、提信息密度
裁剪 (Trim)丢弃过时的历史轮次防止撑爆窗口
摘要 (Summarize)把长历史滚动总结成短摘要长对话保持连续性又不爆
排序 (Order)把最重要的放开头或结尾对抗”lost in the middle”
隔离 (Isolate)把不可信的外部内容明确分区标注防注入、防污染
结构化 (Structure)用标签/分节/格式清晰组织让模型更容易定位信息
外置 (Offload)把大内容存到外部,用时再取(记忆、文件)突破窗口物理限制

渐进式披露(progressive disclosure)是贯穿始终的思想:平时只放”摘要/索引”,需要细节时才展开。 Skill 的三层加载(见 skills.md)就是它的典型应用。

上下文压缩:Agent 长任务的关键

Agent 跑长任务时,上下文会持续增长直到接近上限。常见应对:

  • 滚动摘要 (Rolling Summary):把早期的对话/操作压成一段摘要,替换掉原始的冗长记录。
  • 分段处理:把大任务切成小段,每段用独立、精简的上下文。
  • 外部记忆 (Memory):把需要长期记住的东西写到外部存储(文件/向量库),用时检索回来,而不是一直塞在窗口里。
  • 观察结果精简:工具返回一大段时,只保留关键字段再入上下文,而非原样塞入。

这正是很多 coding agent”上下文快满时自动压缩、然后接着干”的机制。呼应 loop_engineering.md:循环能不能持续跑下去,很大程度取决于上下文管理得好不好。

Context Engineering vs Prompt Engineering

维度Prompt EngineeringContext Engineering
关注点单条提示的措辞、结构整个上下文的内容取舍与编排
粒度一句话/一段提示系统提示 + 历史 + 检索 + 工具返回的总和
场景单轮问答为主多轮 Agent、长任务、RAG
目标问得更清楚让模型每一轮都看到”对的信息”

不是取代关系:Prompt Engineering 是 Context Engineering 的一个子集。写好系统提示是其中一环,但 Context Engineering 还要管历史、检索、压缩等更大的盘子。

常见坑 / 误区

  • ❌ “上下文塞得越多模型越聪明” → 恰恰相反,无关信息会稀释注意力、增加成本、还可能带偏
  • ❌ “把所有资料一次性喂进去最省事” → 会撑爆窗口、贵、且触发”lost in the middle”;应检索 + 按需加载
  • ❌ “对话历史一直留着就行” → 长对话必须裁剪/摘要,否则很快超限
  • ❌ “外部检索来的内容可以直接信任” → 要做相关性筛选,且外部内容要隔离标注防注入(见 agent_security.md
  • ❌ “上下文顺序无所谓” → 有所谓,重要信息放头尾更不易被忽略
  • ❌ “Context Engineering 就是写好 Prompt” → 只是其中一部分,它还管历史、检索、压缩、记忆

延伸阅读 / 关联概念

  • Token — 上下文窗口按 token 计量,理解成本与限制的基础;见 token.md
  • Skill — 渐进式加载,控制上下文成本的典型手段;见 skills.md
  • Loop Engineering — 长循环里上下文如何持续管理;见 loop_engineering.md
  • Agent 运行机制 — 每轮循环都在往上下文堆东西;见 agent.md
  • Embedding / RAG — “选择”相关内容的检索基础;见 embedding_model.md
  • AI 可预测性 — 干净稳定的上下文是可复现输出的前提;见 ai_predictability.md
  • Agent 安全 — 上下文是提示词注入的入口,需隔离外部内容;见 agent_security.md
  • Prompt Engineering — “怎么下令”(指令强度层级:软规则 < 强声明 < few-shot 正反例);见 prompt_engineering.md
  • Agent 记忆 — 短期/长期记忆、落库判据、冲突与过期、遗忘指令处理;见 memory.md