# Deep Research

> 基于双图架构（OG + KG）的迭代式深度研究，用于复杂主题的多来源调研、证据交叉核验与研究写作。维护两张并行的数据结构——提纲图（OG）记录章节骨架与覆盖度，知识图（KG）存储实体关系三元组；通过缺口检测器自动识别待补充的知识空白，驱动精准搜索与迭代探索，直到覆盖度达标或轮次上限；最终按 OG 拓扑顺序逐章写作，每章只注入该章的证据，避免无关干扰。适用于技术或产品选型、行业与竞品分析、政策研究、公司尽调、专题报告等需要结构化知识积累、多轮迭代收敛、以及大量交叉证据的复杂研究课题；当用户需要拆解研究问题、使用最新资料、比较不同来源或观点、解释证据强弱与冲突，并最终沉淀为研究结论、HTML、Word、PPT、PDF、表格时使用。

- Skill: `zxbdzh/deep-research` (Agent Skill, multi-file: 10 files)
- Install (CLI): `npx skillmds@latest add zxbdzh/deep-research`
- Raw SKILL.md: https://api.skillmd.com/api/skills/zxbdzh/deep-research/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: zxbdzh (https://skillmd.com/u/zxbdzh)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/zxbdzh/deep-research

---


# 深度研究（双图版 / DualGraph）

把研究过程变成**双图协同的知识构建**：提纲图（Outline Graph，OG）负责"要写什么"，知识图（Knowledge Graph，KG）负责"已知道什么"；两者之间的缺口驱动每一轮搜索。先积累结构化知识，再以证据约束写作。

默认按以下顺序工作：

- 先从研究问题生成 OG（4-7 章节的骨架）
- 再循环：缺口检测 → 精准搜索 → 抓取全文 → 提炼摘要+三元组 → 更新 OG 引用 + KG 节点
- 直到各章节平均覆盖度 ≥ 0.65 或达到 15 轮上限
- 最后按 OG 拓扑顺序逐章写作，每章精准注入对应证据

> **依赖与分流**
>
> - 当前环境有 `search` 和 `url_fetch` 时，优先用它们完成检索与正文抓取。
> - 需要处理动态网页、JavaScript 页面、搜索摘要不足或必须核对原网页最新内容时，先阅读 `skills/browser/SKILL.md`，再使用 browser。
> - 先阅读 `references/deliverable-routing.md`，判断最终交付属于聊天内结论、HTML，还是需要切换到 `docx / pptx / pdf / xlsx / wps` 等现有 skill。
> - 知识缺口的检测规则详见 `references/gap-detection.md`。
> - 来源优先级和场景化检索策略详见 `references/source-priority.md`。

## 双图数据结构与沉淀物

正式任务默认沉淀以下研究中间件：

- `og.md`：提纲图——章节列表、各章节描述、引用 ID 列表、覆盖度分数
- `kg.md`：知识图——实体节点与实体关系三元组
- `evidence-bank.md`：证据库——所有已抓取的页面摘要与三元组（按 ID 索引）

按最终交付路径，再补充以下文件：

- HTML：按任务语义命名的 `xxx.html` 或 `report.html`
- 通用 Word / PPT / PDF / 表格：研究完成后切换到对应 skill

开始正式研究任务时，优先读取并复用以下模板：

- `assets/og-template.md`
- `assets/kg-template.md`
- `assets/evidence-bank-template.md`

小任务或用户只要聊天内结论时，可以不落盘，但仍要遵守同样的证据标准。

## 覆盖度计算规则

章节覆盖度（coverage_score）使用指数衰减公式：

```
coverage_score = 1 - 0.7^n
```

其中 `n` 为该章节绑定的引用数（evidence_id 条数）：

| 引用数 n | coverage_score |
|----------|----------------|
| 0        | 0.00           |
| 1        | 0.30           |
| 2        | 0.51           |
| 3        | 0.66           |
| 4        | 0.76           |
| 5        | 0.83           |

