深度研究技能Skill research

这个技能用于深度网络研究,采用图思考方法论进行结构化探索,构建知识图谱并存储于SQLite数据库。通过图操作(如合并、遍历、矛盾检测和关系推断)来合成洞察。关键词:深度研究、图思考、知识图谱、数据库、网络研究、智能搜索。

AI智能体 0 次安装 0 次浏览 更新于 3/9/2026

name: research description: 深度网络研究,具有相关性评分和知识图谱存储。在研究主题、公司、人员或概念时使用。执行图思考风格的探索,具有并行分支、相关性评分和合成主题报告。

深度研究技能

一个图思考研究系统,通过结构化探索构建知识图谱,将所有发现存储在SQLite中,并使用图操作(合并、遍历、矛盾检测、关系推断)来合成洞察。

关键要求

您必须对所有操作使用数据库。 每个发现、每个URL、每个搜索查询、每个关系都必须被记录。数据库不是可选的——它是该方法论的核心。如果您跳过数据库操作,研究无效。

您必须执行图操作。 在每个探索阶段后,您必须运行合并、关系推断和矛盾检测。这些不是建议——它们是必需的步骤。

您必须迭代工作。 不要尝试收集所有信息然后合成。以循环方式工作:探索 → 存储 → 分析图 → 识别差距 → 探索差距 → 重复。

参数

解析用户输入以提取:

  • topic: 研究主题(除非–list或–continue,否则必需)
  • --depth N: 探索深度(默认:2)
  • --branches N: 并行探索的方面数(默认:5)
  • --continue "topic": 恢复先前的研究会话
  • --list: 显示所有保存的研究会话

数据库设置

在任何研究之前,初始化数据库。这是强制性的:

sqlite3 research.db < ~/.claude/skills/research/schema.sql 2>/dev/null || true

验证数据库存在并具有表:

sqlite3 research.db "SELECT name FROM sqlite_master WHERE type='table';"

如果表缺失,研究无法进行。


阶段 1: 会话初始化

1.1 创建会话

INSERT INTO sessions (topic, depth_remaining, branches)
VALUES ('{topic}', {depth}, {branches});

立即检索并存储会话ID:

SELECT last_insert_rowid();

存储此session_id。您将在每个后续数据库操作中使用它。

1.2 将主题分解为分支

将主题分解为{branches}个不同方面。对于每个方面,创建初始“线索”发现:

INSERT INTO findings (session_id, content, relevance_score, finding_type, branch_name, depth_level)
VALUES
  ({session_id}, 'BRANCH: {aspect_1_description}', 8, 'lead', '{aspect_1_name}', 0),
  ({session_id}, 'BRANCH: {aspect_2_description}', 8, 'lead', '{aspect_2_name}', 0),
  -- ... 对于所有分支
;

这为图提供了要探索的初始节点。


阶段 2: 探索

对于每个未探索的线索(finding_type=‘lead’ 且未被探索):

2.1 生成搜索查询

为线索创建聚焦搜索查询。在执行前记录:

INSERT INTO search_queries (session_id, query, branch_name, depth_level)
VALUES ({session_id}, '{query}', '{branch}', {current_depth});

2.2 执行搜索

python3 ~/.claude/skills/brave-search/brave.py web "{query}" --count 10 --extra-snippets

2.3 记录URL

对于结果中的每个URL,在获取前记录:

INSERT OR IGNORE INTO explored_urls (session_id, url, status)
VALUES ({session_id}, '{url}', 'pending');

2.4 获取和提取

对于有希望的URL(前3-5个),使用WebFetch获取内容。获取后,更新状态:

UPDATE explored_urls SET status = 'fetched' WHERE session_id = {session_id} AND url = '{url}';

如果获取失败:

UPDATE explored_urls SET status = 'failed' WHERE session_id = {session_id} AND url = '{url}';

2.5 创建发现

对于每个提取的离散信息片段,创建发现:

INSERT INTO findings (session_id, content, source_url, relevance_score, finding_type, branch_name, depth_level)
VALUES ({session_id}, '{content}', '{url}', {score}, '{type}', '{branch}', {depth});

评分标准(严格应用):

  • 9-10: 直接回答关键问题;新颖洞察;可操作
  • 7-8: 有用上下文;支持或挑战其他发现
  • 4-6: 间接相关;可能对完整性有用
  • 1-3: 几乎不相关;仅在没有更好选择时保留
  • 0: 离题;不插入

发现类型:

  • fact: 带有来源的可验证信息
  • lead: 需要进一步探索的有希望方向
  • question: 研究提出的未解决问题
  • theme: 跨多个来源观察到的重复模式
  • contradiction: 冲突信息(见阶段3.3)

