Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

驾驭工程优化设计

适合读者: Agent工程师(AE), 架构师(SYSA), 效率追求者

本章详细分析 MiMo Code 在 Harness Engineering(驾驭工程) 方面的深入优化设计。驾驭工程关注的核心问题是:“如何让智能体持续做对事?” MiMo Code 通过 Goal/Stop 条件、持久化记忆、智能上下文管理和任务跟踪系统,系统性地解决了这个问题。

驾驭工程的核心挑战

Harness Engineering 理论框架 中,我们定义了 L3 驾驭工程的失败模式:漂移/错误累积。具体表现为:

  1. 过早完成:智能体在任务未真正完成时宣布完成
  2. 状态丢失:跨会话时丢失项目上下文和工作进度
  3. 信息过载:上下文窗口被无关信息填满,关键信息被稀释
  4. 目标漂移:在长任务中逐渐偏离原始目标

MiMo Code 针对每个挑战都设计了工程化的解决方案。

优化一:Goal/Stop 条件机制

问题描述

长任务中常见的失败模式是:在看到先前进度后,智能体倾向于过早宣布“完成“或提出问题。这在自动化执行中尤其危险,因为没有人站在旁边纠正或提供反馈。

解决方案

MiMo Code 引入了独立的 Goal 验证器:

用户定义停止条件
    │
    ↓
智能体尝试终止
    │
    ↓
系统启动独立验证器
    │
    ↓
验证器审查完整对话历史
    │
    ↓
判断条件是否真正满足
    │
    ├── 是 → 任务完成
    │
    └── 否 → 反馈具体差距,智能体继续

设计细节

  1. 独立性:验证器不参与实际工作,因此不会对已完成部分产生对齐偏差
  2. 完整性:验证器接收与智能体完全相同的上下文,包括实际的工具输出
  3. 可靠性:无限循环概率低于 0.5%,系统可在达到限制后自动退出

使用示例

# 设置停止条件
/goal 所有测试通过且代码已提交

# 智能体会持续工作,直到验证器确认条件满足

效果对比

场景无 Goal有 Goal
测试失败但智能体宣布完成常见被验证器阻止
部分完成但智能体放弃可能验证器反馈差距,继续执行
无限循环风险高概率 < 0.5%

Goal 条件配置参考

配置参数

参数类型默认值说明
goal_statement字符串-任务的明确描述
verification_model字符串MiMo-V2.5-Pro用于验证的模型
max_iterations整数100最大迭代次数
timeout_minutes整数60任务超时时间
stop_conditions数组[]停止条件列表

示例目标配置

# 示例 1:实现功能 X 并编写测试
- goal_statement: "实现用户认证模块并编写单元测试"
  verification_model: "MiMo-V2.5-Pro"
  max_iterations: 50
  timeout_minutes: 90
  stop_conditions:
    - "所有单元测试通过"
    - "代码通过代码审查"
    - "API 接口文档已更新"

# 示例 2:调试 Y 问题并修复根原因
- goal_statement: "调试支付服务中的超时问题并修复根原因"
  verification_model: "MiMo-V2.5-Pro"
  max_iterations: 30
  timeout_minutes: 120
  stop_conditions:
    - "超时问题已修复"
    - "添加了相应的监控指标"
    - "编写了回归测试"

# 示例 3:重构模块 Z
- goal_statement: "重构用户服务模块以提高可维护性"
  verification_model: "MiMo-V2.5-Pro"
  max_iterations: 80
  timeout_minutes: 150
  stop_conditions:
    - "代码覆盖率达到 90%+"
    - "所有现有测试通过"
    - "性能指标无退化"
    - "文档已更新"

JSON 格式示例

{
  "goals": [
    {
      "goal_statement": "实现用户认证模块并编写单元测试",
      "verification_model": "MiMo-V2.5-Pro",
      "max_iterations": 50,
      "timeout_minutes": 90,
      "stop_conditions": [
        "所有单元测试通过",
        "代码通过代码审查",
        "API 接口文档已更新"
      ]
    }
  ]
}

配置最佳实践

  1. 目标陈述:保持目标具体且可测量,避免模糊的描述
  2. 验证模型:选择与任务复杂性相匹配的模型,平衡性能和成本
  3. 迭代限制:根据任务规模合理设置 max_iterations,避免无限循环
  4. 超时控制:为每个任务设置合理的超时,防止资源浪费
  5. 停止条件:设计多层次的停止条件,确保任务真正完成

