上下文工程:构建高性能AI Agent的系统性架构设计
引言:从"提示工程"到"上下文工程"
随着大语言模型(LLM)上下文窗口从4K扩展到128K甚至1M tokens,我们面临的核心挑战已从"装不下"转变为"管不好"。当Agent在复杂任务中持续运行,信息不断累积形成上下文债务(Context Debt),系统性能并非线性下降,而是在某个临界点突然崩溃。
本文基于LangChain提出的WSCI框架(Write-Select-Compress-Isolate),结合Anthropic关于"上下文腐烂"(Context Rot)的理论研究,系统阐述如何构建稳健、可扩展的AI Agent上下文架构。
第一部分:问题诊断------理解性能下降的本质
1.1 根本病因:上下文腐烂(Context Rot)
上下文腐烂是描述LLM处理长序列时底层认知能力系统性衰退的物理现象,其根源在于:
- 注意力稀释:Transformer的注意力机制随序列长度增加,单token可分配的注意力权重呈指数级下降
- 训练分布偏移:预训练数据中长序列样本稀缺,模型缺乏长距离推理的优化经验
- 位置编码限制:即使采用RoPE、ALiBi等相对位置编码,远距离依赖的建模能力仍会衰减
关键洞察 :上下文腐烂是不可避免的物理约束,与信息内容质量无关,纯粹由信息数量触发。
1.2 四类并发症:具体的失败模式
当上下文腐烂恶化,Agent在具体任务中表现出四种可被诊断的失败模式:
| 失败模式 | 定义 | 核心类比 | 与腐烂的关系 |
|---|---|---|---|
| 上下文污染 (Poisoning) | 幻觉/错误信息进入上下文并被后续推理当作事实 | 信息源被投毒 | 腐烂导致判断力下降,更难识别错误输入 |
| 上下文干扰 (Distraction) | 过多低价值信息压倒模型预训练知识 | 信噪比过低 | 腐烂直接导致注意力无法区分优先级 |
| 上下文混淆 (Confusion) | 不相关信息错误关联,造成逻辑张冠李戴 | 注意力分散 | 腐烂导致无法清晰追踪核心逻辑 |
| 上下文冲突 (Clash) | 上下文不同部分包含矛盾信息 | 指令集冲突 | 腐烂导致长距离记忆衰退,发现不了远距离矛盾 |
1.3 因果关系的三个层面
上下文腐烂(根本病因)
│
├──→ 直接引发:注意力稀释 → 干扰/混淆
│
├──→ 催生放大:推理能力下降 → 更容易产生幻觉(污染源头)
│
└──→ 屏蔽发现:长距离记忆衰退 → 发现不了已存在的冲突
精准类比:将Agent想象成长途驾驶的司机
- 司机疲劳 = 上下文腐烂(内在系统性能力下降)
- 遇到烂路出错 = 四类失败模式(外在症状)
- 精神饱满的司机能应对烂路,疲劳司机出车祸概率大增
第二部分:WSCI框架------系统性的解决方案
针对上下文腐烂这一根本病因及其并发症,LangChain提出了WSCI框架------四个正交的操作维度:
sql
┌─────────────────────────────────────────────────────────┐
│ WSCI 框架架构图 │
├─────────────┬─────────────┬─────────────┬───────────────┤
│ Write │ Select │ Compress │ Isolate │
│ (写入) │ (选择) │ (压缩) │ (隔离) │
├─────────────┼─────────────┼─────────────┼───────────────┤
│ 构建记忆系统 │ 注意力调度 │ 降噪减负 │ 分而治之 │
│ 解决"存什么"│ 解决"取什么" │ 解决"装不下" │ 解决"别干扰" │
└─────────────┴─────────────┴─────────────┴───────────────┘
第三部分:写入(Write)------构建分层记忆系统
写入操作的核心不是简单追加文本,而是构建两种功能截然不同的记忆系统:
3.1 草稿纸(Scratchpad)------ 短期过程记忆
| 特性 | 草稿纸 | 类比 |
|---|---|---|
| 核心类比 | 办公桌/白板 | 处理当前工作,用完即清 |
| 目的 | 辅助当前任务成功执行 | 确保逻辑连贯性 |
| 生命周期 | 任务级/会话内(易失) | 随任务结束清空 |
| 内容粒度 | 详细过程、中间步骤、原始数据 | 思考痕迹 |
| 核心机制 | 存储与使用分离 | 完整信息存于窗口外,按需载入 |
存储与使用分离是草稿纸对抗上下文腐烂的核心手段:
scss
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 应用程序内存 │ ←── │ 上下文工程代码 │ ←── │ LLM上下文窗口 │
│ (完整草稿纸存储) │ │ (智能选择+压缩) │ │ (关键信息子集) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
两种实现模式对比:
| 模式 | 机制 | 优点 | 缺点 |
|---|---|---|---|
| 显式工具调用 | Agent主动调用write_note工具 |
行为透明,可调试性强 | 对模型要求高,增加Token开销 |
| 隐式格式驱动 | 强制Thought/Action格式,框架自动提取 |
高效自动化,符合自然推理流 | 过程由框架封装,相对黑盒 |
3.2 长期记忆(Long-term Memory)------ 跨任务知识沉淀
| 特性 | 长期记忆 | 类比 |
|---|---|---|
| 核心类比 | 档案柜/个人知识库 | 归档重要结论,供未来查阅 |
| 目的 | 辅助未来所有任务 | 实现学习与进化 |
| 生命周期 | 永久性/跨会话(持久) | 持续积累 |
| 内容粒度 | 提炼后的结论、经验、高级知识 | 认知升华 |
| 核心挑战 | 从海量观察中智能提炼高价值信息 | 信息萃取 |
两种生成机制:
机制一:Reflection(反思)------ 事件驱动的纠错型记忆
核心思想:从错误中学习,提炼可复用的行为规则。这是一种"痛过才懂"的学习模式。
完整工作流程:
arduino
┌─────────────────────────────────────────────────────────────────┐
│ Reflection 工作流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 阶段1:失败检测(框架自动完成) │
│ ├── 监控Agent行动与观察的匹配度 │
│ ├── 识别工具调用失败、结果为空、格式错误等异常 │
│ └── 示例:搜索"Apple revenue"返回手机新闻而非财报 │
│ │
│ 阶段2:元提示生成(框架自动完成) │
│ └── 构造复盘Prompt:"回顾这次失败,生成一条可复用的规则 │
│ 避免未来犯错,格式:当[情境]时,应[行动]" │
│ │
│ 阶段3:规则生成(LLM执行) │
│ └── 产出行为策略:"当我搜索公司财报时,应加入'季度收益'等关键词" │
│ │
│ 阶段4:记忆写入(框架执行) │
│ └── 将规则存入长期记忆的"程序性记忆"分区 │
│ └── 标记为:类型=行为规则,置信度=高,来源=反思生成 │
│ │
└─────────────────────────────────────────────────────────────────┘
关键设计要点:
| 设计维度 | 具体策略 | 目的 |
|---|---|---|
| 触发条件 | 明确的失败信号(工具错误、结果为空、格式不匹配) | 避免过度反思,确保规则质量 |
| 规则抽象度 | 从具体实例上升到模式匹配(如"Apple"→"公司") | 提高规则的泛化能力 |
| 置信度管理 | 新规则标记为"待验证",多次成功应用后升级为"已确认" | 防止错误规则持续污染 |
| 冲突检测 | 写入前检查是否与现有规则矛盾 | 避免规则集内部冲突 |
适用场景:
- 工具调用频繁失败的场景(如搜索、API调用)
- 需要快速迭代优化的封闭领域(如特定公司的内部系统操作)
- 错误成本较高的场景(如金融交易、医疗诊断)
机制二:Generative Agents(生成式智能体)------ 周期性的认知升华
核心思想:从日常观察中持续积累,通过周期性总结提炼高级洞察。这是一种"温故知新"的学习模式。
完整工作流程:
arduino
┌─────────────────────────────────────────────────────────────────┐
│ Generative Agents 工作流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 阶段1:原始日志收集(持续进行) │
│ ├── 时间戳:10:05 │
│ │ 事件:张三在会议中提到"项目预算紧张" │
│ ├── 时间戳:14:30 │
│ │ 事件:收到李四邮件,主题"关于Q3成本削减方案" │
│ └── 时间戳:16:45 │
│ 事件:王五在群聊中询问"是否可以推迟非核心采购" │
│ │
│ 阶段2:周期性合成触发(每日/每周结束时) │
│ └── 框架启动Prompt链进行多轮认知升华 │
│ │
│ 阶段3:分层摘要提炼(LLM多轮执行) │
│ ├── 第1轮(事实层):"总结以上日志的核心动态" │
│ │ 输出:"张三、李四、王五都讨论了预算相关问题" │
│ ├── 第2轮(关联层):"这些事件之间有何关联?" │
│ │ 输出:"三人从不同角度(会议、邮件、群聊)表达对预算的担忧" │
│ └── 第3轮(洞察层):"基于此,有何新洞察?" │
│ 输出:"项目X正面临显著的预算风险,可能需要启动风险预案" │
│ │
│ 阶段4:高级记忆写入(框架执行) │
│ └── 将洞察存入长期记忆的"语义记忆"分区 │
│ └── 标记为:类型=高级事实,时效性=长期,置信度=中等 │
│ │
└─────────────────────────────────────────────────────────────────┘
关键设计要点:
| 设计维度 | 具体策略 | 目的 |
|---|---|---|
| 收集粒度 | 原始事件日志(谁、何时、说了什么) | 保留完整上下文,支持多维度总结 |
| 合成周期 | 高频(每日)+ 低频(每周/每月)双层机制 | 平衡时效性与认知深度 |
| Prompt链设计 | 从事实→关联→洞察的递进式提问 | 模拟人类的归纳推理过程 |
| 时效性管理 | 洞察标记有效期(如"预算紧张"标记为季度有效) | 防止过时洞察持续影响决策 |
| 溯源能力 | 保留指向原始日志的引用链接 | 支持洞察的验证与审计 |
适用场景:
- 需要长期跟踪的复杂项目(如客户关系管理、产品研发)
- 多源信息汇聚的场景(如舆情监控、竞争情报)
- 需要发现隐性模式的场景(如用户行为分析、风险评估)
两种机制的对比与协同
| 维度 | Reflection | Generative Agents |
|---|---|---|
| 触发时机 | 事件驱动(失败时立即触发) | 周期驱动(定时批量处理) |
| 学习来源 | 负面经验(错误、失败) | 正面/中性观察(日常事件) |
| 产出形式 | 行为规则(如何做) | 高级事实/洞察(是什么) |
| 记忆类型 | 程序性记忆 | 语义记忆 |
| 更新频率 | 高频、即时 | 低频、批量 |
| 认知深度 | 浅层(单点纠错) | 深层(模式发现) |
| 协同关系 | Reflection规则可指导Generative Agents的关注重点 | Generative Agents的洞察可优化Reflection的触发条件 |
协同示例:
arduino
Generative Agents发现:"近期项目频繁出现预算相关讨论"(洞察)
↓
优化Reflection触发条件:增加"预算相关工具调用失败"的敏感度
↓
Reflection生成规则:"当搜索预算信息时,应同时查询'成本'、'开支'等同义词"
↓
Generative Agents在下一轮合成中发现规则应用效果,验证洞察准确性
第四部分:选择(Select)------ 从加载数据到注意力调度
选择操作是WSCI框架中最高频、最核心的环节,类比操作系统的内存调度算法。
4.1 四大信息源的选择策略
scss
┌─────────────────────────────────────────────────────────────┐
│ 选择操作的信息源架构 │
├──────────────────┬──────────────────┬───────────┬───────────┤
│ 草稿纸 │ 长期记忆 │ 工具集 │ 知识库 │
│ (短期工作笔记) │ (持久化知识) │ (可执行能力)│ (外部数据) │
├──────────────────┼──────────────────┼───────────┼───────────┤
│ • 显式工具回忆 │ • 程序性记忆(如何做)│ • RAG for │ • 混合检索 │
│ • 滑动窗口 │ • 情景记忆(发生了什么)│ Tools │ • Agentic │
│ • 状态总结 │ • 语义记忆(是什么) │ • 动态选择 │ Search │
│ • 错误复盘 │ • 动态少样本提示 │ • 固定遮蔽 │ • 重排序 │
└──────────────────┴──────────────────┴───────────┴───────────┘
4.2 长期记忆的人类记忆三分法
LangChain引入认知科学中的人类记忆三分法来分类长期记忆:
| 记忆类型 | 对应内容 | 选择策略 | 技术实现 |
|---|---|---|---|
| 程序性记忆 | 行为规则(系统提示) | 动态模板切换 | 根据用户意图选择专门指令模块(如识别"退货"意图才加载退货流程指南) |
| 情景记忆 | 过往经验(少样本示例) | 动态少样本提示 | 基于语义相似度从示例库动态检索最相关案例 |
| 语义记忆 | 事实性知识 | 相关性+意图适配性 | RAG、混合检索、知识图谱 |
关键警示 :一个错误的选择比没有记忆更糟糕。ChatGPT曾错误选择用户地理位置信息注入图片生成,导致输出偏差。算法不仅要判断语义相关性 ,更要判断任务意图的适切性。
4.3 工具选择的架构权衡
| 策略 | 机制 | 适用场景 | 权衡点 |
|---|---|---|---|
| 动态选择(RAG for Tools) | 为工具描述建独立索引,预检索加载Top-K | 工具集庞大且开放(如插件系统) | 优先考虑扩展性与精准度 |
| 固定工具集+遮蔽(Masking) | 保持提示前缀不变,利用KV缓存加速 | 工具集小而稳定,对延迟要求极高 | 优先考虑性能与速度 |
第五部分:压缩(Compress)------ 高保真的降噪减负
压缩操作针对即将进入窗口的原始信息流(冗长对话历史、海量API返回),在信息进入新一轮调用前为其降噪减负。
5.1 两种技术路线的对比
| 维度 | 上下文总结(Summarization) | 上下文裁剪(Trimming) |
|---|---|---|
| 核心机制 | LLM智能提炼(理解并重写) | 基于规则过滤(直接丢弃) |
| 优点 | ✅ 智能,保留核心语义 ✅ 擅长处理非结构化长文本 | ✅ 快速,成本极低 ✅ 对保留部分保真度100% |
| 缺点 | ❌ 慢,成本高(需额外LLM调用) ❌ 有损压缩,可能丢失细节 | ❌ "笨拙",可能粗暴丢弃重要信息 ❌ 规则需人工精心设计 |
| 适用场景 | 处理巨型工具返回、总结长对话历史、Agent间工作交接 | 管理常规对话历史(滑动窗口)、清理已消化的旧信息 |
5.2 上下文总结:三个核心应用场景
场景一:总结对话历史
arduino
原始:早期20轮详细对话(10K tokens)
↓ LLM提炼
摘要:"任务:查询订单#12345售后;关键决策:已修改收货地址,
申请电子发票;用户偏好:偏好短信通知"
↓ 替换原文
载入上下文:1段摘要(200 tokens)
场景二:后处理工具反馈
css
错误做法:将5万字网页HTML直接喂给Agent
正确做法:HTML → 专门总结Prompt提取核心要点 → 精炼摘要载入
场景三:Agent间知识交接
css
子Agent完整思考日志(50轮,5K tokens)
↓ 总结提炼
浓缩工作报告:"研究发现Q3营收增长20%,主要驱动因素:A、B、C;
建议:关注D风险"
↓ 提交给主Agent
关键挑战:信息保真度
"过度激进的压缩可能导致微妙但关键的信息丢失。"
应对策略:
- 精心设计的压缩Prompt(明确保留重点)
- 配合分层记忆系统(关键结论写入结构化笔记,不依赖对话压缩)
5.3 上下文裁剪的两种实现
arduino
方式一:硬编码启发式(滑动窗口)
策略:设定固定规则,如"永远只保留最近10轮对话"
优点:极其简单快速,成本几乎为零
缺点:一刀切,可能丢弃早期奠基信息
方式二:智能过滤(训练裁剪器)
策略:训练轻量级分类模型判断每条信息"应保留"或"可丢弃"
优点:比滑动窗口智能(如识别核心问题即使很老也不丢弃)
缺点:需额外模型训练和维护成本
信息保真度管理 :过度激进的压缩可能导致微妙但关键的信息丢失。应通过精心设计的压缩Prompt 配合分层记忆系统,确保关键结论写入持久化结构化笔记,而非在对话历史压缩中意外丢失。
第六部分:隔离(Isolate)------ 分而治之的架构艺术
隔离操作解决复杂系统中的信息流干扰问题,通过创建多个独立的上下文空间实现复杂并行工作流。
6.1 三种隔离架构模式
scss
┌─────────────────────────────────────────────────────────────┐
│ 隔离架构的三种模式 │
├──────────────────┬──────────────────┬───────────────────────┤
│ 多智能体 │ 环境/沙箱 │ 运行时状态对象 │
│ (Agent之间隔离) │ (思考与执行隔离) │ (Agent内部隔离) │
├──────────────────┼──────────────────┼───────────────────────┤
│ • 主Agent规划分解 │ • LLM只负责思考 │ • 状态结构化为多字段对象 │
│ • 子Agent并行执行 │ • 重资产操作交沙箱 │ • 开发者代码按需暴露 │
│ • 完全独立上下文 │ • 状态化环境隔离 │ • Schema预定义边界 │
│ • 关注点分离 │ • 真实对象操作 │ • 运行时动态拉取 │
└──────────────────┴──────────────────┴───────────────────────┘
模式一:多智能体(Multi-Agent)------ Agent之间的隔离
核心机制:团队协作模式,将上下文隔离级别从单个Agent内部提升到多个Agent之间。
架构详解:
scss
┌─────────────────────────────────────────────────────────────────┐
│ 多智能体架构图示 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ │
│ │ 主Agent │ ←── 负责顶层规划与任务分解 │
│ │ (规划者/协调者) │ 维护"元上下文":任务目标、子任务分配、 │
│ │ │ 整合规则,不接触具体执行细节 │
│ └────────┬────────┘ │
│ │ 委派子任务 │
│ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 专家Agent A │ │ 专家Agent B │ │ 专家Agent C │ │
│ │ (代码生成专家) │ │ (数据分析专家) │ │ (文档撰写专家) │ │
│ │ │ │ │ │ │ │
│ │ 独立上下文窗口 │ │ 独立上下文窗口 │ │ 独立上下文窗口 │ │
│ │ • 代码规范 │ │ • 数据schema │ │ • 文档模板 │ │
│ │ • 相关API文档 │ │ • 统计方法 │ │ • 风格指南 │ │
│ │ • 历史代码示例 │ │ • 可视化库用法 │ │ • 术语表 │ │
│ │ (无关信息被隔离)│ │ (无关信息被隔离)│ │ (无关信息被隔离)│ │
│ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │
│ │ │ │ │
│ └────────────────────┼────────────────────┘ │
│ │ 返回结果 │
│ ▼ │
│ ┌─────────────┐ │
│ │ 结果整合 │ │
│ │ (主Agent汇总) │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
关键设计决策:
| 决策点 | 策略选项 | 选择依据 |
|---|---|---|
| 任务分解粒度 | 粗粒度(少而大的子任务)vs 细粒度(多而小的子任务) | 子任务间独立性高→细粒度;需要全局协调→粗粒度 |
| 通信协议 | 结构化(JSON/XML)vs 自然语言 | 机器可读性要求高→结构化;灵活性要求高→自然语言 |
| 上下文共享范围 | 零共享(完全隔离)vs 只读共享(共享背景信息)vs 全共享(共享完整历史) | 避免污染→零共享;需要一致性→只读共享 |
| 协调机制 | 中心化(主Agent调度)vs 去中心化(Agent间直接通信) | 需要全局优化→中心化;需要响应速度→去中心化 |
成本收益分析的量化框架:
sql
成本 = 15x Token开销(典型值)+ 延迟增加 + 系统复杂度提升
收益 = 任务并行度提升 × 单任务质量提升 × 错误隔离带来的稳定性提升
决策规则:
IF 任务可并行度 > 0.7
AND 单任务质量提升 > 30%
AND 错误成本 > 多Agent成本
THEN 采用多Agent架构
ELSE 采用单Agent + 其他WSCI操作优化
模式二:环境沙箱(Sandbox)------ 思考与执行的隔离
核心机制:分离LLM的"思考"(生成代码/指令)与"执行"(操作真实世界状态),让Agent在轻量级上下文中操作重资产数据。
架构详解:
bash
┌─────────────────────────────────────────────────────────────────┐
│ 环境沙箱架构图示 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ │
│ │ LLM上下文窗口 │ │ 沙箱执行环境 │ │
│ │ (轻量级,只存思考) │ │ (重量级,存储真实状态) │ │
│ │ │ │ │ │
│ │ 系统提示:"你是一个数据 │ │ ┌─────────────────┐ │ │
│ │ 分析师,请生成Python代码 │◄───────┤ │ 数据对象 │ │ │
│ │ 分析用户上传的数据集" │ 代码 │ │ • DataFrame │ │ │
│ │ │ │ │ • 文件句柄 │ │ │
│ │ 用户问题:"分析销售趋势" │ │ │ • 数据库连接 │ │ │
│ │ │ │ │ • API响应缓存 │ │ │
│ │ Agent思考:"我需要先加载 │ │ └─────────────────┘ │ │
│ │ 数据,然后计算月度统计..." │ │ │ │
│ │ │ │ ┌─────────────────┐ │ │
│ │ Agent输出(代码): │───────►│ │ 执行引擎 │ │ │
│ │ ```python │ 执行 │ │ • Python解释器 │ │ │
│ │ df = sandbox.load('sales │ │ │ • 文件系统 │ │ │
│ │ _data.csv') │ │ │ • 网络访问 │ │ │
│ │ monthly = df.groupby( │ │ │ • 资源限制器 │ │ │
│ │ 'month').sum() │ │ └─────────────────┘ │ │
│ │ sandbox.plot(monthly) │ │ │ │
│ │ ``` │ │ ┌─────────────────┐ │ │
│ │ │ │ │ 结果摘要 │ │ │
│ │ [接收执行结果摘要] │◄───────┤ │ • 统计指标 │ │ │
│ │ "月度销售趋势图已生成, │ 摘要 │ • 异常检测 │ │ │
│ │ Q3环比增长15%..." │ │ • 可视化路径 │ │ │
│ │ │ │ └─────────────────┘ │ │
│ └─────────────────────────┘ └─────────────────────────┘ │
│ │
│ 关键隔离点:LLM从不直接接触原始数据,只操作沙箱提供的元数据 │
│ │
└─────────────────────────────────────────────────────────────────┘
沙箱与草稿纸的本质区别:
| 维度 | 草稿纸(Scratchpad) | 环境沙箱(Sandbox) |
|---|---|---|
| 隔离层级 | Agent内部 | Agent与外部环境之间 |
| 信息介质 | 文本(字符串) | 真实对象(DataFrame、文件、连接) |
| 存储内容 | 思考过程、推理痕迹 | 真实世界的状态、数据 |
| 操作方式 | 读/写文本 | 发号施令(生成代码操作对象) |
| 生命周期 | 随任务结束清空 | 可持久化或按策略清理 |
| 核心价值 | 记录推理过程,支持回溯 | 让Agent处理远超上下文窗口的数据量 |
| 典型操作 | "记录当前计划"、"更新观察结果" | "加载数据集"、"执行查询"、"生成图表" |
沙箱的高级应用------"盲人摸象"式分析:
json
场景:分析100GB的日志文件,远超LLM上下文窗口
传统方式:无法处理,或需要预先用其他工具抽样
沙箱方式:
│
├── Agent生成代码:"读取日志文件的元数据(时间范围、字段列表)"
├── 沙箱返回:{"size": "100GB", "rows": 500000000, "fields": ["timestamp", "level", "message"]}
│
├── Agent生成代码:"按小时抽样统计错误率分布"
├── 沙箱执行抽样查询,返回:{"peak_hour": "14:00", "error_rate": "5%"}
│
├── Agent生成代码:"深入分析14:00的错误日志,提取常见错误模式"
├── 沙箱返回Top-5错误类型及示例
│
└── Agent基于这些"摸象"得到的元数据,生成最终分析报告
Agent始终工作在轻量级上下文(只存代码和元数据),
但通过沙箱操作实现了对海量数据的分析能力。
模式三:运行时状态对象(Runtime State)------ Agent内部的结构化隔离
核心机制:将Agent的完整状态设计为结构化的多字段对象,通过Schema预定义信息边界,实现内部模块化隔离。
架构详解:
scss
┌─────────────────────────────────────────────────────────────────┐
│ 运行时状态对象架构图示 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Agent运行时状态对象(完整状态) │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ messages │ │working_mem │ │ user_profile│ │ │
│ │ │ (对话历史) │ │ (工作记忆) │ │ (用户画像) │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ • 用户输入 │ │ • 当前计划 │ │ • 偏好设置 │ │ │
│ │ │ • Agent回复 │ │ • 中间结果 │ │ • 历史行为 │ │ │
│ │ │ • 工具调用 │ │ • 待办事项 │ │ • 权限等级 │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ [隔离规则: │ │ [隔离规则: │ │ [隔离规则: │ │ ││ │ │ 全量保留 │ │ 按需加载 │ │ 只读访问] │ │ │
│ │ │ 但受压缩] │ │ 高优先级] │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ tool_results│ │ session_ctx │ │ system_cfg │ │ │
│ │ │ (工具结果) │ │ (会话上下文) │ │ (系统配置) │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ • 原始返回 │ │ • 任务类型 │ │ • 模型参数 │ │ │
│ │ │ • 解析状态 │ │ • 会话ID │ │ • 安全策略 │ │ │
│ │ │ • 缓存标记 │ │ • 时间戳 │ │ • 功能开关 │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ [隔离规则: │ │ [隔离规则: │ │ [隔离规则: │ │ ││ │ │ 后处理压缩 │ │ 全量只读] │ │ 系统级保护] │ │ │
│ │ │ 后丢弃原始] │ │ │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 每次LLM调用时,框架根据当前任务类型,按隔离规则选择暴露的字段: │
│ │
│ 示例:代码生成任务时的上下文组装 │
│ ├── 必须加载:messages(最近3轮)、working_mem(当前计划) │
│ ├── 条件加载:user_profile(如果涉及个性化代码风格) │
│ ├── 后处理加载:tool_results(先压缩为摘要) │
│ └── 禁止加载:system_cfg(内部配置,不暴露给模型) │
│ │
└─────────────────────────────────────────────────────────────────┘
隔离与选择的协同工作流:
设计时(隔离视角):
│
├── 定义状态Schema,划分字段边界
├── 为每个字段设定访问权限(读/写/不可见)
├── 设定字段间的依赖关系(如tool_results依赖session_ctx)
└── 建立字段的加载优先级和压缩策略
│
▼
运行时(选择视角):
│
├── 识别当前任务类型和意图
├── 根据隔离规则,从各字段中选择需要暴露的数据
├── 应用字段特定的压缩策略(如messages用滑动窗口,tool_results用摘要)
└── 组装最终上下文,确保不违反隔离边界
6.2 多智能体的成本收益权衡
核心机制:团队协作模式,将上下文隔离级别从单个Agent内部提升到多个Agent之间。
架构要点:
- 主Agent负责顶层规划与任务分解
- 专家子Agent在完全独立的上下文窗口中并行执行
- 实现清晰的关注点分离,避免主Agent被海量细节污染
成本收益权衡:
- Token消耗可能高达15倍
- 采用标准:任务高度可并行 + 子任务需深度探索 + 收益远大于成本
- 默认策略:采用单Agent,只有遇到明确瓶颈才评估多Agent
6.3 环境沙箱 vs 草稿纸的本质区别
| 维度 | 草稿纸(Scratchpad) | 环境沙箱(Sandbox) |
|---|---|---|
| 隔离对象 | 思考的痕迹 | 真实世界的状态 |
| 存储介质 | 字符串(Text Log) | 真实对象(DataFrame, File等) |
| Agent操作 | 读/写文本 | 发号施令(生成代码操作对象) |
| 核心价值 | 记录推理过程 | 让Agent通过操作对象元数据实现"盲人摸象"式分析,始终工作在轻量级上下文 |
6.4 隔离与选择的辩证关系
- 隔离(Isolate) :架构师视角,强调"阻挡"。通过Schema设计预先定义信息边界和访问权限。
- 选择(Select) :操作员视角,强调"拉取"。在运行时根据隔离预设规则,动态从不同分区拉取信息。
结论 :隔离定义了信息的边界,选择在边界内活动------它们是同一枚硬币的两面。
第七部分:实践指南------构建上下文架构的 checklist
基于WSCI框架,我们提供以下实践 checklist:
7.1 写入阶段
- 明确区分草稿纸(任务级)和长期记忆(永久级)的写入目标
- 选择显式工具调用(可调试)或隐式格式驱动(高效)的实现模式
- 为长期记忆设计Reflection(纠错)或Generative Agents(升华)的生成机制
7.2 选择阶段
- 为草稿纸实现滑动窗口、状态总结或错误复盘的选择策略
- 为长期记忆应用人类记忆三分法,实现动态模板、动态少样本、RAG检索
- 为工具集评估动态选择(大规模)vs 固定遮蔽(高延迟要求)的架构
- 为知识库实现混合检索(向量+关键词+图谱)+ Agentic探索 + 重排序
7.3 压缩阶段
- 对高价值、非结构化信息使用上下文总结(Summarization)
- 对常规维护使用上下文裁剪(Trimming/滑动窗口)
- 建立分层记忆系统,确保关键结论不依赖对话历史压缩
7.4 隔离阶段
- 评估任务是否真正需要多智能体架构(成本可能高达15倍)
- 设计环境沙箱分离思考与执行,处理重资产操作
- 通过运行时状态对象的Schema设计,实现内部结构化隔离
结语:从算法调优到架构设计
回顾整个上下文工程的演进路径:
scss
Anthropic理论层 LangChain工程层 实践认知层
│ │ │
│ 上下文腐烂的根本约束 │ WSCI框架管理上下文 │ 核心挑战转移
│ (Transformer架构限制) │ (Write-Select-Compress-Isolate) │ (算法→架构)
│ │ │
└────────────────────────────┴────────────────────────────┘
│
▼
构建真正强大、可靠、可扩展的AI Agent
其核心已从算法和模型本身
转移到了系统性的上下文架构设计
这正是开发者在Agent时代的核心价值所在------不再是调模型参数,而是设计上下文架构。
参考资源
- LangChain Documentation: Context Engineering Best Practices
- Anthropic Research: The Challenges of Long Context in LLMs
- Shunyu Yao et al. "ReAct: Synergizing Reasoning and Acting in Language Models"
- Noever et al. "Generative Agents: Interactive Simulacra of Human Behavior"