名称: 研究 描述: 深度网络研究,带有相关性评分和知识图谱存储。用于研究主题、公司、人物或概念。执行图形思维(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。