Anthropic Agent SDK:拒绝幻觉腐烂,重塑上下文工程

最近写 Agent 框架真的写到头秃,数据结构和算法已经够让人啊吧啊吧了,结果现在的智能体动不动就“记忆错乱”,执行长任务时宛如一个只有七秒记忆的金鱼。直到我把 Anthropic 最近释出的两篇硬核工程文章生啃了一遍:
- 《Claude Agent SDK: Building an Agent Harness from Scratch》 (2026.01)
- 《Agent Harness: Understanding Claude Code’s Superpower Engine》
目前纯靠 Prompt 堆砌的框架受限于上下文性能极其有限,难以应对复杂项目,但时我通过深度拆解 Anthropic 的这套 “Agentic Engine” 范式了解到了agent的新方法。
1. 痛点突围:被“幻觉腐烂”支配的恐惧
写过稍微复杂点 Agent 的同学一定遇到过这个问题:当我们让 Agent 执行一个长达数十分钟甚至几小时的编程任务时,随着对话轮次的增加,上下文窗口 (Context Window) 会被大量的中间思考过程、报错信息、重试日志塞满。
这个时候,Agent 就会出现 Anthropic 提出的一个极其精准的概念——幻觉腐烂 (Hallucination Decay)。
大模型的注意力机制在超长文本下是会严重衰减的。你以为你给了它 200K 的上下文它就能纵观全局?错,它只会迷失在茫茫的报错日志里,甚至忘了你最开始让它干什么。
为了解决这个问题,Anthropic 没有选择无脑拉长 Context Window,而是把破局点放在了 Harness(脚手架/运行环境) 上。他们不再将 Harness 视为一个简单的 API 封装器,而是将其定位为整个系统的 Agentic Engine(智能引擎)
2. 核心内功:Harness 的上下文工程 (Context Engineering)
在《Building an Agent Harness from Scratch》这篇官方工作坊总结中,Anthropic 明确指出了优秀 Harness 必须具备的两大核心机制。这完全是拿做操作系统的思维在做大模型!
2.1 上下文压缩 (Compaction):给大模型做“内存回收”
传统的聊天框架往往采用“滑动窗口”或“掐头去尾”的方式来清理上下文,但这会丢失关键的全局信息。
Anthropic 提出的 Compaction 是一种主动的、结构化的状态提炼。
- 工作机制:Harness 会在后台定期触发一个轻量级的总结进程。它会将冗长复杂的
Thought(思考链)、Action(工具调用记录) 和Observation(执行结果) 剥离出来,压缩成一个结构化的 状态快照 (State Snapshot)。 - 工程意义:这就好比操作系统里的“内存页置换”。Agent 只需要知道“我已经尝试了 X 方法并且失败了,当前系统的核心状态是 Y”,而不需要再去阅读之前那长达 5000 Token 的具体报错堆栈。这极大延缓了幻觉腐烂的发生。
2.2 动态注入 (Dynamic Injection):按需加载的艺术
如果说压缩是“节流”,那么动态注入就是“开源”。
在执行复杂编程任务时(比如在巨大的代码仓库里 debug),把所有代码都塞进 Prompt 是极其愚蠢的。Harness 具备强大的环境感知能力,它可以做到:
- 精准挂载:当 Agent 决定分析
user_auth.py时,Harness 才将该文件的 AST(抽象语法树)或具体代码片段动态注入到当前的 Prompt 空间中。 - 用完即焚:一旦该模块的分析任务结束,这部分上下文就会被 Harness 剥离,释放 Token 空间。这保证了 Agent 始终在一个极其干净、高信噪比的环境中工作。
3. 架构实战:Claude Code 的多智能体流派
如果说第一篇文章是内功心法,那么《Understanding Claude Code’s Superpower Engine》就是一套极度精密的连招。Claude Code 能够实现长达数小时的自主编程,靠的是一套严格分工的多智能体协作架构与全局共享内存池。
3.1 职权分离:Initiator 与 Worker
在这个引擎中,Anthropic 极其强调工种的边界:
- Initiator Agent (启动者):
- 它是整个工程的大脑和架构师。
- 核心职责:设置工作环境,拆解宏观任务目标,定义安全边界,并拉起子任务。它绝对不负责写具体的底层业务代码,只做决策和资源调度。
- Worker Sub-agents (执行者):
- 纯纯的“打工人”。
- 核心职责:被 Initiator 拉起后,专注于解决极其具体的原子任务(例如:为
login函数补充单元测试,或者修复某个特定的类型推导报错)。任务完成,立刻销毁,绝不占用长期资源。
这种控制流和执行流解耦的设计,简直是软件工程的典范。我们甚至可以用极其聪明的千亿级大模型做 Initiator,用便宜、快速的小模型集群做 Worker,性价比拉满。
3.2 终极杀器:共享内存 (Shared Memory) 协作
在传统的 LangChain 或 AutoGen 这种链式调用里,Agent 之间传递信息往往靠互相“喊话”(即把一堆上下文作为文本发送给另一个 Agent)。这就导致信息在多次传递中被“包浆”,Token 消耗也呈指数级上升。
Claude Code 的 Harness 是怎么做的?
它在底层维护了一个类似 Redis 的 全局状态内存池 (Shared Memory Pool)。
- Initiator 把拆解好的任务清单写进内存池。
- Worker A 领走任务,执行完毕后,不向 Initiator 汇报长篇大论,而是直接把执行结果(例如修改后的代码 diff、测试通过率)更新到内存池的特定字段。
- Initiator 通过订阅内存池的状态变化,来进行下一步的宏观调度。
这就彻底摆脱了“大模型之间互相聊天”的低效模式,转向了正规军的“数据总线 (Data Bus)”架构。
4. 工程碎碎念 (Takeaways)
好好看,好好学!啃完这两篇文章,我的几点暴论:
- 别再迷信纯 Prompt 工程了。 真正能落地的复杂 Agent,本质上是一个带有状态机的复杂后台程序,大模型只是这个程序里的一个“自然语言处理器 (CPU)”。Harness 才是那个决定系统上限的“主板和操作系统”。
- 管理注意力比扩充容量更重要。 200K 甚至 1M 的上下文窗口是用来兜底的,不是用来给你塞垃圾日志的。结构化的上下文管理才是王道。
- 多智能体协作的尽头是共享状态。 别让 Agent 聊天了,让它们读写数据库
- Title: Anthropic Agent SDK:拒绝幻觉腐烂,重塑上下文工程
- Author: Displace
- Created at : 2026-01-22 00:00:00
- Updated at : 2026-03-26 23:51:05
- Link: https://mikumikudaifans.github.io/Displace.github.io/2026/01/22/AgentLearningNote/
- License: This work is licensed under CC BY-NC-SA 4.0.