mcpField
S
systematic-literature-review

systematic-literature-review

github.com/bytedance生产力84.6k2.5k 次安装今天更新
代码仓库

关于 systematic-literature-review

systematic-literature-review 面向需要综述某个主题学术论文的研究者,可搜索 arXiv、提取论文信息,并汇总主题、发现、局限与引文,生成结构化报告。

主要功能

  1. 01搜索 arXiv 相关论文
  2. 02提取结构化论文信息
  3. 03并行分析多篇论文
  4. 04综合跨论文主题
  5. 05统一格式整理引文
  6. 06生成结构化综述报告

适用场景

  1. 01调查某主题的研究进展
  2. 02比较多篇论文的方法
  3. 03编制注释书目
  4. 04梳理特定时间段的研究趋势

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/bytedance/deer-flow --skill systematic-literature-review

安装后在 Claude Code 中输入/systematic-literature-review确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

evals/
evals.json
trigger_eval_set.json
scripts/
arxiv_search.py
templates/
apa.md
bibtex.md
ieee.md

详细介绍

系统性文献综述技能

概述

此技能可针对某个研究主题,对多篇学术论文开展结构化的 系统性文献综述(SLR)。用户提供主题查询后,技能会搜索 arXiv,并行提取每篇论文的结构化元数据(研究问题、方法、主要发现、局限性),综合整组论文中的主题,并生成引用格式统一的最终报告。

**与 academic-paper-review 的区别:**该技能会对单篇论文进行深入同行评审;此技能则广泛综合多篇论文。如果用户提供一篇论文的 URL,并要求“评审这篇论文”,请转到 academic-paper-review。

何时使用此技能

当用户提出以下任何需求时,请使用此技能:

  • 主题文献综述(“调查 Transformer 注意力变体”“综述扩散模型相关文献”)
  • 多篇论文综合(“近期论文对 X 有何看法”“比较关于 Y 的论文所用的方法”)
  • 引用格式统一的系统性综述(“以 APA 格式对 Z 进行 SLR”)
  • 某个主题的文献注释
  • 某一研究领域在特定时间范围内的趋势概述

以下情况不要使用此技能:

  • 用户只提供一篇论文并要求评审(使用 academic-paper-review)
  • 用户提出无需综合多个来源即可回答的事实性问题(直接作答)
  • 用户需要不要求学术严谨性的普通网络研究(使用标准网络搜索)

工作流

此工作流分为五个阶段。请按顺序执行。

阶段 1:规划

开始检索前,请先向用户确认以下信息。如果其中任何一项不明确,请提出一个澄清问题,一并询问所有缺失信息。不要一次只问一个问题。

  • 主题:用通俗英语描述研究领域(例如,“transformer attention variants”)。
  • 范围:论文数量(默认 20 篇,上限为 50 篇),可选的时间范围(例如,“最近 2 年”),可选的 arXiv 类别(例如,cs.CL、cs.CV)。
  • 引用格式:APA、IEEE 或 BibTeX(如果用户未指定,且看起来不是为特定出版场合撰写,默认使用 APA)。
  • 输出位置:最终报告的保存位置(默认 /mnt/user-data/outputs/)。

如果用户说“50+ 篇论文”,请礼貌地将数量限制为 50 篇,并说明超过此数量后,综合质量会迅速下降;如果要进行更大规模的综述,应按子主题拆分。

阶段 2:搜索 arXiv

调用随附的搜索脚本。不要尝试通过其他方式抓取 arXiv,也不要编写自己的 HTTP 客户端——该脚本能够正确处理 URL 编码、Atom XML 解析和 ID 规范化。

python /mnt/skills/public/systematic-literature-review/scripts/arxiv_search.py \
  "<topic>" \
  --max-results <N> \
  [--category <cat>] \
  [--sort-by relevance] \
  [--start-date YYYY-MM-DD] \
  [--end-date YYYY-MM-DD]

**重要——搜索前先提取 2-3 个核心关键词。**不要把用户对主题的完整描述作为查询。调用脚本前,先在脑中将主题精简为 2-3 个最重要的词。删去诸如“在计算机视觉中”“用于 NLP”“变体”“近期”等限定词——这些应通过 --category 或 --start-date 指定,而不是放进查询字符串。

