跳转至

上下文工程入门

这篇先不讲源码,也不讲复杂架构。

先记住一句话:

上下文工程,就是让 Agent 在合适的时候看到合适的信息。

先用一个例子理解

假设你让一个 Agent 帮你改代码。

它要做好这件事,不能只看你一句“帮我修一下 bug”。

它还需要知道:

  • 你在哪个项目里。
  • 你想修哪个问题。
  • 当前打开了哪个文件。
  • 哪段代码被你选中了。
  • 项目有什么编码规范。
  • 能不能改文件。
  • 能不能联网查资料。
  • 改完后要不要跑测试。
  • 之前有没有做过相关决定。

这些信息加起来,就是 Agent 的“上下文”。

上下文工程,就是设计这些信息怎么被收集、整理、筛选、注入给模型。

Prompt 不是全部

很多人一开始会以为:

Agent 效果好不好,主要看提示词写得好不好。

提示词当然重要,但 Agent 产品里更关键的是:

  • 哪些信息默认给模型?
  • 哪些信息按需再查?
  • 哪些信息太旧了要压缩?
  • 哪些信息只是参考,不能当命令?
  • 哪些行为必须受权限控制?

所以,提示词工程像是“怎么说一句话”。

上下文工程更像是“怎么布置整个工作现场”。

三类最重要的上下文

刚开始可以先只记三类。

1. 任务上下文

告诉 Agent 现在要做什么。

例如:

  • 用户的当前请求。
  • 当前任务进度。
  • 下一步要做什么。
  • 哪些事情还没完成。

2. 资料上下文

告诉 Agent 可以参考什么。

例如:

  • 文件内容。
  • 搜索结果。
  • 代码片段。
  • 文档。
  • 历史对话记录。
  • 记忆和知识库。

3. 规则上下文

告诉 Agent 应该怎么做、什么不能做。

例如:

  • 代码规范。
  • 输出格式。
  • 权限限制。
  • 安全要求。
  • 团队约定。
  • 当前渠道的回复方式。

如果一个 Agent 经常乱答、乱改、忘记任务,大概率就是这三类上下文没有管理好。

动态 Prompt 是什么

动态 prompt 可以先理解成:

产品在运行时临时贴给模型的“便签”。

比如:

  • 用户在 IDE 里选中了代码,产品就贴一张便签:“这是当前选区”。
  • 当前不能联网,产品就贴一张便签:“不要尝试访问外部网络”。
  • 上下文快满了,产品就贴一张便签:“请总结当前进度,方便之后继续”。
  • 当前是语音聊天,产品就贴一张便签:“只返回适合朗读的短句”。

这些便签不是用户手写的,而是产品根据运行状态自动注入的。

这就是运行时上下文工程。

它发生在 API 和 Transformer 之间

前面学过 LLM API 后,可以这样看上下文工程:

用户请求
  ↓
HTTP JSON
  ↓
上下文工程:选信息、排顺序、加规则、加工具 schema、压缩历史
  ↓
prompt / chat template
  ↓
tokenizer
  ↓
Transformer

也就是说,上下文工程不是 Transformer 内部结构。

它更像是服务端在调用模型前做的一层组织工作:

  • 哪些 message 放进请求。
  • system、developer、user、tool 如何分层。
  • 检索结果放前面还是后面。
  • 工具说明怎么写进 tools 或 prompt。
  • 历史对话是保留原文还是压缩。
  • 哪些稳定前缀要保持不变,方便 prefix cache 命中。

一个 Agent 产品大概怎么工作

可以先用这条简单流程理解:

用户请求
  ↓
收集上下文
  ↓
筛选重要信息
  ↓
注入提示词和资料
  ↓
模型思考并调用工具
  ↓
记录结果和进度
  ↓
必要时压缩或写入记忆

上下文工程贯穿整条链路。

它不是某个单独功能,而是 Agent 产品的底层组织方式。

Codex / Claude Code / OpenClaw 怎么看

先不要看源码,先看它们各自解决什么上下文问题。

Codex

Codex 主要面对代码仓库。

它关心:

  • 当前工作目录。
  • 项目规则。
  • 文件内容。
  • 终端命令结果。
  • 是否能改文件。
  • 是否要申请权限。
  • 修改后如何验证。

所以 Codex 的上下文工程偏“代码任务现场”。

Claude Code

Claude Code 也主要面对代码任务。

它特别强调:

  • CLAUDE.md 里的项目说明。
  • 自动记忆。
  • 上下文窗口。
  • 压缩。
  • 子 agent 隔离大任务。

所以它很重视“长期代码会话怎么不断片”。

OpenClaw

OpenClaw 更像常驻个人助手。

它关心:

  • 消息来自哪个聊天软件。
  • 是群聊还是私聊。
  • 是否是语音。
  • 是否是定时唤醒。
  • 要不要查记忆。
  • 要不要路由给另一个 agent。

所以 OpenClaw 的上下文工程偏“多渠道、长期在线、跨任务”。

学习路线

建议按这个顺序学:

  1. 先理解:上下文就是 Agent 工作时能看到的信息。
  2. 再理解:上下文分为任务、资料、规则。
  3. 再理解:动态 prompt 是产品运行时贴给模型的便签。
  4. 再看:Codex、Claude Code、OpenClaw 分别在管理哪些上下文。
  5. 最后才看源码里的 prompt 清单。

源码清单是工具书,不是第一课。

下一步

读完这篇后,再看:什么是上下文工程

那篇会进入更完整的定义、产品机制和 Java 设计。

如果你想继续理解上下文工程如何变成完整 Agent 产品,读:Harness Engineering:把模型变成可用 Agent 的工程

如果你想理解 Agent 为什么会一轮轮调用工具,以及如何停止,读:Loop Engineering:Agent 循环、停止条件与恢复

如果你还没读 API 链路,建议先补:LLM API:从 HTTP 到 Transformer