The job: say which concepts each abstract touches — the Disease Ontology's … disease concepts, and the Human Phenotype Ontology's … phenotype terms. The usual route is a trained NER+linking stack. This run replaces it with one yes/no question per concept.
The instrument: Jev, a System One model. It generates no text. We give it the document and a prompt asking whether the abstract touches on each ontology concept. A calibrated probability comes back for each concept, and code branches on it.
No NER stack, no linking step, no graph store. Each term is one yes/no question against the text — … per document for DOID, … for HPO. Prompt used for TypeSafe's noul mapping:
# one Noul question per ontology term, ~100 per API call state = { "document": abstract_text } question("DOID_0014667"): noul instructions: Does `document` mention, describe, or clearly imply the concept 'disease of metabolism' — A disease that involves errors in metabolic processes? Synonymous wording counts; negation does not. # HPO identical but for the term, e.g. HP_0002643 'Neonatal respiratory distress'
Jev has three question types:
These runs are all Noul, so outputs drop straight into a threshold.
The rule: not "what is this document about?" but one atomic gut-check per concept. Anything bigger gets split.
Second opinion. Jev mapped. A second pass re-read each abstract and judged every match yes / maybe / no — the colored cells in Part 3. It said "no" to … of the DOID matches and … of the HPO matches. The mapper is fast and broad (~800–1,000 questions/s); the checker is slow (~3 verdicts/s) and can say why.
The crosswalk, in code. Jev found a disease in the abstract (left, blue). The ontology files already carry that disease's curated symptom list. Side by side you see which known symptoms Jev rediscovered from 200 words and which findings the record lacks. Dashed rows are candidates to fill the record in. No model does the walking — it is a few lines of Python over the ontology files.
Doesn't PubMed already do this? Its MeSH keywords are broad article-level topics assigned by humans, often months late. Each abstract below shows its real headings. MeSH has ~30,000 descriptors and almost none of HPO's ~20,000 phenotypes. That's the gap.
Pick an abstract. You see its text, its MeSH indexing, and both ontologies' decisions side by side. Cell colors are the second-opinion ("Kimi check") verdicts. Hover for the reason. Search filters to articles that have the term.
I ran ontology concept mapping on 20 PubMed sample abstracts (title + abstract text, 30k character limit).
Supplemental — batch-size scaling
Why doesn't the clock move? Not cluster MapReduce — the parallelism is inside the architecture. An LLM would emit each answer token by token; Jev's parallel sampler produces every answer in a single query, against a state read once. TypeSafe's launch post calls the intended use "map-reducing over big data" — the shape is theirs, the cluster isn't needed. (A request's ~32k-token budget, shared by state and questions, is why these runs batch at 100.)
ontology-jev — ontology.py, fetch_pubmed.py, run_experiment.py,
batch_scaling.py, aggregate_results.py, crosswalk.py, fetch_mesh.py.
jev-1.13.0; $0.042/Mtok input, output free).esearch/efetch), query "rare genetic disease clinical phenotype", 20 abstracts.