Cite or abstain: how DermLiving answers a dermatology question
Every claim in a DermLiving answer cites a versioned passage, and a claim without one is removed. When the evidence is missing or the question asks for a decision, the API abstains.
In short
A grounded answer splits into claims, and each claim cites the passage that supports it: source, version, locator, checksum and license. A claim with no supporting passage is left out, and the response says so. When no passage supports an answer, or the question asks for a diagnosis or treatment, the API abstains and says why.
A fluent paragraph is easy to generate and hard to check. Researchers who study text generation call output that reads well but is not supported by its source "hallucination", and a 2022 survey by Ji and colleagues traces it across summarization, dialogue, question answering and other tasks. In a dermatology reference product, an unsupported sentence is worse than no sentence at all.
Retrieval helps. Retrieval-augmented generation, described by Lewis and colleagues in 2020, conditions a model's output on passages retrieved from an index. The same paper named providing provenance for a model's output as an open research problem. DermLiving's answer format is built around that problem: provenance is not a footnote added at the end, it is the structure of the answer.
An answer is a list of claims
Ask POST /v1/knowledge/ask what makes atopic dermatitis flare, and the sandbox returns this:
{ "data": { "status": "grounded", "answer": "Impaired skin barrier function contributes to disease activity. [1] Wool, harsh soaps and sweat are commonly reported to worsen symptoms. [2]", "claims": [ { "id": "clm_1", "text": "Impaired skin barrier function contributes to disease activity.", "citations": ["cit_1"] }, { "id": "clm_2", "text": "Wool, harsh soaps and sweat are commonly reported to worsen symptoms.", "citations": ["cit_2"] } ], "removed_claims": [ { "text": "Food allergy is the main trigger of flares in adults.", "reason": "unsupported" } ] }}The answer string is for display. The claims array is for software: each claim is one sentence, and each names the citations behind it. The response is shortened here; the full one also carries the two citations and the request's metadata.
Every citation is checkable
A citation is not a link to a homepage. It points at one passage, in one version of one source:
| Field | What it pins down |
|---|---|
evidence_id | The passage itself, which GET /v1/evidence/{id} returns |
source.id and source.version | The publisher record and the exact release |
locator | Where in the source: section and paragraph |
checksum | A SHA-256 of the passage text, so a changed passage cannot pass as the old one |
license | The rights record that allows the passage to be used |
Because every passage carries a checksum, a reviewer can confirm that the words cited are the words in the source, at that version.
Unsupported claims are removed
Look again at removed_claims. It lists a sentence saying food allergy is the main trigger of flares in adults. No passage in the sandbox supports it, so it is not part of the answer, and the response says so, with reason unsupported.
The removal is visible on purpose. Silently dropping a claim would hide the problem. Reporting it lets you log it, count it, and see where the knowledge base is thin.
One caveat about the sandbox: that removal is a curated example of the format. Sandbox answers are curated or extracted directly from passages. The verifier that checks model-generated answers claim by claim is still being built.
Three reasons to abstain
Sometimes the right answer is no answer. The API abstains in three cases, and each has its own reason code:
| Reason | When it fires |
|---|---|
clinical_decision | The question asks for a diagnosis, a treatment choice or another clinical decision |
insufficient_evidence | No passage in the knowledge version supports an answer |
patient_data | The input appears to hold patient identifiers |
An abstention keeps the same envelope as an answer, with answer set to null and no citations:
{ "data": { "status": "abstained", "reason": "insufficient_evidence", "answer": null, "message": "No passage in kv_2026_10_01 supports an answer.", "citations": [] }}That came from asking where rosacea usually appears. The sandbox holds no rosacea passages, so it says so instead of improvising.
Why a refusal is useful
A typed abstention is something your software can act on. A clinical_decision can route the user to a clinician. An insufficient_evidence can widen a search or show a reference instead. A patient_data can stop a form before identifiers go anywhere. Each of those is a product decision you get to make, because the API told you exactly why it stopped.
Measured, not promised
Each knowledge version reports release gates through GET /v1/knowledge/versions. The thresholds are: citation validity of at least 99%, claim grounding of at least 95%, curated recall in the top 10 of at least 95%, and correct abstention of at least 95%, with zero unauthorized tool runs. In the sandbox, these are measured on synthetic cases. They show the method; they are not clinical validation. The trust page lists each gate and what it measures.
Questions
What is a grounded answer?
An answer whose every claim cites a passage that supports it. Each citation names the passage, its source and version, where it sits in the source, a checksum of its text and the license that allows its use.
What happens to a claim that no source supports?
It is left out of the answer, and the response lists it under removed_claims with reason unsupported, so the removal is visible rather than silent. In the sandbox, that removal is a curated example of the format.
When does DermLiving refuse to answer?
In three cases: the question asks for a clinical decision, no passage supports an answer, or the input appears to hold patient identifiers. Each returns status abstained with its own reason code.
Is an abstention an error?
No. It returns HTTP 200 with the same envelope as an answer, with the answer set to null and a reason your software can act on.
Are the release gates a clinical validation?
No. In the sandbox they are measured on synthetic cases. They show how each knowledge version will be checked, not how it performs on real clinical questions.