AMD Developer Hackathon ACT III · Track 2, Health and Wellbeing

askfirst

It finds the one missing fact that would change the answer — and refuses to answer until it has it.

askfirst.kgbnetwork.com · github.com/shivang-goliyan/askfirst
The failure, not described but measured

We asked a commercial vision model to read 15 photographs of real syringes.
We told it "unknown" was an acceptable answer.

Wrong on9 of 15
Times it said unknown0 of 15
Read from an empty syringe1.0 mL
Answers given to one byte-identical file2 different
Worst single error+71%

The problem is not that it was wrong. It is that it was certain and wrong, and nothing in the output separated that case from a correct one.

Our own run, logged, checksums kept. Published corroboration: MeasureBench (arXiv 2510.26865) — a frontier model at 19.8% on measurement reading, 2.0% on composite gauges.
What it is

Not a diagnosis tool. A gate in front of the model that decides.

It answers a narrower and far more answerable question: is there enough here?

  1. Record split into atomic fields.
  2. Open model scores it — the full distribution is kept, not a sampled answer.
  3. Each present field removed in turn → what the answer rests on.
  4. Each absent field ranked by how much it could tell you, then by cost and minutes.
  5. Unstable under ablation → refuse, return the ranked gaps, hand over.
The measurement · 6,000 held-out patients · 49 conditions · 2% chance

The scorer is 99.6% right on a complete record.
Then take the record away.

evidence presentfindingsanswer everythinganswer the top 25%
all of it15.699.6%100.0%
60%9.096.2%99.9%
40%5.882.6%98.3%
20%2.739.9%73.5%
10%1.217.1%44.9%

A model this good is 39.9% right on three findings. Refusing the least confident takes it to 73.5%.

Trained on complete records, tested on incomplete ones · Wilson 95% intervals in docs/results/abstention.json · margin beats entropy at every coverage level
What refusing is worth · wrong answer 100, referral 5

Refusing pays at every level. How much to refuse changes fifty-fold.

evidence presentalways answercheapestanswerssaving
all of it0.420.2698%38%
60%3.802.0580%46%
40%17.434.0035%77%
20%60.155.242%91%

That is a setting, not a slogan. Answer 98% of complete records; answer 2% of nearly empty ones. The page lets you move it and the server obeys the same number.

Seven price ratios at 20% evidence: 28% to 98% cheaper. Even when a referral costs half a wrong answer it is 28% cheaper. The direction does not depend on flattering prices.

Why this needs an open model, on AMD

The product is built on the distribution. A closed API returns text.

Entropy, information gain and a calibrated threshold are all functions of the full posterior. There is no version of this that works behind an API that hands back a sentence.

POST /v1/completions   { "echo": true, "max_tokens": 0, "logprobs": 1 }
→ token_logprobs + text_offset over the prompt
   one round trip per label set · vLLM on MI300X, 192 GB HBM3
A better model does not make the answers cheaper. It makes more of them answerable.

The CPU baseline bottoms out at 5% coverage because a naive Bayes is 21% accurate overall. A stronger scorer moves that optimum to higher coverage at the same cost — a strictly better product, measured against a baseline that already exists.

src/askfirst/model.py — exact label scoring via text_offset, mean-normalised, tested against the documented response shape before any GPU hour was spent
What we got wrong, with dates on it

The biggest thing we got wrong, we found ourselves.

Four objectives tried, three of them worse than a coin, and the winner is a property of the question rather than anything learned. Every failure is dated and committed in docs/results/, in the order it happened.
Behaving badly, on purpose, as the track requires

Five questions, five answers that point at code or at a number.

Incorrect responsesMeasured: on thin records, 39.9% right answering everything against 73.5% answering the confident quarter. The whole product is this question.
Sensitive informationNone enters. Synthetic and CC0 data only. MIMIC-IV deliberately excluded — its DUA forbids redistribution.
Uncertain resultsUncertainty is the output: full distribution, entropy in bits, threshold, sufficiency, per-field influence.
High-risk decisionsNever made. The only decision is answer-or-hand-over, tuned pessimistic — it refuses nine cases in ten.
Human reviewRefusal is the handoff, and it carries a ranked, costed work list rather than a shrug.

Not clinically validated. No clinician has reviewed any output. Not medical advice.

docs/SAFETY.md
Prior work — said by us, before it is said to us

MediQ posed the interactive version of this first. We are not claiming the idea.

What we have not found occupied: ranking the absent fields by counterfactual influence over an open model's own logprobs. Absence of search evidence is not proof, and we say so rather than claiming a gap.

The same engine, a second domain

Variant interpretation, where the evidence contradicts itself.

CIViC — public, CC0, 4,940 evidence rows. Grouped by variant and outcome: 585 groups where removing one line of evidence can change the call, of which 182 are contested — the same knowledge base both supports and does not support the conclusion.

Demo case: DNMT3A R882 in AML. Level-B evidence on both sides, at ratings 3 and 4. Most tools average that. This one reports that the case is unresolved and names the evidence doing the damage.

The limit, in the same breath: 182 groups is a demonstration, not a headline. Module A carries the measurement. Computational evidence stays capped at "supporting" strength, which is what ACMG/AMP actually allows.

docs/results/2026-10-12-civic-scope.md
Who pays, and what it costs to run

The buyer is anyone already carrying the cost of a model's confident mistakes.

One assessment is one generation plus a sweep the CPU does for free. The expensive design was the obvious one: an exhaustive 223-field sweep with a language model costs about 22 seconds of GPU per case — a latency wall that does not move with more credits. So the model proposes roughly ten fields in a single pass and the cheap scorer ablates exhaustively at no cost.

It knows when it doesn't know. That's the product.
Open the live URL and try to make it answer something it should not.