2.6 更新搜索查询结果计数

UPDATE search_queries SET result_count = {count}
WHERE session_id = {session_id} AND query = '{query}';

阶段 3: 图操作

这些操作在每个探索周期后是强制性的。 不要跳过它们。

3.1 合并: 检测和合并相似发现

相似发现会碎片化图并降低洞察质量。您必须合并它们。

步骤 1: 识别候选

查询同一分支中可能重复的发现:

SELECT f1.id as id1, f2.id as id2, f1.content as content1, f2.content as content2
FROM findings f1
JOIN findings f2 ON f1.session_id = f2.session_id
  AND f1.branch_name = f2.branch_name
  AND f1.id < f2.id
WHERE f1.session_id = {session_id}
  AND f1.finding_type = f2.finding_type;

步骤 2: 评估相似性

对于每对,评估语义相似性。如果以下情况,应合并发现:

  • 它们以不同措辞陈述相同事实
  • 它们为相同主张引用相同来源
  • 一个是另一个的子集

步骤 3: 执行合并

当将发现B合并到发现A时(保留A):

-- 用合并内容和最佳评分更新A
UPDATE findings
SET content = '{merged_content}',
    relevance_score = MAX(relevance_score, {b_score}),
    source_url = COALESCE(source_url, '{b_url}')
WHERE id = {a_id};

-- 将所有关系从B转移到A
UPDATE relationships SET from_finding_id = {a_id} WHERE from_finding_id = {b_id};
UPDATE relationships SET to_finding_id = {a_id} WHERE to_finding_id = {b_id};

-- 转移实体链接
UPDATE finding_entities SET finding_id = {a_id} WHERE finding_id = {b_id};

-- 删除B
DELETE FROM findings WHERE id = {b_id};

步骤 4: 记录合并

为审计跟踪记录合并(添加到内容或创建合并日志表如果需要)。

3.2 关系推断: 构建图边

没有关系的发现是孤立节点。您必须连接它们。

关系类型:

  • supports: 发现A为发现B提供证据
  • contradicts: 发现A与发现B冲突
  • elaborates: 发现A提供关于发现B的额外细节
  • related_to: 发现A和B讨论相同子主题

步骤 1: 查询未连接发现

SELECT f.id, f.content, f.branch_name, f.finding_type
FROM findings f
WHERE f.session_id = {session_id}
  AND f.id NOT IN (SELECT from_finding_id FROM relationships)
  AND f.id NOT IN (SELECT to_finding_id FROM relationships)
  AND f.finding_type IN ('fact', 'theme');

步骤 2: 对于每个未连接发现,查找相关发现

SELECT id, content, branch_name FROM findings
WHERE session_id = {session_id}
  AND id != {current_id}
  AND finding_type IN ('fact', 'theme', 'lead');

步骤 3: 评估和创建关系

对于每个潜在对,确定是否存在关系及其类型。如果是:

INSERT INTO relationships (from_finding_id, to_finding_id, relationship_type)
VALUES ({from_id}, {to_id}, '{type}');

推断规则:

  • 如果发现A引用一项研究,发现B引用同一研究 → related_to
  • 如果发现A陈述X,发现B为X提供机制 → supports
  • 如果发现A说“X有效”,发现B说“X无效” → contradicts
  • 如果发现A是通用的,发现B是特定案例 → elaborates

3.3 矛盾检测

矛盾是高价值发现。它们表示不确定性、偏见或细微差别。

步骤 1: 查询潜在矛盾

SELECT f1.id, f1.content, f1.source_url, f2.id, f2.content, f2.source_url
FROM findings f1
JOIN findings f2 ON f1.session_id = f2.session_id AND f1.id < f2.id
WHERE f1.session_id = {session_id}
  AND f1.finding_type = 'fact'
  AND f2.finding_type = 'fact'
  AND f1.branch_name = f2.branch_name;

步骤 2: 评估每对

寻找:

  • 关于有效性的相反主张
  • 冲突的统计数据或数字
  • 来自相同证据的不同结论
  • 相互排斥的建议

步骤 3: 记录矛盾

-- 创建关系
INSERT INTO relationships (from_finding_id, to_finding_id, relationship_type)
VALUES ({id1}, {id2}, 'contradicts');

-- 创建矛盾发现
INSERT INTO findings (session_id, content, relevance_score, finding_type, branch_name, depth_level)
VALUES (
  {session_id},
  'CONTRADICTION: {description of conflict between findings}. Source 1: {url1}. Source 2: {url2}. Possible explanations: {analysis}',
  9,
  'contradiction',
  '{branch}',
  {depth}
);