**终止条件**：所有叶节点的平均 coverage_score ≥ **0.65**，且已完成至少 3 轮迭代。

每轮更新覆盖度时，重新计算每个章节节点的 `coverage_score` 并写入 `og.md`。

## 工作流

### 第 0 步：交付路径分流

进入本技能后，先阅读 `references/deliverable-routing.md`，再判断最终交付属于哪一类：

- **聊天内结论 / 无文件路径**：用户只要研究结论、对比、建议时，直接在聊天内交付，不强制生成文件。
- **HTML 路径**：只有当用户明确要求网页阅读稿、HTML 最终稿或浏览器预览稿时，才继续留在本技能内生成 HTML。
- **外部包装 skill 路径**：如果最终交付是普通 Word 报告、PPT、PDF、表格或 金山云文档，先在本技能中完成研究与内容整理，再切换到对应 skill 做最终包装。

### 第 1 步：界定研究任务

如果用户目标还不清楚，最多补 3 个关键问题，优先问：

- 最终要解决什么问题
- 输出更偏"决策报告"还是"专题分析"
- 是否限定时间、地区、行业、对象、语言或来源类型

如果用户已经讲清楚，就直接进入下一步，不要为了提问而提问。

### 第 2 步：初始化双图

**2a. 生成初始提纲**

根据研究问题，生成包含 **4-7 个章节** 的结构化提纲，每个章节需包含：
- 标题（清晰简短）
- 描述（本章节应覆盖的具体内容和关键点）

章节应覆盖研究问题的核心方面，典型结构为：背景与现状 → 核心机制/方法 → 实验/评估/数据 → 挑战与局限 → 未来展望。根据具体任务调整。

**2b. 写入初始文件**

用 `file(brief=..., action=write, path=og.md, content=...)` 创建提纲图，参照 `assets/og-template.md` 格式。每个章节初始覆盖度为 0.00，引用列表为空。

用 `file(brief=..., action=write, path=kg.md, content=...)` 创建空的知识图。

用 `file(brief=..., action=write, path=evidence-bank.md, content=...)` 创建空的证据库。

### 第 3 步：迭代探索循环（最多 15 轮）

每轮包含以下子步骤，**全部完成后**再计算终止条件：

#### 3a. 检测知识缺口

先阅读 `references/gap-detection.md` 了解完整缺口类型。核心检测逻辑：

1. **弱覆盖章节（WEAK_SECTION）** ← 最高优先级
   - 读取 `og.md`，找出 `coverage_score < 0.65` 的叶节点
   - 覆盖度越低，优先级越高（`priority = 1.0 - coverage_score`）

2. **缺失实体（MISSING_ENTITY）**
   - 对每个叶节点，提取标题和描述中的关键术语（引号内内容、连续大写词等）
   - 读取 `kg.md`，检查这些术语是否作为节点存在
   - 未出现在 KG 中的术语 → 生成 MISSING_ENTITY 缺口（priority=0.8）

3. **孤立实体（ISOLATED_ENTITY）**
   - 读取 `kg.md`，找出没有任何关系边的实体节点
   - 这些节点表明知识存在"孤岛"（priority=0.7）

4. **稀疏区域（SPARSE_REGION）**
   - 找出关系边数 < 2 的非孤立实体节点（priority=0.5）

5. **知识孤岛（KNOWLEDGE_ISLAND）**
   - 若 KG 中存在明显互不连通的子图群组（priority=0.6）

将所有缺口按优先级排序，取前 **4 个**进入下一步。若无任何缺口，提前终止循环。

#### 3b. 生成搜索查询

根据当前前 4 个知识缺口，结合研究问题和 KG 现有知识，生成 **3-5 条**精准搜索查询：

