AI / ML · 2026
Ask This Site
A question box wired to a real retrieval pipeline over every page on this site: BM25 at the edge, citations back to the source, and — the part that matters — abstention when the corpus can't support an answer. Citations or silence, never a guess.
How it answers
At build time, the same generator that renders these pages flattens every project, essay, decision record, and resume entry into a passage corpus — one source of truth, so the answers can never drift from the pages you're reading. At query time the Cloudflare Worker runs BM25 retrieval over that corpus at the edge, pulls the top passages, and extracts the sentences that actually carry the answer — so every response is verbatim from a cited source, linked back to the page it came from.
When a model key is configured, a generative tier hands the retrieved passages to Claude to synthesize a cited answer — with a mandatory ABSTAIN escape hatch, and per-IP plus daily spend caps so an open endpoint can't run up a bill. Without a key, the same pipeline answers extractively. Either way: the retrieval, the citations, and the refusal behavior don't depend on an LLM being present.
Abstention is the feature, not a fallback
Most RAG demos are built to always answer — which is exactly how you get confident nonsense. This one scores retrieval confidence and refuses below threshold. That design choice comes from research: I ran a pre-registered study on what happens to honesty when you force models to produce an answer — abstention collapses in every model tested. The fix there is the design here: give the system a first-class way to say “I don't know,” and test that it uses it. The eval suite above runs live against production and asserts both sides: right citations on answerable questions, silence on unanswerable ones.
What makes it trustworthy
One corpus, zero drift
Passages are generated from the same content literals as the human pages and the MCP server — the build regenerates all three together.
Citations are mandatory
Every answer carries its sources: title, section, URL, and the verbatim snippet the answer came from. No source, no answer.
Calibrated refusal
A BM25 score floor plus a matched-term requirement decide when to abstain — and the on-page eval suite pins that threshold in place.
Agents get it too
The same pipeline is exposed as an ask tool on the MCP server — retrieval-only, since the caller is a model that can synthesize for itself.
It's just HTTP
curl 'https://farazian.com/api/ask?q=how+does+parkzy+handle+payments'
# → { "answer": "...", "sources": [{ "title": "Getting Money Right",
# "url": "...", "snippet": "..." }], "mode": "...", "abstained": false }
# or connect an agent and use the 'ask' tool:
claude mcp add --transport http farazian https://farazian.com/mcp