groundnote

A doctor–patient conversation goes in. A sectioned clinical note comes out, and every clause is checked against the transcript.

The model has 239M parameters, and every weight was trained from scratch: pretrained on 3.0B tokens of FineWeb-Edu, then fine-tuned on clinical conversations. The checker underlines each clause of the note:

words found in transcript not found in transcript contradicts transcript unclear

The checker is lexical. It flags some inventions, and green means lexical overlap only. On the real knee visit it passed pain on the wrong side of the knee, and it flagged a correct "denies numbness" as a contradiction.

It was built for one failure in particular. The patient says "No, it doesn't" to "Has your knee locked?", and a small model writes "the knee locked".

Try it live →Paste a transcript and get the checked note. The model runs in your browser, so your text never leaves the page. The first run downloads about 480 MB.

Examples

The two benchmark visits come from held-out test sets the model never trained on, and were picked by a fixed rule, not for looks. Hover over a clause to see the transcript turn it rests on.

"Has your knee locked?" "No, it doesn't." A short fictional visit built around the classic failure. The model writes "denies locking", which is correct, and the checker flags the one clause it got backwards (instability). It invents the patient's age. Two correct clauses are marked not found because they are paraphrased ("BID" for "twice a day"). 10 s on a CPU. Hand numbness visit, in-domain The first synthetic test encounter that mentions the word "knee" (here only in passing). This is the same kind of conversation the model trained on, and the note has no factual errors we could find. The amber clauses are paraphrases the lexical checker cannot match. 10 s on a CPU. Knee visit, real benchmark ACI-Bench test1 D2N126. On real conversations the model invents details: a basketball injury instead of skiing, "denies hearing a pop" when the knee popped, a walking boot. The checker marks those not found, but it marks pain on the medial side green when the patient said the outside. 48 s on a CPU.

Numbers

Held-out test setROUGE-1Clauses not found in transcript
model / gold note
ACI-Bench test1, real visits (40)48.471% / 37%
Synthetic, in-domain (200)88.625% / 23%

On synthetic visits, 3.2% of the facts the patient denied still appear in the note as present. Reranking four samples with the checker brings that to 2.9%.

A full note takes a median 32 s (21–46 s) on a 4-core CPU.

Honest status: the model gets the note's structure and most facts right on the kind of conversation it trained on, but it still hallucinates on real ones. The gap between 71% and 37% is the problem this project measures and works on. The 239M model replaced an earlier 97.5M one (84%, 7.6%) after it beat it on all three measures of a bar fixed in advance.

Run it yourself

The code is MIT-licensed and the weights are CC BY 4.0. It runs offline on your own machine:

python -m groundnote.app Opflare1144/groundnote-239m starts a web page at localhost:8000. Paste a transcript, get the checked note.

Code and instructions on GitHub · Weights on Hugging Face · Live demo

Research prototype, not for clinical use. Example transcripts are synthetic or from ACI-Bench (CC BY 4.0, Yim et al. 2023).