优化二:持久化记忆系统

问题描述

传统编码智能体在会话结束后丢失所有上下文。用户每次开始新会话时,智能体必须重新学习项目约束、架构决策和技术事实。

解决方案

MiMo Code 实现了四层记忆架构:

┌─────────────────────────────────────────┐
│           全局记忆(用户偏好)            │
├─────────────────────────────────────────┤
│           项目记忆(MEMORY.md)          │
├─────────────────────────────────────────┤
│           会话记忆(checkpoint.md)      │
├─────────────────────────────────────────┤
│           历史(SQLite)                 │
└─────────────────────────────────────────┘

关键设计决策

1. 选择文件而非向量数据库

MiMo Code 选择使用 Markdown 文件而非纯向量数据库来存储项目记忆,核心原因是可审查性

方案优点缺点
Markdown 文件用户可直接查看、编辑、删除检索效率较低
向量数据库检索效率高用户无法直接审查,黑箱

一旦记忆影响智能体的后续行为,用户需要能够:

  • 看到系统记住了什么
  • 删除不正确的条目
  • 修改过时的知识

2. 单写入者原则

每个结构化文件只允许一个写入者。这是防止并发写入导致不一致状态的最简单不变量。

写入器子智能体 ──→ checkpoint.md (唯一写入者)
                ──→ MEMORY.md (唯一写入者)
主智能体 ──────→ notes.md (唯一可写入的文件)

3. 提前提取而非延迟压缩

MiMo Code 在 20%、45%、70% 上下文预算时触发检查点,而非等到接近上限。原因:

  • 模型能力退化:高上下文利用率下,模型的压缩能力下降(“中间丢失“问题)
  • 提取需要空间:写入器需要空间来思考和生成结构化输出
  • 增量更新更可靠:每次检查点是前一次的增量,非一次性摘要

记忆维护机制

Dream(梦境)

  • 触发频率:每 7 天自动触发
  • 执行者:独立智能体
  • 功能
    • 合并零散记忆
    • 去重重复条目
    • 验证文件路径有效性
    • 压缩记忆为紧凑表示
    • 更新全局记忆

Distill(蒸馏)

  • 触发频率:每 30 天自动触发
  • 执行者:独立智能体
  • 功能
    • 识别重复的工作模式
    • 固化为可复用技能
    • 生成 CLI 命令
    • 创建自定义智能体
    • 编写 SOP 文档

效果对比

场景无持久化记忆有持久化记忆
新会话开始需要重新介绍项目背景自动加载项目记忆
跨会话任务进度丢失,需重新开始从检查点恢复,继续执行
重复错误每次都可能犯同样的错误项目记忆记录已知问题
团队协作每人独立学习共享项目记忆

记忆操作示例

多会话工作流程示例

以下是一个用户与 MiMo Code 进行多会话协作的完整示例,展示了记忆系统的实际应用:

会话 1:项目初始化

# 用户第一次启动 MiMo Code
> 你好,我需要实现一个用户认证系统

# MiMo Code 记录项目记忆
MEMORY.md 写入:
- 项目名称:用户认证系统
- 技术栈:React + Node.js + PostgreSQL
- 主要模块:用户注册、登录、密码重置
- 架构约束:REST API,JWT 认证

# 会话检查点保存
checkpoint.md 写入:
- 会话 ID:ses_001
- 开始时间:2026-06-20 10:00:00
- 当前任务:设计数据库 schema
- 进度:0%

会话 2:任务继续

# 用户返回,MiMo Code 加载上下文
> 继续上次工作

# 系统自动加载记忆
MEMORY.md 读取:
- 项目名称:用户认证系统
- 技术栈:React + Node.js + PostgreSQL
- 主要模块:用户注册、登录、密码重置

# 会话检查点恢复
checkpoint.md 读取:
- 会话 ID:ses_001
- 上次进度:0%
- 当前任务:实现数据访问层
- 进度:25%

# 系统自动完成任务初始化
> 好的,我将实现数据访问层。让我先设计数据库 schema...

会话 3:项目完成

# 用户返回,查看项目进度
> 项目完成了吗?

# 系统加载完整项目记忆
MEMORY.md 读取:
- 项目名称:用户认证系统
- 技术栈:React + Node.js + PostgreSQL
- 主要模块:用户注册、登录、密码重置
- 架构约束:REST API,JWT 认证

# 会话检查点恢复
checkpoint.md 读取:
- 会话 ID:ses_001
- 当前任务:编写集成测试
- 进度:85%

