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。