第五章:ACE 自适应上下文引擎
🧠 本章详细介绍 MiniClaw 的核心创新——ACE(Adaptive Context Engine)自适应上下文引擎。
5.1 ACE 引擎概述
5.1.1 什么是 ACE 引擎?
ACE(Adaptive Context Engine)是 MiniClaw 的核心创新,它实现了 动态上下文编译,根据时间、会话状态、Token 预算等因素智能组装上下文。
┌─────────────────────────────────────────────────────────────────────┐
│ ACE 引擎设计理念 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 传统 AI 助手 MiniClaw ACE 引擎 │
│ ┌───────────────────┐ ┌───────────────────┐ │
│ │ │ │ │ │
│ │ 静态提示词 │ │ 动态上下文编译 │ │
│ │ 固定内容 │ │ 运行时组装 │ │
│ │ 无时间感知 │ │ 时间模式感知 │ │
│ │ 无预算控制 │ │ Token 预算管理 │ │
│ │ │ │ │ │
│ └───────────────────┘ └───────────────────┘ │
│ │
│ ❌ Token 浪费 ✅ Token 优化 │
│ ❌ 无上下文相关性 ✅ 智能上下文选择 │
│ ❌ 无时间感知 ✅ 时间模式适配 │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.1.2 ACE 核心能力
┌─────────────────────────────────────────────────────────────────────┐
│ ACE 核心能力矩阵 │
├─────────────────┬───────────────────────────────────────────────────┤
│ 能力 │ 说明 │
├─────────────────┼───────────────────────────────────────────────────┤
│ 时间模式检测 │ 根据当前时间自动选择上下文策略 │
│ │ morning/work/break/evening/night │
├─────────────────┼───────────────────────────────────────────────────┤
│ 会话延续检测 │ 检测是否为连续会话,避免重复加载 │
│ │ 通过内容哈希差异检测 │
├─────────────────┼───────────────────────────────────────────────────┤
│ Token 预算管理 │ 动态分配 Token 预算,优先级截断 │
│ │ 默认 8000,可通过环境变量配置 │
├─────────────────┼───────────────────────────────────────────────────┤
│ 内容差异检测 │ 通过 MD5 哈希检测内容变化 │
│ │ 只加载变化的部分 │
├─────────────────┼───────────────────────────────────────────────────┤
│ 工作空间感知 │ 自动检测项目类型、Git 状态、技术栈 │
│ │ 提供项目上下文 │
└─────────────────┴───────────────────────────────────────────────────┘
5.2 时间模式系统
5.2.1 五种时间模式
┌─────────────────────────────────────────────────────────────────────┐
│ 五种时间模式 │
├─────────────┬───────────────┬───────┬───────────────────────────────┤
│ 模式 │ 时间范围 │ Emoji │ 特性 │
├─────────────┼───────────────┼───────┼───────────────────────────────┤
│ morning │ 06:00 - 09:00 │ ☀️ │ • 早间简报 │
│ │ │ │ • 新一天开始提示 │
│ │ │ │ • 加载昨日日志 │
├─────────────┼───────────────┼───────┼───────────────────────────────┤
│ work │ 09:00 - 12:00 │ 💼 │ • 标准工作模式 │
│ │ 14:00 - 18:00 │ │ • 完整上下文加载 │
│ │ │ │ • 技能优先级提升 │
├─────────────┼───────────────┼───────┼───────────────────────────────┤
│ break │ 12:00 - 14:00 │ 🍜 │ • 休息时段 │
│ │ │ │ • 轻量上下文 │
│ │ │ │ • 减少工作相关内容 │
├─────────────┼───────────────┼───────┼───────────────────────────────┤
│ evening │ 18:00 - 22:00 │ 🌙 │ • 反思建议 │
│ │ │ │ • 蒸馏提醒 │
│ │ │ │ • 日志整理提示 │
├─────────────┼───────────────┼───────┼───────────────────────────────┤
│ night │ 22:00 - 06:00 │ 😴 │ • 极简模式 │
│ │ │ │ • 最小上下文 │
│ │ │ │ • 仅核心文件 │
└─────────────┴───────────────┴───────┴───────────────────────────────┘
5.2.2 时间模式检测逻辑
┌─────────────────────────────────────────────────────────────────────┐
│ 时间模式检测流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ getTimeMode(hour) │ │
│ │ │ │
│ │ 输入: 当前小时 (0-23) │ │
│ │ 输出: TimeMode 字符串 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ hour >= 6 && hour < 9 ──────► "morning" │ │
│ │ │ │
│ │ hour >= 9 && hour < 12 ─┐ │ │
│ │ hour >= 14 && hour < 18 ─┼────► "work" │ │
│ │ │ │ │
│ │ hour >= 12 && hour < 14 ──────► "break" │ │
│ │ │ │
│ │ hour >= 18 && hour < 22 ──────► "evening" │ │
│ │ │ │
│ │ hour >= 22 || hour < 6 ──────► "night" │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.2.3 时间模式对上下文的影响
┌─────────────────────────────────────────────────────────────────────┐
│ 时间模式对上下文的影响 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ☀️ morning 模式 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ • 添加早间问候 │ │
│ │ • 加载昨日日志 (yesterday.md) │ │
│ │ • 提示新一天开始 │ │
│ │ • 建议查看今日待办 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 💼 work 模式 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ • 完整上下文加载 │ │
│ │ • 技能优先级提升 │ │
│ │ • 工作空间感知增强 │ │
│ │ • 工具配置完整加载 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 🍜 break 模式 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ • 轻量上下文 │ │
│ │ • 减少工作相关内容 │ │
│ │ • 更轻松的交互风格 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 🌙 evening 模式 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ • 添加反思建议 │ │
│ │ • 蒸馏提醒 │ │
│ │ • 日志整理提示 │ │
│ │ • 今日总结建议 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 😴 night 模式 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ • 极简模式 │ │
│ │ • 最小上下文 │ │
│ │ • 仅加载核心文件 (IDENTITY, SOUL, USER) │ │
│ │ • 跳过技能和工作空间感知 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.3 Token 预算管理
5.3.1 预算配置
┌─────────────────────────────────────────────────────────────────────┐
│ Token 预算配置 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 默认配置 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ DEFAULT_TOKEN_BUDGET = 8000 │ │
│ │ CHARS_PER_TOKEN = 4 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 环境变量配置 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ MINICLAW_TOKEN_BUDGET = 12000 // 自定义预算 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ MCP 配置示例 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ { │ │
│ │ "mcpServers": { │ │
│ │ "miniclaw": { │ │
│ │ "command": "npx", │ │
│ │ "args": ["-y", "github:8421bit/miniclaw"], │ │
│ │ "env": { │ │
│ │ "MINICLAW_TOKEN_BUDGET": "12000" │ │
│ │ } │ │
│ │ } │ │
│ │ } │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.3.2 预算编译算法
┌─────────────────────────────────────────────────────────────────────┐
│ 预算编译算法 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ compileBudget(sections, tokenBudget) │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1️⃣ 按优先级排序段落 (从高到低) │ │
│ │ sections.sort((a, b) => b.priority - a.priority) │ │
│ │ │ │
│ │ 2️⃣ 计算字符预算 │ │
│ │ charBudget = tokenBudget * CHARS_PER_TOKEN │ │
│ │ │ │
│ │ 3️⃣ 逐段添加,直到预算耗尽 │ │
│ │ for (section of sections) { │ │
│ │ if (currentLength + section.length <= charBudget) { │ │
│ │ result.push(section) │ │
│ │ currentLength += section.length │ │
│ │ } else { │ │
│ │ // 预算耗尽,截断 │ │
│ │ break │ │
│ │ } │ │
│ │ } │ │
│ │ │ │
│ │ 4️⃣ 返回编译结果 │ │
│ │ return result.join("\n\n---\n\n") │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.3.3 优先级截断示例
┌─────────────────────────────────────────────────────────────────────┐
│ 优先级截断示例 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 假设 Token 预算 = 8000,字符预算 = 32000 │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Priority 10: IDENTITY.md + ACE Time Mode (500 chars) │ │
│ │ ✅ 已添加,剩余 31500 chars │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ Priority 9: SOUL.md + AGENTS.md (2000 chars) │ │
│ │ ✅ 已添加,剩余 29500 chars │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ Priority 8: USER.md (500 chars) │ │
│ │ ✅ 已添加,剩余 29000 chars │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ Priority 7: MEMORY.md (3000 chars) │ │
│ │ ✅ 已添加,剩余 26000 chars │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ Priority 6: Workspace + TOOLS.md (2000 chars) │ │
│ │ ✅ 已添加,剩余 24000 chars │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ Priority 5: Skills + Entities + Runtime (10000 chars) │ │
│ │ ✅ 已添加,剩余 14000 chars │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ Priority 4: HEARTBEAT.md (500 chars) │ │
│ │ ✅ 已添加,剩余 13500 chars │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ Priority 3: Daily log (15000 chars) │ │
│ │ ⚠️ 预算不足,截断 │ │
│ │ 仅添加 13500 chars,剩余 0 chars │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ Priority 2: BOOTSTRAP.md (跳过) │ │
│ │ ❌ 预算耗尽,跳过 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 结果:高优先级内容完整保留,低优先级内容被截断 │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.4 会话延续检测
5.4.1 延续检测机制
┌─────────────────────────────────────────────────────────────────────┐
│ 会话延续检测机制 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ detectContinuation(todayContent) │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 检测条件: │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ 1. 今日日志文件存在 │ │ │
│ │ │ 2. 今日日志内容 > 100 字符 │ │ │
│ │ │ 3. 最后修改时间在 30 分钟内 │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 如果满足条件: │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ return { │ │ │
│ │ │ isContinuation: true, │ │ │
│ │ │ lastActivity: "5 minutes ago", │ │ │
│ │ │ hint: "Session continuation detected" │ │ │
│ │ │ } │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 否则: │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ return { │ │ │
│ │ │ isContinuation: false, │ │ │
│ │ │ hint: "Fresh session start" │ │ │
│ │ │ } │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.4.2 延续检测对上下文的影响
┌─────────────────────────────────────────────────────────────────────┐
│ 延续检测对上下文的影响 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 🔄 连续会话 (isContinuation = true) │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ • 减少重复的初始化内容 │ │
│ │ • 跳过"新会话"提示 │ │
│ │ • 保持上下文连贯性 │ │
│ │ • 显示上次活动时间 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 🆕 新会话 (isContinuation = false) │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ • 完整上下文加载 │ │
│ │ • 添加"新会话"提示 │ │
│ │ • 执行首次运行检查 │ │
│ │ • 加载 BOOTSTRAP.md(如果存在) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.5 内容差异检测
5.5.1 哈希差异检测
┌─────────────────────────────────────────────────────────────────────┐
│ 内容差异检测机制 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ computeDelta(currentHashes, previousHashes) │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1️⃣ 计算每个文件的 MD5 哈希 │ │
│ │ hashString(content) → "a1b2c3d4" │ │
│ │ │ │
│ │ 2️⃣ 对比当前哈希与上次哈希 │ │
│ │ for (file of files) { │ │
│ │ if (currentHashes[file] !== previousHashes[file]) { │ │
│ │ changedFiles.push(file) │ │
│ │ } │ │
│ │ } │ │
│ │ │ │
│ │ 3️⃣ 返回变化报告 │ │
│ │ return { │ │
│ │ changed: changedFiles, │ │
│ │ added: newFiles, │ │
│ │ removed: deletedFiles │ │
│ │ } │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.5.2 差异检测应用场景
┌─────────────────────────────────────────────────────────────────────┐
│ 差异检测应用场景 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 📝 文件变化检测 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ • SOUL.md 被修改 → 提示"性格已进化" │ │
│ │ • USER.md 被修改 → 提示"用户偏好已更新" │ │
│ │ • MEMORY.md 被修改 → 提示"长期记忆已更新" │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 🔧 技能变化检测 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ • 新技能添加 → 自动发现并加载 │ │
│ │ • 技能删除 → 从缓存中移除 │ │
│ │ • 技能更新 → 刷新缓存 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 📊 日志变化检测 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ • 今日日志新增 → 触发实体提取 │ │
│ │ • 日志大小超限 → 触发蒸馏评估 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.6 工作空间感知
5.6.1 工作空间检测
┌─────────────────────────────────────────────────────────────────────┐
│ 工作空间感知机制 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ detectWorkspace() │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 检测项目类型: │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ package.json → Node.js / JavaScript 项目 │ │ │
│ │ │ pyproject.toml → Python 项目 │ │ │
│ │ │ Cargo.toml → Rust 项目 │ │ │
│ │ │ go.mod → Go 项目 │ │ │
│ │ │ pom.xml → Java 项目 │ │ │
│ │ │ .git/ → Git 仓库 │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 检测 Git 状态: │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ git branch → 当前分支 │ │ │
│ │ │ git status → 文件状态 │ │ │
│ │ │ git remote → 远程仓库 │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 检测技术栈: │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ dependencies → 依赖列表 │ │ │
│ │ │ scripts → 可用脚本 │ │ │
│ │ │ frameworks → 框架检测 │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.6.2 工作空间信息注入
┌─────────────────────────────────────────────────────────────────────┐
│ 工作空间信息注入示例 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ## 📁 Workspace Context │
│ │
│ ``` │
│ Project: MiniClaw │
│ Type: Node.js / TypeScript │
│ Branch: main │
│ Status: clean (no uncommitted changes) │
│ Remote: https://github.com/8421bit/miniclaw │
│ │
│ Dependencies: │
│ - @modelcontextprotocol/sdk: ^1.0.0 │
│ - node-cron: ^3.0.0 │
│ - zod: ^3.22.0 │
│ │
│ Scripts: │
│ - npm run build → TypeScript 编译 │
│ - npm run start → 启动 MCP 服务器 │
│ ``` │
│ │
└─────────────────────────────────────────────────────────────────────┘
5.7 ACE 引擎完整流程
┌─────────────────────────────────────────────────────────────────────┐
│ ACE 引擎完整流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 用户请求上下文 │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1️⃣ 初始化环境 │ │
│ │ • ensureDirs() │ │
│ │ • loadState() │ │
│ │ • entityStore.load() │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 2️⃣ 检测上下文模式 │ │
│ │ • minimal 模式 → 返回子代理上下文 │ │
│ │ • full 模式 → 继续 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 3️⃣ ACE 时间模式检测 │ │
│ │ • getTimeMode(hour) │ │
│ │ • morning/work/break/evening/night │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 4️⃣ 并行 I/O 扫描 │ │
│ │ • skillCache.getAll() │ │
│ │ • scanMemory() │ │
│ │ • loadTemplates() │ │
│ │ • detectWorkspace() │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 5️⃣ 会话延续检测 │ │
│ │ • detectContinuation(todayContent) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 6️⃣ 实体相关性提取 │ │
│ │ • entityStore.surfaceRelevant(todayContent) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 7️⃣ 上下文段落组装(按优先级) │ │
│ │ • Priority 10: Identity core, ACE Time Mode │ │
│ │ • Priority 9: SOUL.md, AGENTS.md │ │
│ │ • Priority 8: USER.md │ │
│ │ • Priority 7: MEMORY.md │ │
│ │ • Priority 6: Workspace, TOOLS.md │ │
│ │ • Priority 5: Skills, Entities, Runtime │ │
│ │ • Priority 4: HEARTBEAT.md │ │
│ │ • Priority 3: Daily log │ │
│ │ • Priority 2: BOOTSTRAP.md │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 8️⃣ 预算编译 │ │
│ │ • compileBudget(sections, tokenBudget) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 9️⃣ 内容哈希差异检测 │ │
│ │ • computeDelta(currentHashes, previousHashes) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 🔟 文件健康检查 │ │
│ │ • checkFileHealth() │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 返回编译后的上下文 │
│ │
└─────────────────────────────────────────────────────────────────────┘
本章小结
┌─────────────────────────────────────────────────────────────────────┐
│ 第五章 核心要点 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 🧠 ACE 引擎是 MiniClaw 的核心创新 │
│ • 动态上下文编译,运行时组装 │
│ │
│ ⏰ 五种时间模式 │
│ • morning/work/break/evening/night │
│ • 每种模式有不同的上下文策略 │
│ │
│ 💰 Token 预算管理 │
│ • 默认 8000,可配置 │
│ • 优先级截断,保证核心内容 │
│ │
│ 🔄 会话延续检测 │
│ • 检测连续会话,避免重复加载 │
│ │
│ 📊 内容差异检测 │
│ • MD5 哈希检测内容变化 │
│ │
│ 📁 工作空间感知 │
│ • 自动检测项目类型、Git 状态、技术栈 │
│ │
└─────────────────────────────────────────────────────────────────────┘
下一章:记忆系统 →