6.3 上下文组装引擎与缓存策略
上下文的质量直接决定智能体的推理能力,但来自多个源的信息如何高效组装成最优上下文是一个复杂问题。本节介绍静态与动态上下文的分离、三阶段组装流程、Claude Code 的动态边界机制、OpenClaw 的插件化架构,以及通过缓存策略提升性能的方法。
6.3.1 上下文组装的挑战
智能体的推理质量高度依赖于上下文的质量和完整性。但是,一个实时的智能体系统通常要从多个不同的来源拼凑上下文:
对话历史:当前和过去会话的消息
用户档案:用户的偏好、背景、技能
项目信息:当前任务的背景、进度、关键决策
参考资料:可用的代码、文档、最佳实践
系统状态:Agent 本身的能力、当前限制、已知问题
这些来源有不同的更新频率、大小、重要性。简单地将所有内容连接会导致:
上下文膨胀:超出 LLM 的有效处理能力
噪音淹没信号:重要信息被海量细节隐埋
冷启动问题:新会话如何快速获得关键背景
上下文组装引擎的目标是 动态选择和排序 这些来源的内容,在容量约束下最大化信息密度。
一个经常被低估的事实是:表观的模型质量,本质上是上下文质量。Sebastian Raschka 在分析 Coding Agent 架构时指出,同一个模型在精心设计的 Harness 中表现出的能力,远超在普通聊天界面中的表现。这种差异并非来自模型本身,而是来自 Harness 为模型提供的上下文质量——包括相关的项目信息、精确的工具描述、恰当的历史记录。从这个视角看,上下文组装引擎不仅是一个技术组件,而是决定整个智能体“智商”的关键因素。
6.3.2 静态上下文 vs 动态上下文
上下文可分为两类:
静态上下文 (Static Context):
在会话期间基本不变的信息
示例:用户档案、系统能力说明、工具定义
特点:高复用性,可缓存
动态上下文 (Dynamic Context):
因用户当前目标而变化的信息
示例:相关的历史记录、当前项目进度、最近的执行结果
特点:低复用性,需要实时生成
高效的上下文管理应该:
缓存静态部分,避免每次重复计算
按需选择动态部分,避免无关内容
优先级排序,确保关键信息不被截断
6.3.3 上下文组装的三阶段流程
上下文组装过程分为三个关键阶段,下面的流程图展示了完整的上下文组装管道:
图 6-2:上下文组装的三阶段流程
需求分析阶段:
使用轻量级分类器识别查询的类型,决定需要哪些记忆源:
搜索与过滤阶段:
根据需求,从各记忆源并行检索:
合并与排序阶段:
将检索结果合并,按相关性和优先级排序,然后填充上下文直到达到容量限制:
6.3.4 Claude Code 的 SYSTEM_PROMPT_DYNAMIC_BOUNDARY
Claude Code 采用了一个聪明的策略来管理上下文大小的不确定性—— 动态边界机制:
定义一个 保护区 (Protected Boundary),其内包含:
系统提示
当前会话的关键信息
用户最新的 1-2 条消息
这个保护区的大小是固定的(约 10-15% 的上下文窗口),不会被其他内容侵占。剩余的空间(约 85-90%)用于动态上下文:
保护区(Protected)
System Prompt
~2%
Current User Messages
~5%
动态区(Dynamic Context Space)
User Profile
按需
Project Context
按需
Recent History
按需
References
按需
Free Space (buffer)
剩余
合计
Total Context Window
200K tokens
这样做的好处是:
可预测性:系统提示和关键信息永不被截断
灵活性:动态内容可以从几 KB 扩展到几百 KB
简单性:不需要复杂的优先级算法,只要在约束内填充
6.3.5 OpenClaw 的 ContextEngine 插件架构
OpenClaw 采用了 插件化的上下文生成,每个记忆源对应一个插件:
具体实现示例:
ContextEngine 协调这些插件的执行:
这种插件化架构的优势:
模块化:新的上下文源无需修改核心引擎
容错性:单个插件失败不影响整体
可观测性:易于追踪每个插件的贡献
可测试性:可以独立测试每个插件
6.3.6 缓存策略
上下文组装的性能瓶颈往往在于重复的搜索和格式化。有效的缓存可以加速 10-100 倍:
缓存失效时机:
用户档案变更:失效所有包含 user_profile 标签的缓存
项目信息更新:失效 project 标签的缓存
时间过期:使用 TTL 自动清理
下一节将深入探讨如何在长对话中自动触发记忆整合,防止上下文溢出。
最后更新于
