mcpField
B
Building Paper Screening Rubrics

Building Paper Screening Rubrics

github.com/kthorn生産性13158 回インストール53 週間前に更新
リポジトリ

Building Paper Screening Rubrics について

Building Paper Screening Rubricsは、文献検索結果を評価する基準を共同で作成・検証するスキルです。テスト論文で基準を反復調整してから一括スクリーニングを行い、抄録のキャッシュと改訂基準での再評価にも対応します。

主な機能

  1. 01関連性基準と例外条件の整理
  2. 02設定可能なスコアリング基準の作成
  3. 03判定済み論文による基準のテスト
  4. 04基準ルールの反復改善と版管理
  5. 05再評価用の抄録キャッシュ

活用シーン

  1. 01大規模な文献検索前の関連性基準作成
  2. 02スクリーニングの誤検出と見落としの低減
  3. 03基準の更新とキャッシュ済み論文の再評価

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kthorn/research-superpower --skill building-paper-screening-rubrics

インストール後、Claude Code で/building-paper-screening-rubricsを入力して読み込まれたか確認します。

詳細

論文スクリーニング用ルーブリックの作成

概要

基本原則: ブレインストーミング → テスト → 改善 → 自動化 → レビュー → 反復を通じて、協力しながらスクリーニング用ルーブリックを作成します。

優れたルーブリックは、エッジケースを事前に理解し、一括スクリーニングの前に実際の論文でテストすることで生まれます。

使用する場面

次のような場合に、このスキルを使用します。

  • 50件以上の論文をスクリーニングする、新しい文献検索を始める場合
  • 現在のルーブリックが論文を誤分類している場合(偽陽性/偽陰性)
  • 自動スクリーニングの前に「関連性」の基準を定義する必要がある場合
  • 基準を更新し、キャッシュ済みの論文を再スクリーニングしたい場合
  • evaluating-paper-relevance 用のヘルパースクリプトを作成する場合

使用しない場面:

  • 検索対象が少ない場合(20件未満)— 手動でのスクリーニングで十分です
  • ルーブリックがすでに適切に機能している場合 — 作り直す必要はありません
  • 一度限りの探索的な検索

2 段階のプロセス

フェーズ 1:協力してルーブリックを設計する
ステップ 1:関連性の基準をブレインストーミングする

論文の関連性を判断する基準を理解するため、分野を問わない質問をします。

中核となる概念:

  • 「研究課題に関する重要な用語や概念は何ですか?」
    • 例:特定の遺伝子、タンパク質、化合物、疾患、手法、生物、理論
  • 「同義語や別名はありますか?」
  • 「論文を除外すべき用語(偽陽性)はありますか?」

データの種類と成果物:

  • 「どのような情報が含まれていると、その論文は価値がありますか?」
    • 定量的測定値(IC50、発現レベル、集団サイズなど)
    • プロトコルや手法
    • アクセッション番号付きのデータセット(GEO、SRA、PDB など)
    • コードやソフトウェア
    • 化学構造
    • 配列やゲノム
    • 理論モデル
  • 「論文に実際のデータが含まれている必要がありますか。それとも、そのようなデータが存在するという記述だけで十分ですか?」

論文の種類:

  • 「どのような種類の論文が関連しますか?」
    • 原著論文のみですか?
    • 総説やメタ分析も含めますか?
    • 手法に関する論文は含めますか?
    • 臨床試験は含めますか?
    • プレプリントも対象としてよいですか?

関係性と文脈:

  • 「関連する概念や類似する概念についての論文も関連しますか?」
    • 例:「タンパク質 X を研究している場合、相同体やパラログに関する論文も関連しますか?」
    • 例:「化合物 A を研究している場合、類似体や誘導体に関する論文も関連しますか?」
    • 例:「疾患 X を研究している場合、関連疾患に関する論文も関連しますか?」
  • 「論文は研究テーマそのものを扱っている必要がありますか。それとも、言及しているだけでもよいですか?」
  • 「活性データがなくても、合成や手法に関する論文は関連しますか?」

