Chenhao Yang
Built the ingest pipeline, the embedding store, and the spatial index. Wrote the verifier.
Columbia · M.S. CS[-73.985,40.795,-73.945,40.825]
/
corpus 13,350 places
/
CCR 75.5%
/
v0.1 · shipped May 2026
Palimpsest plans a short walking tour anywhere on Manhattan and narrates it from free public-domain sources — every claim grounded in a retrieved document under a strict five-field citation contract, verified before the response leaves the server.
“LLMs are confident liars about places.”
The fix is not a bigger model. The fix is a retrieval contract that refuses to render a sentence the model can't ground in a real document from a real source — and a UI that shows the user exactly which document.
Palimpsest treats narration the way an academic treats a footnote:
every assertion is anchored to a doc_id, a canonical
source_url, the source feed, a character span
inside the document, and the agent turn that retrieved it.
The verifier rejects any sentence missing a field; the frontend renders
the surviving citations as chips you can click.
Riverside Church, completed in 1192, was funded by Andrew Carnegie and houses the oldest bell carillon in North America. Martin Luther King Jr. delivered his “Beyond Vietnam” speech here in 1965.
Riverside Church, completed in 1930wiki·p3, was funded by John D. Rockefeller Jr.wiki·p4 and houses the Laura Spelman Rockefeller Memorial Carillonwiki·p7. King delivered “Beyond Vietnam” here in 1967wiki·p11.
3D map on the left, chat pane on the right. React + Vite + TypeScript + MapLibre GL.
apps/webFastAPI service runs an LLM in a bounded 6-turn tool-use loop and streams events back as SSE.
apps/agentTwo typed tools: search_places for hybrid retrieval, plan_walk for OSRM-backed routing.
13,350 places — 12,858 OSM features + 492 Wikipedia/Wikidata entries — embedded with bge-small, indexed by pgvector + PostGIS + pg_trgm.
data/corpusRejects any sentence whose citations don't all clear the 5-field contract against the retrieval ledger. Runs before the response leaves the server.
apps/agent/verifyA citation must resolve to a real document the agent actually retrieved in this conversation — the verifier checks every emitted citation against the per-request retrieval ledger before the response is streamed. No string-matching, no “trust me”.
{
"sentence": "Riverside Church was completed in 1930.",
"citations": [
{
"doc_id": "wp:Riverside_Church",
"source_url": "https://en.wikipedia.org/wiki/Riverside_Church",
"source_type": "wikipedia",
"span": [412, 486],
"retrieval_turn": 2
}
],
"verified": true ✓ // passes ledger check
}
Long-form narrative, dates, names. Pulled article-by-article for places inside the Manhattan footprint and chunked for retrieval.
Structured properties — architects, completion year, heritage status — joined onto the Wikipedia chunks via QID.
Geometry, addresses, building footprints. POI tags drive the “type of place” field; geometry feeds OSRM for the walk leg.
Built the ingest pipeline, the embedding store, and the spatial index. Wrote the verifier.
Columbia · M.S. CSDesigned the tool-use loop, the SSE stream, and the typed Pydantic contract for every tool call.
Columbia · M.S. CSMade the map breathe — engine wrapper, marker style, flyTo choreography, and the chat shell.
Columbia · M.S. CSThe live demo is online — bring your own OpenRouter key and ask it for a walk. The codebase is public, the documents are public, the corpus is in the published Docker images. Clone, run, file issues.