凌晨2点,我看着一个叫"Agentic Context Engineering"的GitHub仓库,心想:这不就是教AI怎么"记笔记"吗?后来发现,这事儿比记笔记复杂多了...
上下文工程(Context Engineering)是AI Agent开发的核心技能。它决定了Agent能"记住"多少信息、如何高效利用有限的上下文窗口、以及如何在多轮对话中保持连贯性。掌握上下文工程,是构建高质量Agent的关键。
| 问题 | 影响 | 上下文工程的解决方案 |
|---|---|---|
| 上下文窗口有限 | 长对话丢失信息 | 智能压缩和摘要 |
| Token成本累积 | API调用费用爆炸 | 上下文优化策略 |
| 信息过载 | 模型注意力分散 | 优先级排序 |
| 无关信息干扰 | 回答质量下降 | 上下文过滤 |
┌─────────────────────────────────────────────┐
│ System Context (系统级) │
│ • 系统提示词 │
│ • 工具定义 │
│ • 安全约束 │
├─────────────────────────────────────────────┤
│ Session Context (会话级) │
│ • 当前对话历史 │
│ • 用户偏好 │
│ • 临时任务状态 │
├─────────────────────────────────────────────┤
│ Persistent Context (持久级) │
│ • 长期记忆 │
│ • 知识库 │
│ • 用户画像 │
└─────────────────────────────────────────────┘
// OpenClaw中的上下文管理
const agent = new Agent({
name: 'context-aware-agent',
// 系统级上下文
systemPrompt: `你是一个专业的AI助手。遵循以下规则:
1. 回答简洁准确
2. 不确定时主动询问
3. 保持专业态度`,
// 上下文配置
context: {
maxTokens: 8000, // 最大上下文Token
compressionStrategy: 'semantic', // 语义压缩
relevanceThreshold: 0.7, // 相关性阈值
// 持久化配置
persistence: {
enabled: true,
storage: 'vector', // 向量存储
embeddingModel: 'text-embedding-3-small'
}
}
});
// 语义压缩示例
import { SemanticCompressor } from 'openclaw';
const compressor = new SemanticCompressor({
model: 'claude-3-haiku', // 使用快速模型压缩
preserveKeywords: true, // 保留关键词
summaryRatio: 0.3 // 压缩到30%
});
// 原始上下文 (2000 tokens)
const originalContext = `
用户问:请介绍一下OpenClaw...
[大量对话历史]
助手答:OpenClaw是一个...`;
// 压缩后 (600 tokens)
const compressed = await compressor.compress(originalContext);
// 输出:用户询问OpenClaw介绍 → 助手说明OpenClaw是AI Agent框架
// 上下文优先级管理
const contextManager = new ContextManager({
priorities: {
system: 100, // 系统提示最高优先级
tools: 90, // 工具定义次之
recentMessages: 80, // 最近消息
userPreferences: 70, // 用户偏好
history: 50, // 历史对话
knowledge: 40 // 知识库检索
},
// 当上下文超出时的处理策略
overflowStrategy: 'drop-lowest' // 丢弃低优先级内容
});
// 分块存储与检索
const chunker = new ContextChunker({
chunkSize: 500, // 每块500 tokens
overlap: 50, // 重叠50 tokens
embeddingModel: 'text-embedding-3-small'
});
// 存储长文档
const doc = await chunker.chunk(longDocument);
// 检索相关块
const relevant = await chunker.retrieve({
query: '用户当前问题',
topK: 5, // 返回最相关的5块
minScore: 0.75 // 最低相关性分数
});
// 在新会话中注入持久记忆
const agent = new Agent({
name: 'memory-agent',
// 记忆注入配置
memoryInjection: {
enabled: true,
maxMemories: 10, // 最多注入10条记忆
recencyWeight: 0.6, // 时间权重
relevanceWeight: 0.4, // 相关性权重
// 记忆检索
retriever: async (query) => {
const memories = await memoryDB.search(query);
return memories.slice(0, 10);
}
}
});
// 首次会话存储记忆
await agent.remember('用户喜欢简洁的回答');
await agent.remember('用户使用深色主题');
// 新会话自动注入记忆
const newSession = agent.newSession();
// 系统提示自动包含:
// "根据历史记忆:用户喜欢简洁的回答,用户使用深色主题"
| 策略 | 节省Token | 适用场景 |
|---|---|---|
| 语义压缩 | 50-70% | 长对话历史 |
| 分块检索 | 60-80% | 知识库查询 |
| 摘要替代 | 40-60% | 文档分析 |
| 缓存复用 | 30-50% | 重复请求 |
| 模型降级 | 70-90% | 简单任务 |
// 配置上下文优化
const agent = new Agent({
context: {
// 启用缓存
cache: {
enabled: true,
ttl: 3600 // 1小时缓存
},
// 智能压缩
compression: {
enabled: true,
trigger: 'auto', // 自动触发
threshold: 0.8, // 使用80%窗口时触发
model: 'claude-3-haiku' // 用便宜模型压缩
},
// 成本控制
costLimit: {
perRequest: 0.5, // 单次请求上限$0.5
perSession: 5, // 单次会话上限$5
alertThreshold: 0.8 // 80%时告警
}
}
});
// 客服Agent上下文配置
const supportAgent = new Agent({
name: 'customer-support',
systemPrompt: `你是一个专业的客服助手。根据用户历史和当前问题提供帮助。`,
context: {
maxTokens: 16000,
// 会话记忆
sessionMemory: {
enabled: true,
maxMessages: 50,
compressionAfter: 20 // 20轮后压缩
},
// 用户画像注入
userProfile: {
enabled: true,
fields: ['language', 'timezone', 'subscription', 'history']
},
// 知识库检索
knowledgeRetrieval: {
enabled: true,
topK: 5,
minScore: 0.75
}
}
});