ChartForge

Eval methods

Plain-language metrics · held-out · six-metric · lab

/eval-methods

How we score notes

ChartForge uses two related boards: the held-out compare (classic · flat · modern · BASE) and the Prior SOAP six-metric suite. Live Lab reuses the same heuristic scores plus best-effort fluency.

Together for inference + FT · never OpenAI · FT create paused. LoRA numbers are never invented.

Open eval hub·Live lab·/metrics/explain alias

Quality score

held-out
Higher is better (0–100)

Measures: Overall note quality for the demo gate — structure, necessity, grounding, claims, and safety.

Weighted composite from structure presence/richness, medical-necessity cues, claim grounding, and the omit>fabricate safety composite.

SOAP structure

both
Higher is better

Measures: Whether Subjective / Objective / Assessment / Plan are present and how rich each section is.

Binary presence (≥24 chars) plus length bands and section-cue heuristics (symptoms, measures, diagnosis, follow-up). Six-metric blends ratio + richness into one score.

QA factual consistency

six-metric
Higher is better (0–1)

Measures: Whether key facts from the transcript show up in the note (QAGS-lite).

Extracts short clinical “answers” from the transcript and checks note/claim support. Labeled proxy for full T5+DistilBERT QAGS.

Claim grounding

held-out
Higher is better

Measures: Fraction of note claims that overlap the transcript (FactEHR / Omi-style).

Token-overlap between note sentences / CAP claims and transcript spans. Also drives ungrounded rate (fabrication soft signal).

SciBERT BERTScore

six-metric
Higher is better (F1)

Measures: Semantic similarity of note vs transcript using SciBERT token embeddings.

Python transformers path (`allenai/scibert_scivocab_uncased`). Falls back to a labeled lexical token-F1 proxy if neural weights are missing.

BioBERT similarity

six-metric
Higher is better (cosine)

Measures: Clinical embedding cosine between note and transcript.

Mean-pooled BioBERT (`dmis-lab/biobert-v1.1`). Lexical proxy when neural path fails.

Fluency / perplexity (PPL)

both
Raw PPL ↓ better · fluencyScore ↑ better

Measures: How fluent / predictable the note text is under a small language model — a writing-quality proxy used in prior CAT evals.

Prefer real GPT-2 perplexity via local `openai-community/gpt2` (Python). Score maps PPL≈18–40 → 0–1. If GPT-2 is unavailable, a labeled structure-richness proxy still fills the column; path to full PPL is documented. Together logprobs are not wired yet.

Six-metric and held-out/lab share this path. Env: SKIP_FLUENCY_PPL=1 or LAB_SKIP_FLUENCY_PPL=1 for proxy-only.

Per-section LLM judge

six-metric
Higher is better (0–1 mean)

Measures: Clinical coherence of each SOAP section vs the transcript.

DeepSeek-R1-class distill on Together rates S/O/A/P and lists unsupported sentences. Deferred (no score) if Together is missing or SKIP_SECTION_JUDGE=1.

Safety / omission composite

held-out
Higher is better

Measures: Prefer missing safety facts over fabricating unsupported claims (Omi-style omit > fabricate).

Checklist for SI, meds, follow-up, measures → omissionCoverage. safetyScore = 0.65×omissionCoverage + 0.35×(1−ungroundedRate).

PDSQI-9 subset (heuristic)

held-out
Higher is better

Measures: Accurate / Thorough / Useful / Organized — offline PDSQI-9 lite.

Derived from structure, claims, omissions, and necessity cues. Default gate when no LLM judge is run.

PDSQI-9 subset (LLM judge)

held-out
Higher is better

Measures: Same four attributes rated by a Together chat model.

Enabled with PDSQI_LLM_JUDGE=1. Never OpenAI. Stub mode documents deferred without API calls.

Regression gate

lab
Higher is better

Measures: Simple 0–1 pass bar used by the product gate (≥ ~0.72 historically).

Normalized view of quality for promote/compare checks on /lab and /soap.

Grounding coverage

lab
Higher is better

Measures: How much of the note is tied to Linked Evidence / utterance provenance.

Counts grounded snippets and overlapping utterance IDs from the hierarchy.