04.01概念更新于 2026年9月17日

什么是 Context

Prompt 是指令,Context 是模型本次看到的全部信息。

04.01 · 课时讲解

什么是 Context

Prompt 是写给模型的指令,Context 是模型这一次调用能看到的全部信息。

1 / 12

一句话理解:Prompt 是你写给模型的指令,Context 是模型在这一次调用里能看到的全部信息;模型只能根据看到的东西做判断,看不到的就等于不存在。

很多团队第一次做 Agent,出了问题的第一反应是“改 Prompt”。改了十几版,效果还是时好时坏。原因往往不在指令写得好不好,而在于模型 那一刻根本没看到做对这件事所需的信息:退款政策上周更新过,但检索到的还是旧版本;用户三轮之前说过“只看企业版客户”,这句话已经被截断;工具返回了 3000 行支付流水,真正关键的那一条淹没在中间。

这一课先把“Context”这个词讲清楚。后面整个模块都建立在一个判断上:Agent 的效果,大部分取决于每一步的上下文里放了什么。

先看整个模块的全景:信息从多个来源汇入,经过“五问”设计进入上下文窗口,再用一组管理手段让窗口保持干净。

Context Engineering 全景:来源、五问设计、上下文窗口、管理手段与支撑体系 Context Engineering:在每一步推理前,挑选并维护一组最合适的 Token ① 来源 · 从哪里来 静态底座(每一步都在) 系统指令 工具定义 运行时产生 对话 用户画像 记忆 知识 工具结果 文件 任务状态 预先装入 Push · 按需获取 Pull ② 设计 · 上下文五问 What 给什么 最小充分信息集 When 何时给 预装 · 按需 · 触发注入 How much 给多少 引用 · 摘要 · 片段 · 全文 Where from 从哪来 唯一权威来源 Priority 谁优先 冲突与预算的取舍 ③ 上下文窗口 · 一次调用 系统指令 工具定义 用户画像与记忆 对话历史 工具结果 检索到的知识 任务状态 模型推理 → 输出 / 工具调用 模型只看得到窗口里的内容 ④ 管理 · 让窗口保持干净 威胁:上下文腐化 稀释 · 干扰 · 中间遗忘 · 错误累积 事前节制 渐进式披露 目录常驻 · 正文与附录按需加载 事后减负 摘要压缩 替换早期历史 外置笔记 进度写到窗口外 清理工具结果 用完即清 子 Agent 隔离 只取回结论 目标:最小充分,而不是尽量完整 工具结果与新对话回流,下一步重新装袋 成本与延迟 提示缓存:稳定前缀在前、变化内容在后 · 命中率纳入监控 · 清理与压缩成批进行 可观测 Trace 还原模型每一步实际看到的上下文 · 先问“它看到了什么”,再决定改 Prompt 还是换模型 可信与安全 来源与时间标签 · 关键事实指定权威来源 · 外部内容只当数据不当指令 · 冲突优先级写清楚
图 1 · Context Engineering 全景:信息从哪来、怎么设计、装进窗口、如何保持干净

Prompt 与 Context 不是一回事

Prompt(指令) Context(上下文)
是什么 告诉模型“你是谁、要做什么、怎么做” 模型本次调用能看到的全部 Token
包含什么 System Prompt、任务描述、输出格式 指令 + 工具定义 + 对话历史 + 工具结果 + 检索到的文档 + 文件 + 模型之前的思考与输出
谁来写 主要由人提前写好 大部分在运行时动态产生
变化频率 版本化,偶尔修改 每一步都在变
典型问题 指令含糊、互相冲突 信息缺失、过期、过多、冲突、难以阅读

Prompt 是 Context 的一部分,而且在一个跑了 20 步的 Agent 里,它往往只占很小一部分。剩下的大头是工具返回的结果、检索到的资料和不断累积的对话历史。

Anthropic 在工程博客里把这件事称为 Context Engineering:Prompt Engineering 关注“怎么写好指令”,Context Engineering 关注“在每一轮推理时,如何挑选并维护一组最合适的 Token”。前者更像一次性的写作任务,后者是贯穿 Agent 整个运行过程的持续工作。

模型没有记忆,每次都是“第一次见面”

理解 Context,最重要的直觉是:大模型 API 本身是无状态的。 模型不会“记得”上一轮说了什么。你看到的“连续对话”,是程序每次都把之前的消息重新发了一遍。

可以把模型想象成一位能力很强、但每次进门都会失忆的外包专家。你每次找他,都必须把相关材料装进一个文件袋递过去。他只看文件袋里的东西,看完给出判断,然后忘掉一切。

  • 文件袋里没有的信息,他不知道。
  • 文件袋里信息太多,他会看漏重点。
  • 文件袋里放了过期的材料,他会基于过期信息做判断。
  • 文件袋有容量上限,也就是 上下文窗口(参见 Token 与上下文窗口)。

Agent 的每一步推理,都是递一次文件袋。一个 Agent 跑 20 步,就是 20 次“装袋”。Context Engineering 做的事,就是设计好每一次装什么。

把“每一步都重新装袋”画出来,就是下面这样:

模型无状态:每次调用都把指令、历史与新结果重新发送一遍 每次调用发送的上下文 模型 第 1 次调用 指令 工具定义 用户问题 模型 调用工具 A 第 2 次调用 指令 工具定义 用户问题 工具结果 1 模型 调用工具 B 第 3 次调用 指令 工具定义 用户问题 工具结果 1 工具结果 2 模型 给出回答 模型本身不记得上一步;“连续”来自程序把历史重新发一遍
图 2 · 每一步都重新装袋:上一步的结果写回,下一次调用整体重发

拆开一次调用:客服 Agent 的第 6 步

用户问:“订单 ORD-1024 的退款为什么一直没到账?”Agent 已经查了订单和退款记录,现在准备决定下一步。此刻模型看到的上下文大致是这样:

客服 Agent 第 6 步的上下文构成:八类信息及其 Token 占用 类别与内容 约占 Token ① System Prompt 角色、目标、业务规则、风险策略 约 3k ② 工具定义 12 个工具的名称、描述、参数 约 6k ③ 用户画像 / 记忆 华东区客服专员,偏好先看结论 约 0.2k ④ 对话历史 用户的问题与前几轮回复 约 1k ⑤ 工具结果 #1 get_order → 订单详情 JSON 约 2k ⑥ 工具结果 #2 get_refund_record → 退款记录 约 1.5k ⑦ 检索到的知识 《退款政策 v3》两个段落 约 1.2k ⑧ 任务状态 已查:订单、退款记录;待查:发票状态 约 0.1k 模型输出 调用 get_invoice_status(order_id) 合计约 15k Token 共用同一个上下文预算
图 3 · 第 6 步的上下文:指令只占一小块,⑤⑥⑦ 这些运行时数据决定下一步

这张图说明了三件事:

  1. 指令只占一小块。 真正决定下一步判断的,是 ⑤⑥⑦ 这些运行时进入的数据。
  2. 每一块都有来源、时效和可信度。 订单 JSON 是系统实时数据,退款政策是某个版本的文档,用户画像可能是几个月前写入的。下一课会专门讲来源。
  3. 每一块都在消耗同一个预算。 工具定义占了 6k,比 System Prompt 还大;如果再把 3000 行支付流水原样塞进来,前面的重要信息就会被稀释。

Agent 答错时,先问“它看到了什么”

当 Agent 给出错误结论时,可以按下面的顺序排查。多数“模型不够聪明”的问题,其实落在前四类:

问题类型 表现 客服场景的例子 解决方向
信息缺失 模型猜测或编造 没查发票状态,就断言“银行还在处理,请再等等” 补工具、补检索、改流程
信息过期 结论基于旧事实 检索到 v2 退款政策,而 v3 已生效 知识保鲜、版本元数据
信息过多 忽略关键细节 3000 行支付流水里漏看“退款单已被系统驳回” 工具返回精简、摘要、按需加载
信息冲突 结论摇摆不定 订单系统显示“已退款”,用户说“没收到” 明确优先级、标注来源
难以阅读 理解偏差 字段名是 st_cd=3,没有说明含义 工具返回可读字段
真正的推理错误 信息齐全仍判断错 规则和数据都在,仍算错了退款到账时限 拆步骤、交给程序计算、加验证

这张表也是和工程师沟通时的共同语言:先 打开 Trace,看模型这一步实际收到了什么,再讨论要不要改 Prompt 或换模型。Trace 的读法见 Tracing。

常见误区

  • “模型会记住之前的对话。” 模型本身不记。能“记住”,是因为程序把历史重新放进了上下文,而历史会被截断、压缩或清理。
  • “上下文窗口够大,全塞进去最省事。” 窗口大只说明装得下,不说明看得清。后面「上下文腐化」一课会讲,信息越多,模型对单条信息的利用率往往越低。
  • “效果不好就改 Prompt。” 如果问题是信息缺失或过期,再精妙的指令也救不回来。先看 Context,再改 Prompt。

产品经理检查清单

评审一个 Agent 方案时,针对关键步骤问:

  • 这一步做出正确判断,需要哪些信息?每一条从哪来?
  • 这些信息是否在这一步 之前 就能进入上下文?
  • 有没有哪一类信息特别大(工具返回、长文档、历史记录)?谁负责把它变小?
  • 如果两个来源说法不一致,模型应该信谁?指令里写清楚了吗?
  • 出错时,我们能否在 Trace 里还原模型那一刻看到的完整上下文?

练习

找一个你能看到调用日志的 AI 应用(自己的 Demo、Claude Code 的会话,或团队的 Agent 都可以),选一次“答得不好”的运行:

  1. 把那一次调用的上下文按上面 ①–⑧ 的类别拆开,估算每类大约占多少 Token。
  2. 用“问题类型”表格判断,这次失败属于哪一类。
  3. 写一句话:如果只允许改上下文、不允许改指令,你会怎么改?

延伸阅读

下一步

下一课「上下文从哪里来」会逐一拆解对话、用户画像、记忆、知识、工具结果、文件与任务状态这些来源,以及它们各自的可信度与时效。

试试:上下文、MCP、沙箱、Prompt 注入、外链