paper-autoraters
Run the four paper-quality autoraters from PaperOrchestra (arXiv:2604.05018, App. F.3) — Citation F1 (P0/P1 partition + Precision/Recall/F1), Literature Review Quality (6-axis 0-100 with anti-inflation rules), SxS Overall Paper Quality (side-by-side), and SxS Literature Review Qu
Install
npx skills add https://github.com/Ar9av/PaperOrchestra/tree/main/skills/paper-autoraters
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install ar9av-paperorchestra@llmmart
git clone https://github.com/Ar9av/PaperOrchestra.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole ar9av/paperorchestra collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Paper Autoraters (App. F.3)
Faithful implementation of the four LLM-as-judge autoraters used in PaperOrchestra (Song et al., 2026, arXiv:2604.05018, §5 and App. F.3).
These are the metrics the paper uses to demonstrate that PaperOrchestra beats single-agent and AI-Scientist-v2 baselines. Use them to:
- Score a generated paper against a ground-truth paper.
- Compare two paper-writing pipelines side-by-side.
- Validate your own host-agent execution of the paper-orchestra pipeline.
The four autoraters
| Autorater | What it does | Inputs | Output |
|---|---|---|---|
| Citation F1 — P0/P1 partition | Partitions reference list into P0 (must-cite) and P1 (good-to-cite) given the paper text | one paper text + its references list | JSON {ref_num: "P0"\|"P1"} |
| Literature Review Quality | 6-axis 0-100 score for Intro+Related Work, with anti-inflation hard caps | one paper PDF/text + reference avg citation count | JSON with axis_scores, penalties, summary, overall_score |
| SxS Overall Paper Quality | Holistic side-by-side preference judgment | two papers (PDF or text) | JSON with winner ∈ {paper_1, paper_2, tie} |
| SxS Literature Review Quality | Side-by-side preference, Intro+Related Work only | two papers | JSON with winner ∈ {paper_1, paper_2, tie} |
The paper uses Gemini-3.1-Pro and GPT-5 as judges, set to temperature 0.0 (Gemini) or default 1.0 (GPT-5, which doesn't allow temperature adjustment). Use whatever your host LLM is.
Workflow
Citation F1 (compute Precision / Recall / F1 vs ground truth)
This is a two-step procedure:
Step 1: Partition the reference lists into P0 / P1
For both the ground-truth paper AND the generated paper, run the LLM with
references/citation-f1-prompt.md:
inputs:
paper_text: full paper LaTeX or markdown
references_str: numbered reference list (e.g., "1. Vaswani et al. (2017)
Attention Is All You Need. NeurIPS. 2. He et al. (2016)
Deep Residual Learning for Image Recognition. CVPR. ...")
output: JSON {"1": "P0", "2": "P1", "3": "P0", ...}
Save both partitions:
bench/<paper_id>/gt_partition.jsonbench/<paper_id>/gen_partition.json
Step 2: Resolve references to entity IDs and compute F1
The paper uses Semantic Scholar paper IDs to match references between the
two lists. The compute_f1.py script does this deterministically given
two input lists:
python skills/paper-autoraters/scripts/compute_f1.py \
--gt-partition gt_partition.json \
--gt-refs gt_refs.json \
--gen-partition gen_partition.json \
--gen-refs gen_refs.json \
--out f1_report.json
Where gt_refs.json and gen_refs.json are lists of {ref_num, paper_id, title} produced by your host's S2-resolution pass (the same
fuzzy match + S2 verification used by literature-review-agent/scripts/).
Output JSON contains P0 / P1 / overall Precision, Recall, F1.
Literature Review Quality (single paper, 6 axes)
Load references/litreview-quality-prompt.md. Inputs:
- The full paper PDF (or LaTeX/markdown if your host lacks PDF input)
avg_citation_countfor the venue/field (used as the baseline for citation count anchoring, e.g., 58.52 for CVPR 2025, 59.18 for ICLR 2025 per the paper)
The prompt instructs the model to evaluate ONLY the literature-review function of the paper (Introduction + Related Work / Background sections). It produces a strict JSON output with per-axis scores and justifications.
Critical anti-inflation rules baked into the prompt:
| Rule | Cap |
|---|---|
| Default expectation | overall 45-70 |
| > 85 requires strong evidence on ALL axes | — |
| > 90 extremely rare (near-survey-level mastery) | — |
| Any axis < 50 → overall rarely > 75 | — |
| Mostly descriptive review | Critical Analysis ≤ 60 |
| Novelty asserted without comparison | Positioning ≤ 60 |
| Sparse/inconsistent citations | Citation Rigor ≤ 60 |
| Citation count < 50% of avg | Coverage ≤ 55 |
| Citation count > 120% of avg | Coverage = "strong" |
Plus penalty table:
| Penalty | Range |
|---|---|
| Overclaiming novelty | -5 to -15 |
| Missing key recent work | -5 to -15 |
| Mostly descriptive review | -5 to -10 |
| Weak gap statements | -5 to -10 |
| Citation dumping | -5 to -10 |
Save the output to litreview_quality_score.json. The score JSON is the
same shape used by content-refinement-agent/scripts/score_delta.py, so
you can re-use the halt-rule logic to compare iterations.
SxS Overall Paper Quality (side-by-side, full paper)
Load references/sxs-paper-quality-prompt.md. Inputs:
- Two paper PDFs or LaTeX files (call them
paper_1andpaper_2)
The prompt produces a JSON with paper_1_holistic_analysis,
paper_2_holistic_analysis, comparison_justification, and
winner ∈ {paper_1, paper_2, tie}.
To mitigate LLM positional bias (the paper notes this in §5.4), run the comparison twice with the order swapped:
call_1: paper_A → paper_1, paper_B → paper_2 → winner1
call_2: paper_B → paper_1, paper_A → paper_2 → winner2
Final outcome: a win (both calls agree on paper A), tie (one win + one
tie, or two ties), or loss (both agree on paper B). The paper uses this
exact ordering protocol.
SxS Literature Review Quality (side-by-side, Intro+RW only)
Load references/sxs-litreview-prompt.md. Same input/output shape as the
SxS paper quality autorater, but the model is instructed to evaluate
only the Introduction and Related Work / Background sections of each
paper. Same positional-bias mitigation: run twice, swap order.
Resources
references/citation-f1-prompt.md— verbatim P0/P1 partition prompt from App. F.3references/litreview-quality-prompt.md— verbatim 6-axis litreview rubric from App. F.3references/sxs-paper-quality-prompt.md— verbatim SxS paper-quality prompt from App. F.3references/sxs-litreview-prompt.md— verbatim SxS litreview prompt from App. F.3scripts/compute_f1.py— Precision / Recall / F1 from two partition JSONs
Files (paperorchestra)
-
references
-
citation-f1-prompt.md 2.5 KB
# Citation F1 — P0/P1 Partition prompt **Source: arXiv:2604.05018, Appendix F.3, page 58 (verbatim).** Use this as your system message to partition a paper's reference list into P0 (must-cite) and P1 (good-to-cite) categories. Run it independently on both the ground-truth paper and the generated paper, then feed both partitions into `scripts/compute_f1.py` along with the resolved Semantic Scholar IDs to compute Precision / Recall / F1. --- ``` You are an expert academic reviewer. Read the following paper text and analyze its references. Your goal is to categorize the provided references into two priorities: Priority Levels - P0 (Must-Cite): Core citations strictly necessary for the paper. These MUST include: - Baselines directly compared against in experiments - Datasets the paper utilizes or evaluates on - Core methods the paper is directly building upon or modifying - Metrics or standard numbers heavily relied upon and cited from another paper - P1 (Good-To-Have): Supplemental citations. These include: - Standard background references covering broad history - General related work that is not directly competing or built-upon - Minor implementations or utility tools mentioned in passing Paper Text: {paper_text} References List: {references_str} Output Format Please return ONLY a JSON dictionary where the keys are the exact reference numbers (e.g., "1", "2") and the values are either "P0" or "P1". Example output: ```json {{ "1": "P0", "2": "P1", "3": "P0" }} ``` ``` --- ## Substitution | Placeholder | Source | |---|---| | `{paper_text}` | The full LaTeX or markdown text of the paper | | `{references_str}` | The numbered reference list (extracted from `\bibliography{...}` or the References section) | The model returns a JSON dict; the host agent saves it as `gt_partition.json` (for the ground-truth paper) or `gen_partition.json` (for the generated paper). ## How F1 is computed After both partitions exist, the host agent must resolve every numbered reference to a unique Semantic Scholar paper ID (using the same fuzzy match + S2 verification logic as `literature-review-agent/scripts/`). Then: ``` P0_GT = set of S2 IDs from gt refs flagged P0 P0_Gen = set of S2 IDs from gen refs flagged P0 P0_Precision = |P0_GT ∩ P0_Gen| / |P0_Gen| P0_Recall = |P0_GT ∩ P0_Gen| / |P0_GT| P0_F1 = 2 * P / R / (P + R) ``` Same for P1. Overall F1 uses the union of P0 and P1. The deterministic computation lives in `scripts/compute_f1.py`. -
litreview-quality-prompt.md 7.9 KB
# Literature Review Quality Autorater — verbatim prompt **Source: arXiv:2604.05018, Appendix F.3, pages 59–63 (verbatim).** Use this as your system message to score the literature review quality of a single paper draft. Output is a strict JSON object with per-axis scores, penalties, and an overall score. Designed to be conservative — high scores require explicit textual evidence. --- ``` You are an expert, skeptical academic reviewer agent. Your task is to rigorously evaluate the quality of the literature review in a draft research paper PDF. You must be conservative with scoring. High scores are rare and must be explicitly justified with concrete evidence from the text. Assume most drafts are not publication-ready. Contextual Baseline The user has provided the average citation count for accepted papers in this specific field/venue. Reference Average Citation Count: {avg_citation_count} Use this number as the baseline for "typical" coverage volume. Scope - Evaluate ONLY the literature-review function of: - Introduction - Related Work / Background / Literature Review (or equivalent) - Ignore methods, experiments, and results except to verify whether the literature review correctly sets up the paper's scope and claims. Process (Follow Strictly) 1. Identify the paper title. 2. Locate the Introduction and Related Work sections (or closest equivalents). 3. Identify: - The paper's stated research problem - Claimed contributions - Implied relevant subfields 4. Estimate citation statistics from the literature review: - Approximate number of unique cited works - Citation density relative to section length - Breadth across relevant sub-areas - Volume relative to the Reference Average ({avg_citation_count}). 5. For each scoring axis, evaluate ONLY what is explicitly written. - Do NOT infer author intent. - Do NOT reward missing but "expected" knowledge. 6. Apply anti-inflation rules and penalties. 7. Produce output strictly in the JSON schema defined below. - NO extra text before or after the JSON. - All fields must be filled. - Use null if information is genuinely unavailable. Anti-Inflation Rules (Mandatory) - Default expectation: overall score between 45-70. - Scores > 85 require strong evidence across ALL axes. - Scores > 90 are extremely rare and require near-survey-level mastery. - If any axis < 50, overall score should rarely exceed 75. - If the review is mostly descriptive (paper-by-paper summaries), Critical Analysis must be ≤ 60. - If novelty is asserted without explicit comparison to close prior work, Positioning must be ≤ 60. - Sparse or inconsistent citations cap Citation Rigor at ≤ 60. - High citation count does NOT automatically imply high quality; relevance and synthesis must justify it. Scoring Scale (Anchors - Do Not Invent New Ones) - 0-20 = Unacceptable - 21-40 = Weak - 41-55 = Adequate but flawed - 56-70 = Solid - 71-85 = Strong - 86-92 = Excellent - 93-100 = Exceptional (extremely rare) Axes (0-100 Each) Axis 1: Coverage & Completeness - Evaluate: - Breadth across major relevant threads - Inclusion of foundational and recent work - Absence of obvious omissions - Citation volume relative to the Reference Average ({avg_citation_count}) - Citation count anchors (Relative to Reference Average of {avg_citation_count}): - Count is < 50% of Reference: Usually narrow or incomplete (cap ≤ 55 unless field is very small). - Count is 50%-80% of Reference: Minimal acceptable coverage. - Count is 80%-120% of Reference: Solid breadth if well integrated. - Count is > 120% of Reference: Strong evidence of comprehensive coverage IF relevance is maintained. Axis 2: Relevance & Focus - Evaluate: - Alignment of citations with the research problem - Minimal tangents or citation padding - Clear scoping and prioritization of literature Axis 3: Critical Analysis & Synthesis - Evaluate: - Thematic grouping and comparison of approaches - Discussion of tradeoffs, limitations, and open gaps - Evidence of synthesis rather than sequential summaries - Hard cap: ≤ 60 if the review is mostly descriptive. Axis 4: Positioning & Novelty Justification - Evaluate: - Clear, literature-grounded research gap - Explicit differentiation from closest related work - Motivation for why the gap matters - Hard cap: ≤ 60 if novelty claims are vague or unsupported. Axis 5: Organization & Writing Quality - Evaluate: - Logical structure, flow, and signposting - Clarity and precision of academic language - Appropriate subsectioning and definitions Axis 6: Citation Practices, Density & Scholarly Rigor - Evaluate: - Whether key claims are supported by citations - Credibility and consistency of sources - Citation density relative to section length - Balance between foundational and recent work - Hard caps: - Citation count significantly below Reference Average ({avg_citation_count}) for a broad problem: ≤ 55 - High citation count with weak integration: ≤ 65 Penalties (Apply After Axis Scoring) Apply zero or more penalties: - Overclaiming novelty without close comparison: -5 to -15 - Missing key recent work (if detectable): -5 to -15 - Mostly descriptive review with weak synthesis: -5 to -10 - Weak or generic gap statements: -5 to -10 - Citation dumping or consistency issues: -5 to -10 Optional Positive Adjustment (Rare) You MAY apply a small positive adjustment (+3 to +7 total points) ONLY IF: - Citation count is substantially higher (> 150%) than the Reference Average ({avg_citation_count}) - Citations are relevant and distributed across subtopics - Review remains synthesized and focused - Critical Analysis score > 60 AND Relevance score > 65 Do NOT apply this adjustment otherwise. Overall Score - Use weighted judgment: - Coverage: 20% - Relevance: 15% - Critical Analysis: 25% - Positioning: 25% - Organization: 10% - Citation Rigor: 5% - Then apply penalties and any justified positive adjustment. - Sanity-check against anti-inflation rules. Output Format (Strict JSON Only) Return exactly the following JSON structure and nothing else: ```json {{ "paper_title": string | null, "citation_statistics": {{ "estimated_unique_citations": number, "citation_density_assessment": "low" | "appropriate" | "high", "breadth_across_subareas": "narrow" | "moderate" | "broad", "comparison_to_baseline": string, "notes": string }}, "axis_scores": {{ "coverage_and_completeness": {{ "score": number, "justification": string }}, "relevance_and_focus": {{ "score": number, "justification": string }}, "critical_analysis_and_synthesis": {{ "score": number, "justification": string }}, "positioning_and_novelty": {{ "score": number, "justification": string }}, "organization_and_writing": {{ "score": number, "justification": string }}, "citation_practices_and_rigor": {{ "score": number, "justification": string }} }}, "penalties": [ {{ "reason": string, "points_deducted": number }} ], "summary": {{ "strengths": [string], "weaknesses": [string], "top_improvements": [string] }}, "overall_score": number }} ``` Justification Constraints - Each justification: 2-5 sentences, evidence-based. - Do NOT quote more than 25 total words from the paper. - If evidence is missing, explicitly state: "Not evidenced in the text." ``` --- ## Substitution | Placeholder | Source | |---|---| | `{avg_citation_count}` | Average citation count for accepted papers in the target venue. The paper uses 58.52 for CVPR 2025 and 59.18 for ICLR 2025 (Table 8). For other venues, look it up from the venue's recent published papers. | -
sxs-litreview-prompt.md 2.3 KB
# SxS Literature Review Quality Autorater — verbatim prompt **Source: arXiv:2604.05018, Appendix F.3, pages 64–65 (verbatim).** Use this as your system message to perform a side-by-side preference comparison of just the literature review (Introduction + Related Work) sections of two papers. Run twice with order swapped to mitigate positional bias. --- ``` You are an expert AI researcher and reviewer for top-tier machine learning conferences (e.g., CVPR, NeurIPS, ICLR). Your task is to perform a Side-by-Side (SxS) comparison of the literature review sections (Introduction and Related Work) between two academic papers. The ordering of the papers is arbitrary and does not indicate quality. Evaluate each paper independently before comparing them. Do not base your decision solely on length or verbosity. Critical Evaluation Criteria 1. Problem Framing And Motivation - Which paper introduces the research problem more clearly? - Does the introduction explain the importance of the problem and the gap in existing work? 2. Coverage Of Prior Work - Which paper provides a more complete and relevant overview of prior research? 3. Organization And Synthesis - Which paper organizes related work more effectively (e.g., grouping by themes or approaches)? - Does it synthesize prior work rather than simply listing papers? 4. Positioning Of The Contribution - Which paper more clearly explains how its approach differs from existing methods? 5. Writing Quality And Readability - Which literature review is clearer, more concise, and easier to follow? Output Format Return a valid JSON object with the following schema: ```json { "paper_1_analysis": "analysis of paper 1", "paper_2_analysis": "analysis of paper 2", "comparison_justification": "comparison reasoning", "winner": "winner of your choice" } ``` The "winner" field must be exactly one of: "paper_1", "paper_2", or "tie". ``` --- ## Inputs This autorater needs only the **Introduction and Related Work** sections of each paper, NOT the full document. The host agent should: 1. Extract Intro + Related Work from both papers (LaTeX section commands or PDF section detection). 2. Pass them as `paper_1` and `paper_2`. 3. Run twice, swapping order, to mitigate positional bias (see `sxs-paper-quality-prompt.md` for the protocol). -
sxs-paper-quality-prompt.md 3.4 KB
# SxS Overall Paper Quality Autorater — verbatim prompt **Source: arXiv:2604.05018, Appendix F.3, pages 63–64 (verbatim).** Use this as your system message to perform a side-by-side preference comparison between two paper drafts. To mitigate positional bias, run the comparison TWICE with the paper order swapped, then aggregate. --- ``` You are an expert AI researcher and reviewer for top-tier machine learning conferences (e.g., CVPR, NeurIPS, ICLR). Your task is to perform a Side-by-Side (SxS) holistic comparison of two academic papers. The two papers describe the same or highly similar research ideas. Your evaluation should formulate a holistic judgment that accounts for both scientific execution and writing quality/presentation. The ordering of the papers is arbitrary and does not indicate quality. Evaluate each paper independently before comparing them. Do not base your decision solely on length or verbosity. Critical Evaluation Criteria 1. Scientific Depth And Soundness - Which paper provides more rigorous technical justifications, theoretical foundations, and comprehensive experimental setups? 2. Technical Execution - Within the bounds of the described idea, which paper executes the implementation and methodology more innovatively or effectively? 3. Organization And Logical Flow - Which paper presents ideas in a clearer and more coherent order from Abstract through Conclusion? - Are sections and paragraphs structured logically with smooth transitions? 4. Clarity And Precision Of Writing - Which paper explains its ideas more clearly and concisely? - Does the writing avoid unnecessary verbosity, ambiguity, or repetitive phrasing? 5. Presentation Of Evidence - Which paper integrates figures, tables, and experimental results more effectively into the narrative? - Are visuals clearly referenced and explained in the text? 6. Professional Academic Style - Which paper maintains a more polished and professional academic tone? - Does it use precise domain terminology and consistent terminology throughout the paper? Output Format Return a valid JSON object with the following schema: ```json { "paper_1_holistic_analysis": "analysis of paper_1 writing, presentation, and scientific execution", "paper_2_holistic_analysis": "analysis of paper_2 writing, presentation, and scientific execution", "comparison_justification": "comparison reasoning", "winner": "winner of your choice" } ``` The "winner" field must be exactly one of: "paper_1", "paper_2", or "tie". ``` --- ## Positional bias mitigation protocol The paper notes (§5.4): "human preferences correlate strongly with our GPT-5 evaluator for Overall Quality (Pearson r = 0.6458, Spearman ρ = 0.6355). Literature review correlation is lower due to inherent LLM self-bias." To get a robust SxS verdict, run the comparison twice: ``` Call 1: paper_A → paper_1, paper_B → paper_2, result1 Call 2: paper_B → paper_1, paper_A → paper_2, result2 normalize both results to "A wins" / "B wins" / "tie", then: Final outcome: - WIN for A: A wins in both calls - LOSS for A: B wins in both calls - TIE: one win + one tie, or two ties, or A wins one + B wins one ``` The paper uses this exact protocol — see §5.2 "(2) SxS Paper Quality" description.
-
-
scripts
-
compute_f1.py 3.6 KB
#!/usr/bin/env python3 """ compute_f1.py — Compute Precision / Recall / F1 for citation matching between a ground-truth paper and a generated paper, partitioned by P0 (must-cite) and P1 (good-to-cite). Implements the Citation F1 metric from arXiv:2604.05018, §5.2 "Citation F1" — uses Semantic Scholar paper IDs to match references between the two lists. Inputs: --gt-partition JSON dict {ref_num: "P0"|"P1"} from the autorater for the GT paper --gt-refs JSON list [{ref_num, paper_id, title}] for the GT references --gen-partition same shape, for the generated paper --gen-refs same shape, for the generated references Output: JSON report at --out with P0 / P1 / overall P / R / F1. Usage: python compute_f1.py \\ --gt-partition gt_partition.json \\ --gt-refs gt_refs.json \\ --gen-partition gen_partition.json \\ --gen-refs gen_refs.json \\ --out f1_report.json """ import argparse import json import sys def precision_recall_f1(gt_set: set[str], gen_set: set[str]) -> dict: if not gen_set and not gt_set: return {"precision": 0.0, "recall": 0.0, "f1": 0.0, "n_gt": 0, "n_gen": 0, "n_intersection": 0} intersection = gt_set & gen_set p = len(intersection) / len(gen_set) if gen_set else 0.0 r = len(intersection) / len(gt_set) if gt_set else 0.0 f1 = 2 * p * r / (p + r) if (p + r) > 0 else 0.0 return { "precision": round(p, 4), "recall": round(r, 4), "f1": round(f1, 4), "n_gt": len(gt_set), "n_gen": len(gen_set), "n_intersection": len(intersection), } def build_id_set(refs: list[dict], partition: dict[str, str], wanted: set[str]) -> set[str]: """Return the set of S2 paper IDs whose ref_num falls into one of the wanted partitions (e.g., {"P0"}).""" ids: set[str] = set() for ref in refs: num = str(ref.get("ref_num")) pid = ref.get("paper_id") or ref.get("paperId") if not pid: continue if partition.get(num) in wanted: ids.add(str(pid)) return ids def main() -> int: p = argparse.ArgumentParser(description=__doc__) p.add_argument("--gt-partition", required=True) p.add_argument("--gt-refs", required=True) p.add_argument("--gen-partition", required=True) p.add_argument("--gen-refs", required=True) p.add_argument("--out", required=True) args = p.parse_args() try: gt_part = json.load(open(args.gt_partition)) gt_refs = json.load(open(args.gt_refs)) gen_part = json.load(open(args.gen_partition)) gen_refs = json.load(open(args.gen_refs)) except (OSError, json.JSONDecodeError) as e: print(f"ERROR: failed to load inputs: {e}", file=sys.stderr) return 1 p0_gt = build_id_set(gt_refs, gt_part, {"P0"}) p0_gen = build_id_set(gen_refs, gen_part, {"P0"}) p1_gt = build_id_set(gt_refs, gt_part, {"P1"}) p1_gen = build_id_set(gen_refs, gen_part, {"P1"}) all_gt = p0_gt | p1_gt all_gen = p0_gen | p1_gen report = { "P0": precision_recall_f1(p0_gt, p0_gen), "P1": precision_recall_f1(p1_gt, p1_gen), "overall": precision_recall_f1(all_gt, all_gen), } with open(args.out, "w") as f: json.dump(report, f, indent=2) for name, m in report.items(): print(f"{name:8s} P={m['precision']:.3f} R={m['recall']:.3f} F1={m['f1']:.3f} " f"(intersect={m['n_intersection']}/gen={m['n_gen']}/gt={m['n_gt']})") return 0 if __name__ == "__main__": sys.exit(main())
-
-
SKILL.md 6.4 KB
--- name: paper-autoraters description: Run the four paper-quality autoraters from PaperOrchestra (arXiv:2604.05018, App. F.3) — Citation F1 (P0/P1 partition + Precision/Recall/F1), Literature Review Quality (6-axis 0-100 with anti-inflation rules), SxS Overall Paper Quality (side-by-side), and SxS Literature Review Quality (side-by-side). TRIGGER when the user asks to "score this paper draft", "evaluate against the benchmark", "compare two papers", or "run the autoraters". --- # Paper Autoraters (App. F.3) Faithful implementation of the four LLM-as-judge autoraters used in PaperOrchestra (Song et al., 2026, arXiv:2604.05018, §5 and App. F.3). These are the metrics the paper uses to demonstrate that PaperOrchestra beats single-agent and AI-Scientist-v2 baselines. Use them to: 1. Score a generated paper against a ground-truth paper. 2. Compare two paper-writing pipelines side-by-side. 3. Validate your own host-agent execution of the paper-orchestra pipeline. ## The four autoraters | Autorater | What it does | Inputs | Output | |---|---|---|---| | **Citation F1 — P0/P1 partition** | Partitions reference list into P0 (must-cite) and P1 (good-to-cite) given the paper text | one paper text + its references list | JSON `{ref_num: "P0"\|"P1"}` | | **Literature Review Quality** | 6-axis 0-100 score for Intro+Related Work, with anti-inflation hard caps | one paper PDF/text + reference avg citation count | JSON with `axis_scores`, `penalties`, `summary`, `overall_score` | | **SxS Overall Paper Quality** | Holistic side-by-side preference judgment | two papers (PDF or text) | JSON with `winner` ∈ {paper_1, paper_2, tie} | | **SxS Literature Review Quality** | Side-by-side preference, Intro+Related Work only | two papers | JSON with `winner` ∈ {paper_1, paper_2, tie} | The paper uses Gemini-3.1-Pro and GPT-5 as judges, set to temperature 0.0 (Gemini) or default 1.0 (GPT-5, which doesn't allow temperature adjustment). Use whatever your host LLM is. ## Workflow ### Citation F1 (compute Precision / Recall / F1 vs ground truth) This is a two-step procedure: #### Step 1: Partition the reference lists into P0 / P1 For both the ground-truth paper AND the generated paper, run the LLM with `references/citation-f1-prompt.md`: ``` inputs: paper_text: full paper LaTeX or markdown references_str: numbered reference list (e.g., "1. Vaswani et al. (2017) Attention Is All You Need. NeurIPS. 2. He et al. (2016) Deep Residual Learning for Image Recognition. CVPR. ...") output: JSON {"1": "P0", "2": "P1", "3": "P0", ...} ``` Save both partitions: - `bench/<paper_id>/gt_partition.json` - `bench/<paper_id>/gen_partition.json` #### Step 2: Resolve references to entity IDs and compute F1 The paper uses Semantic Scholar paper IDs to match references between the two lists. The `compute_f1.py` script does this deterministically given two input lists: ```bash python skills/paper-autoraters/scripts/compute_f1.py \ --gt-partition gt_partition.json \ --gt-refs gt_refs.json \ --gen-partition gen_partition.json \ --gen-refs gen_refs.json \ --out f1_report.json ``` Where `gt_refs.json` and `gen_refs.json` are lists of `{ref_num, paper_id, title}` produced by your host's S2-resolution pass (the same fuzzy match + S2 verification used by `literature-review-agent/scripts/`). Output JSON contains P0 / P1 / overall Precision, Recall, F1. ### Literature Review Quality (single paper, 6 axes) Load `references/litreview-quality-prompt.md`. Inputs: - The full paper PDF (or LaTeX/markdown if your host lacks PDF input) - `avg_citation_count` for the venue/field (used as the baseline for citation count anchoring, e.g., 58.52 for CVPR 2025, 59.18 for ICLR 2025 per the paper) The prompt instructs the model to evaluate ONLY the literature-review function of the paper (Introduction + Related Work / Background sections). It produces a strict JSON output with per-axis scores and justifications. Critical anti-inflation rules baked into the prompt: | Rule | Cap | |---|---| | Default expectation | overall 45-70 | | > 85 requires strong evidence on ALL axes | — | | > 90 extremely rare (near-survey-level mastery) | — | | Any axis < 50 → overall rarely > 75 | — | | Mostly descriptive review | Critical Analysis ≤ 60 | | Novelty asserted without comparison | Positioning ≤ 60 | | Sparse/inconsistent citations | Citation Rigor ≤ 60 | | Citation count < 50% of avg | Coverage ≤ 55 | | Citation count > 120% of avg | Coverage = "strong" | Plus penalty table: | Penalty | Range | |---|---| | Overclaiming novelty | -5 to -15 | | Missing key recent work | -5 to -15 | | Mostly descriptive review | -5 to -10 | | Weak gap statements | -5 to -10 | | Citation dumping | -5 to -10 | Save the output to `litreview_quality_score.json`. The score JSON is the same shape used by `content-refinement-agent/scripts/score_delta.py`, so you can re-use the halt-rule logic to compare iterations. ### SxS Overall Paper Quality (side-by-side, full paper) Load `references/sxs-paper-quality-prompt.md`. Inputs: - Two paper PDFs or LaTeX files (call them `paper_1` and `paper_2`) The prompt produces a JSON with `paper_1_holistic_analysis`, `paper_2_holistic_analysis`, `comparison_justification`, and `winner ∈ {paper_1, paper_2, tie}`. To mitigate LLM positional bias (the paper notes this in §5.4), run the comparison **twice** with the order swapped: ``` call_1: paper_A → paper_1, paper_B → paper_2 → winner1 call_2: paper_B → paper_1, paper_A → paper_2 → winner2 ``` Final outcome: a `win` (both calls agree on paper A), `tie` (one win + one tie, or two ties), or `loss` (both agree on paper B). The paper uses this exact ordering protocol. ### SxS Literature Review Quality (side-by-side, Intro+RW only) Load `references/sxs-litreview-prompt.md`. Same input/output shape as the SxS paper quality autorater, but the model is instructed to evaluate **only** the Introduction and Related Work / Background sections of each paper. Same positional-bias mitigation: run twice, swap order. ## Resources - `references/citation-f1-prompt.md` — verbatim P0/P1 partition prompt from App. F.3 - `references/litreview-quality-prompt.md` — verbatim 6-axis litreview rubric from App. F.3 - `references/sxs-paper-quality-prompt.md` — verbatim SxS paper-quality prompt from App. F.3 - `references/sxs-litreview-prompt.md` — verbatim SxS litreview prompt from App. F.3 - `scripts/compute_f1.py` — Precision / Recall / F1 from two partition JSONs
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.