**查询措辞——保持简短。**脚本会将包含多个词的查询用双引号括起来,以便在 arXiv 上进行短语匹配。这意味着:

  • "diffusion models" → 搜索完全匹配的短语 → 很合适,能返回相关论文。
  • "diffusion models in computer vision" → 搜索完全匹配的 5 词短语 → 过于具体,可能返回 0 条结果,因为很少有论文包含这个完全相同的字符串。

查询中使用 2-3 个核心关键词,并用 --category 缩小领域范围,而不是把领域名称塞进查询。示例:

用户的说法合适的查询不合适的查询
"diffusion models in computer vision""diffusion models" --category cs.CV"diffusion models in computer vision"
"transformer attention variants""transformer attention""transformer attention variants in NLP"
"graph neural networks for molecules""graph neural networks" --category cs.LG"graph neural networks for molecular property prediction"

脚本会将一个 JSON 数组打印到标准输出。每篇论文包含:id、title、authors、abstract、published、updated、categories、pdf_url、abs_url。

排序策略:

  • 始终使用 relevance 排序——arXiv 的 BM25 式评分能够确保结果确实与用户的主题相关。submittedDate 排序会返回该类别中最近提交的论文,不考虑其与主题的相关性,因此结果大多与主题无关。
  • 用户要求“近期”论文或给出时间范围时,使用 --sort-by relevance 并结合 --start-date 来限制时间范围,同时确保结果与主题相关。例如,“近期的扩散模型论文” → --sort-by relevance --start-date 2024-01-01,而不是 --sort-by submittedDate。
  • 仅当用户明确要求按时间顺序排列(例如“按论文发表顺序展示”)时,才适合使用 submittedDate 排序。这种情况很少见。
  • lastUpdatedDate 很少有用;除非用户提出要求,否则忽略它。

**搜索恰好运行一次。**如果结果不理想,不要修改查询后重试——arXiv 的相关性排序就是如此。换用不同的查询措辞重试会浪费工具调用,还可能触及递归限制。如果结果确实为空(0 篇论文),请告知用户,并建议他们扩大主题范围或移除类别筛选条件。

如果脚本返回的论文少于用户要求的数量,这就是该查询在 arXiv 上实际能找到的结果数。不要凑数——向用户报告实际数量并继续。

如果脚本失败(网络错误、arXiv 返回非 200 状态码),请告知用户具体错误并停止。不要编造论文元数据。

不要将搜索结果保存到文件——JSON 会保留在你的上下文中,供第 3 阶段使用。整个工作流中唯一要保存的文件是第 5 阶段的最终报告。

阶段 3:并行提取元数据

你必须通过 task 工具将提取工作委派给子代理,不要自己提取元数据。 这是不可妥协的要求。具体来说,不要执行以下任何操作:

  • ❌ 编写 python -c "papers = [...]" 或任何用于处理论文的 Python/bash 脚本
  • ❌ 在自己的上下文中逐篇阅读摘要并直接提取元数据
  • ❌ 在此阶段使用除 task 以外的任何工具

相反,你必须调用 task 工具来启动子代理。原因是:在自己的上下文中提取 10-50 篇论文会消耗过多 token,并降低阶段 4 的综合质量。每个子代理都在隔离的上下文中运行,只接收分配给它的一批论文,从而生成质量更高的提取结果。

将论文分成每批约 5 篇,然后针对每一批调用 task 工具,并设置 subagent_type: "general-purpose"。每个子代理接收论文摘要文本,并返回结构化 JSON。

并发限制:每轮最多 3 个子代理。 DeerFlow 运行时会强制执行 MAX_CONCURRENT_SUBAGENTS = 3,并会静默丢弃同一轮中的任何额外调度——LLM 不会收到相关通知,因此必须严格遵循下方的轮次策略。

轮次策略——请使用此决策表,不要自行计算如何拆分:

论文数量每批约 5 篇轮数每轮子代理数量
1–51 批1 轮1 个子代理
6–102 批1 轮2 个子代理
11–153 批1 轮3 个子代理
16–204 批2 轮3 + 1
21–255 批2 轮3 + 2
26–306 批2 轮3 + 3
31–357 批3 轮3 + 3 + 1
36–408 批3 轮3 + 3 + 2
41–459 批3 轮3 + 3 + 3
46–5010 批4 轮3 + 3 + 3 + 1

