Search Australian government datasets in plain English. GovChat returns the closest datasets from the ABS and *.gov.au sites, a short answer checked for made-up figures, and a five-factor trust score backed by an audit record.
Ask on the left. Trust factors, sources and the dataset graph sit in the side panel.
Context
A team project for GovHack 2025; the frontend and most of the API commits are mine. Public data is only useful if people can find it, and a wrong answer about government data does real harm. So GovChat answers from dataset metadata only, cites every source, and shows a trust score you can check against the audit record.
Timeline
Aug 2025
Problem framing
Australian government data is spread across the ABS and dozens of department sites. Finding a dataset means knowing which agency holds it and what it is called. GovChat lets you ask in plain English instead.
Aug 2025
Catalogue and embeddings
Two crawlers, both respecting robots.txt. One walks *.gov.au for CSV, XLS, PDF and ZIP links; the other pulls page text from seed sites, with optional Playwright for pages that need JavaScript. ABS dataflow metadata is flattened into one catalogue, embedded with OpenAI and loaded into ChromaDB.
Aug 2025
Trust layer
Each answer returns the top four datasets, a trust score from five factors and an audit id. The frontend shows the factors, the sources with similarity badges and an audit view; the API stores the full record under that id. A React Flow graph lets you browse related datasets.
Dec 2025
Won GovHack 2025
GovChat was named a GovHack 2025 winner.
Key technical decisions
01
metadata-only answers › answers from the raw data
The model sees only dataset titles and agencies, not the data itself, so any figure it writes would be made up. A grounding pass swaps figures like "4.2 million" for "[data available]", and the trust score drops to zero when a leftover figure is detected.
02
geometric trust score › weighted average
The score multiplies each factor raised to its weight. If one factor is zero, such as an answer with an invented figure, the whole score is zero. A weighted average would still show 0.7 and look safe.
03
an audit record per answer › a bare answer
Each response saves the query, the raw matches, the answer and the trust factors under an audit id, so anyone can see why a dataset came back.
Trust score
retrieval.py (simplified)py
1# trust score: weighted geometric blend of five factors
Grounding carries the most weight because invented figures are the worst failure. Retrieval reaches 1.0 only when the best match clears 0.90 similarity. The figure check is a pattern match, so it catches forms like “4.2 million” or “5 percent”, not every number. Two factors are placeholders for now: recency and verification sit at 1.0 until freshness tracking and checks on figures are built.