# 系统提示用户完成情况
> 您好!我已完成用户认证系统的开发。项目进度如下:
> - 数据库 schema:已设计
> - 数据访问层:已实现
> - API 接口:已完成
> - 单元测试:已编写
> - 集成测试:正在编写

# 用户确认完成
> 好的,项目看起来很不错。让我运行一下完整的测试套件...

会话 4:记忆维护

# 7 天后,Dream 自动运行
> [Dream 任务] 正在合并零散记忆...

# Dream 发现并合并记忆
MEMORY.md 更新:
- 添加:API 文档生成
- 合并:重复的错误处理逻辑
- 验证:所有文件路径有效

# 30 天后,Distill 自动运行
> [Distill 任务] 正在提取可复用技能...

# Distill 生成技能
SKILL.md 生成:
- 技能名称:用户认证模块模板
- 描述:快速生成用户认证模块的代码模板
- CLI 命令:/generate-auth-module
- SOP 文档:AUTH_MODULE_SOP.md

控制台输出示例

# 会话开始时的控制台输出
$ mimo
> 欢迎回来!我已加载您上次的项目记忆。
> 当前项目:用户认证系统
> 剩余任务:编写集成测试 (T1.4)
> 进度:85%

# 会话结束时的控制台输出
$ mimo
> 项目已完成!所有检查点已保存。
> 会话总结:
> - 总任务数:4
> - 已完成任务:3
> - 进行中任务:1
> - 会话时长:2 小时 15 分钟
> - 记忆更新:已自动运行 Dream/Distill

# 记忆管理命令
$ mimo /memory-list
> 项目记忆:
> - MEMORY.md (项目记忆)
> - checkpoint.md (会话检查点)
> - notes.md (零散笔记)
> - global_memory.md (全局偏好)

$ mimo /memory-view MEMORY.md
> 项目记忆 (2026-06-20):
> - 技术栈:React + Node.js + PostgreSQL
> - 主要模块:用户注册、登录、密码重置
> - 架构约束:REST API,JWT 认证

关键操作步骤

  1. 会话开始:系统自动加载 MEMORY.md 和 checkpoint.md
  2. 任务执行:系统使用项目记忆初始化任务,保存检查点
  3. 跨会话恢复:用户返回时,系统自动恢复完整上下文
  4. 记忆维护:Dream/Distill 定期自动运行,优化记忆结构
  5. 用户控制:用户可以查看、编辑或删除记忆内容

优化三:智能上下文管理

问题描述

即使上下文窗口足够大,模型的指令遵循能力也会随输入长度增长而下降。有用的约束和意图被大量工具输出稀释。

解决方案

MiMo Code 实现了智能上下文管理:

上下文窗口使用率
    │
    ├── < 20% → 正常工作
    │
    ├── 20% → 触发检查点 1
    │
    ├── 45% → 触发检查点 2
    │
    ├── 70% → 触发检查点 3
    │
    ├── 90% → 执行重建
    │         │
    │         ↓
    │    注入持久化文件(≤65K tokens)
    │         │
    │         ↓
    │    新窗口开始,继续工作
    │
    └── 100% → 紧急重建

预算注入机制

重建时,MiMo Code 按以下顺序注入内容,每个部分有独立的 token 限制:

优先级内容说明
1任务列表智能体首先需要知道它应该做什么
2会话检查点当前工作状态
3最近用户消息逐字片段,防止写入器重写偏离原始意图
4项目记忆跨会话的项目知识
5全局记忆用户级偏好
6笔记零散发现
7文件路径索引可按需读取的内存文件
8尾部提醒告诉智能体下一步做什么

即使每个部分达到限制,总注入内容也保持在约 65K tokens 以内。

效果对比

场景基础上下文管理智能上下文管理
上下文耗尽会话结束或质量退化自动重建,继续工作
信息稀释关键信息被淹没预算控制,重要信息优先注入
状态丢失重建后丢失上下文从检查点恢复完整状态

上下文预算配置

配置参数

参数类型默认值说明
max_context_tokens整数128000模型的最大上下文窗口大小
checkpoint_thresholds数组[0.2, 0.45, 0.7]触发检查点的上下文使用率阈值
rebuild_strategy字符串full重建策略:full/partial/minimal

示例配置

# MiMo Code 上下文预算配置
context_budget:
  max_context_tokens: 128000
  checkpoint_thresholds:
    - 0.2  # 20% 时触发检查点 1
    - 0.45 # 45% 时触发检查点 2
    - 0.7  # 70% 时触发检查点 3
  rebuild_strategy: "full"  # 完整重建

