Virtual CRISPR Code and benchmark datasets for predicting CRISPR screen results with LLMs, as described in "Virtual CRISPR: Can LLMs Predict CRISPR Screen Results?" for the BioNLP workshop at ACL 2025 (link to paper).
| Model | AUROC | AUPRC | F1 | FPR | PPV | NPV | Sens. | Spec. |
|---|---|---|---|---|---|---|---|---|
| GPT-4o (prompting) | N/A | N/A | 0.35 ± 0.17 | 0.79 ± 0.19 | 0.32 ± 0.14 | 0.23 ± 0.13 | 0.41 ± 0.22 | 0.21 ± 0.19 |
| Raw Emb. | 0.89 | 0.86 | 0.84 | 0.15 | 0.85 | 0.83 | 0.83 | 0.85 |
| Summ. Emb. | 0.72 | 0.69 | 0.67 | 0.26 | 0.71 | 0.67 | 0.64 | 0.74 |
Performance on the Difficult CRISPR screen benchmark. Compares the embedding-based classifier using embeddings of raw text (Raw Emb.) or embeddings of GPT-4o summaries (Summ. Emb.) against GPT-4o direct prompting (results aggregated across prompting strategies). Standard classification metrics reported. GPT-4o prompting gives binary outputs and thus AUROC and AUPRC are undefined. Best model highlighted. Please see our paper for further details.
@inproceedings{song2025virtual,
title={Virtual CRISPR: Can LLMs Predict CRISPR Screen Results?},
author={Song, Steven and Abdrabou, Abdalla and Dabholkar, Asmita and Day, Kastan and Dharmoju, Pavan and Perera, Jason and Kindratenko, Volodymyr and Khan, Aly A},
booktitle={Proceedings of the 24th Workshop on Biomedical Language Processing},
pages={354--364},
year={2025}
}
conda env create -f env.yml
conda activate crisprAll data for benchmarking and prompting is contained within this repository.
Additional data download is necessary for training or inferencing embedding based models. Expand this section for more details.
Source data and precomputed LLM-derived embeddings can be downloaded from here: https://uchicago.box.com/s/4663twrg8j1l5n1hrp74oyiikjjqv6sr.
Pretrained model weights for the embedding-based classifiers can be downloaded from here: https://uchicago.box.com/s/jqrnz0570m6lpqc1lqnagig2fyi56uo6.
Extract the contents of the tarballs under embedding/. The resulting folder structure should be:
<repo_root>
├── benchmarks
├── embedding
│ ├── configs
│ ├── data # source data and precomputed embeddings
│ │ ├── embeddings
│ │ ├── eval
│ │ ├── screens
│ │ ├── summaries
│ │ └── terms
│ ├── runs # pretrained model weights
│ │ ├── classifier-summarized
│ │ └── classifier-unsummarized
| └── [...]
└── [...]
- Benchmarks: Benchmarks for in-silico CRISPR screen prediction task.
- Data and utilities for loading prepared benchmarks.
- Prompting: Prediction via prompting of LLMs.
- Run scripts for prompting models served locally, by OpenAI, or other custom providers.
- Source code and prompt templates for prompting LLMs.
- Notebooks for computing evaluation metrics and generating plots.
- Embedding: Training and inferencing models using LLM-derived embeddings.
- Utilities for extracting, summarizing, and embedding training data derived from BioGRID-ORCS (numbered notebooks/scripts in
embedding/preprocessing). - Source code and training configurations for training different embedding based models. Configurations in
embedding/configs. Train using:cd embedding python src/train.py fit --config <config_file>
- Notebooks for inferencing, computing evaluation metrics, and generating plots.
- Use
embedding/infer.ipynbas a starting point for inferencing.
- Utilities for extracting, summarizing, and embedding training data derived from BioGRID-ORCS (numbered notebooks/scripts in
Reference genomes were downloaded from NCBI (columns were manually renamed after download to align across data):
datasets summary gene taxon "homo sapien" --as-json-lines | dataformat tsv gene --fields symbol,gene-id,gene-type > genome_homo_sapiens.tsv
datasets summary gene taxon "mus musculus" --as-json-lines | dataformat tsv gene --fields symbol,gene-id,gene-type > genome_mus_musculus.tsv- Prompting:
llama-2changedsystemroles touserfor messages and merged multiple consecutive messages from single role into single messageo1-minichangedsystemroles touserfor messageso1ando1-minido not allow explicit chain-of-thought and sampled with specific parameters- OpenAI models run with 4 parallel requests
- local Llama models run with 32 parallel requests
- 70B models served with vLLM tensor-parallel across 2x A100 80GBs with flags as-above to make models fit with otherwise default parameters
- all other local models served with vLLM on single A100 80GB with default parameters
