记忆库(Memory)用户使用说明
让 Mobile AI Agent 越用越聪明:跨任务沉淀经验、跨会话记住偏好、任务内压缩上下文——零网络依赖,数据完全留在你的浏览器里。
目录
功能概述
记忆库是 Mobile AI Agent 的"大脑"。当你让 Agent 操控手机完成一个任务(比如"打开抖音搜索商品"),它会把这次执行过程中的可复用经验自动沉淀下来;下次再执行类似任务时,Agent 会优先检索这些经验,少走弯路、少踩坑。
核心价值:
- 越用越快:成功路径被记住,同类任务执行轮次显著减少
- 越用越稳:失败教训被记住,同类错误不再重蹈
- 越用越懂你:聊天偏好被记住,长期交互风格自动适配
核心特点
| 特点 | 说明 |
|---|---|
| 本地优先 | 所有数据存于浏览器 IndexedDB(库名 mobile-ai-memory),零网络依赖,隐私数据不出设备 |
| 自动沉淀 | 任务结束自动提炼经验,无需手动操作;聊天中自然表达偏好即可被记住 |
| 智能检索 | BM25 算法 + 字段加权(标题×3 / 关键词×2 / 正文×1),毫秒级命中相关经验 |
| 正反经验 | 成功任务提炼"可复用路径",失败任务提炼"踩坑警示",检索时分别注入 |
| App 级知识 | 经验可归属到具体 App(如"微信""抖音"),同 App 任务优先注入,减少探索 |
| 容量自管理 | 语义记忆 LRU 淘汰(上限 500),情景日志 FIFO 淘汰(上限 200),常用经验自动保留 |
| 优雅降级 | 浏览器隐私模式等导致 IndexedDB 不可用时,自动降级为无记忆模式,不影响主流程 |
| MCP 开放 | 对外暴露 3 个工具(search / save / delete),第三方 MCP 客户端可直接读写记忆 |
三层记忆模型
记忆库采用认知科学启发的三层模型,模拟人脑的"长期记忆 + 短期记忆 + 工作记忆":
1. 语义记忆(Semantic Memory)— 长期经验
类比:人脑里"微信设置页在'我'Tab → 设置"这类知识。
| 属性 | 说明 |
|---|---|
| 存储 | IndexedDB semantic store |
| 容量 | 上限 500 条 |
| 淘汰策略 | LRU:score = (lastUsedAt ?? createdAt) + hits × 86_400_000,最低者淘汰 |
| 来源 | 任务结束 LLM 提炼 / 聊天偏好提炼 / MCP 外部写入 |
| 关键字段 | title(一句话标题)、content(经验正文)、keywords(检索关键词)、polarity(正/反面)、app(归属 App) |
经验极性:
positive:可复用的成功路径(如"抖音搜索入口在首页右上角放大镜")negative:反面踩坑警示(如"搜索页直接点搜索按钮无响应,需先点输入框唤起键盘")
2. 情景日志(Episodic Memory)— 长期事件记录
类比:人脑里"上次我打开抖音搜了个商品,点了 5 次才成功"这类事件记忆。
| 属性 | 说明 |
|---|---|
| 存储 | IndexedDB episodic store |
| 容量 | 上限 200 条 |
| 淘汰策略 | FIFO:createdAt 最旧者淘汰 |
| 写入时机 | 每次 Agent 任务结束自动落库(一任务一条,事件内联) |
| 内容 | 任务目标、状态、完整事件流(步骤开始/结束、工具调用、错误、反思、重规划)、工作记忆快照 |
3. 工作记忆(Working Memory)— 短期上下文
类比:你正在做一件事时,脑子里同时记住的"刚才做了 A、现在要做 B、已知 C"。
| 属性 | 说明 |
|---|---|
| 存储 | 纯内存(任务生命周期内) |
| 容量 | 最近 3 步完整摘要 + 更早步骤折叠为滚动摘要 + 事实清单 ≤ 20 条 |
| 作用 | 给 Agent 每步决策提供压缩后的上下文,替代旧的"前 N 步 summary 前 80 字" |
| 生命周期 | 任务结束后可选写入情景日志作为 summary |
工作原理
数据流全景
┌─────────────────────────────────────────────────────────────────────┐
│ 记忆库数据流 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 任务开始 │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────┐ │
│ │ 1. 检索注入 │ │
│ │ - App 级 UI 知识(5 条,优先) │ │
│ │ - 正面经验(3 条,可复用路径) │ │
│ │ - 反面经验(2 条,踩坑警示) │ │
│ │ 命中后 hits+1, lastUsedAt 回写 │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 任务执行 │
│ │ │
│ ├── 每步 ──> 工作记忆:addStep / addFact │
│ │ buildContext() 输出压缩上下文给 Resolve 阶段 │
│ │ │
│ ▼ │
│ 任务结束 │
│ │ │
│ ├── addEpisode() ──> 情景日志落库(await) │
│ │ │
│ └── distillTaskMemories() ──> LLM 提炼 ──> addSemantic() │
│ (成功→正面经验 / 失败→反面经验,detached 异步) │
│ │
│ 聊天中 │
│ │ │
│ └── 意图词命中 ──> distillChatMemories() ──> addSemantic() │
│ (用户偏好提炼,至多 1 条) │
│ │
└─────────────────────────────────────────────────────────────────────┘
检索算法
记忆库使用 BM25 + 字段加权 + 双重 boost 的检索算法:
- 分词:英文/数字小写整词(
[a-z0-9_]+),中文按 bigram 二元组切分 - 字段加权:标题 ×3 / 关键词 ×2 / 正文 ×1(关键词整词入索引,不分词)
- BM25 打分:
k1=1.2, b=0.75,经典信息检索算法 - 双重 boost:
- 命中加权:每次命中 +2%,封顶 +40%(常用经验权重更高)
- 时近性:7 天内创建 +10%(新鲜经验优先)
性能:索引在应用启动时从 IndexedDB 全量重建,千条量级毫秒级完成;运行期增删同步维护,无需重建。
典型使用场景
场景 1:重复性手机操作自动化
用户目标:每周在抖音搜索某商品并截图
记忆效果:
- 第 1 次:Agent 探索抖音界面,可能尝试多次点击才找到搜索入口
- 第 2 次:Agent 检索到"抖音搜索入口在首页右上角放大镜",直接导航
- 第 N 次:Agent 秒级完成,跳过所有探索步骤
沉淀的经验:
title: "抖音搜索入口"
content: "抖音搜索入口在首页右上角放大镜图标,点击后进入搜索页"
keywords: ["抖音", "搜索", "放大镜", "首页"]
app: "抖音"
polarity: "positive"
场景 2:失败教训规避
用户目标:在某 App 搜索页执行搜索操作
记忆效果:
- 第 1 次:Agent 直接点搜索按钮,无响应(需先唤起键盘),任务失败
- 第 2 次:Agent 检索到"搜索页直接点搜索按钮无响应",先点输入框唤起键盘,再搜索
- 后续:Agent 在该 App 搜索页永远先唤起键盘
沉淀的经验:
title: "搜索需先唤起键盘"
content: "XX App 搜索页直接点搜索按钮无响应,需先点输入框唤起键盘再搜索"
keywords: ["搜索", "键盘", "输入框"]
app: "XX App"
polarity: "negative"
场景 3:长期偏好记忆
用户聊天:"以后都用中文回复我"
记忆效果:
- Agent 提炼出"语言偏好:用户要求以后所有回复均使用中文"
- 后续所有聊天默认使用中文,无需重复说明
沉淀的经验:
title: "语言偏好"
content: "用户要求以后所有回复均使用中文"
keywords: ["中文", "回复", "语言"]
polarity: "positive"
场景 4:第三方 MCP 客户端集成
场景:外部 MCP 客户端(如 Qoder、Claude Desktop)通过 WebMCP 直接读写记忆
工具:
search_memory:{ query: "抖音搜索", type: "semantic", limit: 5 }→ 返回相关经验save_memory:{ title: "自定义经验", content: "...", keywords: [...] }→ 写入记忆delete_memory:{ id: "xxx" }→ 删除指定记忆
用途:外部系统可把自身积累的知识注入 Agent 记忆,实现跨系统经验共享。
案例讲解
案例 A:从 0 到 1 的抖音商品搜索任务
任务目标:"打开抖音,搜索'蓝牙耳机',截图前 10 个商品"
第 1 次执行(无记忆)
Plan 阶段:
Step 1: 打开抖音
Step 2: 进入搜索页
Step 3: 输入关键词
Step 4: 截图商品列表
Resolve 阶段:
Step 1: launchApp("com.ss.android.ugc.aweme") ✓
Step 2: 探索界面... 点击底部"首页" Tab ✗(错误)
探索界面... 点击顶部"放大镜"图标 ✓(成功)
Step 3: 点击搜索输入框 → 唤起键盘 → inputText("蓝牙耳机") ✓
Step 4: screenshot() ✓
任务耗时:4 步,2 次探索失败
沉淀经验:
- "抖音搜索入口在首页右上角放大镜"(positive)
- "抖音搜索需先点输入框唤起键盘"(positive)
第 2 次执行(有记忆)
Plan 阶段:
检索注入:
- App 级知识:抖音搜索入口在首页右上角放大镜
- 正面经验:抖音搜索需先点输入框唤起键盘
Step 1: 打开抖音
Step 2: 点击首页右上角放大镜进入搜索页
Step 3: 点击搜索输入框唤起键盘,输入"蓝牙耳机"
Step 4: 截图商品列表
Resolve 阶段:
Step 1: launchApp("com.ss.android.ugc.aweme") ✓
Step 2: tap(放大镜坐标) ✓(经验命中,直接导航)
Step 3: tap(输入框) → inputText("蓝牙耳机") ✓(经验命中)
Step 4: screenshot() ✓
任务耗时:4 步,0 次探索失败
效果对比:
| 指标 | 第 1 次 | 第 2 次 | 提升 |
|---|---|---|---|
| 探索失败次数 | 2 | 0 | -100% |
| 执行轮次 | 6 | 4 | -33% |
| Token 消耗 | ~8000 | ~5000 | -37% |
案例 B:失败教训规避
任务目标:"在某电商 App 搜索'手机壳'并加入购物车"
第 1 次执行(失败)
Step 3: 在搜索页直接点击"搜索"按钮
→ 按钮无响应(需先唤起键盘)
→ Agent 重试 3 次,任务失败
沉淀经验:
title: "搜索需先唤起键盘"
content: "XX App 搜索页直接点搜索按钮无响应,需先点输入框唤起键盘再搜索"
polarity: "negative"
第 2 次执行(有记忆)
Plan 阶段:
检索注入:
- 反面经验:XX App 搜索页直接点搜索按钮无响应,需先点输入框唤起键盘
Resolve 阶段:
Step 3: tap(输入框) → 键盘弹出 → inputText("手机壳") → tap(搜索按钮) ✓
任务成功,规避了上次的坑
案例 C:聊天偏好记忆
对话:
用户:"以后都用中文回复我"
Agent:(提炼出"语言偏好"记忆)
"好的,以后我会用中文回复你。"
后续所有对话:
Agent 默认使用中文,无需重复说明
竞品比较
| 维度 | Mobile AI Use 记忆库 | ChatGPT Memory | Claude Projects | AutoGPT Memory |
|---|---|---|---|---|
| 存储位置 | 本地 IndexedDB | 云端(OpenAI 服务器) | 云端(Anthropic 服务器) | 本地 / 向量数据库 |
| 隐私性 | ✅ 数据不出设备 | ❌ 上传至云端 | ❌ 上传至云端 | ✅ 本地存储 |
| 网络依赖 | ✅ 零依赖 | ❌ 需联网 | ❌ 需联网 | ⚠️ 向量库需联网 |
| 记忆类型 | 三层(语义 / 情景 / 工作) | 单层(用户偏好) | 单层(项目知识) | 两层(短期 / 长期) |
| 自动沉淀 | ✅ 任务结束自动提炼 | ✅ 对话中自动 | ❌ 手动上传 | ✅ 自动 |
| 检索算法 | BM25 + 加权 + boost | 未公开 | 未公开 | 向量相似度 |
| 经验极性 | ✅ 正 / 反面分开 | ❌ 无区分 | ❌ 无区分 | ❌ 无区分 |
| App 级知识 | ✅ 归属具体 App | ❌ 无 | ❌ 无 | ❌ 无 |
| 容量管理 | ✅ LRU / FIFO 自动淘汰 | 未公开 | 未公开 | ⚠️ 需手动清理 |
| MCP 开放 | ✅ 3 个工具对外 | ❌ 封闭 | ❌ 封闭 | ⚠️ 部分开放 |
| 降级策略 | ✅ IndexedDB 不可用时 no-op | ❌ 无降级 | ❌ 无降级 | ❌ 无降级 |
核心优势:
- 隐私优先:数据完全留在浏览器,不上传云端
- 三层模型:比竞品更细粒度的记忆分层,模拟人脑认知
- 正反经验:不仅记住成功路径,也记住踩坑教训
- App 级知识:针对移动端场景,经验可归属到具体 App
- 开放集成:MCP 工具对外,第三方客户端可直接读写
数据分析
容量与性能
| 指标 | 数值 | 说明 |
|---|---|---|
| 语义记忆上限 | 500 条 | LRU 淘汰,常用经验自动保留 |
| 情景日志上限 | 200 条 | FIFO 淘汰,最旧记录先出 |
| 工作记忆容量 | 近 3 步全文 + 滚动摘要 + 20 条事实 | 规则压缩,零 LLM 成本 |
| 索引重建时间 | 毫秒级(千条量级) | 应用启动时全量重建 |
| 检索响应时间 | < 10ms | 纯内存倒排索引 + BM25 |
| 单条经验大小 | ~200 字节 | title + content + keywords |
| 总存储占用 | < 1 MB | 500 条语义 + 200 条情景 |
检索权重分析
| 字段 | 权重 | 说明 |
|---|---|---|
| title | ×3 | 标题权重最高,一句话概括经验 |
| keywords | ×2 | 关键词整词入索引,检索命中率高 |
| content | ×1 | 正文权重最低,但信息量最大 |
Boost 机制:
| Boost | 计算方式 | 效果 |
|---|---|---|
| 命中加权 | 1 + min(hits, 20) × 0.02 |
每次命中 +2%,封顶 +40% |
| 时近性 | 7 天内创建 ×1.1 | 新鲜经验优先 |
提炼效率
| 场景 | 提炼条数 | 说明 |
|---|---|---|
| 成功任务 | 0–3 条正面经验 | 可复用导航路径、页面结构 |
| 失败任务 | 0–2 条反面经验 | 踩坑警示,纯环境错误跳过 |
| 聊天偏好 | 0–1 条 | 长期偏好 / 指令 |
提炼失败率:0%(失败静默返回空数组,不影响主流程)
任务执行效果预估
基于记忆库的能力,同类任务第 N 次执行相比第 1 次:
| 指标 | 预估提升 | 说明 |
|---|---|---|
| 探索失败次数 | -50% ~ -100% | 经验命中后直接导航 |
| 执行轮次 | -20% ~ -40% | 跳过探索步骤 |
| Token 消耗 | -20% ~ -40% | 上下文压缩 + 经验注入 |
| 任务成功率 | +10% ~ +30% | 规避已知坑点 |
注:以上为基于典型移动端任务的预估,实际效果取决于任务复杂度与记忆命中率。
常见问题
Q1:记忆库的数据会同步到云端吗?
不会。所有数据存于浏览器本地 IndexedDB(库名 mobile-ai-memory),零网络依赖。即使关闭浏览器,数据依然保留(除非清除浏览器数据)。
Q2:浏览器隐私模式下记忆库能用吗?
不能。隐私模式下 IndexedDB 不可用,记忆库自动降级为 no-op 模式,所有读写 API 返回空或 null,不影响 Agent 主流程。控制台会输出一次 console.warn 提示。
Q3:记忆库会自动清理吗?
会。语义记忆超过 500 条时,按 LRU 策略淘汰(score = lastUsedAt + hits × 86_400_000,最低者淘汰);情景日志超过 200 条时,按 FIFO 策略淘汰最旧记录。常用经验会自动保留。
Q4:如何查看和管理我的记忆?
打开 聊天框 右上角工具栏的"记忆管理"抽屉,可以:
- 查看所有语义记忆与情景日志
- 按关键词搜索
- 删除单条记忆
- 清空某一类记忆
Q5:外部 MCP 客户端可以读写记忆吗?
可以。记忆库对外暴露 3 个 WebMCP 工具:
search_memory:检索记忆save_memory:写入记忆delete_memory:删除记忆
第三方 MCP 客户端(如 Qoder、Claude Desktop)可通过这些工具直接读写记忆,实现跨系统经验共享。
Q6:记忆提炼会消耗 Token 吗?
会。每次任务结束后,会调用一次 LLM 提炼语义记忆(成功任务 0–3 条,失败任务 0–2 条)。提炼失败静默跳过,不影响主流程。聊天偏好提炼仅在意图词命中时触发(如"以后""偏好""喜欢"),控制 LLM 成本。
Q7:正反经验有什么区别?
- 正面经验(positive):可复用的成功路径,如"抖音搜索入口在首页右上角放大镜"
- 反面经验(negative):失败踩坑警示,如"搜索页直接点搜索按钮无响应,需先点输入框唤起键盘"
检索时正反分开注入,明确告诉模型"上次这里踩过坑",避免重蹈覆辙。
Q8:App 级知识是什么?
经验可归属到具体 App(如"微信""抖音"),用于 App 级 UI 知识优先注入。例如:
- "微信设置页在'我'Tab → 设置"(app: "微信")
- "抖音搜索入口在首页右上角放大镜"(app: "抖音")
当任务目标包含某 App 名时,该 App 的知识会优先注入,减少探索轮次。
Q9:工作记忆和语义记忆有什么区别?
| 维度 | 工作记忆 | 语义记忆 |
|---|---|---|
| 生命周期 | 单次任务运行期 | 长效(跨任务/会话) |
| 存储 | 纯内存 | IndexedDB |
| 容量 | 近 3 步 + 滚动摘要 + 20 条事实 | 上限 500 条 |
| 作用 | 给当前任务提供压缩上下文 | 给未来任务提供经验参考 |
| 写入方式 | 代码自动喂入 | LLM 提炼 / 聊天偏好 / MCP |
Q10:记忆库支持导出/导入吗?
暂不支持。当前版本记忆数据仅存于本地 IndexedDB,无法跨设备迁移。如需备份,可通过浏览器开发者工具导出 IndexedDB 数据。未来版本可能支持 JSON 导出/导入。
铁律:
- 读失败返回空、写失败静默丢弃、提炼失败跳过
- 记忆是附加能力,任何异常不得影响 Agent / 聊天主流程