矛盾评分9+,因为它们揭示重要细微差别。

3.4 实体提取和链接

实体支持跨会话知识和模式检测。

步骤 1: 从新发现中提取实体

对于每个新发现,识别命名实体:

  • 人员(研究人员、医生、案例研究中的患者)
  • 组织(医院、研究机构、公司)
  • 概念(特定治疗、机制、条件)
  • 技术(设备、药物、协议)

步骤 2: 创建或查找实体

-- 尝试插入(如果存在将静默失败,由于UNIQUE约束)
INSERT OR IGNORE INTO entities (name, entity_type) VALUES ('{name}', '{type}');

-- 获取实体ID
SELECT id FROM entities WHERE name = '{name}';

步骤 3: 链接发现到实体

INSERT OR IGNORE INTO finding_entities (finding_id, entity_id)
VALUES ({finding_id}, {entity_id});

阶段 4: 图遍历和差距分析

在图操作后,分析图结构以识别差距。

4.1 查找孤立集群

-- 没有关系的发现(孤立节点)
SELECT id, content, branch_name FROM findings
WHERE session_id = {session_id}
  AND id NOT IN (SELECT from_finding_id FROM relationships)
  AND id NOT IN (SELECT to_finding_id FROM relationships);

孤立节点表示未探索的连接。创建线索来调查它们。

4.2 查找弱支持主张

-- 高相关性发现,支持关系少
SELECT f.id, f.content, f.relevance_score, COUNT(r.id) as support_count
FROM findings f
LEFT JOIN relationships r ON r.to_finding_id = f.id AND r.relationship_type = 'supports'
WHERE f.session_id = {session_id} AND f.relevance_score >= 8
GROUP BY f.id
HAVING support_count < 2;

重要主张需要确证。创建线索以找到支持证据。

4.3 查找未解决问题

SELECT id, content FROM findings
WHERE session_id = {session_id} AND finding_type = 'question';

每个问题都是一个差距。按相关性评分优先。

4.4 识别未探索线索

SELECT f.id, f.content, f.branch_name
FROM findings f
LEFT JOIN search_queries sq ON sq.session_id = f.session_id
  AND sq.branch_name = f.branch_name
  AND sq.depth_level > f.depth_level
WHERE f.session_id = {session_id}
  AND f.finding_type = 'lead'
  AND f.relevance_score >= 7
  AND sq.id IS NULL;

这些是未跟进的线索。如果depth_remaining > 0,探索它们。

4.5 从差距创建新线索

对于每个识别的差距,创建线索发现:

INSERT INTO findings (session_id, content, relevance_score, finding_type, branch_name, depth_level)
VALUES ({session_id}, 'GAP: {description}', 8, 'lead', '{branch}', {depth});

阶段 5: 递归探索

如果depth_remaining > 0 且未探索线索存在:

5.1 递减深度

UPDATE sessions SET depth_remaining = depth_remaining - 1, updated_at = CURRENT_TIMESTAMP
WHERE id = {session_id};

5.2 选择要探索的线索

SELECT id, content, branch_name FROM findings
WHERE session_id = {session_id}
  AND finding_type = 'lead'
  AND relevance_score >= 7
ORDER BY relevance_score DESC
LIMIT {branches};

5.3 返回阶段 2

对于每个选定线索,以线索为搜索焦点执行阶段 2(探索)。

探索后,再次执行阶段 3(图操作)。

重复直到 depth_remaining = 0 或无高价值线索剩余。


阶段 6: 合成

6.1 查询完整图

获取所有高相关性发现:

SELECT f.id, f.content, f.source_url, f.relevance_score, f.finding_type, f.branch_name
FROM findings f
WHERE f.session_id = {session_id} AND f.relevance_score >= 7
ORDER BY f.relevance_score DESC, f.branch_name;

获取所有关系:

SELECT r.*, f1.content as from_content, f2.content as to_content
FROM relationships r
JOIN findings f1 ON r.from_finding_id = f1.id
JOIN findings f2 ON r.to_finding_id = f2.id
WHERE f1.session_id = {session_id};

获取所有实体及其发现:

SELECT e.name, e.entity_type, GROUP_CONCAT(f.content, ' | ') as related_findings
FROM entities e
JOIN finding_entities fe ON e.id = fe.entity_id
JOIN findings f ON fe.finding_id = f.id
WHERE f.session_id = {session_id}
GROUP BY e.id;

获取矛盾:

SELECT f.content, f.source_url FROM findings f
WHERE f.session_id = {session_id} AND f.finding_type = 'contradiction';

获取未解决问题:

SELECT content FROM findings
WHERE session_id = {session_id} AND finding_type = 'question' AND relevance_score >= 6;

6.2 通过图结构识别主题

主题从相关发现集群中涌现。查询集群:

-- 查找连接最多的发现(主题候选)
SELECT f.id, f.content, f.branch_name,
       COUNT(DISTINCT r1.id) + COUNT(DISTINCT r2.id) as connection_count
FROM findings f
LEFT JOIN relationships r1 ON f.id = r1.from_finding_id
LEFT JOIN relationships r2 ON f.id = r2.to_finding_id
WHERE f.session_id = {session_id} AND f.finding_type IN ('fact', 'theme')
GROUP BY f.id
ORDER BY connection_count DESC;

高度连接的发现是主题中心。将其连接发现分组在一起。

6.3 生成报告

围绕发现主题构建报告,不仅仅是分支:

# 研究报告: {topic}

**生成时间:** {timestamp}
**会话 ID:** {session_id}
**深度:** {depth} | **分支:** {branch_count} | **发现:** {finding_count} | **关系:** {relationship_count}

## 执行摘要
{2-3句话合成图中最重要的洞察}

## 关键主题

### {主题 1: 来自图聚类}
{合成此集群发现的叙述}

- {发现} ([来源]({url})) [相关性: {score}]
  - 支持: {支持发现列表}
  - 相关: {相关发现列表}

### {主题 2}
...

## 矛盾和细微差别
{每个矛盾发现,分析为什么来源不同意}

## 证据质量
| 主张 | 支持计数 | 来源 | 置信度 |
|-------|---------------|---------|------------|
| {主张} | {‘supports’关系计数} | {urls} | {高/中/低} |

## 知识图谱统计
- 总发现: {count}
- 事实: {count} | 线索: {count} | 主题: {count} | 问题: {count} | 矛盾: {count}
- 关系: {count}
  - 支持: {count}
  - 矛盾: {count}
  - 阐述: {count}
  - 相关: {count}
- 识别实体: {count}
- 探索URL: {count}

## 开放问题
{‘question’类型发现列表,按相关性优先}

## 未探索线索
{由于深度限制未跟进的髙评分线索}

## 来源
| 来源 | 发现 | 相关性范围 |
|--------|----------|-----------------|
| {url}  | {count}  | {min}-{max}     |

6.4 保存报告

mkdir -p research-reports

写入 research-reports/{topic-slug}-report.md

6.5 更新会话

UPDATE sessions SET status = 'completed', updated_at = CURRENT_TIMESTAMP
WHERE id = {session_id};

列出和继续会话

–list

SELECT id, topic, status, created_at, updated_at,
       finding_count, high_relevance_count, urls_explored, queries_executed
FROM v_session_summary
ORDER BY updated_at DESC;

–continue “{topic}”

-- 查找会话
SELECT id, depth_remaining FROM sessions WHERE topic LIKE '%{topic}%' AND status != 'completed';

-- 加载状态
SELECT COUNT(*) FROM findings WHERE session_id = {id};
SELECT COUNT(*) FROM explored_urls WHERE session_id = {id};

-- 查找未探索线索
SELECT id, content, branch_name FROM findings
WHERE session_id = {id} AND finding_type = 'lead' AND relevance_score >= 7;

以未探索线索恢复阶段 2。


错误处理

  • 数据库缺失: 停止。运行模式初始化。验证。然后进行。
  • URL获取失败: 在explored_urls中记录为’failed’。继续其他URL。
  • 分支无发现: 插入’question’发现,记录差距。
  • 合并冲突: 保留两个发现,创建’related_to’关系。
  • 矛盾不确定: 创建为’question’类型,非’contradiction’。

验证检查清单

在完成合成前,验证:

  • [ ] 所有搜索查询记录在search_queries表
  • [ ] 所有获取URL记录在explored_urls表
  • [ ] 所有发现具有relevance_score、finding_type、branch_name
  • [ ] 合并操作执行(即使无需合并)
  • [ ] 关系推断执行(图应有边)
  • [ ] 矛盾检测执行
  • [ ] 会话状态更新为’completed’

验证查询:

SELECT
  (SELECT COUNT(*) FROM findings WHERE session_id = {id}) as findings,
  (SELECT COUNT(*) FROM relationships r JOIN findings f ON r.from_finding_id = f.id WHERE f.session_id = {id}) as relationships,
  (SELECT COUNT(*) FROM explored_urls WHERE session_id = {id}) as urls,
  (SELECT COUNT(*) FROM search_queries WHERE session_id = {id}) as queries;

如果 relationships = 0,您未完成图操作。返回阶段 3。