エッジケース:

  • 「一見関連しているように見えて、実際には関連しない論文を思いつきますか?」
  • 「一見関連していないように見えて、実際には関連する論文はありますか?」

回答を screening-criteria.json に記録します

ステップ 2:初期ルーブリックを作成する

ブレインストーミングに基づいて、スコアリングのロジックを提案します。

Scoring (0-10):

Keywords Match (0-3 pts):
  - Core term 1: +1 pt
  - Core term 2 OR synonym: +1 pt
  - Related term: +1 pt

Data Type Match (0-4 pts):
  - Measurement type (IC50, Ki, EC50, etc.): +2 pts
  - Dataset/code available: +1 pt
  - Methods described: +1 pt

Specificity (0-3 pts):
  - Primary research: +3 pts
  - Methods paper: +2 pts
  - Review: +1 pt

Special Rules:
  - If mentions exclusion term: score = 0

Threshold: ≥7 = relevant, 5-6 = possibly relevant, <5 = not relevant

ユーザーに提示して、次のように尋ねます。「このロジックは期待に合っていますか?」

初期ルーブリックを screening-criteria.json に保存します。

{
  "version": "1.0.0",
  "created": "2025-10-11T15:30:00Z",
  "keywords": {
    "core_terms": ["term1", "term2"],
    "synonyms": {"term1": ["alt1", "alt2"]},
    "related_terms": ["related1", "related2"],
    "exclusion_terms": ["exclude1", "exclude2"]
  },
  "data_types": {
    "measurements": ["IC50", "Ki", "MIC"],
    "datasets": ["GEO:", "SRA:", "PDB:"],
    "methods": ["protocol", "synthesis", "assay"]
  },
  "scoring": {
    "keywords_max": 3,
    "data_type_max": 4,
    "specificity_max": 3,
    "relevance_threshold": 7
  },
  "special_rules": [
    {
      "name": "scaffold_analogs",
      "condition": "mentions target scaffold AND (analog OR derivative)",
      "action": "add 3 points"
    }
  ]
}
フェーズ 2:テストに基づく改善
ステップ 1:テストセットを作成する

PubMed を簡単に検索して、候補となる論文を取得します。

# Search for 20 papers using initial keywords
curl "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=YOUR_QUERY&retmax=20&retmode=json"

最初の 10~15 件の論文の要旨を取得します。

curl "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=PMID1,PMID2,...&retmode=xml&rettype=abstract"

要旨を 1 件ずつユーザーに提示します。

Paper 1/10:
Title: [Title]
PMID: [12345678]
DOI: [10.1234/example]

Abstract:
[Full abstract text]

Is this paper RELEVANT to your research question? (y/n/maybe)

ユーザーの判定を test-set.json に記録します。

{
  "test_papers": [
    {
      "pmid": "12345678",
      "doi": "10.1234/example",
      "title": "Paper title",
      "abstract": "Full abstract text...",
      "user_judgment": "relevant",
      "timestamp": "2025-10-11T15:45:00Z"
    }
  ]
}

明確な判定が得られた論文が 5~10 件になるまで続けます

ステップ 2:ルーブリックでテスト論文をスコアリングする

各テスト論文にルーブリックを適用します。

for paper in test_papers:
    score = calculate_score(paper['abstract'], rubric)
    predicted_status = "relevant" if score >= 7 else "not_relevant"
    paper['predicted_score'] = score
    paper['predicted_status'] = predicted_status

精度を計算します。

correct = sum(1 for p in test_papers
              if p['predicted_status'] == p['user_judgment'])
accuracy = correct / len(test_papers)
ステップ 3:結果をユーザーに示す

分類レポートを提示します。

RUBRIC TEST RESULTS (5 papers):

✓ PMID 12345678: Score 9 → relevant (user: relevant) ✓
✗ PMID 23456789: Score 4 → not_relevant (user: relevant) ← FALSE NEGATIVE
✓ PMID 34567890: Score 8 → relevant (user: relevant) ✓
✓ PMID 45678901: Score 3 → not_relevant (user: not_relevant) ✓
✗ PMID 56789012: Score 7 → relevant (user: not_relevant) ← FALSE POSITIVE

