AI Agents 的上下文工程:完整实战指南

@sairahul1
英语4周前 · 2026年6月17日
579K
547
90
16
1.4K

TL;DR

一份关于 AI Agents 上下文工程的综合指南,详细介绍了压缩和隔离等策略,以确保在长流程任务中维持高性能。

你的 AI 助手在前 10 步表现完美。

然后到了大约第 15 步,它开始变得马虎。

工具调用错误,忘记原始指令,输出质量低下。

大多数人都怪模型。

但几乎从来不是模型的问题。

而是模型看到的内容有问题。

组织模型看到的内容,叫做上下文工程

它正在迅速成为构建 AI Agent 最重要的一项技能。

以下是完整的操作手册。

提示工程已死。上下文工程才是现在最重要的。

Rahul - inline image

你听说过提示工程。

编写清晰的指令,给出好的示例,告诉模型扮演什么角色。

这对聊天机器人来说很有效。

但当你构建一个 Agent 时,它就不再管用了。

原因如下。

聊天机器人回答一个问题就停止。

而 Agent 会执行操作——浏览网页、调用 API、编写代码、运行命令——一步接一步,有时甚至数十步。

每一步都会产生输出,这些输出被添加到模型的上下文中。

而上下文是有限的。

Anthropic 的工程团队是这样定义的:

“上下文是从 LLM 采样时包含的 token 集合。上下文工程就是优化这些 token 的效用,以持续达成期望的结果。”

简单来说:确保你的 Agent 在正确的时间,以正确的格式,看到正确的信息。

提示工程是上下文工程的一个子集。

上下文工程才是一切。

你 Agent 的上下文窗口就是 RAM。而且它正在被填满。

Rahul - inline image

LangChain 对此有一个很好的类比。

把 LLM 想象成一种新型操作系统。

模型是 CPU——它负责思考。

上下文窗口是 RAM——工作内存,模型当前能看到和推理的一切都存在于这里。

就像你的电脑在 RAM 充满时会变慢一样,当上下文窗口变得拥挤时,Agent 的推理能力也会下降。

这叫做上下文腐烂

Chroma 进行了一项研究,评估了 18 个前沿模型——GPT-4.1、Claude 4、Gemini 2.5、Qwen3 等。

每个模型的性能都随着输入长度的增加而下降。

不是在硬限制处,而是在那之前就开始了。

一个拥有 20 万 token 窗口的模型,可能在 5 万 token 时就表现出显著的退化。

这种下降是连续的,而不是断崖式的。

为什么?Transformer 的工作原理是每个 token 都关注其他所有 token——产生 n 平方的关系。随着上下文增长,模型维持所有这些关系的能力会减弱。

此外还有“迷失在中间”的问题。

LLM 表现出 U 形的注意力曲线。

→ 上下文开头:记忆良好

→ 上下文结尾:记忆良好

→ 中间:很大程度上被忽略

研究人员发现,当相关信息从上下文开头移到中间时,准确率下降了 30 多个百分点。

你最初的指令——被埋藏在 5 万 token 的工具输出之下——实际上就消失了。

Claude Code 用户发现,在上下文容量达到 40–60% 时,输出质量就会下降。远在任何硬限制之前。

实际上在 Agent 上下文中争夺空间的是什么

Rahul - inline image

7 个类别。全部在争夺同一个有限的窗口。

1. 系统提示

Agent 的身份、行为规则、控制流逻辑、不同任务类型的指令。在 Agent 中,这不仅仅是“有帮助”,它可以定义整个架构。

2. 工具定义

Agent 可能调用的每个工具都需要一个模式,描述它的功能、所需参数以及何时使用。

3. 工具调用结果

每次工具调用都会将其输出添加到上下文中。一次网页检索:5000–10000 token。一次文件读取:类似。这些积累得很快。

4. 检索知识(RAG)

从向量数据库检索的文档、搜索结果、API 响应——任何用来告知 Agent 决策的信息。

5. 对话历史

