记忆库(Memory)

记忆库(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 的检索算法:

  1. 分词:英文/数字小写整词([a-z0-9_]+),中文按 bigram 二元组切分
  2. 字段加权:标题 ×3 / 关键词 ×2 / 正文 ×1(关键词整词入索引,不分词)
  3. BM25 打分:k1=1.2, b=0.75,经典信息检索算法
  4. 双重 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 ❌ 无降级 ❌ 无降级 ❌ 无降级

核心优势:

  1. 隐私优先:数据完全留在浏览器,不上传云端
  2. 三层模型:比竞品更细粒度的记忆分层,模拟人脑认知
  3. 正反经验:不仅记住成功路径,也记住踩坑教训
  4. App 级知识:针对移动端场景,经验可归属到具体 App
  5. 开放集成: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 / 聊天主流程