- 每条查询针对一个具体缺口
- 查询要具体，包含关键实体名或术语（专有名词、英文缩写、模型/方法名**保留原文**）
- 不同查询覆盖不同缺口，避免重复
- 中文查询时，最后 1 条提供英文变体

#### 3c. 搜索与抓取

对每条查询依次执行：

**3c-i. 搜索**

使用 `search` 工具。类型选择：
- 学术论文、白皮书、政府/行业报告：`type="research"`
- 官网说明、产品文档、事实性资料：`type="info"`
- 近期动态、时效性事件、发布消息：`type="news"`
- 公开统计、数据源、榜单、数据库：`type="data"`

**3c-ii. URL 过滤**

对搜索结果中的 URL 进行过滤，**跳过**以下类型（详见本文档末尾的 URL 过滤规则）：
- PDF/PPT/DOC 等不可爬取文件
- YouTube、Twitter/X、Facebook、Instagram、TikTok、Reddit
- 中文字典/古诗词类网站（zdic、汉典等）
- 视频平台（B站视频页、优酷、爱奇艺等）
- 电商平台（淘宝、京东商品页等）

arxiv 链接统一转换为 HTML 格式（`/pdf/` 或 `/abs/` → `/html/`）。

每条查询最多取 **3 个**不重复 URL 进入下一步。已处理过的 URL 直接跳过。

**3c-iii. 抓取全文**

用 `url_fetch` 抓取每个 URL 的完整正文。

若 `url_fetch` 失败或内容明显不完整（< 200 字符）：
- 检查是否是 JavaScript 渲染页面
- 若是，切换到 `browser` 工具（先阅读 `skills/browser/SKILL.md`）

必须使用 browser 的场景：
- `url_fetch` 拿不到有效正文
- 页面强依赖 JavaScript
- 搜索结果与原网页发布时间、标题、数据不一致
- 需要翻页、查看隐藏内容

**3c-iv. 提炼摘要 + 三元组**

对每个成功抓取的页面内容：

1. **摘要**：针对当前搜索查询，从页面提炼关键信息（200 字以内，保留数字、事实、关键术语）。若页面与查询完全无关，摘要写"无相关内容"并跳过该页面。

2. **三元组**：从内容中抽取实体-关系-实体三元组（最多 15 条，只抽取明确表达的事实），格式为 `(实体A, 关系动词, 实体B)`。

#### 3d. 更新双图与证据库

对每条有效证据（摘要不为"无相关内容"的）：

**更新 evidence-bank.md**：
- 分配唯一 ID（如 `ev_001`、`ev_002`）
- 记录 URL、标题、查询词、摘要、三元组
- 用 `file(brief=..., action=append, ...)` 追加到 `evidence-bank.md`

**更新 kg.md**：
- 将三元组中的实体加入 KG（节点去重，同名实体合并）
- 将关系边加入 KG（去重：相同 head-relation-tail 不重复）
- 用 `file(brief=..., action=write, ...)` 更新 `kg.md`

**更新 og.md（引用绑定）**：
1. 将证据摘要与各章节标题+描述对比，判断最匹配的章节
2. 匹配逻辑（按优先级）：
   - 摘要中出现章节标题的关键词（英文词交集 or 中文 3-gram 命中）
   - 若无明确匹配，找最相关的章节（语义最近）
3. 将证据 ID 加入匹配章节的引用列表（`citations`）
4. 重新计算该章节的 `coverage_score = 1 - 0.7^n`（n = 引用数）

**自动扩展提纲（可选）**：
- 若证据揭示一个明确重要但当前 OG 中完全没有覆盖的新话题，且 OG 总章节数 < 8：
  - 在最相关的章节下新增子章节（或新增顶级章节）
  - 将当前证据的 ID 绑定到新章节

更新完成后，用 `file(brief=..., action=write, ...)` 将最新 `og.md` 和 `kg.md` 写回。

#### 3e. 终止判断

每轮迭代结束后检查：

