当 AI 编程助手的上下文窗口从 8K 扩展到 300K+,我们解决了"记不住"的问题,却迎来了新的挑战:如何让 AI 在海量上下文中保持精准、高效、不遗忘?
引言:上下文膨胀的困境
你是否遇到过这样的场景:
AI 在长对话中"忘记"了早期讨论的架构决策
重复的工具调用浪费了大量 Token
调试过程中的试错记录占据了大部分上下文
换一个会话,AI 就"失忆"了
这些问题的根源在于:AI 的上下文管理还停留在"金鱼记忆"阶段——要么全部记住(浪费 Token),要么全部忘记(丢失关键信息)。
本文将介绍一套完整的AI 开发上下文智能管理方案,借鉴了 OpenCode DCP、MemPalace、Supermemory 等优秀项目的设计理念,实现了从"金鱼记忆"到"项目大脑"的跃迁。
第一章:问题分析——上下文管理的三个层面
1.1 会话级管理
单个会话内的上下文膨胀问题:
问题: - 对话轮数超过 100 轮 - Token 数量超过 30 万 - 大量重复的工具调用输出 - 调试过程中的试错记录 影响: - 响应变慢 - 成本增加 - 关键信息被淹没1.2 跨会话管理
多个会话之间的上下文传递问题:
问题: - 会话 A 的关键发现无法传递给会话 B - 每次新会话都从零开始 - 重复探索相同的问题 影响: - 效率低下 - 决策不一致 - 知识无法积累1.3 项目级管理
整个项目的全局上下文把控问题:
问题: - 不知道项目整体状态 - 不知道哪些模块在开发 - 不知道有哪些未解决的问题 - 不知道之前的架构决策 影响: - 决策缺乏全局视野 - 容易重复犯错 - 项目进度不透明第二章:核心架构——变换层设计
2.1 核心原则
原始会话历史永不修改,只变换发送给 LLM 的内容。
┌─────────────────────────────────────────────────────────────┐ │ 变换层架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────┐ ┌──────────────────────────┐ │ │ │ 原始会话历史 │ │ 发送给 LLM 的上下文 │ │ │ │ (永不修改) │ │ (动态变换) │ │ │ │ │ │ │ │ │ │ m0001: 用户请求 │ │ [系统指令] │ │ │ │ m0002: 助手响应 │ → │ [压缩摘要] │ │ │ │ m0003: 工具输出 │ │ [最近对话] │ │ │ │ m0004: ... │ │ [保护内容] │ │ │ │ ... │ │ [消息 ID] │ │ │ │ │ │ [压缩提示] │ │ │ └─────────────────────┘ └──────────────────────────┘ │ │ │ │ 关键:原始历史不变,只变换发送内容 │ └─────────────────────────────────────────────────────────────┘2.2 变换管道
输入: 原始会话历史 输出: 变换后的上下文 步骤: 1. 过滤消息(移除噪声) 2. 分配消息 ID(m0001, m0002...) 3. 应用自动策略(去重、错误清理) 4. 检查保护规则 5. 执行压缩(如果需要) 6. 注入压缩提示 7. 注入消息 ID 标签 8. 输出变换后的上下文第三章:智能压缩策略
3.1 自动策略(低代价,高收益)
借鉴 OpenCode DCP 的设计理念:
去重策略
相同工具 + 相同参数的多次调用,只保留最新的输出:
原始对话: [轮 1] read("/src/index.ts") → "内容 A" [轮 5] read("/src/index.ts") → "内容 B" [轮 10] read("/src/index.ts") → "内容 C" 去重后: [轮 10] read("/src/index.ts") → "内容 C" [轮 1,5] [已去重: read /src/index.ts]错误清理
工具调用失败后,保留错误信息,清理可能很大的输入:
原始: [轮 5] read("/huge-file.log") → Error: File too large (50MB) 清理后(轮 9): [轮 5] read("/huge-file.log") → [已清理: 工具调用失败,输入已移除] 错误信息: Error: File too large (50MB)大输出截断
工具输出超过阈值时,自动截断并添加摘要:
原始(10000 Token): <tool-output> [10000 Token 的内容...] </tool-output> 截断后: <tool-output> [前 500 Token...] <!-- [已截断: 10000 Token → 1000 Token] --> <!-- 中间 9000 Token 已移除 --> [后 500 Token...] </tool-output>3.2 智能摘要压缩
当上下文超过 30 万 Token 时,触发智能压缩:
保留(高价值)
类型 | 判断依据 | 示例 |
|---|---|---|
| 架构决策 | 涉及设计、模式、规范 | "我们决定使用 Manager-Worker 模式" |
| 未解决问题 | 包含"待修复"、"TODO" | "跨域拦截器问题待修复" |
| 关键配置 | 环境变量、依赖版本 | "使用 Java 17, Spring Boot 3.2.4" |
| 用户偏好 | "我喜欢"、"我希望" | "我喜欢函数式风格" |
| 代码规范 | 命名规范、编码风格 | "实体以 DO 结尾" |
剔除(低价值)
类型 | 判断依据 | 示例 |
|---|---|---|
| 已解决的调试 | 已标记"已修复" | "修复了拼写错误" |
| 重复探索 | 多次搜索同一内容 | 反复 grep 同一个文件 |
| 中间状态 | 临时变量、草稿 | "让我试试这个方法" |
| 错误重试 | 失败后成功的尝试 | "第一次失败,第二次成功" |
| 工具调用细节 | 具体的命令输出 | ls、cat 的详细输出 |
3.3 压缩效果
压缩前: 30 万 Token 压缩后: ~5000 Token 压缩率: 98% 保留信息: - 架构决策 ✅ - 未解决问题 ✅ - 用户偏好 ✅ - 代码规范 ✅ - 当前任务上下文 ✅ 丢失信息: - 调试过程 ❌ - 重复探索 ❌ - 工具输出细节 ❌ - 确认对话 ❌第四章:消息 ID 系统
4.1 核心设计
为每条消息分配稳定引用,便于精确指定压缩范围:
<message-id>m0001</message-id> <user>修复并行网关状态机</user> <message-id>m0002</message-id> <assistant>让我先探索一下代码...</assistant> <message-id>m0003</message-id> <tool> <name>read</name> <parameters>{"filePath": "/src/NodeExecutionManager.java"}</parameters> <output>...</output> </tool>4.2 压缩时的使用
LLM 可以使用消息 ID 精确指定压缩范围:
compress(m0001, m0010) → 压缩 m0001 到 m0010 的内容压缩后:
<compress-block id="b1" range="m0001-m0010"> <summary> 用户请求修复并行网关状态机 Bug。 经过探索,发现问题在 NodeExecutionManager.java。 使用方法 B 修复成功,测试通过。 </summary> </compress-block>第五章:保护模式
5.1 核心设计
防止关键内容在压缩时被误删:
protection: # 永不压缩的工具 protected_tools: - task # 任务派发 - skill # 技能加载 - todowrite # 任务列表 - write # 文件写入 - edit # 文件编辑 # 永不压缩的文件模式 protected_file_patterns: - "**/*.config.ts" - "**/AGENTS.md" - "**/constraints.md" - "**/specs/**" # 保护用户消息 protect_user_messages: false # 保护子代理结果 protect_subagent_results: true5.2 压缩时的保护
当压缩范围包含保护内容时,将保护内容追加到摘要:
<compress-block id="b1" range="m0001-m0010"> <summary> 修复并行网关状态机 Bug。 问题在 NodeExecutionManager.java。 </summary> <protected-content> <!-- 以下内容受保护,未被压缩 --> [m0003] read AGENTS.md: # 项目知识库 ... [m0007] task 派发: 修复并行网关状态机 ... </protected-content> </compress-block>第六章:项目记忆系统
6.1 三层记忆架构
借鉴 opencode-mem、mempalace、supermemory 的设计理念:
┌─────────────────────────────────────────────────────────────┐ │ 项目记忆系统 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 记忆存储层 │ │ │ │ │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │ │ │ │ 项目记忆 │ │ 用户记忆 │ │ 会话记忆 │ │ │ │ │ │ (Tier 1) │ │ (Tier 2) │ │ (Tier 3) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 架构决策 │ │ 编码偏好 │ │ 会话摘要 │ │ │ │ │ │ 代码规范 │ │ 工具习惯 │ │ 关键发现 │ │ │ │ │ │ 构建命令 │ │ 常用模式 │ │ 未解决问题 │ │ │ │ │ │ 模块边界 │ │ │ │ │ │ │ │ │ └──────────┘ └──────────┘ └──────────────────┘ │ │ │ │ │ │ │ │ 存储: .opencode/memory/ (YAML 文件) │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 🔒 纯本地存储,零云依赖 │ └─────────────────────────────────────────────────────────────┘6.2 记忆类型
层级 | 类型 | 持久性 | 注入时机 | 示例 |
|---|---|---|---|---|
| Tier 1 | 项目记忆 | 永久 | 每次会话 | 架构决策、代码规范、构建命令 |
| Tier 2 | 用户记忆 | 永久 | 按需 | 编码偏好、工具习惯 |
| Tier 3 | 会话记忆 | 临时 | 上下文相关 | 会话摘要、关键发现 |
6.3 记忆生命周期
creation_strategies: explicit: description: "用户明确要求记住" trigger: "记住这个 / save this / don't forget" action: "立即保存到对应类型" implicit: description: "AI 自动捕获" trigger: "检测到架构决策、代码规范、用户偏好" action: "后台静默保存" structural: description: "从项目文件解析" trigger: "读取 AGENTS.md、README.md、constraints.md" action: "解析并保存到项目记忆" session: description: "会话结束时" trigger: "会话完成/归档" action: "生成会话摘要并保存"第七章:智能上下文注入
7.1 注入策略
injection: # 首次消息注入 first_message: enabled: true sources: - project/architecture.yaml - project/conventions.yaml - user/preferences.yaml max_tokens: 500 # 文件读取注入 file_read: enabled: true sources: - project/architecture.yaml max_tokens: 200 # 按需注入 on_demand: enabled: true sources: - all max_tokens: 10007.2 注入格式
## 项目记忆 ### 架构 - Manager-Worker 模式 - 引擎核心不包含 Web 功能 - 通过 SPI 接口扩展 ### 规范 - 实体以 DO 结尾 - 服务接口以 I 开头 - 管理器类使用 *Manager ### 构建 - mvn clean compile - mvn test - npm run dev ### 偏好 - 偏好函数式风格 - 不喜欢通配符导入第八章:全局状态追踪
8.1 状态仪表盘
dashboard: last_updated: "2026-05-06 15:30:00" modules: engine: status: "stable" version: "1.0.0" hub: status: "warning" issues: ["hub_audit_log 暂无实体"] frontend: status: "development" active_tasks: - session_id: "sess_001" description: "修复并行网关状态机" progress: 80 recent_decisions: - date: "2026-05-06" decision: "采用 Manager-Worker 模式" risks: - description: "hub_audit_log 暂无实体" severity: "medium"8.2 状态查询
=== 项目状态仪表盘 === 最后更新: 2026-05-06 15:30:00 模块状态: Engine: ✅ 稳定 (v1.0.0) Hub: ⚠️ 警告 (v1.0.0) - 有未解决问题 Frontend: 🚧 开发中 (v0.1.0) 活跃任务 (2): sess_001: 修复并行网关状态机 (80%) sess_002: 重构 NodeExecutionManager (30%) 最近决策 (2): [2026-05-06] 采用 Manager-Worker 模式 [2026-05-06] 使用 SPI 接口扩展 风险项 (2): ⚠️ hub_audit_log 暂无实体 (中等) ℹ️ 大量未跟踪文件 (低)第九章:跨会话传递
9.1 传递机制
会话 A 完成 → 提取关键发现 → 保存传递文件 ↓ 会话 B 开始 ← 加载相关传递 ← 匹配模块/类型9.2 传递内容
handoff: session_id: "sess_001" completed: "2026-05-06 15:30:00" task_type: "bug_fix" related_modules: ["engine", "spi"] key_findings: - "并行网关状态机在多分支汇聚时有 Bug" - "问题在 NodeExecutionManager.java" unresolved_issues: - "跨域拦截器问题待修复" architecture_decisions: - "使用 SPI 接口扩展,不修改引擎内核"第十章:与现有方案对比
10.1 对比 DCP
特性 | DCP | 我们的实现 |
|---|---|---|
去重策略 | ✅ | ✅ |
错误清理 | ✅ | ✅ |
消息 ID | ✅ | ✅ |
保护模式 | ✅ | ✅ |
变换层 | ✅ | ✅ |
跨会话管理 | ❌ | ✅ |
项目记忆 | ❌ | ✅ |
全局状态 | ❌ | ✅ |
10.2 对比记忆插件
特性 | mempalace | supermemory | 我们的实现 |
|---|---|---|---|
存储 | ChromaDB | 云 API | 本地 YAML |
隐私 | ⚠️ 本地 | ⚠️ 云 | ✅ 完全本地 |
离线 | ❌ Python | ❌ 网络 | ✅ 支持 |
复杂度 | 高 | 中 | 低 |
跨会话 | ❌ | ✅ | ✅ |
项目记忆 | ❌ | ✅ | ✅ |
第十一章:最佳实践
11.1 配置建议
session_manager: # 会话级压缩 session: compress_after_days: 7 archive_after_days: 30 delete_after_days: 90 # 对话级压缩 conversation: sliding_window: max_turns: 100 max_tokens: 300000 # 自动策略 auto_strategies: deduplication: enabled: true purge_errors: enabled: true after_turns: 4 # 项目记忆 memory: enabled: true storage_path: ".opencode/memory" # 跨会话传递 handoff: enabled: true max_handoffs: 5 max_age_days: 711.2 使用建议
- 保持注入简洁
:记忆注入控制在 500 Token 以内
- 定期清理
:每周清理过期会话和记忆
- 只记关键信息
:不要记住所有内容,只记架构决策、代码规范、用户偏好
- 利用传递
:让关键发现跨会话传递
- 查看状态
:定期查看项目状态仪表盘
第十二章:未来展望
12.1 语义检索
当前使用关键词匹配,未来可以引入向量检索:
retrieval: method: "semantic" # keyword 或 semantic embedding_model: "local" # 本地模型,不依赖云 similarity_threshold: 0.612.2 实体抽取
自动从对话中提取实体:
entity_extraction: enabled: true types: - architecture_decisions - code_conventions - user_preferences - error_solutions12.3 主动学习
AI 主动学习项目模式:
learning: enabled: true patterns: - code_style - naming_conventions - architecture_patterns结语
AI 开发上下文智能管理不是简单的"压缩"或"记忆",而是一个系统工程:
- 变换层架构
:原始历史永不修改,只变换发送内容
- 智能压缩
:保留高价值,剔除低价值
- 保护模式
:防止关键内容被误删
- 项目记忆
:积累项目知识
- 全局状态
:掌握项目全貌
- 跨会话传递
:知识持续积累
从"金鱼记忆"到"项目大脑",AI 编程助手正在进化。
参考资料
OpenCode DCP - 动态上下文裁剪
opencode-mem - 本地记忆系统
opencode-plugin-mempalace - MemPalace 集成
opencode-supermemory - 云记忆服务
OpenViking - 上下文数据库