Accuracy: 60% (3/5 correct)
Target: ≥80%

--- FALSE NEGATIVE: PMID 23456789 ---
Title: "Novel analogs of compound X with improved potency"
Score breakdown:
  - Keywords: 1 pt (matched "compound X")
  - Data type: 2 pts (mentioned IC50 values)
  - Specificity: 1 pt (primary research)
  - Total: 4 pts → not_relevant

Why missed: Paper discusses "analogs" but didn't trigger scaffold_analogs rule
Abstract excerpt: "We synthesized 12 analogs of compound X..."

--- FALSE POSITIVE: PMID 56789012 ---
Title: "Review of kinase inhibitors"
Score breakdown:
  - Keywords: 2 pts
  - Data type: 3 pts
  - Specificity: 2 pts (review, not primary)
  - Total: 7 pts → relevant

Why wrong: Review paper, user wants primary research only
ステップ 4:反復して改善する

ユーザーに調整内容を尋ねます。

Current accuracy: 60% (below 80% threshold)

Suggestions to improve rubric:
1. Strengthen scaffold_analogs rule - should "synthesized N analogs" always trigger?
2. Lower points for review papers (currently 2 pts, maybe 0 pts?)
3. Add more synonym terms for core concepts?

What would you like to adjust?

フィードバックに基づいて screening-criteria.json を更新します

更新例:

{
  "special_rules": [
    {
      "name": "scaffold_analogs",
      "condition": "mentions target scaffold AND (analog OR derivative OR synthesized)",
      "action": "add 3 points"
    }
  ],
  "paper_types": {
    "primary_research": 3,
    "methods": 2,
    "review": 0  // Changed from 1
  }
}
ステップ 5:満足するまで再テストする

更新したルーブリックでテスト論文を再スコアリングします

新しい結果を示します。

UPDATED RUBRIC TEST RESULTS (5 papers):

✓ PMID 12345678: Score 9 → relevant (user: relevant) ✓
✓ PMID 23456789: Score 7 → relevant (user: relevant) ✓ (FIXED!)
✓ PMID 34567890: Score 8 → relevant (user: relevant) ✓
✓ PMID 45678901: Score 3 → not_relevant (user: not_relevant) ✓
✓ PMID 56789012: Score 5 → not_relevant (user: not_relevant) ✓ (FIXED!)

Accuracy: 100% (5/5 correct) ✓
Target: ≥80% ✓

Rubric is ready for bulk screening!

精度が 80% 以上の場合: 一括スクリーニングに進みます
80% 未満の場合: 反復を続けます

フェーズ 3:一括スクリーニング

テストセットでルーブリックの妥当性を確認したら、次の手順に進みます。

  1. PubMed の検索結果全体に適用します
  2. すべての要旨を abstracts-cache.json に保存します。
{
  "10.1234/example": {
    "pmid": "12345678",
    "title": "Paper title",
    "abstract": "Full abstract text...",
    "fetched": "2025-10-11T16:00:00Z"
  }
}
  1. すべての論文をスコアリングし、papers-reviewed.json に保存します。
{
  "10.1234/example": {
    "pmid": "12345678",
    "status": "relevant",
    "score": 9,
    "source": "pubmed_search",
    "timestamp": "2025-10-11T16:00:00Z",
    "rubric_version": "1.0.0"
  }
}
  1. 要約レポートを生成します。
Screened 127 papers using validated rubric:
- Highly relevant (≥8): 12 papers
- Relevant (7): 18 papers
- Possibly relevant (5-6): 23 papers
- Not relevant (<5): 74 papers

All abstracts cached for re-screening.
Results saved to papers-reviewed.json.

Review offline and provide feedback if any misclassifications found.
フェーズ 4:オフラインレビューと再スクリーニング

ユーザーが論文をオフラインでレビューし、問題を特定します:

User: "I reviewed the results. Three papers were misclassified:
- PMID 23456789 scored 4 but is actually relevant (discusses scaffold analogs)
- PMID 34567890 scored 8 but not relevant (wrong target)
- PMID 45678901 scored 6 but is highly relevant (has key dataset)

