技术原理核心
Progressive Disclosure ContextEngine 分层加载
深入分析动态上下文载入的核心技术原理,包括Progressive Disclosure、分层加载、ContextEngine架构
1. Progressive Disclosure(渐进式披露)
1.1 概念起源
Progressive Disclosure源自UI/UX设计领域,核心思想是:只在用户需要时展示相关信息,隐藏复杂性直到真正需要。这一原则被成功迁移到AI Agent的上下文管理中。
1.2 在LLM中的应用
传统方式(Monolithic Loading):
System Prompt 加载全部内容:
├── 所有Agent定义 (800+ tokens)
├── 所有Skills描述 (5,000+ tokens)
├── 所有Tools Schema (3,000+ tokens)
├── 所有MCP服务器 (2,000+ tokens)
├── 项目文件 (8,000+ tokens)
└── 总计: 18,000+ tokens (每轮都加载)
Progressive Disclosure方式:
第一层 - 导航层 (Navigation):
├── Agent核心身份 (< 500 tokens)
├── 可用能力摘要 (200 tokens)
└── 如何获取更多信息 (100 tokens)
↓ 按需加载
第二层 - 技能层 (Skills):
├── 当Agent决定使用某技能时加载
└── 仅加载相关技能的完整定义
↓ 按需加载
第三层 - 执行层 (Execution):
├── 具体的Tool Schema
├── 相关代码片段
└── 记忆详情
1.3 核心优势
- Token效率:简单任务仅需2K tokens,复杂任务按需扩展到5-8K,相比传统方式节省90%+
- 信号噪声比:减少无关信息干扰,提高关键指令的可见性
- 模块化:各层独立管理,便于维护和更新
2. 分层上下文加载(Hierarchical Context Loading)
2.1 三层架构模型
flowchart TB
subgraph L1["第一层: Navigation / 导航层"]
A1[Agent核心身份]
A2[能力目录摘要]
A3[动态加载指引]
end
subgraph L2["第二层: Skills / 技能层"]
B1[技能名称列表]
B2[技能触发条件]
B3[按需: 技能详细定义]
end
subgraph L3["第三层: Agents / 执行层"]
C1[工具完整Schema]
C2[MCP服务器描述]
C3[记忆具体内容]
C4[项目文件详情]
end
L1 -->|当需要技能详情时| L2
L2 -->|当决定使用工具时| L3
2.2 各层职责
| 层级 | 内容 | Token预算 | 加载策略 |
|---|---|---|---|
| L1-导航层 | Agent身份、能力摘要、加载指引 | < 1K | 始终加载 |
| L2-技能层 | 技能列表、触发条件、按需详情 | 1-3K | 动态载入 |
| L3-执行层 | 工具Schema、记忆详情、代码 | 按需 | 即时加载 |
2.3 实际案例
William Zujkowski的实践表明:
- 传统方式:150K tokens/会话,成本$4.50
- 分层加载:2K tokens/简单任务,5-8K tokens/复杂任务,成本$0.06
- 节省比例:98%的token使用量,同时保持代码库上下文的完整性
3. OpenClaw ContextEngine架构深度解析
3.1 历史演进
2026.3.7之前:硬编码的Sliding-Window Compaction(滑动窗口压缩)
- 对话过长时自动摘要旧消息
- 优点:简单、自动
- 缺点:单一策略、无法跨会话记忆、摘要会丢失细节
2026.3.7之后:可插拔的ContextEngine插件架构
3.2 9层System Prompt架构
OpenClaw采用了高度结构化的System Prompt构建机制:
flowchart LR
subgraph SP["System Prompt 构建流程"]
direction TB
L1[Layer 1: Framework Rules] --> L2[Layer 2: Agent Identity]
L2 --> L3[Layer 3: Tool Definitions]
L3 --> L4[Layer 4: Skills Registry]
L4 --> L5[Layer 5: Workspace Context]
L5 --> L6[Layer 6: Memory Injection]
L6 --> L7[Layer 7: Runtime State]
L7 --> L8[Layer 8: User Preferences]
L8 --> L9[Layer 9: Session Context]
end
| 层级 | 内容 | 可动态加载 |
|---|---|---|
| 1 | 框架规则(安全、输出格式) | ❌ 必须始终存在 |
| 2 | Agent身份、目标、行为准则 | ❌ 核心身份不可变 |
| 3 | 可用工具列表及Schema | ✅ 可按需加载 |
| 4 | 技能注册表及描述 | ✅ 分层加载 |
| 5 | 工作区文件、代码片段 | ✅ 按需检索 |
| 6 | 长期记忆、会话记忆 | ✅ 动态注入 |
| 7 | 运行时信息(时间、环境) | ❌ 自动注入 |
| 8 | 用户偏好设置 | ✅ 按需加载 |
| 9 | 当前会话上下文 | ❌ 自动管理 |
3.3 ContextEngine插件接口
OpenClaw将上下文管理提取为标准化接口:
// ContextEngine 核心接口(概念性)
interface ContextEngine {
// 组装进入LLM的上下文
assembleContext(request: ContextRequest): Promise<ContextAssembly>;
// 管理会话历史
manageHistory(history: Message[]): Promise<Message[]>;
// 处理token预算
enforceBudget(assembly: ContextAssembly, maxTokens: number): ContextAssembly;
// 跨会话记忆管理
persistMemory(sessionId: string, keyInfo: any): Promise<void>;
loadMemory(sessionId: string): Promise<any>;
}
// 内置引擎
class LegacyContextEngine implements ContextEngine {
// Sliding-window + Summarization
}
class RAGContextEngine implements ContextEngine {
// RAG-based context assembly
}
// 第三方插件可实现自定义逻辑
class CustomContextEngine implements ContextEngine {
// 自定义策略
}
3.4 关键特性
- 插件化设计:ContextEngine作为插件槽位,支持自定义实现
- 延迟解析:
plugins.slots.contextEngine配置指定使用哪个引擎 - 向后兼容:Legacy引擎继续支持现有行为
3.5 已知问题
根据GitHub Issue #40232和#39725,2026.3.7版本存在启动时序问题:
- Context Engine插件可能在Agent Bootstrap之前解析
- 导致
Context engine "xxx" is not registered错误 - 影响使用第三方ContextEngine(如lossless-claw)的场景
4. 动态载入的核心机制
4.1 Lazy Loading Pattern
sequenceDiagram
participant User
participant Agent
participant ContextManager
participant ToolRegistry
User->>Agent: "帮我分析这段代码"
Agent->>ContextManager: 获取基础上下文
ContextManager-->>Agent: 核心身份 + 能力摘要 (1K tokens)
Agent->>Agent: 分析意图 → 需要代码分析工具
Agent->>ContextManager: 请求加载"code-analysis"工具
ContextManager->>ToolRegistry: 获取工具Schema
ToolRegistry-->>ContextManager: 完整Schema + 示例
ContextManager-->>Agent: 增量上下文 (+2K tokens)
Agent->>Agent: 执行代码分析
Agent-->>User: 返回分析结果
4.2 智能摘要与检索
Summarization策略:
- 将远距离的对话历史压缩为摘要
- 保留关键决策点和结果
- 丢弃中间推理过程
RAG增强:
- 使用向量检索动态获取相关知识
- 仅在需要时注入检索结果
- 避免预加载全部知识库
4.3 Token预算管理
flowchart TD
A[开始组装上下文] --> B{当前Token数 > 预算?}
B -->|否| C[返回完整上下文]
B -->|是| D[应用压缩策略]
D --> E[优先级排序]
E --> F[摘要化低优先级内容]
F --> G[移除可动态加载项]
G --> B
优先级策略:
- P0 - 不可移除:核心身份、安全规则、当前用户消息
- P1 - 尽量保留:最近对话历史、关键记忆
- P2 - 可摘要:早期对话、次要记忆
- P3 - 可动态加载:工具Schema、技能定义、参考文档
参考资料
- From 150K to 2K Tokens - William Zujkowski - Progressive Context Loading实践
- ContextEngine Deep Dive - OpenClaw Blog - OpenClaw ContextEngine详解
- Inside OpenClaw: 9-Layer System Prompt Architecture - OpenClaw系统提示架构分析
- Hierarchical Context Loading Framework - 分层上下文加载框架