会话召回技能
从四层存储查询历史知识,并注入当前会话上下文。
触发场景
场景 1: 用户感到沮丧
用户可能感到烦躁,因为:
- 你似乎忘记了之前学过的东西
- 你在重复之前被纠正过的错误
- 你在走之前已证明行不通的方向
- 你在忽略用户已表达过的偏好
处理方式: 开头一句事实陈述(「我漏掉了之前的记录」),直接给召回结果。不道歉,不铺垫。
场景 2: 常规查询
用户只是想查询历史记录:
- "有没有关于 X 的记录?"
- "之前怎么处理的?"
- "我的偏好是什么?"
处理方式: 直接展示召回结果,不假设用户沮丧。
场景 3: 主动刷新
用户调用 /recall 无参数:
- 对话已持续较长时间
- 想刷新上下文中的知识
处理方式: 展示所有四层的简洁摘要。
四层数据源
与 auto-extract 的存储层一一对应:用户配置(跨项目、自动加载)、项目根配置(项目级)、子模块配置(就近)、情境记忆(按需查询)。完整定义见 auto-extract skill。
硬规则:单条知识唯一归属
- 同一条知识不应同时存在于多层。
- 召回时如果多层都命中同一主题,视为存储不一致:必须显式标注来源并提醒清理,不要静默选择其一。
第零步:探测可用后端(MANDATORY)
查询前必须先探测,不假设任何特定文件、工具或服务存在。
配置文件层
扫描三个范围的 CLAUDE.md、AGENTS.md:
- 用户配置:用户级 agent 配置目录下
- 项目根配置:项目根目录及其配置子目录下
- 子模块配置:项目子目录中已存在的(排除根目录、node_modules 等);有相关参数(如
/recall oc-tweaks 发布)时优先语义最近的子模块
检测到哪个查哪个,不存在就跳过。
一律当场重读文件,不用会话开头注入的旧副本——文件可能在会话开始后被改过。
情境记忆
按优先级探测:
- 宿主提供的记忆工具: 能按关键词检索知识条目的工具 → 用它的搜索接口
- 宿主提供的记忆目录: agent 自己会读取的 memory 目录(含
*.md文件)→ 读文件匹配
都没有 → 说明「情境记忆层当前环境不可用」,不报错。
原则: 只用宿主自己会读的记忆系统。不要求用户安装任何额外依赖。
执行步骤
第一步:理解上下文
分析用户为什么调用 /recall:
- 判断触发场景(沮丧/常规/刷新)
- 提取关键词(用户参数 > 对话上下文)
- 确定查询范围
如果用户提供了参数(如 /recall 代码风格),用它们作为主要关键词。
如果参数类似"我不知道/你看看/refresh",视为场景 3(主动刷新):四层都查,每层展示最相关的 2-3 条。
第二步:查询配置文件层
对用户配置、项目根配置、子模块配置三个范围,各做:
- 重读探测到的文件(可能有多个)
- 按 section 标题匹配关键词
- 提取相关段落
第三步:查询情境记忆
- 工具后端: 用它的搜索接口,传入关键词。中英文都试;先宽后窄。
- 目录后端: 读 memory 目录里的文件,按文件名和内容匹配。
- 都没有: 明确说明这层不可用,不报错。
第四步:展示结果
按层级分组展示结果:
## 召回结果
### 用户配置(来自 {探测到的文件名})
找到 X 条相关内容:
- **[Section 标题]**: [相关内容摘要]
### 项目根配置(来自 {探测到的文件名})
找到 X 条相关内容:
- **[Section 标题]**: [相关内容摘要]
### 子模块配置(来自 {探测到的文件名})
找到 X 条相关内容:
- **[Section 标题]**: [相关内容摘要]
### 情境记忆(来自 {探测到的后端描述})
找到 X 条相关记录:
- **[主题]**: [内容摘要]
---
**应用到当前情况**: 基于这些召回,我会...
如果同一主题在多层命中,视为存储不一致:必须显式标注来源并提醒清理。
查询策略
按主题查询
如果用户提供了主题(如 /recall 代码风格):
- 配置文件层:各范围都搜中英文相关 section 标题;子模块配置优先语义最近的子模块
- 情境记忆:中英文关键词都试
无参数查询
如果没有提供主题:
- 从最近的对话中提取关键词
- 每层展示最相关的 2-3 条
所有层都查,展示按相关性压缩
主题查询和常规查询也必须查所有可用层——跳过任何一层,就无法发现跨层重复,唯一归属规则就落空了。展示时再压缩:强相关的层展开,弱相关的层只给一行摘要。只有用户明确要求快速查询时,才允许查到足够就停。
边界情况
没有找到结果
我查询了四层数据源,但没有找到与 "[主题]" 相关的记录。
已搜索:
- 用户配置 - {文件名或"未检测到"} - 无匹配
- 项目根配置 - {文件名或"未检测到"} - 无匹配
- 子模块配置 - {文件名或"未检测到"} - 无匹配
- 情境记忆 - {后端描述或"不可用"} - 无匹配
可能原因:
- 这个话题还没有被学习过
- 尝试使用不同的关键词
你能告诉我具体是什么情况吗?
如果本次对话后来因此产生了新的纠正或经验,结束时用 auto-extract 存起来——否则下次还是查不到。
文件不存在
跳过该层并继续查询下一层,在结果中注明"未检测到"。
情境记忆后端不可用
情境记忆:当前环境没有可用的记忆系统,只查了配置文件层。
子模块无配置文件
跳过子模块配置层,不报错。在结果中注明"无子模块配置"。
与 auto-extract 的一致性
学习时存到哪层,召回时就从哪层查。四层名字、定义、唯一归属规则两边一致;完整定义见 auto-extract skill。
边界原则:
- 用户配置 = 身份层 = 每个会话都需要知道
- 项目根/子模块配置 = 项目与模块的约定层
- 情境记忆 = 经验层 = 特定情境下需要召回
- 严格唯一:同一知识只应存在于一层;召回发现多层命中时,视为不一致并提醒清理