系統的文献レビュースキル
概要
このスキルは、研究トピックに関する複数の学術論文にわたる構造化された系統的文献レビュー(SLR) を作成します。トピッククエリを入力として、arXivを検索し、各論文から構造化メタデータ(研究課題、方法論、主要な発見、限界)を並行して抽出し、論文全体のテーマを統合し、一貫した引用を含む最終レポートを出力します。
academic-paper-review との違い: そのスキルは1つの論文の詳細なピアレビューを行います。このスキルは多くの論文にわたる幅優先の統合を行います。ユーザーが1つの論文URLを渡して「この論文をレビューして」と依頼した場合は、代わりに academic-paper-review にルーティングしてください。
このスキルを使用するタイミング
ユーザーが以下のいずれかを希望する場合にこのスキルを使用します:
- トピックに関する文献調査(「トランスフォーマーアテンションの変種を調査して」、「拡散モデルの文献をレビューして」)
- 複数の論文にわたる統合(「最近の論文はXについて何と言っているか」、「Yに関する論文の方法論を比較して」)
- 一貫した引用形式による系統的レビュー(「ZについてAPA形式でSLRを実施して」)
- トピックに関する注釈付き参考文献
- 一定期間における分野の研究トレンドの概要
以下の場合にはこのスキルを使用しないでください:
- ユーザーが1つの論文のみを提供し、そのレビューを依頼した場合(
academic-paper-reviewを使用) - 複数の情報源を統合する必要のない事実質問をユーザーがした場合(直接回答)
- ユーザーが学術的厳密性を必要としない一般的なWeb調査を希望する場合(標準のWeb検索を使用)
ワークフロー
ワークフローは5つのフェーズで構成されます。順番に従って実行してください。
フェーズ1: 計画
検索を実行する前に、以下の項目をユーザーと確認してください。不明な点がある場合は、不足している部分をカバーする1つの確認質問をしてください。質問は一度に1つずつ行わないでください。
- トピック: 平易な英語での研究領域(例:「トランスフォーマーアテンションの変種」)
- 範囲: 論文数(デフォルト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の用語に精神的に削減してください。「in computer vision」「for NLP」「variants」「recent」などの修飾語は削除してください。これらは --category または --start-date に属し、クエリ文字列には含めません。
クエリのフレージング — 短く保ってください。 スクリプトは複数単語のクエリを二重引用符で囲み、arXivでフレーズマッチングを行います。つまり:
"diffusion models"→ 正確なフレーズを検索 → 良い、関連する論文を返す。"diffusion models in computer vision"→ その正確な5語のフレーズを検索 → 特定すぎて、おそらく0件の結果を返す。なぜなら、その正確な文字列を含む論文はほとんどないからです。
クエリとして2〜3のコアキーワードを使用し、 --category を使用してフィールドを絞り込みます。フィールド名をクエリに詰め込まないでください。例:
| ユーザーの発言 | 適切なクエリ | 不適切なクエリ |
|---|---|---|
| 「コンピュータビジョンにおける拡散モデル」 | "diffusion models" --category cs.CV | "diffusion models in computer vision" |
| 「トランスフォーマーアテンションの変種」 | "transformer attention" | "transformer attention variants in NLP" |
| 「分子のためのグラフニューラルネットワーク」 | "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はめったに有用ではありません。ユーザーが要求しない限り無視してください。
検索は1回だけ実行してください。 結果が不完全に見えても、変更したクエリで再試行しないでください。arXivの関連性ランキングはそのままです。異なるクエリフレージングで再試行すると、ツール呼び出しが無駄になり、再帰制限に達するリスクがあります。結果が本当に空(0論文)の場合は、ユーザーに伝え、トピックを広げるかカテゴリフィルターを削除するよう提案してください。
スクリプトが要求よりも少ない論文を返した場合、それがクエリに対するarXivの実際の結果セットサイズです。リストを水増ししないでください。実際の数をユーザーに報告し、続行してください。
スクリプトが失敗した場合(ネットワークエラー、arXivからの200以外の応答)、どのエラーかをユーザーに伝えて停止してください。論文メタデータを作り出そうとしないでください。
検索結果をファイルに保存しないでください — JSONはフェーズ3のためにコンテキスト内に保持されます。ワークフロー全体で保存される唯一のファイルは、フェーズ5の最終レポートです。
フェーズ3: メタデータの並行抽出
task ツールを使用して、抽出をサブエージェントに委任する必要があります。自分でメタデータを抽出しないでください。 これは譲れません。具体的には、以下のことを行わないでください:
- ❌
python -c "papers = [...]"またはその他のPython/bashスクリプトを作成して論文を処理する - ❌ 要約を1つずつ読んで、自分のコンテキスト内でメタデータをインライン抽出する
- ❌ このフェーズで
task以外のツールを使用する
代わりに、task ツールを呼び出してサブエージェントを起動する必要があります。理由: 10〜50の論文を自分のコンテキストで抽出すると、トークンを大量に消費し、フェーズ4の統合の質が低下します。各サブエージェントは、自身のバッチの論文のみを使用して分離されたコンテキストで実行され、よりクリーンな抽出が生成されます。
論文を約5件のバッチに分割し、各バッチに対して subagent_type: "general-purpose" を指定して task ツールを呼び出します。各サブエージェントは論文の要約をテキストとして受け取り、構造化JSONを返します。
同時実行制限: 1ターンあたり最大3つのサブエージェント。 DeerFlowランタイムは MAX_CONCURRENT_SUBAGENTS = 3 を強制し、同じターンに追加でディスパッチされたものは静かにドロップされます。このことがLLMに通知されることはないため、以下のラウンド戦略を厳密に従ってください。
ラウンド戦略 — 以下の決定表を使用し、分割を自分で計算しないでください:
| 論文数 | 約5件のバッチ | ラウンド数 | ラウンドあたりのサブエージェント数 |
|---|---|---|---|
| 1–5 | 1 バッチ | 1 ラウンド | 1 サブエージェント |
| 6–10 | 2 バッチ | 1 ラウンド | 2 サブエージェント |
| 11–15 | 3 バッチ | 1 ラウンド | 3 サブエージェント |
| 16–20 | 4 バッチ | 2 ラウンド | 3 + 1 |
| 21–25 | 5 バッチ | 2 ラウンド | 3 + 2 |
| 26–30 | 6 バッチ | 2 ラウンド | 3 + 3 |
| 31–35 | 7 バッチ | 3 ラウンド | 3 + 3 + 1 |
| 36–40 | 8 バッチ | 3 ラウンド | 3 + 3 + 2 |
| 41–45 | 9 バッチ | 3 ラウンド | 3 + 3 + 3 |
| 46–50 | 10 バッチ | 4 ラウンド | 3 + 3 + 3 + 1 |
同じターンに3つ以上のサブエージェントを決してディスパッチしないでください。 行に「2ラウンド (3 + 1)」と書かれている場合、それは: 最初のターンで3つのサブエージェントを並行してディスパッチし、すべての3つが完了するのを待ち、次に2番目のターンで1つのサブエージェントをディスパッチすることを意味します。ラウンドはメインエージェントレベルで厳密に順次実行されます。
論文数が行の間にある場合(例:23論文)、次の行のレイアウトに切り上げますが、実際に必要な数のバッチのみをディスパッチします。決定表は形状を示すものであり、厳格な規定ではありません。
メインエージェントレベルでバッチ処理を行ってください: フェーズ2ですでにすべての論文の要約を取得しているため、各サブエージェントは純粋なテキスト入力を受け取ります。サブエージェントはネットワークやサンドボックスにアクセスする必要はありません。彼らの唯一の仕事はテキストを読み、JSONを返すことです。サブエージェントに arxiv_search.py を再実行させないでください。トークンの無駄遣いであり、レート制限のリスクがあります。
各サブエージェントが受け取るもの(構造化プロンプトとして):
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を返した場合、それを記録し、影響を受けた論文をメモし、残りのバッチで続行してください。1つのバッチの不良で統合全体を失敗させないでください。
すべてのラウンドが完了したら、バッチごとの配列を1つの論文メタデータオブジェクトのリストに平坦化し、順序を保持してください。
フェーズ4: 統合とフォーマット
ここで最終的なSLRレポートを作成します。ここでは、論文間の統合(テーマ分析)と引用フォーマットの2つのことが行われます。
論文間の統合: レポートは単に論文をリストする以上のことを行う必要があります。最低限、以下を特定してください:
- テーマ: セット全体にわたる3〜6の繰り返し発生する研究方向、アプローチ、または問題の枠組み。
- 収束: 複数の論文が一致する発見。
- 不一致: 論文が異なる結論に達している、または互換性のない方法論を使用している箇所。
- ギャップ: 集合的な文献がまだ扱っていない点(多くの場合、「限界」フィールドに明示的に記載されています)。
論文セットが小さすぎる、またはテーマ統合をサポートするには異種すぎる場合(例:まったく異なるサブトピックに関する5論文)、レポートでその旨を明示的に述べてください。存在しないテーマを強制しないでください。
引用フォーマット: 正確な形式はユーザーの好みに依存します。ユーザーが要求した形式に一致するテンプレートファイルのみを読み、3つすべてを読まないでください:
- templates/apa.md — APA第7版。社会科学およびほとんどのコンピュータサイエンスジャーナルのデフォルト。ユーザーがAPAを要求した場合、または形式を指定しなかった場合に使用します。
- templates/ieee.md — IEEE数字引用。ユーザーがIEEE会議やジャーナルを対象としている場合、または明示的にIEEEを要求した場合に使用します。
- templates/bibtex.md — BibTeXエントリ。ユーザーがBibTeX、LaTeX、または機械可読な参考文献を言及した場合に使用します。重要: arXiv論文は
@articleではなく@miscとして引用されます。BibTeXテンプレートはこれを明示的にカバーしています。
各テンプレートには、引用ルールと完全なレポート構造(エグゼクティブサマリー、テーマ、論文ごとの注釈、参考文献、方法論セクション)の両方が含まれています。レポート本文についてはテンプレートの構造をそのまま守り、フェーズ3のメタデータから内容を埋めてください。
フェーズ5: 保存と提示
完全なレポートを /mnt/user-data/outputs/slr-<topic-slug>-<YYYYMMDD>.md に保存します。ここで <topic-slug> は小文字のハイフン繋ぎにしたトピックです(例:transformer-attention)。次に、present_files ツールをそのパスで呼び出し、ユーザーがダウンロードできるようにします。
チャットメッセージでは、ユーザーがファイルを開かなくてもすぐに価値を確認できるように、短いプレビューを表示します:
- エグゼクティブサマリー — レポート冒頭の3〜5文の段落をそのまま。
- テーマリスト — フェーズ4の統合で特定したテーマの箇条書き(テーマ名と1行の説明のみ。完全なテーマセクションは含めません)。
- 論文数 + ファイルへのポインタ — 例:「20論文、論文ごとの注釈、およびフォーマットされた参考文献を含む完全なレポートを
slr-transformer-attention-20260409.mdに保存しました。」
完全な2000語以上のレポートをインラインでダンプしないでください。論文ごとの注釈、参考文献、方法論はファイルに含まれています。プレビューはユーザーがレポートを一目で評価し、開くかどうかを判断できるようにするためのものです。
例
例1: 典型的なSLRリクエスト
ユーザー: 「最近のトランスフォーマーアテンションの変種について、20論文、APA形式で系統的文献レビューを実施してください。」
フロー:
- フェーズ1: トピック(トランスフォーマーアテンションの変種)、範囲(20論文、デフォルトの期間)、形式(APA)を確認します。何か不足している場合にのみ1つの確認を行います(例:「特定の期間はありますか?それともデフォルトで過去3年にしますか?」)。
- フェーズ2:
arxiv_search.py "transformer attention" --max-results 20 --sort-by relevance --start-date 2023-01-01。 - フェーズ3: 20論文 → ラウンド1 = 3サブエージェント × 5論文 = 15カバー、ラウンド2 = 1サブエージェント × 5論文 = 5カバー。
- フェーズ4: APAテンプレートを読み、テーマを統合し、レポートを作成します。
- フェーズ5:
slr-transformer-attention-20260409.mdに保存し、プレビューを表示します。