1. 计算所有叶节点的平均 coverage_score
2. 若 **平均 coverage_score ≥ 0.65 且已完成至少 3 轮**：终止循环
3. 若 **已达到 15 轮**：强制终止
4. 若 **本轮无知识缺口**（3a 检测为空）：提前终止

满足任一条件即可终止，进入写作阶段。

### 第 4 步：关键判断定向核验

以下内容必须优先做二次核验：

- 精确数字、增长率、准确率、市场份额、效率提升
- "行业第一""主流""广泛采用"等带比较含义的表述
- 带时间敏感性的政策、产品版本、组织数量、融资或财务数据
- 明显会影响结论方向的争议点

若无法核验：删除该数字，或改写成保守的定性判断，明确标注"待验证"或"无法确认"。

### 第 5 步：分章节写作

按 OG 的 **BFS（宽度优先）层序** 逐章撰写：

1. 从 `og.md` 读取章节顺序（根节点 → 子节点，按层次展开）
2. 跳过虚拟根节点，只写有内容的章节
3. 对每个章节：

   **a. 注入证据（精准上下文）**：
   - 从 `evidence-bank.md` 中读取该章节 `citations` 列表对应的所有证据
   - 只使用这些证据写作，不引入其他章节的证据（避免跨章干扰）

   **b. 维护 running_context（跨章连贯性）**：
   - 每完成一章，提取该章的前 120 字作为摘要
   - 将摘要格式为 `[章节标题]: 摘要内容...` 追加到 running_context
   - running_context 保留最近 600 字，防止无限膨胀
   - 下一章写作时，将 running_context 作为上下文注入

   **c. 写作要求**：
   - 深入分析，不要泛泛而谈
   - 有条理地展开（可使用子标题、列表、表格等）
   - 与前文保持逻辑连贯，不重复已写内容
   - 正文引用时在句末或关键断点处标注编号，如 `[1]`、`[2]`；编号与 evidence-bank.md 中的编号保持一致
   - 若某章节引用为空，基于通用知识撰写，并注明"内容待补充"
   - 标题级别：一级章节用 `##`，二级用 `###`，以此类推

4. 所有章节写完后，整理 **参考文献列表**：
   - 从 `evidence-bank.md` 中提取正文中实际引用过的所有条目
   - 按引用顺序编号，格式为：`[n] 作者/机构. 标题. 年份. URL`
   - 若缺作者、年份，可留空，但 URL 和标题必须有
   - 格式由用户指定决定：默认使用编号引用；若用户指定 APA 或 GB/T 7714，则按对应格式统一整理
   - 将参考文献列表追加到报告末尾（`## 参考文献` 章节）

5. 拼接所有章节与参考文献列表，补充报告标题和研究问题说明，生成完整 Markdown 报告

### 第 6 步：按交付类型输出

**聊天内结论**：直接在对话中呈现完整报告内容。

**落盘输出**：
- 先写入 `evidence-bank.md`（最终版本）
- 再写入 `og.md` 和 `kg.md`（最终状态）
- 若 HTML 路径：先阅读 `references/html-report.md`，再生成 `report.html`
- 若其他格式：研究完成后切换到对应 skill

提交前必须阅读 `references/final-gate.md`，通过质量检查后再交付。

## 核心原则

1. **双图驱动，缺口导向**：不是机械地搜索，而是让 OG-KG 缺口告诉你下一步搜什么。
2. **原始来源优先**：优先官方文档、论文、标准、财报、监管披露、原始数据。
3. **证据精准注入**：每个章节只用该章节的引用证据写作，不混入其他章节证据。
4. **覆盖度可量化**：用 `1 - 0.7^n` 公式跟踪每章节的知识充盈程度。
5. **关键结论可回溯**：正文里的每个重要判断都要能在 `evidence-bank.md` 里找到支撑。
6. **宁可少写，不要补空话**：证据薄弱就缩短该节，不要用行业套话填篇幅。

