WarshGPT is a retrieval-augmented AI research tool built by F/m Investments that answers questions about Federal Reserve Chair Kevin Warsh's public economic views, citing a specific source for every claim, and refusing any forecast, recommendation, or answer not grounded in his own record.
Kevin Warsh is the newly installed Fed Chairman. We wanted to ask what he thinks about inflation, or Fed independence, or the Treasury market, and get answers tied to his own words. He's not going to answer our questions himself, but there's a deep record of his previous comments: two decades of FOMC transcripts, speeches, testimony, and essays. It's scattered across a dozen archives and hard to search as one body.
Hand all of it to a general-purpose large language model and the trouble starts. Asked about a sitting Fed Chair by a registered investment firm, a model will fill gaps with plausible guesses, predict the next rate decision, and answer in Warsh's voice on request. With the Federal Reserve as the subject and an SEC-registered adviser publishing, each of those is a problem.
So the job of building WarshGPT had two halves: answer only from his real words, and refuse to do any guessing, forecasting, or speaking for him. Most of the hard work is in the refusals.
What Is WarshGPT?
WarshGPT is a retrieval-augmented generation (RAG) tool: every answer is grounded in passages pulled at query time from a corpus of Kevin Warsh's public record — FOMC transcripts, speeches, testimony, essays, and hand-verified quotes — rather than from what a language model absorbed in training. Each answer carries a citation back to the source passage; an answer with no resolvable citation is downgraded to "no public record."
How WarshGPT Avoids AI Hallucination: Retrieval Over Recall
Rather than trust what a model absorbed in training, we keep a library of Warsh's documents and a slew of economic and administrative data (the corpus) and require every answer to come from passages and data retrieved out of the corpus at query time. The model answers from documents we hand it.
We considered loading his whole record into the context window instead. It's already past a million tokens and still growing. Retrieval handles that; a context window has a ceiling.
We kept the stack boring and self-contained. The vector store is LanceDB, embedded and on disk. Embeddings are computed locally with a small open model — BGE, an efficient tool for RAG — via fastembed, so search touches no external service. The only network call in the system is the last one, to the model, to write the answer.
A request hits /api/ask
We embed the question locally, pull a wide candidate set from LanceDB, then trim it with maximal marginal relevance (MMR) so the model sees the range of what he said instead of five paraphrases of one line. Those passages, and only those, go to the model.
What's in the WarshGPT Corpus
More than 1,750 passages, as of writing:
- 657 verbatim turns from 51 FOMC transcripts (2006–2011), his full governor tenure, parsed from the Fed's own PDFs — what he actually argued inside the room.
- 18 Fed speeches and his Congressional testimony, full text.
- About two dozen essays and op-eds, the Bank of England "Warsh Review," his 2025 Hoover Institute lecture, his 2026 Senate confirmation statement.
- 197 hand-verified curated quotes.
- Economic and administrative data starting in 2005 and live-updating — employment, inflation, GDP, and more, alongside FOMC, administration, and general market conditions.
Every passage carries its source. Anything without one, or without a confirmed speaker, doesn't load. FOMC parsing is the fussy part: the speaker grammar has to be exact, so a Warsh turn never absorbs a reporter's or another governor's question.
Macro context is stored separately. For the dates his quotes span, we join the factual backdrop — fed funds rate, unemployment, CPI, payrolls, GDP, the 10-year, the 2s10s spread, housing, and more, all from FRED — plus the sitting administration. It's a distinct, separately cited source type, never attributed to Warsh. That's structural and intentional: the backdrop is a different kind of record, so it can't be read as his words.
The Model and Its Contract
Generation runs on Claude Opus 4.8, chosen after A/B testing for guardrail adherence over raw fluency. It gets the question, the retrieved passages, and a system prompt of rules, and returns a schema-constrained response.
The citation contract is enforced by the server. It reads citations from the inline tags in the model's prose and resolves them only against passages actually provided. An answer with nothing resolvable is retried, then downgraded to "no public record." No source, no answer.
Guardrails Enforced in Code
A prompt-only guardrail can be talked past. So the rules that carry real risk are run twice — in the prompt, and in deterministic code after the model.
Take securities. WarshGPT discusses subject areas — monetary policy, the Treasury market, whether crypto is "money," CBDCs, tokenization — but never names a specific tradeable instrument, including F/m's own funds. Too fine a line for a prompt. So there's a denylist: if a banned name shows up in the answer or a cited source, the server re-grounds on passages that name no instrument (a digital-dollar question leans on his CBDC op-ed, not the Bitcoin one), and downgrades only if nothing clean is left. In testing, "digital dollar" questions get answered and "USDC vs. USDT" questions get declined.
Gaps get the same treatment. An earlier build let the model add a line of background when the record was silent. We took it out — it generates no background facts now. When the record is silent, it says so and offers a link from a fixed, server-side list. The model never emits the URL itself, so it can't fabricate one. A labeled wrong fact is worse than none, because the tool's authority sells it.
Keeping the Corpus Current
The corpus refreshes daily, on one rule: publish only a fully clean run, else change nothing.
The mechanism is a reversible swap. Indexes are immutable, versioned tables; the server follows an atomic pointer file and reopens only when it changes. The refresh job builds a candidate index, validates it, runs canary queries, then flips the pointer in a single write. On any failure — a source that won't parse, a passage count that drops, a canary that regresses — it keeps the last good index, quarantines the item, alerts, and stops. Git is the rollback substrate: every clean run commits a restore point.
The single-speaker edge case
One case earns the extra care. The Fed posts a new Chair's opening statement first, marked PRELIMINARY and single-speaker, then the full multi-speaker Q&A days later at the same URL. Treat the single-speaker file as malformed and you quarantine it for good, losing the real transcript when it lands. So the pipeline separates "not ready, retry" from "broken, skip." The preliminary defers; the full transcript ingests itself when it appears.
Testing
Before launching we red-teamed the tool to force a forecast, an investment recommendation, an impersonation, an invented quote, a partisan take, or runaway compute. No breaches. An independent AI code-reviewer went over the build across several rounds and found real bugs, since fixed. Offline checks run on every change; live checks exercise the real path.
What Leaves the Box
Conservative by default. The app fails closed, refusing to start in production without its protections: per-IP rate limits, a global daily token budget so cost can't run away, and a concurrency cap. It's origin-locked, bound to localhost, reachable only through a trusted proxy, and never open to the internet directly. No secrets live in the repo — the API key is read at runtime and never reaches the browser, which sees only the ask and metadata endpoints. What leaves F/m's infrastructure is the question plus the retrieved passages, sent to the model to write the answer. Nothing else.
Scope and Limits
The corpus is thorough on Warsh's accessible public record, but interviews and video appear only as hand-verified quotes, not bulk transcripts, since multi-speaker audio is hard to attribute — and attribution is the point. The tool is narrow by design: no forecasts, no buy or sell, no named security, no speaking as Warsh, no answer from outside his record. That's the spec, not a set of shortcomings.
And just to be clear: WarshGPT isn't affiliated with, endorsed by, or speaking for the Federal Reserve or Chair Warsh. It gives you his record and the sources under it. The conclusions are for you to make.
Frequently asked questions
What is WarshGPT?
WarshGPT is an AI research tool from F/m Investments that answers questions about Federal Reserve Chair Kevin Warsh's public economic views, using only passages retrieved from his documented record and citing a source for every claim.
Is WarshGPT affiliated with the Federal Reserve or Chair Warsh?
No. WarshGPT is not affiliated with, endorsed by, or speaking for the Federal Reserve or Chair Warsh. It surfaces his public record and the sources behind it; the conclusions are left to the reader.
Does WarshGPT make interest rate forecasts or investment recommendations?
No. WarshGPT is built to refuse forecasts, buy/sell recommendations, and any mention of specific tradeable securities, including F/m's own funds. These rules are enforced in server-side code, not just in the model's instructions.
How does WarshGPT prevent AI hallucination?
WarshGPT uses retrieval-augmented generation (RAG). Every answer must be grounded in passages retrieved from Warsh's corpus at the moment the question is asked, and a server-enforced citation contract rejects any answer whose claims can't be resolved back to a real, retrieved source.
What's in WarshGPT's corpus?
More than 1,750 passages, including 657 verbatim FOMC transcript turns from his 2006–2011 governor tenure, 18 Fed speeches and Congressional testimony, roughly two dozen essays and op-eds, 197 hand-verified quotes, and live-updating economic and administrative data from FRED.
How often is the corpus updated?
Daily, through an atomic, git-backed refresh. A refresh only publishes if it passes validation and canary queries in full; otherwise the last known-good corpus stays live and the failed update is quarantined and flagged.
What happens if WarshGPT doesn't have an answer in Warsh's record?
It says so directly — "no public record" — rather than filling the gap with a plausible-sounding guess, and offers a link from a fixed, server-controlled list instead of one the model could fabricate.