所有已发生事件的完整记录。用户消息、Agent 响应、推理过程、之前的决策。每轮对话线性增长。

6. 记忆

当前会话的短期记忆。之前会话的长期记忆——用户偏好、先前结果、学习到的模式。

7. Agent 状态

当前计划、待办事项列表、进度标记、草稿笔记。跟踪 Agent 在多步任务中所处位置的元信息。

全部 7 个竞争同一个窗口。

上下文工程就是决定什么能胜出。

4 大核心策略

LangChain 发布了一个框架,将所有上下文工程技术组织为 4 个类别。

你将要学到的每一项技术都属于其中之一。

写入。选择。压缩。隔离。

Rahul - inline image

策略 1 — 写入(Agent 会遗忘。给它们一种记住的方式。)

Rahul - inline image

当 Agent 的上下文被填满并压缩时,它会丢失信息。

如果 Agent 在此之前没有写下任何东西——这些信息就永远消失了。

写入意味着给 Agent 提供在上下文窗口之外持久化信息的方法。

三种形式:

草稿板

给 Agent 一个工具,让它在任务过程中做笔记。中间发现、做出的决定、它知道以后需要的信息。

Anthropic 构建了一个“思考”工具——一个专门的空间,让 Claude 解决问题。

在 tau-bench 基准测试中,这使某些任务的性能提升了高达 54%。

规则文件

持久的过程记忆。

如果你用过 Claude Code,你见过 CLAUDE.md。

在每次会话开始时加载的指令——项目架构、约定、如何运行测试、需要注意什么。

Agent 每次启动都会阅读它。

它永远不会忘记基础。

记忆提取

Agent 保存事实、用户偏好和学习到的模式,以便在会话之间检索。

完全存在于上下文窗口之外。

Agent 明天需要的信息,明天到来时就在那里等着。

策略 2 — 选择(不要给 Agent 所有东西。只给它当下需要的。)

Rahul - inline image

一个拥有 40 个工具、一个大型知识库和多个会话历史的 Agent,无法一次性加载所有内容。

必须有东西来决定当前步骤哪些是相关的。

传统 RAG:系统决定。

用户提问 → 检索文档 → 塞入提示 → 完成。

静态的,一次性。模型没有发言权。

Agentic RAG:Agent 决定。 它搜索所需内容,优化查询,选择工具,判断何时拥有足够信息。

检索是一个迭代过程,而不是一次性管道。

这一点很重要,因为每一步的相关性都在变化——只有 Agent 知道下一步需要什么。

工具选择问题是最让人头疼的。

如果你的 Agent 有 40 多个工具,那么在工作开始之前,上下文中就可能已经存在多达 10,000 token 的工具定义。

解决办法:对工具描述进行 RAG。

不要每次调用都转储所有工具定义,而是使用语义搜索只暴露与当前步骤相关的工具。

一篇名为 RAG-MCP 的论文对此进行了测试。

工具选择准确率:从 14% 提升到 43%(提升了 3 倍)。Token 使用量:大约减半。

Anthropic 称之为混合策略:预先加载必要的上下文(如 CLAUDE.md),让 Agent 即时检索其他所有内容。

提前加载基础。按需检索其余。

策略 3 — 压缩(上下文会累积。保留含义,削减 token。)

Rahul - inline image

即使选择了好的内容,上下文仍然会累积。

每次工具调用、检索到的文档和决策都留在窗口中。

想象你的 Agent 已经进行了 20 次工具调用。

上下文:累积的 80,000 token 工具输出、对话历史、推理痕迹。

其中大部分已经不再相关。Agent 已经处理过了。

但它们仍然存在,占用空间,削弱注意力,推高成本和延迟。

你可以在 3 个点进行压缩。

在信息进入上下文之前:

→ 将大型文档分割成连贯的块,然后再检索

→ 进行重排序,只让最有用的块进入

→ 在工具输出进入主上下文之前,实时总结它们

在 Agent 工作时:

→ 对话历史的滚动摘要——持续更新

→ 流行混合方案:保留最近 10 条消息原文 + 总结所有更早的消息

→ 硬修剪:一旦上下文达到大小阈值,删除较早的消息

→ Claude Code 自动压缩:在容量达到 95% 时触发,自动总结整个轨迹

在 Agent 对某件事采取行动之后:

→ 清除工具结果:一旦某个工具结果在 15 步之前被使用,就丢弃它

→ 用一行总结替换,或者完全删除

→ Agent 不需要它在 20 步之前获取的网页全文

目标:减少 token 数量。保留真正重要的东西。

策略 4 — 隔离(最强大的策略。实现多 Agent 系统。)

Rahul - inline image

这是长 Agent 运行中的更深层问题。

不仅仅是空间问题。还有污染问题。

研究阶段的详细文件搜索,当 Agent 转到编写代码时仍留在上下文中。

那些旧的研究上下文现在是噪音。在 Agent 需要专注于干净实现的阶段,它会分散模型的注意力。

隔离意味着给工作的不同部分各自独立的上下文窗口。

子 Agent

父 Agent 将集中的子任务(例如“搜索代码库中所有与认证相关的文件”)委托给子 Agent。

子 Agent 在自己的干净上下文窗口中工作。

当它汇报时,只返回一个精炼的摘要。

所有混乱的搜索操作都隔离在子 Agent 的上下文中,永远不会污染父 Agent。

状态模式隔离(LangGraph 的方法)

设计 Agent 的状态,使不同的字段存储不同类型的上下文。

LLM 只看到与当前步骤相关的字段。

工具结果存放在“后台”字段中——对模型不可见,直到明确地暴露出来。

无需启动单独的子 Agent,即可精细控制 Agent 在每个步骤看到的内容。

隔离是使复杂多步工作流真正可靠的原因。

不同的工作。不同的上下文窗口。没有污染。

Agent 失败的 4 种方式(找出失败原因。修复它。)

Drew Breunig 确定了 Agent 上下文增长时四种不同的失败模式。

你见过的每一个出问题的 Agent 都属于其中之一。

Rahul - inline image

失败模式 1:上下文中毒

幻觉或错误进入上下文。

Agent 在后续步骤中一次又一次地引用它。

第 5 步的错误数据会累积到之后的每一步。

修复: 在工具输出进入上下文之前进行验证。从错误中恢复后,压缩失败尝试的历史。不要保留 10 步死胡同调试的痕迹,只保留最终解决方案。

━━━

失败模式 2:上下文分心

上下文变得太长,模型开始过度依赖最近的历史。

不再综合制定新计划,而是重复最近做过的事。

它停止思考。开始重复。

修复: 积极总结和修剪。即使你有很大的上下文窗口可用。大的窗口并不意味着要填满它。

━━━

失败模式 3:上下文混乱

多余的内容导致模型做出低质量的决策。

经典例子:当给定 46 个工具时,模型在基准测试中失败——尽管上下文完全在限制之内——但只给 19 个工具时却能正常工作。

工具不是多到上下文装不下。

而是多到模型无法清晰推理。

修复: 动态工具管理。使用 RAG-MCP 只暴露与当前步骤相关的工具。保持工具集与当前阶段匹配。

━━━

失败模式 4:上下文冲突

新信息与上下文中已有的信息矛盾。

系统提示说一件事。检索到的文档说了另一件事。

Agent 无法调和矛盾。产生不一致的行为。

修复: 建立明确的权威顺序。系统提示 > 检索到的事实 > 对话历史。在注入新信息之前,先与现有上下文进行验证。使用 XML 标签和清晰的标题,让模型知道哪个来源可信。

如何为 Agent 编写系统提示(不是聊天机器人。是 Agent。)

Rahul - inline image

聊天机器人的系统提示设定一个语气。

“你是一个有用的助手。简洁友好。”

Agent 的系统提示定义架构。

