Sequential Experimental Design · CRISPR Screens · Genentech · 2026

Biology-in-the-loop: Amortized Adaptive Hit Discovery in CRISPR Screens

Carl Edwards, Edward De Brouwer, Xiner Li, Namkyeong Lee, Ehsan Hajiramezanali, Anne Biton, Sara Mostafavi, Gabriele Scalia

Genentech, South San Francisco, CA, USA  ·  ★ equal contribution

TL;DR. We construct AssayBench-Loop, a large-scale benchmark for adaptive hit discovery comprising over one thousand CRISPR screens. We equip AssayBench-Loop with dedicated metrics that account for hit-rate heterogeneity and incomplete ground truth data. We then train AssayFormer, a transformer-based amortized acquisition policy that excels at in-context learning and generalizes across phenotypes. We combine AssayFormer with an LLM handoff strategy, leading to AssayLoop, achieving state-of-the-art performance on adaptive hit discovery.
Try it yourself! Run the model in-browser

Hits recovered against genes acquired. Ten rounds of a hundred genes. The dashed line is chance: what picking genes at random recovers. See the full recovery curves →

You can only test a hundred genes at a time, and testing all 20,000 genes is expensive; how do you pick the genes most likely to be hits without testing everything? LLMs know a lot of biology but learn from experimental feedback poorly. Classical sequential design learns from feedback but starts from nothing. AssayLoop hands the screen from one to the other: an LLM picks the first rounds, then a policy trained across a thousand historical screens takes over.

A screen is a library of genes, a phenotype and a hit set; a method picks 100 genes per round for ten rounds.
The task. A screen is a library of genes, a phenotype, and a hit set. Each round, a method sees the phenotype and everything it has already assayed with its outcome, and must choose the next hundred genes. Ten rounds, then the score.

Abstract

Many biological discovery problems require experiments to be selected sequentially under constrained budgets. CRISPR screening is a prominent example, as exhaustive perturbation testing is often infeasible and candidate perturbations must instead be prioritized over multiple experimental rounds. Despite the importance of this problem, existing benchmarks for adaptive hit discovery remain limited in scale and diversity. Here, we introduce AssayBench-Loop, a large-scale benchmark for adaptive hit discovery comprising 1,389 CRISPR screens across five phenotype categories. Beyond enabling systematic evaluation, the scale of AssayBench-Loop makes it possible to learn acquisition strategies across historical experiments. Building on this resource, we introduce AssayLoop, a new acquisition policy for adaptive hit discovery that combines the strengths of large language models and a trained policy. At the core of AssayLoop is AssayFormer, a transformer-based amortized acquisition policy trained across historical screens to transfer screening strategies to new assays while adapting to observations collected during the current experiment. AssayLoop complements this learned policy with language-model-derived biological priors through an adaptive handoff strategy, using LLM guidance for early-round prioritization before transitioning to the learned policy; we further show with AssayLLM, a domain-specific post-trained LLM, that sequential acquisition capabilities can be transferred to smaller models. On temporally held-out screens, AssayLoop achieves a 5.67-fold enrichment over random selection and recovers 27.7% of hits after assaying only approximately 5% of the candidate library, outperforming existing adaptive-design methods, standalone LLMs, and AssayFormer alone. These results demonstrate the value of learning acquisition policies across historical experiments and combining them with broad biological priors for efficient active hit discovery.

Headline findings

By the numbers

27.7%
Hits found at 5% of library acquired
57
Methods compared
1,349
Training screens
10 × 100
Rounds × genes per round
21,147
Candidate genes to choose from
8
Evaluation metrics

A benchmark built for transfer

The held-out screens are deliberately unlike the historical screens used for training, hit frequencies are strongly long-tailed, and assay hit rates span several orders of magnitude. Together, these properties make the benchmark a test of transfer and adaptation rather than memorization of familiar screens or universally frequent hits.

Three benchmark-characterization panels showing nearest-screen hit-set overlap, the long-tailed frequency with which genes are hits, and the unnormalized number of screens across hit rates.
Figure 2E–G: benchmark characterization. Test screens have little hit-set overlap with their nearest training neighbor (E); historical hit frequency has a pronounced long tail dominated at its head by common-essential genes (F); and screen hit rates vary by orders of magnitude (G). Panel G reports raw screen counts rather than a normalized density.

Explore

Getting started

Score your own policy

pip install assaybench

That gives you the screen data and the metric functions for evaluation. Everything between is your method.

from assaybench import AssayBenchDataset, adjusted_nauc, enrichment_factor, load_manifest

# The paper's test set: 20 genome-wide screens, curated and shipped with the package.
wanted = {s["dataset_name"] for s in load_manifest("assayloop-test").screens}
_, _, test = AssayBenchDataset(dataset_name="biogrid", split_type="year", fold=0) \
    .get_train_test_split()
screen = next(s for s in test if s["dataset_name"] in wanted)

library = screen["relevance_genes"]
hits = [g for g, is_hit in zip(library, screen["hit"]) if is_hit]

# Your policy. Ten rounds of 100 genes; the labels for a round are revealed
# before the next one is proposed.
rounds = my_policy(screen, n_rounds=10, batch_size=100)
acquired = [gene for batch in rounds for gene in batch]

print(enrichment_factor(acquired, library, hits, budget=1000))
print(adjusted_nauc(rounds, library, hits))

Reproduce the paper

The AssayFormer architecture, the GRPO training loop, the LLM harness and the handoff live here.

git clone https://github.com/Genentech/AssayLoop
cd assayloop
pip install -e .

# Re-run a method on the same 20 screens.
assayloop run --screen-set paper_test --model assayformer