Obsidian Metadata

typesource
subtypevideo
urlhttps://www.youtube.com/watch?v=fA4pe9bE0LY
speakersIsaac Flath, Hamel Husain
duration41:32

Video: Building Eval Tools with FastHTML (the AnkiHub annotation app)

Isaac walks through a real commercial annotation app built for AnkiHub (medical flashcards) with Lab Codes, plus a minimal FastHTML version (companion repo, including a FastAPI + React variant).

The use case: why off-the-shelf didn’t fit

  • Retrieval: medical students search for flashcards to study. Queries vary wildly, from one word to an uploaded 50-page PDF chapter, while the “documents” are one- or two-sentence cards. That’s the inverse of typical RAG.
  • In a technical medical domain, exact terms matter and “similar” isn’t good enough.

App features that emerged from real use

  • Dashboard of real production queries with per-annotator progress.
  • Two annotators per query, then a finalize step only where they disagree: each sees the other’s rating and records a final rating plus a note on why. The team was still developing the rubric, so disagreements were meant to spark discussion, not just produce a κ score.
  • Annotators are 4th-year medical students (domain experts) working with the PM.
  • ~400 candidate cards per query, so keyboard navigation matters a lot at that volume.
  • Rate each result good / bad (relevant / not relevant) plus a note, and also rate the query itself (e.g., “heart” is too broad). They only discovered they needed query-level coding after annotation started, which argues for shipping something simple quickly and iterating.
  • Push to Phoenix from an admin page, so datasets and annotations live in the observability store.
  • Build time: roughly 5 focused hours (spread over ~3 days).

FastHTML notes

  • Python-only web framework (HTML elements as Python functions, HTMX for partial updates, routes from function names) with the fastlite DB and MonsterUI components. The minimal app is about 70–80 lines.
  • HTMX patterns: auto-save notes on change, and swap just the good/bad button pair to show the stored state.
  • Hamel’s question: is using a less mainstream framework “swimming upstream” with AI coding tools? Isaac’s answer: provide good context/rules files for the framework and stay in a middle ground (use AI heavily but understand the code). Use whatever you know; the principles are the same in any stack.

→ Annotation Tools and Review Interfaces · Benevolent Dictator (multi-annotator with finalize step) · RAG Evaluation