它指定控制流——如何处理任务类型、何时使用哪些工具、出错时该怎么做、要遵循哪些护栏。

这更像是为自主员工编写职位描述,而不是编写个性提示。

Anthropic 称之为在“正确的高度”编写。

过于规定性: “如果用户提到账单并且提到退款并且金额超过 100 美元,则调用工具 X。” 脆弱。在你没有预料到的每个边缘情况上都会失败。

过于模糊: “要乐于助人并使用适当的工具。” 没有给 Agent 任何信息。没有具体的信号,它无法做出好的自主决策。

最佳点: 具体到足以指导自主行为。灵活到让模型在新情况下运用判断。强启发式。不是死板的规则。

实用技巧:

→ 使用 XML 标签或 Markdown 标题组织——背景、指令、工具指南

→ 从最小化开始,在失败中迭代——不要试图一开始就预见所有边缘情况

→ 最小化并不意味着短——一个复杂的 Agent 系统提示可能有几千 token,只要每个 token 都有其价值,这没问题

→ 使用少量示例——向 Agent 展示好的行为是什么样的,而不是试图用文字描述每条规则

KV 缓存:关心上下文顺序的 $$$ 原因

Rahul - inline image

大多数 Agent 构建者不知道这个存在。

当你向 LLM 发送 token 时,模型会为每个 token 计算键值表示。

计算成本很高。

因此推理提供商会缓存这些表示。

如果你的上下文开头——前缀——在 API 调用之间保持不变,提供商会重用缓存的计算,只处理末尾的新 token。

快速。便宜。

但如果你在调用之间重新排列或更改上下文的早期部分——你就会使缓存失效。提供商会从头开始重新计算所有内容。

在 Claude Sonnet 上的成本差异:

→ 缓存输入 token:每百万 0.30 美元

→ 非缓存输入 token:每百万 3.00 美元

相差 10 倍。

对于一个每个任务进行 30–40 次 API 调用的 Agent 来说,这很快累积起来。

KV 缓存效率的实用规则:

→ 稳定内容放在上下文顶部——系统提示、工具定义、任何在轮次之间不变的内容

→ 动态内容放在上下文底部——对话历史、当前步骤、Agent 状态

→ 不要在对话中动态添加和移除工具——这会使缓存失效

→ 使用工具屏蔽而不是工具移除——将所有工具定义稳定地放在前缀中(缓存),只需将不相关的标记为当前阶段不可用

7 小时交付 35,000 行代码的工作流

Rahul - inline image

Dex Horthy(HumanLayer 的 CEO)在 AI Engineer Code Summit 上展示了这个。

据报道,他的团队使用这种方法在 7 小时内向一个大型 Rust 代码库交付了约 35,000 行代码。

方法:频繁的意图压缩。

将 Agent 工作结构化为多个阶段。每个阶段产生一个压缩的产物。每个新阶段从一个只包含该产物的全新上下文窗口开始。

始终保持上下文窗口在 40–60% 以下。

阶段 1 — 研究

子 Agent 探索代码库。读取文件。追踪数据流。绘制架构图。

所有混乱的 grep 结果和文件内容都留在子 Agent 的上下文中。永远不会触及父 Agent。(隔离)

输出:一个紧凑的 research.md——文件路径、函数签名、模式、陷阱。(写入)

上下文重置:原始研究使用了 60–80% 的窗口。研究产物将其压缩到 15–20%。(压缩)

阶段 2 — 规划

新的上下文窗口。只包含:研究文档 + 问题定义。

Agent 生成详细的实施计划。

这是最重要的人工审查检查点。

在这里发现逻辑错误,修复起来既容易又免费。之后修复就会花费数小时。

阶段 3 — 实施

再次全新的上下文窗口。只包含:计划。

Agent 一步步执行。

对于复杂任务:用 progress.md 跟踪已完成和剩余的工作。(写入)

结果:在每个阶段都有一个干净、专注的 Agent。没有污染。没有上下文腐烂。没有“第 20 步变得马虎”。

