第 7 期:Skill 1 — Memory Search(记忆搜索)

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

本期场景:博客项目开发了两周,你隐约记得之前做过一个关于"标签系统"的架构决策,但忘了具体选了哪个方案。你想让 Claude 帮你翻出那条记录。


7.1 Memory Search 是什么?

Memory Search 是 Claude-Mem 最核心的 Skill —— 让 Claude 能够用自然语言搜索你的开发历史

在第 6 期中,我们学习了三层检索的原理。Memory Search 就是那三层检索的实际接口。


7.2 四个 MCP 工具详解

工具 1:search — 索引搜索

在记忆库中执行全文 + 语义混合搜索,返回轻量的索引列表。

search(
  query: "标签系统",        // 搜索关键词(必填)
  type: "decision",        // 按 Observation 类型过滤(可选)
  date_from: "2026-04-01", // 起始日期过滤(可选)
  date_to: "2026-04-21",   // 截止日期过滤(可选)
  project: "my-blog",      // 按项目过滤(可选)
  limit: 10                // 返回条数(可选,默认 10)
)

返回结果:每条约 50-100 tokens

[
  {"id": 23, "title": "选择多对多标签方案", "type": "decision", "date": "2026-04-15"},
  {"id": 31, "title": "实现标签 CRUD API", "type": "feature", "date": "2026-04-16"}
]

工具 2:timeline — 时间线上下文

查看某条 Observation 前后的事件链,理解因果关系。

timeline(
  observation_id: 23,  // 围绕哪条 Observation(可选)
  query: "标签"        // 或用关键词查时间线(可选)
)

返回结果:按时间排列的相关事件

[
  {"id": 21, "title": "调研 Prisma 多对多关系", "type": "discovery"},
  {"id": 22, "title": "对比隐式 vs 显式中间表", "type": "discovery"},
  {"id": 23, "title": "选择多对多标签方案", "type": "decision"},
  {"id": 24, "title": "创建 Tag 和 PostTag 模型", "type": "feature"}
]

工具 3:get_observations — 获取完整详情

用 ID 批量获取 Observation 的全部内容。

get_observations(
  ids: [22, 23]  // Observation ID 数组(必填)
)

返回结果:每条约 500-1,000 tokens

[
  {
    "id": 22,
    "title": "对比隐式 vs 显式中间表",
    "type": "discovery",
    "narrative": "开发者对比了 Prisma 的两种多对多实现方式...",
    "facts": [
      "隐式中间表由 Prisma 自动管理,语法更简洁",
      "显式中间表支持在关联上添加额外字段(如 sort_order)",
      "博客的标签场景不需要额外字段"
    ],
    "concepts": ["Prisma", "多对多关系", "中间表"]
  },
  {
    "id": 23,
    "title": "选择多对多标签方案",
    "type": "decision",
    "narrative": "基于调研结果,开发者决定使用 Prisma 隐式多对多...",
    "facts": [
      "选择隐式多对多(无需手动建中间表)",
      "在 Post 模型中添加 tags Tag[] 字段",
      "在 Tag 模型中添加 posts Post[] 字段"
    ]
  }
]

工具 4:list_projects — 列出所有项目

list_projects()

返回所有记录过的项目名称列表。当你有多个项目时,可以用 project 参数限定搜索范围。


7.3 搜索语法与高级技巧

按类型过滤

# 只看架构决策
search(query="数据库", type="decision")

# 只看 Bug 修复
search(query="API", type="bugfix")

# 只看新发现
search(query="Prisma", type="discovery")

6 种可用类型decisionbugfixfeaturerefactordiscoverychange

按文件过滤

搜索涉及特定文件的 Observations:

# 搜索和 auth.ts 相关的所有记录
search(query="file:auth.ts")

# 搜索和 prisma schema 相关的决策
search(query="file:schema.prisma", type="decision")

按时间过滤

# 只搜索最近一周的记录
search(query="Bug", date_from="2026-04-14")

# 搜索某个时间段
search(query="部署", date_from="2026-04-01", date_to="2026-04-10")

组合搜索(高级)

# 上周关于数据库的架构决策
search(
  query="数据库 Schema",
  type="decision",
  date_from="2026-04-14",
  project="my-blog"
)

7.4 使用自然语言搜索

在实际使用中,你不需要记住这些语法。直接用自然语言问 Claude:

你:我们之前为什么选择了隐式多对多来做标签?

Claude 会自动将你的问题翻译成合适的搜索调用:

graph TD
    A["你的问题:
我们为什么选隐式多对多做标签?"] --> B["Claude 分析意图"] B --> C["search(query='标签 多对多', type='decision')"] C --> D["找到 id #23"] D --> E["get_observations(ids=[22, 23])"] E --> F["Claude 综合 narrative + facts"] F --> G["回答: 因为博客标签不需要
额外字段,隐式方案更简洁"] style A fill:#6366f1,color:#fff style G fill:#10b981,color:#fff

7.5 搜索结果的引用

Claude-Mem 支持 Observation ID 引用。当 Claude 基于记忆回答问题时,它会标注来源:

Claude:根据 Observation #23,我们选择了 Prisma 隐式多对多方案...

你可以在 Web UI 中查看完整记录:
http://localhost:37777/api/observation/23

这种可追溯性让你能验证 Claude 的回答是否准确 —— 它不是在编造,是在引用真实的历史记录。


实操练习

  1. 确保博客项目已经有至少 2 个会话的 Observations
  2. 在新会话中,用自然语言搜索:
    • "我们做过哪些架构决策?"
    • "上次修复了什么 Bug?"
    • "和数据库相关的操作有哪些?"
  3. 观察 Claude 是如何调用搜索工具的
  4. 在 Web UI 中通过 ID 验证搜索结果

下期预告

Memory Search 解决了"搜记忆"的问题。但如果 Claude 需要理解你的代码结构呢?读 500 行文件太浪费 Token。下一期介绍 Smart Explore —— 用 AST 解析精准裁剪代码,Token 节省 20 倍。

➡️ 第 8 期:Skill 2 — Smart Explore 智能代码探索