# 高级配置示例
advanced_config:
  enable_predictive_rebuild: true
  predictive_threshold: 0.85
  min_rebuild_interval: 30  # 分钟
  max_rebuild_frequency: 4   # 每小时最多重建 4 次

JSON 格式示例

{
  "context_budget": {
    "max_context_tokens": 128000,
    "checkpoint_thresholds": [0.2, 0.45, 0.7],
    "rebuild_strategy": "full",
    "advanced_config": {
      "enable_predictive_rebuild": true,
      "predictive_threshold": 0.85,
      "min_rebuild_interval": 30,
      "max_rebuild_frequency": 4
    }
  }
}

配置最佳实践

  1. max_context_tokens:根据目标模型调整,确保不超过模型支持的最大值
  2. checkpoint_thresholds:根据任务复杂性调整,复杂任务使用较低的阈值
  3. rebuild_strategy
    • full:完整重建,适合复杂任务
    • partial:部分重建,适合简单任务
    • minimal:最小重建,适合快速迭代
  4. 高级配置:根据硬件资源和任务需求调整预测重建参数

动态调整示例

# 根据任务复杂性动态调整配置
/task 实现复杂微服务架构
> 系统自动调整上下文预算:
> - max_context_tokens: 128000
> - checkpoint_thresholds: [0.15, 0.35, 0.6]
> - rebuild_strategy: "full"
> - 启用预测重建:true

/task 实现简单页面组件
> 系统自动调整上下文预算:
> - max_context_tokens: 64000
> - checkpoint_thresholds: [0.3, 0.6, 0.85]
> - rebuild_strategy: "minimal"
> - 禁用预测重建:false

优化四:任务跟踪系统

问题描述

复杂项目包含多个相互依赖的任务。传统智能体缺乏结构化的任务管理,导致:

  • 任务遗漏
  • 依赖混乱
  • 进度不透明

解决方案

MiMo Code 实现了树形任务系统:

T1: 实现用户认证模块
├── T1.1: 设计数据库 schema
├── T1.2: 实现数据访问层
├── T1.3: 实现 API 接口
│   ├── T1.3.1: 登录接口
│   ├── T1.3.2: 注册接口
│   └── T1.3.3: 密码重置
└── T1.4: 编写测试

