# Knowledge Fetch

> 当用户询问此前的决策、经验、偏好或尝试（「之前怎么处理的」「recall 一下」「召回」），或继续工作前必须召回项目与用户历史知识时使用。

- Skill: `cuipengfei/knowledge-fetch` (Agent Skill)
- Install (CLI): `npx skillmds@latest add cuipengfei/knowledge-fetch`
- Raw SKILL.md: https://api.skillmd.com/api/skills/cuipengfei/knowledge-fetch/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: cuipengfei (https://skillmd.com/u/cuipengfei)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/cuipengfei/knowledge-fetch

---


# 会话召回技能

从四层存储查询历史知识，并注入当前会话上下文。

## 触发场景

### 场景 1: 用户感到沮丧

用户可能**感到烦躁**，因为：

- 你似乎忘记了之前学过的东西
- 你在重复之前被纠正过的错误
- 你在走之前已证明行不通的方向
- 你在忽略用户已表达过的偏好

**处理方式**: 开头一句事实陈述（「我漏掉了之前的记录」），直接给召回结果。不道歉，不铺垫。

### 场景 2: 常规查询

用户只是想查询历史记录：

- "有没有关于 X 的记录？"
- "之前怎么处理的？"
- "我的偏好是什么？"

**处理方式**: 直接展示召回结果，不假设用户沮丧。

### 场景 3: 主动刷新

用户调用 `/recall` 无参数：

- 对话已持续较长时间
- 想刷新上下文中的知识

**处理方式**: 展示所有四层的简洁摘要。

## 四层数据源

与 auto-extract 的存储层一一对应：用户配置（跨项目、自动加载）、项目根配置（项目级）、子模块配置（就近）、情境记忆（按需查询）。完整定义见 auto-extract skill。

### 硬规则：单条知识唯一归属

- 同一条知识不应同时存在于多层。
- 召回时如果多层都命中同一主题，视为存储不一致：必须显式标注来源并提醒清理，不要静默选择其一。

## 第零步：探测可用后端（MANDATORY）

**查询前必须先探测，不假设任何特定文件、工具或服务存在。**

### 配置文件层

扫描三个范围的 `CLAUDE.md`、`AGENTS.md`：

- 用户配置：用户级 agent 配置目录下
- 项目根配置：项目根目录及其配置子目录下
- 子模块配置：项目子目录中已存在的（排除根目录、node_modules 等）；有相关参数（如 `/recall oc-tweaks 发布`）时优先语义最近的子模块

检测到哪个查哪个，不存在就跳过。

**一律当场重读文件**，不用会话开头注入的旧副本——文件可能在会话开始后被改过。

### 情境记忆

按优先级探测：

1. **宿主提供的记忆工具**: 能按关键词检索知识条目的工具 → 用它的搜索接口
2. **宿主提供的记忆目录**: agent 自己会读取的 memory 目录（含 `*.md` 文件）→ 读文件匹配

都没有 → 说明「情境记忆层当前环境不可用」，不报错。

**原则**: 只用宿主自己会读的记忆系统。不要求用户安装任何额外依赖。

## 执行步骤

### 第一步：理解上下文

分析用户为什么调用 `/recall`：

1. 判断触发场景（沮丧/常规/刷新）
2. 提取关键词（用户参数 > 对话上下文）
3. 确定查询范围

如果用户提供了参数（如 `/recall 代码风格`），用它们作为主要关键词。

如果参数类似"我不知道/你看看/refresh"，视为场景 3（主动刷新）：四层都查，每层展示最相关的 2-3 条。

### 第二步：查询配置文件层

对用户配置、项目根配置、子模块配置三个范围，各做：

1. 重读探测到的文件（可能有多个）
2. 按 section 标题匹配关键词
3. 提取相关段落

### 第三步：查询情境记忆

- **工具后端**: 用它的搜索接口，传入关键词。中英文都试；先宽后窄。
- **目录后端**: 读 memory 目录里的文件，按文件名和内容匹配。
- **都没有**: 明确说明这层不可用，不报错。

### 第四步：展示结果

按层级分组展示结果：

```markdown
## 召回结果

### 用户配置（来自 {探测到的文件名}）

找到 X 条相关内容：

- **[Section 标题]**: [相关内容摘要]

### 项目根配置（来自 {探测到的文件名}）

找到 X 条相关内容：

- **[Section 标题]**: [相关内容摘要]

### 子模块配置（来自 {探测到的文件名}）

找到 X 条相关内容：

- **[Section 标题]**: [相关内容摘要]

### 情境记忆（来自 {探测到的后端描述}）

找到 X 条相关记录：

- **[主题]**: [内容摘要]

---

**应用到当前情况**: 基于这些召回，我会...
```

如果同一主题在多层命中，视为存储不一致：必须显式标注来源并提醒清理。

## 查询策略

### 按主题查询

如果用户提供了主题（如 `/recall 代码风格`）：

- 配置文件层：各范围都搜中英文相关 section 标题；子模块配置优先语义最近的子模块
- 情境记忆：中英文关键词都试

### 无参数查询

如果没有提供主题：

- 从最近的对话中提取关键词
- 每层展示最相关的 2-3 条

### 所有层都查，展示按相关性压缩

主题查询和常规查询也必须查所有可用层——跳过任何一层，就无法发现跨层重复，唯一归属规则就落空了。展示时再压缩：强相关的层展开，弱相关的层只给一行摘要。只有用户明确要求快速查询时，才允许查到足够就停。

## 边界情况

### 没有找到结果

```markdown
我查询了四层数据源，但没有找到与 "[主题]" 相关的记录。

已搜索：

- 用户配置 - {文件名或"未检测到"} - 无匹配
- 项目根配置 - {文件名或"未检测到"} - 无匹配
- 子模块配置 - {文件名或"未检测到"} - 无匹配
- 情境记忆 - {后端描述或"不可用"} - 无匹配

可能原因：

- 这个话题还没有被学习过
- 尝试使用不同的关键词

你能告诉我具体是什么情况吗？
```

如果本次对话后来因此产生了新的纠正或经验，结束时用 auto-extract 存起来——否则下次还是查不到。

### 文件不存在

跳过该层并继续查询下一层，在结果中注明"未检测到"。

### 情境记忆后端不可用

```markdown
情境记忆：当前环境没有可用的记忆系统，只查了配置文件层。
```

### 子模块无配置文件

跳过子模块配置层，不报错。在结果中注明"无子模块配置"。

## 与 auto-extract 的一致性

学习时存到哪层，召回时就从哪层查。四层名字、定义、唯一归属规则两边一致；完整定义见 auto-extract skill。

**边界原则**:

- **用户配置** = 身份层 = 每个会话都需要知道
- **项目根/子模块配置** = 项目与模块的约定层
- **情境记忆** = 经验层 = 特定情境下需要召回
- **严格唯一**：同一知识只应存在于一层；召回发现多层命中时，视为不一致并提醒清理

