Skip to the content.

Context

LLM-generated content is written into persistent storage alongside human-verified data, and downstream features and users will read it. Some of it has been checked, most has not, and once stored the two look identical.

Examples

A meaning (a word paired with a translation) can exist at several trust levels: generated by Google Translate (unverified), verified by an LLM-Checking-LLM pass (auto-verified), implicitly accepted (a learner drilled it in an exercise without flagging it as wrong), or explicitly corrected by a trusted user, such as a teacher. Each level carries different confidence, and the system can make different decisions depending on the validation state: for example, only including explicitly confirmed translations in exercises, while using auto-verified ones for reading assistance where the stakes are lower.

Simplified articles carry a similar state, arrived at differently. Each stored version has a broken flag that keeps it out of what learners are offered, and it is set three ways: an automatic quality check at generation time, an audit tool that finds versions the LLM wrote in the wrong language, and readers themselves, since three reports mark an article broken.1

What the state is for differs in each case. A meaning’s level is read on every exercise that might use it, and grades how the meaning may be used. A version’s flag is read when a reader asks for a level, and excluding a version is also what causes it to be replaced: the on-demand path calls the LLM only when it finds no usable version at that level. One gates use; the other gates use and triggers repair.

Problem

How can trusted and untrusted LLM-generated data be told apart after it lands in the database, so each is used according to its confidence?

Forces

Solution

Maintain an explicit, queryable validation state for all LLM-generated content in the data model. Never let LLM-generated content silently become trusted data. The validation state may be a simple flag, but more often it is a spectrum or state machine reflecting different levels of trust (e.g., unverified → auto-verified → implicitly accepted → explicitly confirmed by a trusted user; alternatively, one could track the number of users that have validated a given content).

Every stored LLM-generated record carries a trust level, raised by the events above it. Each use reads only the levels it can tolerate: a low-stakes use accepts any level, a high-stakes one only confirmed records.
Every stored LLM-generated record carries a trust level, raised by the events above it. Each use reads only the levels it can tolerate: a low-stakes use accepts any level, a high-stakes one only confirmed records.

Consequences

Known Uses

Together the three bracket the granularity this pattern turns on: a multi-state lifecycle (Argilla), a binary gold/not-gold flag (Label Studio), and a probabilistic score (Snorkel).

Note. The examples above are data-labeling platforms; a documented, in-product LLM-output trust-state lifecycle (as opposed to human-annotation state) remains thinly evidenced: one reason we keep this among the less-settled patterns.

Notes


💬 Open an issue about this pattern

  1. Article.broken, UserArticleBrokenReport, and available_simplified_versions in the zeeguu/api repository. ↩