WTWilly Tai
Case study · live demoData & Knowledge

Type a question. Get a chart, pulled from the right data by design.

A blank canvas where you ask in plain English and a chart appears on the fly. But every question is resolved against a governed semantic catalog rather than raw text-to-SQL, so the correct metric is pulled, the provenance is shown under each chart, and an ambiguous word is clarified instead of guessed. It's the lightweight, governed answer to the static dashboard. This one runs live in your browser, and there's a clickable link below.

01 / The pain

Static dashboards can't keep up with the questions, and "just ask the AI" pulls the wrong column.

A dashboard answers the questions you anticipated when you built it. Real operational questions arrive faster than anyone can build tiles: "average CO₂ by site last week", "which building's power is trending up", "compare water across the piers". The obvious next step is to let people ask in natural language. But the naive version, where you point a language model at the database schema and ask it to write SQL, is unreliable in the way that matters most. It guesses the wrong column, invents joins, and silently picks the wrong metric when a word is ambiguous. A confident chart built on the wrong data is worse than no chart, because someone will act on it.

02 / Why the naive approach fails

Raw "text-to-SQL" is a guess; the failures are invisible and confident.

Hand an LLM the schema and a question and it will produce something. The problem is that you can't tell a right answer from a wrong one by looking at the chart:

The fix is well-established: a semantic layer. Measured publicly, natural-language querying hits ~83% accuracy when grounded in a semantic layer versus ~40% writing raw SQL. So the job is not a cleverer prompt. It is to resolve every question against governed metadata, and to refuse to guess when the metadata is ambiguous.

NAIVE · natural language → raw SQL "show consumption" guesses a columnpower? water? · silently picks one GOVERNED · resolved against the semantic catalog "show consumption" semantic catalogmetric · synonym · unit · agg ambiguous → clarifyask, don't guess chart + provenancethe right metric
fig.1 · raw text-to-SQL guesses; a governed catalog resolves, clarifies, and cites
02b / The reference

This is the pattern the platforms are converging on.

The enterprise answer is the same shape: a governed semantic layer between natural language and the data. Databricks' Unity Catalog Business Semantics and Metric Views define metrics centrally, including display names, units, synonyms and dimensions, and AI/BI Genie grounds every natural-language question in those governed definitions so the model interprets business terms correctly instead of guessing. This demo is that idea, made small and explicit: a hand-written catalog doing the governing, so you can see exactly how the grounding works.

03 / How it works

The question resolves against governed metadata first, and only then does a chart appear.

A typed question never touches the data directly. It is first parsed against the catalog: the words are matched to a governed metric (via its synonyms), an aggregation, a dimension and a time window. If that resolution is clean, the query runs and a chart is drawn with its provenance attached. If a word is ambiguous, the canvas stops and asks. The model (or, here, a deterministic parser) proposes an interpretation; the catalog governs what's allowed.

UNGOVERNED · the words GOVERNED · resolved against the catalog "avg CO₂ by site last week"free text Resolvemetric·agg·dim·window chart + provenance clarifyif ambiguous no chart is ever drawn without a clean, governed resolution · and the resolution is shown, not hidden
fig.2 · the trust boundary: free text becomes a chart only by resolving against governed metadata

The catalog is the governance. Each metric carries its meaning, unit, the words that map to it, and the aggregations it allows. The terms that map to more than one metric are marked ambiguous on purpose:

metric · co2_ppm label : "CO₂ (air quality)" unit: ppm synonyms: co2, carbon dioxide, iaq, air quality… aggs : avg, max dimensions: site {Building A, CPFT, mTower…}, time ambiguous (on purpose) "consumption" → [ power_kw, water_lpm ] "usage" → [ power_kw, water_lpm ] → the canvas asks which, instead of    quietly charting the wrong one
fig.3 · the hard part: governed metadata, including the terms it refuses to resolve alone
04 / One worked example

The question it answers, and the one it refuses to guess.

Type "average CO₂ by site last week" and the canvas resolves it. It matches "co₂" to the governed metric co2_ppm, "average" to avg, "by site" to the site dimension, and "last week" to a 7-day window, then runs it and draws a bar chart that states all of that underneath. Now type "show consumption by site". "Consumption" maps to two governed metrics, so the canvas does not guess. It shows a clarify prompt: Power or Water? One click resolves it and the chart appears.

