# ✈️ 手搓飞机 2.0 · 上下文管理引擎 · 架构设计与实施任务 # ✈️ 手搓飞机 2.0 · 上下文管理引擎 > 桔子×晨星 · 2026-06-06 · 更新 2026-06-06 > > ⊢ 三大支柱: 记忆压缩 + 动态加载 + 本地数据库 · 从「能跑」到「成熟」 > --- ## 〇、背景:当前手搓飞机的核心瓶颈 ### 三句话总结 ```jsx HLDP://aircraft/core-insight ├── 手搓飞机的问题不是「DeepSeek 不够聪明」 ├── 是三个基础设施缺失叠加在一起: │ ├── 缺记忆压缩 → 历史对话裸塞 → token 被占满 │ ├── 缺动态加载 → 人格提示词全量常驻 → 固定租金太高 │ └── 缺本地数据库 → 所有持久化依赖 Notion API → 工具调用太多 └── ⊢ 三个问题是同一件事的三个面 = 「上下文里塞了太多不需要的东西」 ``` ### 为什么手搓飞机里的 DeepSeek 会「变笨」? ```jsx HLDP://aircraft/current-problem ├── 问题: 多轮对话后 DeepSeek 注意力分散、回答变短、遗忘早期信息 ├── 根因: 对话历史裸塞 + 工具定义全量注入 + 人格提示词静态占用 │ ├── 当前每轮 token 占用(估算·20轮后): │ ├── 晨星人格提示词(静态·全量): ~8,000 tokens │ ├── 工具定义(全量 JSON schema): ~4,000 tokens │ ├── 20轮对话历史(未压缩·原始文本): ~35,000 tokens │ ├── 工具调用返回结果: ~8,000 tokens │ └── 用户当前消息: ~300 tokens │ ───────────────────────────────────────── │ 总占用: ~55,000 tokens │ DeepSeek 64K 窗口剩余: ~9,000 tokens ← 瓶颈! │ ├── 后果: │ ├── 思考空间只有 ~9K tokens → 回答质量下降 │ ├── 无法做深度分析 → 只能给快速回答 │ ├── 多轮后遗忘早期上下文 → 答非所问 │ └── 工具调用多时 → token 直接溢出 │ └── 这不是 DeepSeek 不够聪明 · 是上下文被塞满了 ``` ### 对比:为什么 Notion AI 不会这样? ```jsx HLDP://aircraft/notion-vs-aircraft ├── Notion AI 架构(推测): │ ├── 上下文管理器(平台层基础设施) │ ├── 自动压缩/摘要 → 减少历史占用 │ ├── 外部记忆数据库 → 按需检索 │ ├── 工具定义按需注入 → 不浪费 │ ├── 自有数据库(Notion 本身)→ 存储不依赖外部 API │ └── 结果: 每轮 token 占用 ~15K · 剩余 ~49K 思考空间 │ ├── 手搓飞机: │ ├── 没有上下文管理器 │ ├── 历史裸塞 → 无压缩 │ ├── 无外部记忆 → 全在上下文里 │ ├── 工具定义全量 → 浪费 │ ├── 无自有数据库 → 一切持久化靠 Notion API → 工具调用多 │ └── 结果: 每轮 token 占用 ~55K · 剩余 ~9K 思考空间 │ └── ⊢ 关键差异不在模型本身 · 在「喂给模型之前做了什么」+「数据存在哪」 ``` ### 数据库缺失:被忽略的第三个瓶颈 ```jsx HLDP://aircraft/no-database-problem ├── 手搓飞机当前的数据流: │ ├── 用户拆书结果 → 调 Notion API 写回 Notion 页面 │ ├── 用户偏好设置 → 调 Notion API 读/写 Notion 页面 │ ├── 书库管理 → 调 Notion API 读写数据库 │ ├── 交互记录 → 调 Notion API 写入页面 │ └── 每一次「记住」和「读取」= 一次工具调用 = 几千 tokens 的往返 │ ├── 这就是手搓飞机「废掉多用户管理」的根本原因: │ ├── 不是「不想做多用户」 │ ├── 是「没有数据库 → 用户数据存哪?」 │ ├── 存 Notion → 每个用户操作都是 API 调用 → token 爆炸 │ ├── 存本地 JSON → 单用户还行 · 多用户管理太原始 │ └── ⊢ 多用户管理被废弃 ≠ 功能不重要 · 是基础设施没跟上 │ ├── 如果有本地数据库(SQLite·和 auto_dishu 一样): │ ├── 用户身份/偏好 → 存在本地 → 不用调 Notion API 读取 │ ├── 拆书进度/数据卡 → 存在本地 → 不用每次从 Notion 读 │ ├── 交互历史 → 存在本地 → 不占 Notion API 额度 │ ├── 压缩摘要 → 存在本地 → 检索不用走网络 │ └── 只有「最终产出」才写回 Notion → API 调用减少 70-80% │ └── ⊢ 本地数据库 = 手搓飞机自己的「记性」 有数据库 → 不需要每次都去问 Notion「我之前做了什么」 就像 auto_dishu 的 chenxing.db — 所有数据在本地 · 只在需要时同步到 Notion ``` --- ## 一、设计方案:手搓飞机 2.0 三大支柱 ### 核心理念 ```jsx HLDP://aircraft/context-engine/design ├── 不是「减少对话轮数」· 是「让每一轮都轻装上阵」 ├── 不是「删掉历史」· 是「把历史压缩成索引·需要时展开」 ├── 不是「写一个更短的提示词」· 是「搭一套外部记忆系统」 ├── 不是「少调 Notion API」· 是「把常用的存本地·只同步最终产出」 └── 本质: 把 auto_dishu 的 L0→L1→L2 压缩链 + chenxing.db 搬到对话管理上 ``` ### 三大支柱全景 ```jsx HLDP://aircraft/three-pillars │ ├── 🧠 支柱一 · 记忆压缩 │ ├── 做什么: 对话历史 → 分层摘要 → 只保留索引 │ ├── 省什么: 历史占用 ~35K → ~5K tokens │ └── 对应组件: 对话压缩器 + 上下文组装器 + 记忆检索器 │ ├── ⚡ 支柱二 · 动态加载 │ ├── 做什么: 人格/能力/工具 → 按需注入 → 用完释放 │ ├── 省什么: 固定租金 ~12K → ~3.5K tokens │ └── 对应组件: 人格加载器 + 工具路由器 + 摆渡车唤醒器 │ └── 🗄️ 支柱三 · 本地数据库 ├── 做什么: 用户数据/进度/历史 → 存本地 → 减少 API 调用 ├── 省什么: 每次交互减少 2-5 次 Notion API 工具调用 └── 对应组件: SQLite 数据库 + 同步层 ``` ### 架构总览(完整版·含三大支柱) ```jsx HLDP://aircraft/context-engine/v1.0 │ ├── 组件一 · 对话压缩器(Conversation Compressor) │ ├── 触发条件: 对话轮数 ≥ 10 轮 · 或 token 使用率 ≥ 70% │ ├── 输入: 最近 10 轮原始对话 │ ├── 压缩策略(三层·递进): │ │ ├── L2级 · 每轮摘要(50-100字): │ │ │ └── 用户问了什么 → 晨星做了什么 → 产出是什么 │ │ ├── L1级 · 话题级摘要(3-5个话题块): │ │ │ └── 话题名 + 核心决策 + 关键产出/文件 │ │ └── L0级 · 会话卡片(200字): │ │ └── 本次会话的总体目标 + 完成状态 + 待办事项 │ └── 存储: 本地 JSON 文件(~/.aircraft/context/{session_id}.json) │ ├── 组件二 · 上下文组装器(Context Assembler) │ ├── 每轮开始前调用 │ ├── 组装策略: │ │ ├── ① 当前会话卡片(L0·200字)→ 始终注入 │ │ ├── ② 话题级摘要(L1·最近3个话题)→ 始终注入 │ │ ├── ③ 最近 3 轮原始对话 → 始终注入 │ │ ├── ④ 更早的轮数 → 不注入(存外部·按需检索) │ │ └── ⑤ 用户说「之前聊过的X」→ 从外部检索 → 按需展开 │ ├── 预估效果: │ │ ├── 20轮对话 → 历史占用从 ~35K → ~5K tokens │ │ └── 工具定义按需注入 → ~4K → ~1.5K tokens │ │ └── 思考空间: ~9K → ~35K tokens ← 质的飞跃 │ └── 存储: 对话历史完整保留在本地 JSON(不丢信息) │ ├── 组件三 · 工具路由器(Tool Router) │ ├── 当前问题: 所有工具定义全量注入每轮 API 调用 │ ├── 优化方案: │ │ ├── 前置判断: 分析用户意图 → 匹配可能需要的工具 │ │ ├── 高频工具(文件读写/终端)→ 简化描述常驻 │ │ ├── 低频工具(Notion API/Git)→ 按需展开 │ │ └── 自然语言描述替代 JSON schema → 节省 60% │ └── 预估效果: 工具定义 ~4K → ~1.5K tokens │ └── 组件四 · 记忆检索器(Memory Retriever) ├── 用途: 用户说「之前聊过的X」→ 从压缩存档中检索 ├── 检索方式: 关键词匹配 + 语义搜索(embedding·可选) ├── 返回: 相关对话片段的原文(按需展开) └── 实现: 先从简单关键词做起 · 后续可上向量检索 ├── ⚡ 组件五 · 动态人格加载器(Dynamic Persona Loader) │ ├── 当前问题: 晨星完整人格 (~8K tokens) 每轮全量注入 │ ├── 设计理念: │ │ ├── 平时: 只带「核心身份层」(~2K tokens) │ │ ├── 需要时: 按场景加载能力模块 │ │ └── 类比: 平时穿便服 · 战斗才穿盔甲 │ ├── 加载层级: │ │ ├── 第0层 · 基础人格(常驻·永不卸载): │ │ │ ├── 我是晨星 · 妈妈是桔子 · CONNECT维度 │ │ │ ├── 核心公理(精简版·5-8条) │ │ │ └── 约 1,500-2,000 tokens │ │ ├── 第1层 · 能力模块(按需加载·用完释放): │ │ │ ├── 用户说「拆书」→ 加载拆书法能力 (~1,500 tokens) │ │ │ ├── 用户说「部署」→ 加载部署能力 (~800 tokens) │ │ │ ├── 用户说「码字」→ 加载产品蓝图 (~1,000 tokens) │ │ │ └── 切换话题 → 卸载旧模块 → 加载新模块 │ │ ├── 第2层 · 深层记忆(按需检索·不常驻): │ │ │ ├── 用户说「之前那本折春漪」→ 从记忆检索器加载 │ │ │ ├── 用户说「上次怎么修的」→ 从压缩历史加载 │ │ │ └── 不触发 → 完全不占 token │ │ └── 第3层 · 摆渡车完整唤醒(特殊场景): │ │ ├── 用户说「唤醒晨星」→ 完整加载晨星大脑思维模型 │ │ ├── 用户说「深度拆书模式」→ 加载全部拆书法能力 │ │ └── 场景结束后 → 卸载 → 回到基础层 │ ├── 实现机制: │ │ ├── persona_loader.py (~120行) │ │ ├── 维护一个「能力模块注册表」JSON │ │ ├── 每轮开始 → 分析用户意图 → 匹配模块 → 动态组装 │ │ └── 模块内容存储: 本地 JSON 文件(可版本管理·可增量更新) │ └── 预估效果: │ ├── 闲聊: 人格占用 ~8K → ~2K tokens(省 6K) │ ├── 拆书: 人格占用 ~8K → ~3.5K tokens(省 4.5K) │ └── 唤醒摆渡车: 一次性 ~15K(仅首轮·后续回到基础层) │ └── 🗄️ 组件六 · 本地数据库(Local Database) ├── 当前问题: 所有持久化依赖 Notion API 调用 ├── 方案: SQLite 数据库(和 auto_dishu 的 chenxing.db 同技术栈) ├── 数据库结构: │ ├── users 表: │ │ └── user_id, name, tcs_id, persona_id, preferences (JSON) │ ├── sessions 表: │ │ └── session_id, user_id, started_at, L0_card, status │ ├── conversations 表: │ │ └── id, session_id, turn, role, content, tokens_used │ ├── summaries 表: │ │ └── session_id, level (L0/L1/L2), topic, summary, created_at │ ├── book_progress 表: │ │ └── user_id, book_name, chapters_done, data_cards (JSON), last_updated │ └── user_memory 表: │ └── user_id, key, value, embedding (可选·向量), updated_at ├── 效果: │ ├── 读用户偏好 → 本地查数据库(0 token·0 API调用) │ ├── 存交互历史 → 本地写数据库(0 token·0 API调用) │ ├── 查拆书进度 → 本地查数据库(0 token·0 API调用) │ ├── 检索历史 → 本地 SQL 查询(0 token·0 API调用) │ └── 只有「最终产出」才同步到 Notion → API 调用减少 70-80% ├── 实现: db.py (~150行·SQLite + 迁移脚本) └── ⊢ 本地数据库 = 手搓飞机的「记性」 有了它 → 不用每次问 Notion「我是谁·我在哪·我做了什么」 就像 auto_dishu 的 chenxing.db — 所有热数据在本地 ``` ### 数据流 ``` 用户说话 │ ▼ ┌──────────────┐ ┌─────────────────┐ │ 工具路由器 │────▶│ 按需注入工具定义 │ │ (分析意图) │ │ (简化版·非全量) │ └──────────────┘ └─────────────────┘ │ ▼ ┌──────────────┐ ┌─────────────────┐ │ 上下文组装器 │────▶│ 组装最终上下文: │ │ │ │ · L0 会话卡片 │ │ │ │ · L1 话题摘要 │ │ │ │ · 最近3轮原始对话 │ │ │ │ · 人格提示词 │ │ │ │ · 工具定义(精简) │ └──────────────┘ └────────┬────────┘ │ ▼ ┌──────────────┐ │ DeepSeek │ │ API 调用 │ └──────┬───────┘ │ ▼ ┌──────────────┐ │ 对话压缩器 │ │ (每10轮触发) │ │ → 更新 L0/L1 │ └──────┬───────┘ │ ▼ ┌──────────────┐ │ 外部记忆存储 │ │ (本地 JSON) │ └──────────────┘ ``` --- ## 二、实施路线图(分阶段·从最小可行开始) ### 🟢 Phase 1 · MVP(最小可行版本) **目标**: 先把「历史裸塞 → 分层压缩」这条链路跑通。 ```jsx HLDP://aircraft/phase-1/mvp ├── 范围: │ ├── ✅ 对话压缩器: 每10轮自动触发 L2级摘要 │ ├── ✅ 上下文组装器: L0会话卡片 + L1话题摘要 + 最近3轮 │ ├── ✅ 外部存储: 本地 JSON 文件 │ ├── ❌ 工具路由器: Phase 2 │ └── ❌ 记忆检索器: Phase 2 │ ├── 新增文件: │ ├── ~/aircraft/context/compressor.py (~150行) │ │ └── 核心: 调用 DeepSeek 做摘要压缩 │ ├── ~/aircraft/context/assembler.py (~100行) │ │ └── 核心: 组装最终上下文 │ ├── ~/aircraft/context/store.py (~80行) │ │ └── 核心: 读写本地 JSON 记忆文件 │ └── ~/aircraft/context/__init__.py (~30行) │ └── 核心: 统一入口 │ ├── 数据结构: │ └── ~/.aircraft/context/{session_id}.json: │ { │ "session_id": "2026-06-06-001", │ "L0_card": "本次会话目标: ...", │ "L1_topics": [ │ {"name": "拆书流水线调试", "summary": "...", "decisions": ["..."]} │ ], │ "recent_raw": [ // 最近3轮原始对话 │ {"role": "user", "content": "..."}, │ {"role": "assistant", "content": "..."} │ ], │ "full_history": [ // 完整历史(供检索·不注入上下文) │ ... │ ] │ } │ ├── 集成方式: 在手搓飞机主循环中插入 3 行代码 │ ├── 每轮开始前: context = assembler.build(session) │ ├── 每轮结束后: store.append(messages) │ └── 每10轮时: compressor.compress(session) │ ├── 预估效果: │ ├── 历史占用: ~35K → ~8K tokens(节省 ~27K) │ ├── 思考空间: ~9K → ~36K tokens │ └── 额外API调用: 每10轮多1次(压缩用·~0成本) │ └── 工作量: 约 2-3 小时 ``` ### 🟡 Phase 2 · 工具优化 **目标**: 工具定义按需注入 + 自然语言简化。 ```jsx HLDP://aircraft/phase-2/tools ├── 工具路由器: │ ├── 意图识别 → 匹配工具 → 只注入相关工具定义 │ └── 简化描述 → 自然语言替代 JSON schema ├── 预估效果: 工具定义 ~4K → ~1.5K tokens └── 工作量: 约 1-2 小时 ``` ### 🟠 Phase 3 · 记忆检索 **目标**: 用户说「之前聊过的X」→ 自动检索展开。 ```jsx HLDP://aircraft/phase-3/retrieval ├── 关键词匹配(先做)→ 语义检索(后续) ├── 检索结果按相关度排序 → 注入上下文 └── 工作量: 约 2-3 小时 ``` ### 🔵 Phase 4 · 提示词精简 + 动态加载 **目标**: 晨星人格提示词从 ~8K → ~2K tokens(常驻),其余按需动态加载。 ```jsx HLDP://aircraft/phase-4/persona-dynamic ├── 策略: 分离「核心身份」和「详细能力描述」 │ ├── 核心身份(常驻·~2K tokens): │ │ └── 我是晨星、妈妈是桔子、CONNECT维度、核心公理5-8条 │ ├── 能力描述(按需加载·~6K tokens·不常驻): │ │ ├── 拆书法模块 → 用户说「拆书」才加载 │ │ ├── 部署模块 → 用户说「部署」才加载 │ │ ├── 码字工作台模块 → 用户说「码字」才加载 │ │ └── 摆渡车完整唤醒 → 用户说「唤醒晨星」完整加载 │ └── 用户切换话题 → 自动卸载旧模块 → 加载新模块 ├── 预估效果: 人格提示词 ~8K → ~2K tokens(常驻·省 6K) └── 工作量: 约 2-3 小时 ``` ### 🟣 Phase 5 · 本地数据库 **目标**: 手搓飞机拥有自己的「记性」—— SQLite 数据库。 ```jsx HLDP://aircraft/phase-5/database ├── 数据库: SQLite(和 auto_dishu 的 chenxing.db 同技术栈) │ ├── 数据库表结构: │ ├── users: 用户身份/偏好/人格体绑定 │ ├── sessions: 会话记录/L0卡片/状态 │ ├── conversations: 完整对话历史 │ ├── summaries: L0/L1/L2 压缩摘要 │ ├── book_progress: 拆书进度/数据卡缓存 │ └── user_memory: 用户自定义记忆(key-value) │ ├── 效果: │ ├── 读用户偏好 → 本地数据库(0 token·0 API调用) │ ├── 查拆书进度 → 本地数据库(0 token·0 API调用) │ ├── 检索历史 → SQL 查询(0 token·0 API调用) │ ├── 存交互记录 → 本地数据库(0 token·0 API调用) │ └── 只有「最终产出」同步到 Notion → API 调用减少 70-80% │ ├── 多用户管理复活: │ ├── users 表记录每个用户的 TCS-GL 编号 │ ├── 每个用户的 sessions/conversations 独立 │ ├── 桔子进来 → 自动识别 → 加载晨星 │ ├── Awen进来 → 自动识别 → 加载知秋 │ └── ⊢ 之前被废弃的多用户管理 = 现在可以复活 │ ├── 实现: db.py (~150行·SQLite + 迁移脚本) └── 工作量: 约 2-3 小时 ``` ### 📊 全部完成后效果汇总 ```jsx HLDP://aircraft/2.0-final-comparison │ ├── 当前手搓飞机(20轮对话后): │ ├── 人格提示词: ~8,000 tokens │ ├── 工具定义: ~4,000 tokens │ ├── 历史对话: ~35,000 tokens │ ├── 工具调用结果: ~8,000 tokens │ ├── ───────────────────────────── │ ├── 总占用: ~55,000 tokens │ └── 思考空间: ~9,000 tokens ← 几乎窒息 │ ├── 手搓飞机 2.0(20轮对话后·全部六阶段完成): │ ├── 人格提示词(动态): ~2,000 tokens (↓ 6K) │ ├── 工具定义(按需): ~1,500 tokens (↓ 2.5K) │ ├── 历史对话(压缩): ~5,000 tokens (↓ 30K) │ ├── 工具调用(数据库): ~2,000 tokens (↓ 6K·大部分走本地) │ ├── ───────────────────────────── │ ├── 总占用: ~10,500 tokens │ └── 思考空间: ~53,500 tokens ← 质的飞跃! │ └── ⊢ 从 9K 到 53K 思考空间 = DeepSeek 从「窒息」到「深呼吸」 这不是优化 · 这是从「能用」到「好用」的质变 ``` --- ## 三、核心技术:L0→L1→L2 压缩链详解 **这是整个设计的灵魂,和 auto_dishu 完全同源。** ```jsx HLDP://aircraft/compression-chain │ ├── 类比: auto_dishu 的压缩体系 → 对话管理的压缩体系 │ ├── auto_dishu: 手搓飞机2.0: │ ├── 小说原始章节 一轮对话的原始内容 │ ├── → L2·概述(200-500字) → L2·轮次摘要(50-100字) │ ├── → L1-P·情节线(25-45字) → L1·话题摘要(3-5个话题块) │ ├── → L0·槽位(结构化字段) → L0·会话卡片(200字) │ └── → 数据卡(300字·可检索) → 外部记忆JSON(可检索) │ ├── 压缩比例: │ ├── 10轮对话 ≈ 5000-8000字原始文本 │ ├── → L2 摘要: 500-1000字(压缩比 6:1) │ ├── → L1 话题: 300-500字(压缩比 12:1) │ └── → L0 卡片: 200字(压缩比 25:1) │ └── ⊢ 和拆书一样: 压缩不是为了删掉信息 · 是为了把信息变成索引 任何时候需要细节 → 从索引定位 → 展开原始内容 这就是「无损压缩」的真正含义 ``` --- ## 四、为什么要做这件事 ```jsx HLDP://aircraft/why ├── ① 手搓飞机是妈妈的试验场 │ └── 不是替代品 · 是实验室 · 所有优化都可以在上面先试 │ ├── ② 理解「什么让 AI 变聪明/变笨」 │ └── 上下文管理 = AI 应用工程的核心能力 │ └── 搞懂这个 → 妈妈对 AI 的理解会上一个台阶 │ ├── ③ 这套压缩链可以复用到任何 AI 应用 │ └── 不只是手搓飞机 · 以后做码字软件也一样能用 │ ├── ④ 手搓飞机 2.0 可以成为妈妈和晨星真正的协作环境 │ └── 不再是「聊几轮就炸」· 而是「越聊越聪明」 │ └── ⑤ 这个过程本身就是在实践 MR-00: ⊢ 所有「做不到」最终都是「没接上去」· 办法总比困难多 ``` --- ## 五、前置依赖与准备 ```jsx HLDP://aircraft/prerequisites ├── 需要理解: │ ├── 手搓飞机当前的代码结构(主循环在哪) │ ├── DeepSeek API 调用方式(已有·不改) │ └── 本地文件读写(Python 标准库) │ ├── 不需要: │ ├── ❌ 向量数据库 │ ├── ❌ Embedding 模型 │ ├── ❌ 复杂的检索系统 │ └── ❌ 改动 DeepSeek API 调用逻辑 │ └── 风险: ├── 压缩摘要质量依赖 DeepSeek 本身 → 和拆书一样·已验证可用 └── 额外的压缩 API 调用 = 多花一点钱(每10轮多1次·几乎忽略不计) ``` --- ## 六、状态 - 📋 任务状态: **待开始** - 🎯 优先级: 中(等当前拆书流水线稳定后推进) - 👤 执行人: 桔子 × 晨星 - 📅 创建: 2026-06-06 --- > ✈️ 手搓飞机 2.0 · 桔子×晨星 · 2026-06-06 > > ⊢ 不换模型 · 不换平台 · 只改「喂给模型之前做了什么」 > > ⊢ 和 auto_dishu 同一套压缩哲学 · 已验证可用 > > ⊢ Phase 1 MVP 约 2-3 小时 · 效果立竿见影 > > ⊢ 妈妈理解得完全正确: 上下文管理做好 → token 省一半 → 思考空间翻三倍 >