Can we update the rubric?"

フィードバックに基づいてルーブリックを更新します:

  1. 誤分類が発生した理由を分析する
  2. ルーブリックの調整案を提示する
  3. 新しいルーブリックですべてのキャッシュ済み論文を再採点する
  4. 変更点の差分を表示する

再スクリーニングのワークフロー:

# Load all abstracts from abstracts-cache.json
# Apply updated rubric to each
# Generate change report

RUBRIC UPDATE: v1.0.0 → v1.1.0

Changes:
- Added "derivative" to scaffold_analogs rule
- Increased dataset bonus from +1 to +2 pts

Re-screening 127 cached papers...

Status changes:
  not_relevant → relevant: 3 papers
    - PMID 23456789 (score 4→7)
    - PMID 45678901 (score 6→8)
  relevant → not_relevant: 1 paper
    - PMID 34567890 (score 8→6)

Updated papers-reviewed.json with new scores.
New summary:
- Highly relevant: 13 papers (+1)
- Relevant: 19 papers (+1)

ファイル構成

research-sessions/YYYY-MM-DD-topic/
├── screening-criteria.json      # Rubric definition (weights, rules, version)
├── test-set.json               # Ground truth papers used for validation
├── abstracts-cache.json        # Full abstracts for all screened papers
├── papers-reviewed.json        # Simple tracking: DOI, score, status
└── rubric-changelog.md         # History of rubric changes and why

他のスキルとの連携

evaluating-paper-relevance の実行前:

  • まずこのスキルを使ってルーブリックを作成し、検証します
  • screening-criteria.json と abstracts-cache.json を作成します
  • 次に、検証済みのルーブリックを使って evaluating-paper-relevance を実行します

ヘルパースクリプトの作成時:

  • screening-criteria.json を使ってスコアリングロジックをパラメーター化します
  • abstracts-cache.json を参照し、再取得を避けます
  • スクリプトを書き直さずにルーブリックを簡単に更新できます

answering-research-questions の実行中:

  • 初期化フェーズ(フェーズ 1:クエリの解析後)にルーブリックを作成します
  • 一括スクリーニングの前にテストセットで検証します
  • 再現性を確保するため、研究セッションとともにルーブリックを保存します

ルーブリック設計パターン

パターン 1:加算式スコアリング(デフォルト)
score = 0
score += count_keyword_matches(abstract, keywords)  # 0-3 pts
score += count_data_type_matches(abstract, data_types)  # 0-4 pts
score += specificity_score(paper_type)  # 0-3 pts

# Apply special rules
if matches_special_rule(abstract, rule):
    score += rule['bonus_points']

return score
パターン 2:ドメイン固有のルール

医薬品化学:

{
  "special_rules": [
    {
      "name": "scaffold_analogs",
      "keywords": ["target_scaffold", "analog|derivative|series"],
      "bonus": 3
    },
    {
      "name": "sar_data",
      "keywords": ["IC50|Ki|MIC", "structure-activity|SAR"],
      "bonus": 2
    }
  ]
}

ゲノミクス:

{
  "special_rules": [
    {
      "name": "public_data",
      "keywords": ["GEO:|SRA:|ENA:", "accession"],
      "bonus": 3
    },
    {
      "name": "differential_expression",
      "keywords": ["DEG|differentially expressed", "RNA-seq|microarray"],
      "bonus": 2
    }
  ]
}

計算手法:

{
  "special_rules": [
    {
      "name": "code_available",
      "keywords": ["github|gitlab|bitbucket", "code available|software"],
      "bonus": 3
    },
    {
      "name": "benchmark",
      "keywords": ["benchmark|comparison", "performance|accuracy"],
      "bonus": 2
    }
  ]
}

よくある間違い