同一轮中绝不能调度超过 3 个子代理。 如果某一行写着“2 轮(3 + 1)”,则表示:第一轮并行调度 3 个子代理,等待它们全部完成后,第二轮再调度 1 个子代理。主代理必须严格按顺序逐轮执行。

如果论文数量处于表中两行之间(例如 23 篇论文),则按下一行的布局安排轮次,但只调度实际需要的批次数量——决策表仅提供结构,并非必须严格照搬。

在主代理级别完成分批:你已经在阶段 2 获取了每篇论文的摘要,因此每个子代理接收的都是纯文本输入。子代理不需要访问网络或沙盒——它们只需阅读文本并返回 JSON。不要让子代理重新运行 arxiv_search.py,这会浪费 token,还可能触发速率限制。

每个子代理接收的内容,以结构化提示词的形式提供:

Execute this task: extract structured metadata and key findings from the
following arXiv papers.

Papers:
[Paper 1]
arxiv_id: 1706.03762
title: Attention Is All You Need
authors: Ashish Vaswani, Noam Shazeer, ...
published: 2017-06-12
abstract: <full abstract text>

[Paper 2]
arxiv_id: ...
...

For each paper, return a JSON object with these fields:
- arxiv_id (string)
- title (string)
- authors (list of strings)
- published_date (string, YYYY-MM-DD)
- research_question (1 sentence, what problem the paper tackles)
- methodology (1-2 sentences, how they tackle it)
- key_findings (3-5 bullet points, what they actually found)
- limitations (1-2 sentences, what they acknowledge or what is obviously missing)

Return the result as a JSON array, one object per paper, in the same
order as the input. Do not include any text outside the JSON — no
preamble, no markdown fences, just the array.

解析子代理结果:task 工具会返回带固定前缀的字符串,例如 Task Succeeded. Result: [...JSON...]。在尝试解析 JSON 前,先去除 Task Succeeded. Result: 前缀(或 Task failed. / Task timed out. 前缀)。如果某一批失败或返回的 JSON 无法解析,请记录相关情况并注明受影响的论文,然后继续处理剩余批次——不要因一批出错就放弃整个综合任务。

所有轮次完成后,将各批数组展平为一个论文元数据对象列表,并保持原有顺序。

阶段 4:综合与排版

现在生成最终的 SLR 报告。此阶段包含两项工作:跨论文综合(主题分析)和引文格式处理。

跨论文综合:报告不能只是罗列论文。至少应识别以下内容:

  • 主题:整组论文中反复出现的 3–6 个研究方向、方法或问题框架。
  • 趋同点:多篇论文认同的研究发现。
  • 分歧点:论文得出不同结论或采用不兼容方法的情况。
  • 研究空白:现有文献尚未涉及的内容(通常会在“局限性”字段中明确说明)。

如果论文集规模太小或异质性太高,无法进行主题综合(例如,5 篇论文涉及截然不同的子主题),请在报告中明确说明——不要强行归纳不存在的主题。

引文格式:具体格式取决于用户的偏好。仅阅读与用户要求格式相匹配的模板文件,不要全部读取:

  • templates/apa.md — APA 第 7 版。社会科学和大多数计算机科学期刊的默认格式。用户要求 APA 或未指定格式时使用。
  • templates/ieee.md — IEEE 数字引文格式。用户的目标是 IEEE 会议或期刊,或明确要求 IEEE 时使用。
  • templates/bibtex.md — BibTeX 条目。用户提到 BibTeX、LaTeX 或需要机器可读的参考文献时使用。重要:arXiv 论文应引用为 @misc,而不是 @article——BibTeX 模板对此有明确说明。

每个模板都包含引文规则和完整的报告结构(执行摘要、主题、逐篇论文注释、参考文献、方法部分)。请严格遵循模板中的报告正文结构,然后填入阶段 3 的元数据。

阶段 5:保存并呈现

将完整报告保存到 /mnt/user-data/outputs/slr-<topic-slug>-<YYYYMMDD>.md,其中 <topic-slug> 是主题名称转换为小写并以连字符连接后的版本(例如 transformer-attention)。然后调用 present_files 工具,并传入该路径,以便用户下载。

