Stage 05 · SpecialtiesModule 22 of 26~6h

Research & Academia

Literature review and writing assistance for researchers.

← All modules in this stage

Research is one of the few places where "did you make this up?" is a career-ending question. Claude can dramatically speed up reading, summarising, structuring, and drafting — if you keep a hard line between what's in your sources and what the model thinks.

By the end of this module you'll have

Time: about 1.5 hours for the basics, ~6 hours with all three notebooks.

Prerequisites: Modules 9 (RAG), 13 (content creation), 15 (advanced reasoning).


The non-negotiable rule

Every claim must be traceable to a source you've read. If Claude writes a sentence with no citation, treat it as unsupported. The patterns below all enforce this.

This isn't a stylistic preference — it's the difference between research and "AI-generated text that looks like research".


Recipe 1 · Summarise a paper, with citations to its own sections

from anthropic import Anthropic
from dotenv import load_dotenv

load_dotenv()
client = Anthropic()

paper_text = open("paper.txt").read()    # or PDF -> text via your favourite extractor

response = client.messages.create(
    model="claude-sonnet-4-6", max_tokens=900,
    system=(
        "You are a careful research assistant. Summarise the paper below. "
        "For every factual claim in your summary, append a section reference in brackets, "
        "e.g. [§3.2] or [Abstract]. If you cannot find a section reference, do NOT make the claim. "
        "Output: 6 bullet points covering: question, method, data, key result, limitations, future work."
    ),
    messages=[{"role": "user", "content": paper_text}],
)
print(response.content[0].text)

You should see bullets like "Method: a transformer with rotary positional embeddings [§3.1]". Sentences without references shouldn't exist; if they do, that's a sign to push back on the prompt or distrust the model.


Recipe 2 · Literature triage

When you have 30 candidate papers and no time, you don't read them all. You triage — figure out which 5 to read in depth.

def triage(title: str, abstract: str, my_focus: str) -> dict:
    response = client.messages.create(
        model="claude-haiku-4-5-20251001", max_tokens=200,
        system=(
            "You are screening papers for a literature review. Output one JSON object with: "
            '{"relevance": "high"|"medium"|"low", '
            '"why":     short string referencing the abstract, '
            '"open_q":  one open question this paper might help answer or "n/a"}'
            "Use only what's in the abstract. Do not invent details."
        ),
        messages=[{
            "role": "user",
            "content": f"MY FOCUS: {my_focus}\n\nTITLE: {title}\n\nABSTRACT: {abstract}",
        }],
    )
    import json
    return json.loads(response.content[0].text)

# Run over your bibliography; sort by relevance.

This is a filter, not a substitute for reading. The "high" pile is what you read carefully. The "low" pile is parked. The triage saves the read time, not the reading.


Recipe 3 · Related-work paragraph

You have a stack of papers you've read and notes on each. You need a tightly-cited paragraph for your introduction.

notes = """\
[Smith 2024] showed that X improves Y by Z%.
[Patel 2025] argued the opposite — that the gain disappears with proper controls.
[Lee 2023] introduced the dataset everyone now uses; reported strong baselines.
"""

related = client.messages.create(
    model="claude-opus-4-7", max_tokens=400,
    system=(
        "Draft a related-work paragraph (≤180 words) for the introduction of a research paper. "
        "Cite every claim with the bracketed handle from the notes (e.g. [Smith 2024]). "
        "Do NOT add citations not present in the notes. Do NOT make claims the notes don't support."
    ),
    messages=[{"role": "user", "content": "Notes I have:\n" + notes}],
).content[0].text

print(related)

The output uses the citation handles you supplied. If a model invents [Jones 2024], that's an easy automated check (regex against the supplied handles).


Recipe 4 · Peer-review reply

Replying to reviewers is its own skill. The template is brutally consistent.

review = """\
Reviewer 2: 'The experiments only use one dataset. The claims of generality are unjustified.'
"""

response_letter = client.messages.create(
    model="claude-sonnet-4-6", max_tokens=400,
    system=(
        "You are drafting a polite, substantive reviewer response. Format: "
        "1) Restate the concern in one sentence. "
        "2) Acknowledge specifically what is fair. "
        "3) Describe the concrete change made (or rebut, with evidence). "
        "4) Point to the new section/figure. "
        "Do not invent experiments; if asked to add one, write [TODO: run X]."
    ),
    messages=[{"role": "user", "content": review}],
).content[0].text

print(response_letter)

The [TODO: run X] rule keeps you honest. The model is drafting language, not committing you to experiments you haven't run.


Things to never do

Don't Because
Ask Claude to "find papers on X" It will invent realistic-looking ones (wrong years, wrong authors). Use a real search engine.
Paste your draft and ask for a "punch-up" without a voice guide Your tone will drift toward generic academic-ese.
Trust a literature summary for citations Even with the citation rule, sample-check before building on it.
Use a paper-only prompt to fact-check a claim The model can only check against what's in the prompt. Wider claims need a real source check.
Submit text containing "[TODO]" markers They survive. They get noticed.

Try changing one thing


Going deeper: open the notebooks


Module checklist


Next module

Module S3 · Creative Writing — different rules entirely, because invention is the point.