第 6 期:三层渐进式检索 — Claude-Mem 的省钱秘诀

⏱ 预计阅读 9 分钟 更新于 2026/5/7
💡 进群学习加 wx: agentupdate
(申请发送: agentupdate)

本期场景:你的博客项目已经开发了 2 周、10 个会话、200 条 Observations。现在你问 Claude:"上次那个登录 Bug 是怎么修的?" 如果把 200 条全部塞给 Claude... 大概要烧掉 10 万个 Token。


6.1 Token 经济学:为什么「全塞进去」是自杀行为?

先算一笔账:

指标 数值
10 个会话 × 20 条 Observations 200 条
每条 Observation 平均 500 tokens 100,000 tokens
Claude 上下文窗口 200,000 tokens(上限)
你实际需要的信息 可能只有 2-3 条相关的

如果暴力注入所有 200 条记忆:

  • 💸 消耗: 100K tokens($0.30-$1.50/次)
  • 🐌 速度: 填充上下文需要很长时间
  • 🤯 质量: 大量无关信息会干扰 Claude 的判断("上下文中毒")

Claude-Mem 的解决方案:不要全给它,让它自己来拿需要的部分。


6.2 三层检索:Progressive Disclosure(渐进披露)

Claude-Mem 的核心设计哲学叫 Progressive Disclosure —— 分层递进地披露信息。Claude 先拿到一个轻量的目录索引,找到感兴趣的条目后,再去获取详情。

Layer 1: search → 轻量索引

消耗: ~50-100 tokens/条

返回的信息极其精简:只有 ID、标题、类型、时间。就像一本书的目录。

// search(query="登录 Bug", type="bugfix", limit=10)
[
  { "id": 42, "title": "修复 JWT 刷新逻辑", "type": "bugfix", "date": "2026-04-18" },
  { "id": 67, "title": "修复登录 API 422 错误", "type": "bugfix", "date": "2026-04-20" },
  { "id": 89, "title": "修复 OAuth 回调 URL", "type": "bugfix", "date": "2026-04-21" }
]

Layer 2: timeline → 时间线上下文

消耗: ~100-200 tokens/条

Claude 看完索引后,对 #67 感兴趣。通过 timeline 获取它前后的关联事件,理解因果链。

// timeline(observation_id=67)
[
  { "id": 65, "title": "读取 auth.ts 文件", "type": "discovery", "time": "10:31" },
  { "id": 66, "title": "发现缺少请求体验证", "type": "discovery", "time": "10:33" },
  { "id": 67, "title": "修复登录 API 422 错误", "type": "bugfix", "time": "10:35" },
  { "id": 68, "title": "添加输入验证测试", "type": "feature", "time": "10:38" }
]

Layer 3: get_observations → 完整详情

消耗: ~500-1,000 tokens/条

只对筛选后的 ID 获取全部内容。这一步最"贵",但因为已经精准过滤,只取 2-3 条。

// get_observations(ids=[66, 67])
[
  {
    "id": 66,
    "title": "发现缺少请求体验证",
    "narrative": "开发者在检查 src/api/auth/login.ts 时发现...",
    "facts": ["login 路由未检查空请求体", "导致 Prisma 抛出 422"],
    "files_read": ["src/api/auth/login.ts"]
  },
  {
    "id": 67,
    "title": "修复登录 API 422 错误",
    "narrative": "在路由处理函数开头添加了 zod 验证...",
    "facts": ["使用 zod 进行输入验证", "验证失败返回 400"],
    "files_modified": ["src/api/auth/login.ts"]
  }
]

6.3 省费对比

graph LR
    subgraph "暴力方式"
        A1["200 条 Observations
全部注入 Claude"] --> A2["100,000 tokens
💸💸💸"] end subgraph "三层渐进式检索" B1["Layer 1: search
返回 10 条索引"] --> B2["~700 tokens"] B2 --> B3["Layer 2: timeline
查看 #67 的前后文"] --> B4["+400 tokens"] B4 --> B5["Layer 3: get_observations
获取 2 条详情"] --> B6["+1,500 tokens"] end A2 --> C["总计: 100,000 tokens"] B6 --> D["总计: 2,600 tokens"] style A2 fill:#ef4444,color:#fff style D fill:#10b981,color:#fff
方式 Token 消耗 成本
暴力全塞 ~100,000 $0.30-$1.50
三层检索 ~2,600 $0.01
节省比例 ~97%

6.4 Claude 是如何自动执行三层检索的?

你不需要手动告诉 Claude "先搜索、再看时间线、再取详情"。Claude-Mem 的 MCP 工具设计天然引导 Claude 这样做:

  1. Claude 收到你的问题 → "上次那个登录 Bug 怎么修的?"
  2. Claude 看到自己有 searchtimelineget_observations 三个工具可用
  3. Claude 的推理过程(自动发生):
思考:用户问的是一个特定的历史 Bug 修复。
我应该先搜索相关的记忆。

行动:search(query="登录 Bug", type="bugfix")
结果:找到 3 条匹配,id #67 最相关。

思考:我需要了解这个 Bug 修复的上下文。
行动:timeline(observation_id=67)
结果:看到了问题的发现过程和修复步骤。

思考:我需要 #66 和 #67 的完整详情来给用户准确答案。
行动:get_observations(ids=[66, 67])
结果:获得了完整的 narrative 和 facts。

回复用户:上次登录 Bug 的根因是...修复方案是...

这个三步漏斗是自动发生的。 Claude-Mem 的工具名和描述经过精心设计,让 Claude 自然而然地选择正确的调用顺序。


6.5 SessionStart 时的自动注入

除了主动搜索,Claude-Mem 在每次会话开始时也使用渐进式策略自动注入上下文:

  • 注入最近 N 个会话的 Summaries(轻量,每条 ~200 tokens)
  • 注入最近的 next_steps(告诉 Claude 上次没做完什么)
  • 不注入所有历史 Observations 的完整内容

可以在 settings.json 中配置注入的上下文量:

{
  "CONTEXT_OBSERVATION_LIMIT": 50,
  "CONTEXT_SESSION_LIMIT": 10
}

实操练习

  1. 在博客项目中累积至少 2-3 个会话
  2. 在新会话中问 Claude 一个关于历史操作的问题
  3. 观察 Claude 的工具调用过程 —— 它应该会先 search,再 get_observations
  4. 在 Web UI 中找到对应的 Observations,对比 Claude 给你的回答和原始记录

下期预告

三层检索只解决了「怎么省 Token」的问题。但具体到实际使用,你需要掌握搜索的高级技巧 —— 按类型、按文件、按时间过滤。下一期深入 Memory Search Skill。

➡️ 第 7 期:Skill 1 — Memory Search 记忆搜索