在聊天消息中,提供简短预览,让用户无需打开文件也能立即了解其内容:

  1. 执行摘要——报告开头的 3–5 句段落,原文照录。
  2. 主题列表——阶段 4 综合中识别出的主题列表(仅列出主题名称和一句话说明,不要贴出完整主题章节)。
  3. 论文数量 + 文件链接——例如:“包含 20 篇论文、逐篇注释和格式化参考文献的完整报告已保存至 slr-transformer-attention-20260409.md。”

不要在聊天中贴出 2000 多字的完整报告——逐篇论文注释、参考文献和方法部分应放在文件中。预览旨在让用户快速了解报告内容,并决定是否打开文件。

示例

示例 1:典型的 SLR 请求

用户:“对近期的 transformer 注意力变体进行系统性文献综述,20 篇论文,采用 APA 格式。”

你的流程:

  1. 阶段 1:确认主题(transformer 注意力变体)、范围(20 篇论文,默认时间范围)和格式(APA)。仅在缺少信息时提出 一个 澄清问题(例如:“您有指定的时间范围吗?还是采用默认的最近 3 年?”)。
  2. 阶段 2:arxiv_search.py "transformer attention" --max-results 20 --sort-by relevance --start-date 2023-01-01。
  3. 阶段 3:20 篇论文 → 第 1 轮 = 3 个子 Agent × 5 篇论文 = 覆盖 15 篇,第 2 轮 = 1 个子 Agent × 5 篇论文 = 覆盖 5 篇。汇总结果。
  4. 阶段 4:读取 templates/apa.md,按照其结构撰写报告,并根据阶段 3 的元数据填写主题和逐篇注释。
  5. 阶段 5:保存为 slr-transformer-attention-20260409.md,调用 present_files。

示例 2:对数量不明确的小规模集合的请求

用户:“帮我调查几篇关于扩散模型的论文。”

你的流程:

  1. 阶段 1:“几篇”含义不明确。提出一个问题:“您想要多少篇论文?10、20 还是 30 篇?对引用格式有偏好吗(默认采用 APA)?”
  2. 用户回复“10 篇,BibTeX”。
  3. 阶段 2:arxiv_search.py "diffusion models" --max-results 10 --category cs.CV。
  4. 阶段 3:10 篇论文 → 单轮,2 个子 Agent × 5 篇论文。
  5. 阶段 4:读取 templates/bibtex.md,使用 @misc 条目格式(而不是 @article)。
  6. 阶段 5:保存并展示。

示例 3:超出范围的请求

用户:“这是篇论文(https://arxiv.org/abs/1706.03762)。你能评审一下吗?”

这是对单篇论文的同行评审,而非文献综述。不要使用此技能。改由 academic-paper-review 处理。

说明

  • 前置条件:subagent_enabled 必须为 true。阶段 3 需要使用 task 工具并行提取元数据。仅当运行时配置(config.configurable.subagent_enabled)中的 subagent_enabled 设为 true 时,才会加载此工具。否则,可用工具中不会出现 task 工具,阶段 3 也无法按设计执行。
  • 设计上仅支持 arXiv。此技能不会查询 Semantic Scholar、PubMed 或 Google Scholar。arXiv 收录了大量 CS/ML/物理/数学预印本,而 DeerFlow 用户最常希望调查的也正是这类文献。多来源学术搜索应由专用 MCP 服务提供,而非纳入此技能。
  • 论文数量上限为 50 篇。这与阶段 3 的并发策略有关(每轮最多 3 个子 Agent,每个约 5 篇,最多约 3 轮)。超过 50 篇的综述会降低综合质量,最好拆分为多个子主题。
  • 阶段 3 要求启用子 Agent。此技能的并行提取步骤必须使用 task 工具,该工具仅在运行时 subagent_enabled=true 时可用。若子 Agent 不可用,不要声称能够执行阶段 3 的并行计划;应告知用户,完整工作流需要启用子 Agent,或者提出将请求缩小范围/拆分为更小的人工评审。
  • 子 Agent 的结果是字符串,而非对象。解析 JSON 载荷前,务必去除 Task Succeeded. Result: / Task failed. / Task timed out. 前缀。
  • id 字段是纯 arXiv id(例如 1706.03762),不是 URL,也不带版本后缀。如果需要完整 URL,请使用 abs_url / pdf_url。
  • 综合分析,而非罗列。最终报告必须归纳主题,并比较各篇论文的研究发现。若报告只是逐篇罗列论文,则属于失败情况;如果找不到主题,应明确说明,而不是编造。

评论

支持 Markdown