第 6 期:三层渐进式检索 — Claude-Mem 的省钱秘诀
(申请发送: 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 这样做:
- Claude 收到你的问题 → "上次那个登录 Bug 怎么修的?"
- Claude 看到自己有
search、timeline、get_observations三个工具可用 - 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
}
实操练习
- 在博客项目中累积至少 2-3 个会话
- 在新会话中问 Claude 一个关于历史操作的问题
- 观察 Claude 的工具调用过程 —— 它应该会先
search,再get_observations - 在 Web UI 中找到对应的 Observations,对比 Claude 给你的回答和原始记录
下期预告
三层检索只解决了「怎么省 Token」的问题。但具体到实际使用,你需要掌握搜索的高级技巧 —— 按类型、按文件、按时间过滤。下一期深入 Memory Search Skill。