最佳平台如何处理这些差异

Claude Code

混合检索。CLAUDE.md 预先加载。像 glob 和 grep 这样的工具处理即时代码库导航。

在 95% 时自动压缩——保留架构决策和最近访问的 5 个文件。

可以为复杂的子任务生成子 Agent,每个子 Agent 都有自己干净的上下文。

理念:“做最简单有效的事。”让模型聪明地知道需要什么,并给它工具去找到它们。

Manus

KV 缓存感知的上下文排序:稳定前缀,动态后缀。使用工具屏蔽而不是移除。

观察压缩管道——每个工具输出在进入 Agent 上下文之前都要经过处理。

持久待办事项列表用于状态追踪。

文件系统作为溢出内存存储被驱逐的上下文。

专为规模构建。服务数十万用户,效率是业务成本问题。

ChatGPT Agent

以视觉为先的方法。Agent 与 GUI 浏览器交互。

截图作为视觉快照添加到上下文中。模型在自己看到的内容上进行推理。

视觉 token 很昂贵,因此 Agent 会选择性截图。

使用强化学习在数千台虚拟机中学习最优工具使用策略,而不是显式编程。

Google ADK

最严谨的架构方法。

三个设计原则:

  1. 分离存储与呈现——持久状态不等于每次 API 调用中出现的内容
  2. 显式转换——命名、有序的处理器,以可测试、可组合的方式转换上下文
  3. 默认限定上下文范围——每个模型调用只看到所需的最小信息

工程纪律胜过提示技巧。

通用的 Agent 轮次管道

每个严肃平台都收敛到每个 Agent 轮次的同一个 5 步循环:

收集 — 用户输入、对话历史、工具结果、检索到的文档、Agent 状态

选择 — 在剩余 token 预算内,当前步骤相关的内容

压缩 — 总结、截断或重组以适应上下文

排列 — 稳定内容在前(缓存),动态内容在后

组装并调用 — 最终上下文 → API 调用 → 获取输出 → 循环

这就是你使用过的每个生产 Agent 内部运行的循环。

理解这个循环,是那些能交付可靠 Agent 的构建者与那些纳闷为什么他们的 Agent 在第 15 步就变得马虎的构建者之间的区别。

总结

上下文腐烂是真实存在的,并且早在你的上下文限制之前就开始了。

修复它的 4 个策略:

写入 — 在上下文之外持久化信息,这样 Agent 就不会忘记

选择 — 只拉入当前步骤需要的内容

压缩 — 削减 token,保留含义,主动而非被动

隔离 — 不同工作使用不同上下文,没有污染

需要注意的 4 种失败模式:

中毒 — 错误数据在每一步累积

分心 — 长历史让 Agent 重复而不是思考

混乱 — 太多工具降低决策质量

冲突 — 矛盾导致行为不一致

KV 缓存可节省 10 倍成本。将稳定内容放在前面。

最佳工作流:研究 → 压缩 → 规划 → 压缩 → 实施。每个阶段使用新上下文。

上下文工程对于认真的 Agent 工作来说不是可选项。

它就是工作本身。

如果这有用:

→ 转发分享给你认识的每一位 Agent 构建者

→ 关注 @sairahul1 获取更多在你睡觉时也能运行的系统

→ 收藏本文——你会回来参考这 4 个策略框架的

我写关于 AI、产品构建和实际可行的系统的内容。

一键保存

使用 YouMind AI 深度阅读爆款文章

保存原文、追问细节、总结观点,并在一个 AI 工作空间里把爆款文章沉淀成可复用笔记。

了解 YouMind
写给创作者

把你的 Markdown 变成干净的 𝕏 文章

图片上传、表格、代码块,往 𝕏 上手动重排太痛苦。YouMind 把整篇 Markdown 一键转成干净、可直接发布的 𝕏 文章草稿。

试试 Markdown 转 𝕏

更多可拆解样本

近期爆款文章

探索更多爆款文章