3.8 记忆预取
记忆预取是 Claude Code 在模型生成响应的同时,并行搜索相关记忆文件的优化机制。它的核心价值是隐藏延迟——搜索记忆文件需要磁盘 I/O,与其等模型响应完再搜索(串行),不如在模型思考的同时就开始搜索(并行)。
startRelevantMemoryPrefetch()(src/utils/attachments.ts)在每次 query 循环迭代入口启动:
typescript
// src/query.ts — 使用 using 关键字确保 dispose
using pendingMemoryPrefetch = startRelevantMemoryPrefetch(
state.messages, state.toolUseContext,
)工作流程:
- 启动条件:
isAutoMemoryEnabled()为 true 且相关 feature flag 活跃 - 并行执行:在
callModel()流式调用期间并行运行,搜索本项目的自动记忆目录~/.claude/projects/<项目路径转义>/memory/(同一 git 仓库的所有 worktree 共享一份,可被 settings/env 覆盖)中与当前对话相关的记忆文件 - 单次消费:通过
settledAt守卫确保每轮只消费一次。如果 query 循环因 PTL 恢复而重试,预取结果不会被重复注入 - 去重:
readFileState追踪已读文件,防止同一个记忆文件在同一会话中被多次注入 - 注入时机:预取结果作为附件消息(
AttachmentMessage)在工具执行之后注入,出现在下一轮 API 调用的上下文中 - 资源清理:
using语法确保在 generator 退出(正常/异常/中断)时自动调用[Symbol.dispose](),发送遥测数据并清理资源