
Anthropic:怎么才能控制模型的行为,做好Agents?
Anthropic 最近又发了一篇关于 AI Agents 的博客,过去几个月已经连续好几篇了。
我觉得他们关于Agents的内容整体都挺好的,写的也很有实践意义。
今天的分享,围绕一个核心问题:如何配置上下文,才能让模型持续输出期望的行为。
TLDR:
上下文是有限资源,存在 Context Rot现象。 好的上下文工程 = 找到最小的高信号 token 集,最大化期望结果。
长时间任务三板斧:压缩、结构化笔记、子智能体。
新的趋势是 Just-in-time策略:不预处理所有数据,而是维护轻量级标识符(文件路径、链接),运行时动态加载。
混合策略是实践共识,Claude Code 采用混合模型:CLAUDE.md 直接放入上下文(预处理),glob/grep 让 Agent 即时探索。
什么是上下文工程?
先说清楚概念。上下文指的是调用大模型时包含的所有 token。
而上下文工程就是在 LLM 固有约束下,优化这些 token,以实现预期结果的工程问题。
简单来说:提示工程关注的是“怎么写好提示词”,上下文工程关注的是“怎么管理整个上下文状态”——包括系统指令、工具、外部数据、消息历史、MCP等所有信息。
早期,大多数用例是一次性的分类或文本生成任务,写好提示词就够了。
但现在我们要构建的是能在多轮推理、长时间运行的 Agent,这些 Agent 每次循环都会生成更多可能相关的数据,这些信息必须被持续精炼。
为什么上下文很珍贵!
Anthropic的核心insight是:上下文是有限资源,边际收益递减。
尽管模型能处理越来越大的上下文窗口,但研究发现了一个现象叫 Context Rot——随着上下文 token 数量增加,模型准确召回信息的能力会下降。
这不是某个模型的问题,而是所有模型的共性。
原因在于 Transformer 架构本身:每个 token 都要关注(attend)其他所有 token,这产生了 n² 的两两关系。上下文越长,模型捕获这些关系的能力就越被稀释。
这意味着:好的上下文工程就是找到最小的、高信号的 token 集合,最大化期望结果的可能性。
上下文的构成
Anthropic 给出了覆盖上下文的各个组成部分:
System Prompts
要极其清晰,使用简单直接的语言,并且要在正确的高度呈现想法。
那什么叫正确的高度?Anthropic 指出了两个极端的失败模式:
- 一个是把复杂的、脆弱的 if-else 逻辑硬编码进提示词
- 另一个是提供模糊的、高层次的指导,无法给 LLM 具体信号
最优的高度在中间:足够具体以有效引导行为,又足够灵活让模型获得强启发式指导。
建议用 XML 标签或 Markdown 标题组织提示词(如 <background_information>
, ## Tool guidance
等),但格式也逐渐变得不那么重要,因为模型越来越强了。
核心原则是:追求完整可以概述预期行为的最小集合。但是,最小不等于短——仍然需要给 Agent 足够的前置信息。
Tools
工具让 Agent 能与环境交互、拉取新上下文。
最常见的失败模式是:工具集臃肿,覆盖太多功能,或导致使用哪个工具的决策点模糊不清。
如果人都无法明确说出某个情况该用哪个工具,AI Agent 更做不到。
Examples
Few-shot prompting 是公认的有效方法。
但 Anthropic 提到,不建议把一堆边缘案例塞进提示词,试图阐述 LLM 应该遵循的每条规则。
相反,应该想办法构建一组多样的、典型的示例,有效展示 Agent 的预期行为。
对 LLM 来说,示例就是一图胜千言。
从预处理到即时策略
传统做法是用基于向量的检索在推理前就把相关上下文准备好。
但现在越来越多人在用 Just-in-time 上下文策略。
核心思路:不预处理所有相关数据,而是维护轻量级标识符(文件路径、存储查询、网页链接等),用工具在运行时动态加载数据到上下文。
Anthropic 自己的 Claude Code 就是这么做的。模型可以写目标查询、存储结果,利用 Bash 命令如 head 和 tail 分析大量数据,而不用把完整数据对象加载到上下文。
这种方式模仿人类认知:我们不会记住整个信息语料库,而是引入外部组织和索引系统(文件系统、收件箱、书签)按需检索相关信息。
这种方法还实现了 Progressive Disclosure ——让 Agent 通过探索逐步发现相关上下文。
每次交互产生的上下文为下一个决策提供信息:文件大小暗示复杂度;命名规范暗示用途;时间戳可以代表相关性。
当然,这有权衡:运行时探索比检索预计算数据慢。
而且需要有非常精妙的工程,确保 LLM 有正确的工具和启发式方法来有效找到信息。
最有效的 Agent 可能采用混合策略:部分数据预先检索以提高速度,部分由 Agent 自主探索。
Claude Code 就是混合模型:CLAUDE.md 文件会直接放入上下文,而 glob 和 grep 等原语让它能即时导航环境、检索文件。
长时间任务的上下文工程
对于需要几十分钟到几小时连续工作的长时间任务,Agent 需要专门技术来应对上下文窗口限制。
Anthropic 提供了三个策略:
Compaction
把接近上下文窗口限制的对话进行总结,用摘要重新启动新的上下文窗口。这通常是上下文工程的第一个杠杆。
在 Claude Code 中,会把消息历史传给模型总结压缩关键细节。模型保留架构决策、未解决的 bug、实现细节,同时丢弃冗余的工具输出或消息。然后 Agent 用压缩后的上下文加最近访问的 5 个文件继续工作。
压缩的艺术在于选择保留什么、丢弃什么。过度激进的压缩可能丢失微妙但关键的上下文。
Structured Note-taking
也叫智能体记忆。Agent 定期把笔记写到上下文窗口外的持久化内存中,之后再拉回上下文窗口。
Claude Code 创建待办清单,或你的自定义 Agent 维护 NOTES.md 文件,这种简单模式让 Agent 跨复杂任务追踪进度,维护原本会在几十次工具调用中丢失的关键上下文和依赖。
Sub-agent Architectures
与其让一个 Agent 维护整个项目的状态,不如让专门的子智能体处理有清晰上下文窗口的聚焦任务。
主 Agent 用高层计划协调,子智能体执行深度技术工作或使用工具查找相关信息。
每个子智能体可能广泛探索,使用大量 token,但只返回结果的精简总结(通常 1,000-2,000 token)。
这实现了清晰的关注点分离——详细搜索上下文隔离在子智能体内,主 Agent 专注于综合和分析结果。
实践建议
在上下文的不同组成部分(系统提示、工具、示例、消息历史等)都要深思熟虑,保持信息丰富但紧凑。
选择哪种方法取决于任务特征:
- 上下文压缩适合需要大量来回的任务,保持对话流
- 记笔记适合有清晰里程碑的迭代开发
- 多智能体架构适合并行探索有回报的复杂研究和分析
如何在扩展交互中,保持连贯性,是构建 Agent 的核心。
最后
Anthropic 在 Sonnet 4.5 发布时,还在 Claude Developer Platform 上发布了公开测试版的记忆工具,地址在:http://anthropic.com/news/context-management
通过基于文件的系统让存储和查询上下文窗口外的信息变得更容易。同时也有记忆和上下文管理 cookbook,地址在:https://github.com/anthropics/claude-cookbooks/blob/main/tool_use/memory_cookbook.ipynb。
本文转载自探索AGI,作者:猕猴桃