You typeResolved toOutcome
average CO₂ by site last weekco2_ppm · avg · by site · 7dcharted · cited
power trend over the last 14 dayspower_kw · over time · 14dcharted · cited
show consumption by siteconsumption → 2 metricsclarify · won't guess
The refusal is what makes it useful. Anyone can wire a model to draw a chart from any sentence. The value is the canvas that won't chart "consumption" until it knows whether you mean power or water, and that shows you, under every chart, exactly which metric, aggregation, dimension and window it used. That's the difference between a slick demo and a number a facilities team can act on.
05 / Numbers & honest trade-offs

What it does, and what it does and doesn't prove.

5
governed metrics
Each with unit, synonyms, allowed aggs.
83% / 40%
grounded vs raw NL-SQL
Public benchmark, the case for a catalog.
2
ambiguous terms caught
"consumption", "usage" → clarify.
0
backend / DB needed
Runs entirely in the browser.

Where this stands, honestly. The data is a synthetic smart-FM estate (five metrics across five sites), and the resolver here is a deterministic, catalog-grounded parser rather than a hosted LLM. That is the point: the catalog is the guardrail, and a model would sit in front of it to handle fuzzier phrasing, never replace it. So this proves the governance mechanism, where questions resolve to defined metrics, ambiguity is refused, and provenance is shown. It is not a benchmark over a real warehouse. The 83%/40% figure is the public, independent case for why the semantic layer matters; it's not a measurement of this demo.

The trade-off you tune: how much the resolver will infer. A stricter catalog refuses more and asks more (safer, more clicks); a looser one infers more from context (smoother, more risk of a wrong-column chart). Adding an LLM front-end widens the language it understands but must stay behind the catalog, or you're back to guessing. The governed canvas is not "no AI." It is AI that has to show its working and stop when it can't.

06 / Governance, shown

Every chart states the governed query it came from.

The thing that makes the canvas trustworthy is that the resolution is never hidden. Under each chart is the exact governed query: which metric (and which synonym matched it), which aggregation, which dimension and filter, which window. So you can always check that the chart answered the question you asked, and a reviewer can audit any chart on the canvas after the fact.

Resolution · under a chartno chart without a governed resolution
question  : "average CO₂ by site last week"
metric    : co2_ppm   (matched synonym "co2")   unit: ppm
aggregation: avg
dimension : site   →   Building A, CPFT, mTower, WCP, ISC
window    : last week   (7 days)
status    : resolved ✓   → bar chart drawn

question  : "show consumption by site"
term      : "consumption" → { power_kw, water_lpm }
status    : ambiguous ⚠   → asked the user; no chart drawn
The same governance idea as the rest of the portfolio, applied here to business intelligence: the model proposes, and deterministic rules decide and disclose.
07 / Old vs new

The dashboard, re-imagined.

STATIC DASHBOARD fixed tiles rebuild for each question or raw NL → wrong field GOVERNED CANVAS ask any question resolved against the catalog clarified · cited · correct
fig.4 · fixed tiles that pull the wrong field → any question, governed and cited

What this says about how I work.

The exciting idea is "type a question, get a chart". The valuable idea is the governance that sits underneath it: the catalog that defines what a metric means, the refusal to chart an ambiguous word, the provenance under every result. I build the version that has to show its working: the model proposes, governed metadata decides, and nothing is drawn that can't be traced back to a defined metric. An operations team will only act on a number it can trust. So the real work is not the chart that appears when you type. It is the catalog underneath that makes the chart mean what you think it means, and the discipline to refuse a chart that can't be traced back to it.

See it run, live.

Unlike the consoles that run on my machine, this one runs entirely in your browser. Open the canvas, type a question (or tap a suggestion), and watch the chart resolve. Then try "show consumption by site" and watch it refuse to guess. The demo now also includes a side-by-side naive-vs-governed comparison, the catalog itself rendered as an inspectable table, and an optional small local model (Qwen2 0.5B, running in your browser via WebGPU) whose every proposal is validated against the catalog before anything is drawn.

Open the live canvas →Runs client-side over a synthetic dataset: no sign-in, nothing to install.