深网研究知识图谱系统Skill research

这是一个用于深度网络研究的技能,采用图形思维(Graph-of-Thoughts)方法,通过结构化探索构建知识图谱,并将所有发现存储在SQLite数据库中。它使用图形操作(如合并、遍历、矛盾检测、关系推理)来合成洞察,生成主题报告并支持数据驱动的决策。关键词:深网研究、知识图谱、Graph-of-Thoughts、数据分析、相关性评分、关系推理、SQLite、深度探索。

数据分析 0 次安装 0 次浏览 更新于 3/9/2026

名称: 研究 描述: 深度网络研究,带有相关性评分和知识图谱存储。用于研究主题、公司、人物或概念。执行图形思维(Graph-of-Thoughts)风格的探索,包括并行分支、相关性评分,并合成为主题报告。

深度研究技能

一个图形思维研究系统,通过结构化探索构建知识图谱,将所有发现存储在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: {描述发现间冲突}. 来源 1: {url1}. 来源 2: {url2}. 可能解释: {分析}',
  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。