6.3 上下文组装引擎与缓存策略

上下文的质量直接决定智能体的推理能力,但来自多个源的信息如何高效组装成最优上下文是一个复杂问题。本节介绍静态与动态上下文的分离、三阶段组装流程、Claude Code 的动态边界机制、OpenClaw 的插件化架构,以及通过缓存策略提升性能的方法。

6.3.1 上下文组装的挑战

智能体的推理质量高度依赖于上下文的质量和完整性。但是,一个实时的智能体系统通常要从多个不同的来源拼凑上下文:

  • 对话历史:当前和过去会话的消息

  • 用户档案:用户的偏好、背景、技能

  • 项目信息:当前任务的背景、进度、关键决策

  • 参考资料:可用的代码、文档、最佳实践

  • 系统状态:Agent 本身的能力、当前限制、已知问题

这些来源有不同的更新频率、大小、重要性。简单地将所有内容连接会导致:

  1. 上下文膨胀:超出 LLM 的有效处理能力

  2. 噪音淹没信号:重要信息被海量细节隐埋

  3. 冷启动问题:新会话如何快速获得关键背景

上下文组装引擎的目标是 动态选择和排序 这些来源的内容,在容量约束下最大化信息密度。

一个经常被低估的事实是:表观的模型质量,本质上是上下文质量。Sebastian Raschka 在分析 Coding Agent 架构时指出,同一个模型在精心设计的 Harness 中表现出的能力,远超在普通聊天界面中的表现。这种差异并非来自模型本身,而是来自 Harness 为模型提供的上下文质量——包括相关的项目信息、精确的工具描述、恰当的历史记录。从这个视角看,上下文组装引擎不仅是一个技术组件,而是决定整个智能体“智商”的关键因素。

6.3.2 静态上下文 vs 动态上下文

上下文可分为两类:

静态上下文 (Static Context):

  • 在会话期间基本不变的信息

  • 示例:用户档案、系统能力说明、工具定义

  • 特点:高复用性,可缓存

动态上下文 (Dynamic Context):

  • 因用户当前目标而变化的信息

  • 示例:相关的历史记录、当前项目进度、最近的执行结果

  • 特点:低复用性,需要实时生成

高效的上下文管理应该:

  1. 缓存静态部分,避免每次重复计算

  2. 按需选择动态部分,避免无关内容

  3. 优先级排序,确保关键信息不被截断

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

这样做的好处是:

  1. 可预测性:系统提示和关键信息永不被截断

  2. 灵活性:动态内容可以从几 KB 扩展到几百 KB

  3. 简单性:不需要复杂的优先级算法,只要在约束内填充

6.3.5 OpenClaw 的 ContextEngine 插件架构

OpenClaw 采用了 插件化的上下文生成,每个记忆源对应一个插件:

具体实现示例:

ContextEngine 协调这些插件的执行:

这种插件化架构的优势:

  • 模块化:新的上下文源无需修改核心引擎

  • 容错性:单个插件失败不影响整体

  • 可观测性:易于追踪每个插件的贡献

  • 可测试性:可以独立测试每个插件

6.3.6 缓存策略

上下文组装的性能瓶颈往往在于重复的搜索和格式化。有效的缓存可以加速 10-100 倍:

缓存失效时机:

  • 用户档案变更:失效所有包含 user_profile 标签的缓存

  • 项目信息更新:失效 project 标签的缓存

  • 时间过期:使用 TTL 自动清理

下一节将深入探讨如何在长对话中自动触发记忆整合,防止上下文溢出。

最后更新于