## URL 过滤规则

处理搜索结果时，**跳过**以下模式的 URL：

**文件类型**：`.pdf`、`.ppt`、`.pptx`、`.doc`、`.docx`、`.xls`、`.xlsx`

**社交/短视频平台**：`youtube.com`、`youtu.be`、`twitter.com`、`x.com`、`facebook.com`、`instagram.com`、`tiktok.com`、`reddit.com/r/`

**中文字典/古诗词类**：`zdic.net/hans/`、`zdic.net/ci/`、`hanyuguoxue.com/zidian/`、`chagushici.com/zidian/`、`hanziyuan.net`、`hanyu.baidu.com/item/`、`hanyucidian.org`

**视频/直播平台**：`iqiyi.com`、`youku.com`、`mgtv.com`、`sohu.com/v/`、`v.qq.com`、`bilibili.com/video/`

**电商/购物平台**：`amazon.com`、`amazon.co.uk`、`jd.com/product/`、`taobao.com/item`、`tmall.com`、`pinduoduo.com`

**百度百科短词条**：`baike.baidu.com/item/X` 中若词条名 X 为 1-2 个汉字则跳过

**arXiv 格式转换**：`arxiv.org/pdf/XXXX` 或 `arxiv.org/abs/XXXX` → 统一改为 `arxiv.org/html/XXXX`，去掉 `.pdf` 后缀

## 反空话约束

以下写法默认视为低质量，除非 evidence-bank.md 里有明确证据：

- "近年来得到了广泛关注和应用"
- "某头部机构 / 某业内公司内部测试显示"
- "显著提升效率""大幅降低成本""效果显著优于"
- "未来将全面普及""预计将达到"

对这类句子，优先改成以下三类表达：

- **事实句**：谁在什么时候发布了什么、做了什么
- **比较句**：不同来源在哪些口径上得出不同结论
- **限定句**：这个判断只适用于什么场景、时间窗口或样本范围

## 写作规则

- 主体段落优先使用"观点句 → 证据 → 分析 → 过渡"的结构
- 不要把文献逐条罗列；要按主题、方法、结论或争议组织
- 任何精确数字都要能回溯到 `evidence-bank.md` 中的来源；如果缺出处，就删掉
- 不能把搜索摘要、营销文案或媒体转述当作最终证据
- 如果一个小节只有共识性常识，没有新的研究发现，就缩短或合并
- 如果用户研究的是行业落地，不要把主体篇幅浪费在通用技术原理介绍上
- 对关键来源说明其性质：原始研究、综述、官方说明、行业报告、媒体报道等
- 如果用户没有指定格式，默认使用可回查的编号引用；若指定 APA、GB/T 7714，再统一整理
- 章节有 `citations` 为空时，注明"本章节证据待补充"，不要编造数据

## HTML 交付（仅显式要求时）

只有当用户明确要求 HTML 最终稿或网页预览稿时，才输出 `report.html`：

- 先阅读 `references/html-report.md`
- 再阅读 `references/final-gate.md`
- HTML 内正文引用使用编号锚点，参考文献区列出所有 evidence-bank.md 中引用的来源

## 质量门槛

提交前至少自检以下问题：

- 是否存在无 evidence-bank.md 支撑的关键结论
- 是否存在无出处的精确数字或排名
- 是否过度依赖单一网站或单一立场
- 是否核对了关键数字、日期、名称、版本
- 是否单独说明了争议点与不确定性
- 是否把搜索摘要误当成最终证据
- 是否把"趋势判断"写成了"已证实事实"
- OG 各章节是否都至少有一条引用（无引用章节需说明）
- KG 中是否有明显孤立节点（孤立实体说明知识存在空白）
- 若额外生成了 `report.html`，其正文引用是否都能跳转到参考文献条目

提交前必须再阅读一次 `references/final-gate.md`。若未通过，先重写再交付。