テスト駆動の検証を省略する: ルーブリックをテストせずに一括スクリーニングする → 誤分類が多発し、時間を無駄にする 抄録をキャッシュしない: 再スクリーニング時に PubMed から再取得する → 遅く、レート制限に達する グラウンドトゥルースによるテストを行わない: ルーブリックの精度を測定できない → 正しく機能しているか分からない テスト論文が少なすぎる: 2~3 件の論文でテストする → ルーブリックが過学習し、汎化できない ルーブリックが複雑すぎる: 10 個以上のルールによるブール論理 → デバッグ、更新、説明が難しい 変更を記録しない: 理由を追跡せずにルーブリックを更新する → 再現できず、間違いから学べない しきい値を高く設定しすぎる: 95%の精度を求める → 改善を延々と続けることになり、効果が薄れる セッションとともにルーブリックを保存しない: セッション終了時にルーブリックが失われる → スクリーニングを再現できない

成功基準

次の条件を満たすと、ルーブリックの準備が整っています:

  • テストセット(グラウンドトゥルースとなる論文 5~10 件)で精度が 80%以上
  • ユーザーが、ルーブリックでエッジケースを捉えられると確信している
  • ドメイン固有のパターンに関する特別なルールが文書化されている
  • すべてのファイルが作成されている(screening-criteria.json、test-set.json、abstracts-cache.json)
  • 一括スクリーニングを実行する準備ができている

クイックリファレンス

タスクファイル内容
ルーブリックを定義するscreening-criteria.jsonキーワード、重み、特別なルール
ルーブリックをテストするtest-set.jsonユーザーの判定を含むグラウンドトゥルースの論文
抄録をキャッシュするabstracts-cache.json再スクリーニング用の抄録全文
結果を追跡するpapers-reviewed.jsonDOI、スコア、ステータス、ルーブリックのバージョン
変更を記録するrubric-changelog.md更新履歴と根拠

セッションの例

Agent: "I'll help you build a screening rubric. Let's start with some questions about what makes papers relevant..."

[Brainstorming phase - ask 5 question categories]

User: "I'm looking for papers on tuberculosis drug resistance with MIC data for bedaquiline and clofazimine. Papers about analogs are also relevant."

Agent: "Got it. Here's the initial rubric:
- Keywords: tuberculosis, drug resistance, bedaquiline, clofazimine (0-3 pts)
- Data: MIC values, IC50, in vitro activity (0-4 pts)
- Specificity: Primary research (0-3 pts)
- Special rule: If mentions target drugs + 'analog/derivative' → +3 bonus pts
- Threshold: ≥7 = relevant

Does this look right?"

User: "Yes, let's test it."

Agent: "I'll search PubMed for 20 papers and show you abstracts to classify..."

[Shows 10 abstracts, user classifies them]

Agent: "Testing rubric on your classifications...
Accuracy: 70% (7/10 correct)
- 2 false negatives (missed relevant papers)
- 1 false positive (marked review as relevant)

False negative example: Paper discusses 'derivatives of bedaquiline' but scored only 5 pts because didn't explicitly say 'analog'.

Suggestion: Add 'derivative' and 'compound' to special rule trigger terms?"

User: "Yes, and lower review paper points."

Agent: "Updated rubric. Re-testing...
Accuracy: 90% (9/10 correct) ✓

Ready to run bulk screening on 127 papers?"

User: "Yes, go ahead."

Agent: [Screens 127 papers, saves results]

"Done! Found 18 relevant papers. All abstracts cached for re-screening.
Review offline and let me know if any misclassifications."

[Later...]

User: "Found 2 misclassifications. Can we update the rubric?"

Agent: "Sure! What did I miss?"

User: "PMID 12345 discusses pretomanid combination therapy with bedaquiline - should be relevant."

Agent: "Got it. Adding 'combination therapy' as related term with +2 bonus pts.
Re-screening all 127 cached papers...
Status changes: 3 papers now relevant (including PMID 12345).
Updated papers-reviewed.json."

次のステップ

ルーブリックを作成した後:

  • evaluating-paper-relevance での一括スクリーニングに使用します
  • screening-criteria.json でヘルパースクリプトをパラメーター化します
  • エッジケースが見つかったらルーブリックを更新します
  • 基準が変わったらキャッシュ済みの論文を再スクリーニングします
  • 再現性を確保するため、研究セッションの README にルーブリックを記録します

コメント