关键特性

  1. 自动集成:任务进度自动与检查点系统集成
  2. 跨会话持久化:任务状态在会话重建后保留
  3. 进度追踪:每个任务有独立的进度文件(tasks/<id>/progress.md

使用示例

# 创建任务树
/task 实现用户认证模块
  /task 设计数据库 schema
  /task 实现数据访问层
  /task 实现 API 接口
    /task 登录接口
    /task 注册接口
    /task 密码重置
  /task 编写测试

# 查看任务进度
/tasks

# 标记任务完成
/task-done T1.1

综合效果

MiMo Code 的四项驾驭工程优化共同解决了长任务自动化的核心挑战:

挑战优化方案效果
过早完成Goal/Stop 条件验证器确保任务真正完成
状态丢失持久化记忆系统跨会话保持完整上下文
信息过载智能上下文管理重要信息优先注入
目标漂移任务跟踪系统结构化管理,防止偏离

这些优化使得 MiMo Code 在 200+ 步骤的长任务中,相比 Claude Code 有 65%+ 的胜率。

与 OpenCode 的对比

维度OpenCodeMiMo Code
完成验证无内置机制Goal 验证器
记忆系统无内置持久化四层记忆架构
上下文管理基础压缩智能检查点+重建+预算注入
任务管理无内置机制树形任务系统

常见反模式

反模式一:Goal 条件写得过于宽泛。 “完成任务”、“做到最好”、“确保没问题“这类 Goal 陈述形同虚设。验证器需要判断“条件是否真正满足”,模糊的描述让它无从判断,要么永远判“未完成“导致死循环,要么轻易放行导致智能体在任务未真正完成时就停了。好的 Goal 应该具体到可验证的程度:“所有单元测试通过”、“代码通过 ESLint 检查”、“API 文档已更新”。每个 stop_condition 都应该对应一个可自动化检查的结果,而不是主观判断。

反模式二:手动维护 MEMORY.md 而不信任写入器。 有些开发者觉得“写入器自动维护的记忆不够精确“,于是手动编辑 MEMORY.md,删除“不准确“的条目或添加“更完整“的描述。这打破了系统的单写入者不变量。写入器在下次检查点时可能把你的手动修改覆盖掉,或者基于你修改后的记忆做出错误的推理。MEMORY.md 的设计意图是让写入器基于多轮观察积累稳定知识,而非人工整理的文档。如果你想补充项目背景,应该在会话开始时直接告诉智能体,让它在工作中自然积累到项目记忆中。

反模式三:关闭检查点或调高阈值以“节省 token“。 检查点的触发阈值(20%、45%、70%)是经过大量测试优化的。调高阈值(比如改成 50%、75%、90%)看起来减少了写入器的调用次数,节省了 token,但代价是每次提取时上下文更满、模型压缩能力更差、提取质量下降。更危险的是,如果调得太高(比如 90% 才触发第一次),可能在还没来得及做第一次检查点时上下文就耗尽了,导致整个会话状态丢失。如果你确实觉得 token 成本高,应该优化检查点内容的精简度,而非减少触发频率。

适用场景与限制

Goal/Stop 条件适用场景: 任务有明确的“完成“定义(测试通过、部署成功、代码审查通过),且这个定义可以被自动化验证。特别适合无人值守的自动化任务,比如夜间跑的批量重构、CI/CD 流水线中的自动修复、定期的数据迁移。验证器的独立性确保它不会被智能体的“我已经做了很多工作“的对齐偏差影响。

Goal/Stop 条件不适用的场景: 探索性任务(“帮我看看这段代码有什么问题”)、创意性任务(“写一段优雅的实现”)、交互式调试(需要人工判断“这个行为对不对“)。这些场景中,“完成“本身是模糊的,验证器无法给出可靠判断。强行设置 Goal 反而会让智能体陷入“条件永远不满足“的死循环,或者在验证器误通过后过早停止。

持久化记忆的限制: 四层记忆系统在单用户场景下运行良好,但团队共享项目记忆时需要注意冲突。如果两个开发者同时在不同分支上工作,各自的写入器可能向 MEMORY.md 写入矛盾的信息(比如一个记录“使用 PostgreSQL“,另一个记录“迁移到 MySQL“)。Dream 机制会合并这些矛盾,但合并逻辑可能做出错误的选择。团队使用时建议约定“谁负责维护 MEMORY.md“,或者定期人工审查合并结果。

智能上下文管理的限制: 65K tokens 的总注入预算是硬上限。对于超大型项目(数百个文件、复杂的依赖图),65K tokens 可能不够注入所有必要的上下文。此时智能体会丢失部分项目记忆,表现为“记不清某些架构决策“。解决方法是精简 MEMORY.md,只保留最关键的信息,或者使用文件路径索引让智能体按需读取。

常见失败与陷阱

陷阱一:Goal 验证器的误阻塞。 实践中,误阻塞(条件已满足但验证器判断未满足)比误通过更常见。最典型的场景是测试因环境问题(端口占用、依赖未安装、临时文件缺失)而非代码问题失败,验证器看到测试失败就判定“条件未满足“,智能体开始修复它认为的问题,但实际上是环境问题。此时智能体可能引入不必要的修改。应对方法是在 Goal 配置中加入环境预检查,或者在 stop_conditions 中明确区分“代码测试“和“环境测试“。

陷阱二:Dream 合并引入错误知识。 Dream 机制自动合并零散记忆,但合并逻辑基于模式识别,可能把两个相关的但不同的观察错误地合并。比如智能体在会话 A 中发现“用户偏好 Tab 缩进“,在会话 B 中发现“项目要求 Space 缩进“,Dream 可能把这两个矛盾的观察合并为“用户偏好 Tab 缩进(项目要求 Space 缩进时除外)“,这个合并后的条目比两个原始条目都更模糊且更容易误导。定期人工审查 MEMORY.md 是必要的,特别是当项目规范发生变化时。

陷阱三:上下文重建后的“冷启动“效应。 虽然重建注入了检查点、项目记忆和全局记忆,但智能体在新窗口中醒来时仍然需要一点时间“热身“——理解当前状态、恢复工作节奏。这个“冷启动“效应在复杂任务中尤为明显:智能体可能需要 1-2 轮交互才能完全恢复到中断前的工作状态。如果你的任务对连续性要求极高(比如实时调试),频繁的重建会打断工作流。此时可以考虑调低检查点阈值,减少重建次数,或者在重建后主动给智能体一个“上下文恢复“提示。

下一步