D-viva-assistant-agent
- Next.js
- TypeScript
- AI SDK v6
- SQLite / better-sqlite3
- Tailwind CSS
- Zod
- Vitest
- Electron
一個面向論文答辯準備的私有桌面 app。它把學生自己的論文轉成帶來源的練習題、評分與修訂任務,同時把論文文件與練習記錄留在本機。
一眼看懂
角色 獨立開發者 — 產品設計、架構、數據庫層、LLM 整合、校驗與測試
問題
現有答辯準備工具要麼是通用閃卡,要麼每道題都要手打。真正的瓶頸是 grounding:AI 考官只有在問題能追溯到論文原文時才有用;判分只有在能引用所用證據時才可信。
解法
我做了一套私有桌面流程:論文先導入成 evidence blocks,練習題與評分都引用這些 blocks,低分回答進入複盤隊列。除非用戶主動選擇 provider,文件與歷史都留在本機。
成果
已實裝本地優先論文答辯準備 app · 帶來源練習 · 隱私優先桌面使用
我的工作
- 論文 ingest 管線 — PDF / MD / TXT → 段落 evidence block,附導入質量報告;所有下游 AI 調用 grounded 到 ingest 輸出,不靠模型先驗
- AI 備考包生成 — 論文摘要、關鍵數字、方法問答、高壓問答、文獻卡;每條引用來源 evidence block,落庫前過校驗器
- 可編輯備考項、重新校驗、review queue,以及帶無 key 靜態 fallback 的 training plan 生成器
- 實時 AI 考官 — 從 evidence block 出題,對用戶回答做五維評分(準確性 / 深度 / 語言 / 方法論 / 沉著度),附診斷、英文改寫與追問
- STT 練習閉環 — 錄音 → 轉寫(Browser Web Speech 或 Google Cloud STT)→ 判分;低分項進複盤修復板
- Provider-agnostic LLM 層 — AI SDK v6 generateObject + Zod 結構化判分;支持 Gemini / Claude / OpenAI;無 key 時優雅降級(練習和轉寫仍可用)
- Electron + electron-builder macOS 打包,把產品定位為私有桌面工具,而不是 hosted multi-user service
技術證據
- 本地優先數據模型:SQLite(better-sqlite3、WAL、FTS5)存論文、evidence block、備考包與練習記錄;DB 完全在本機
- 隱私設計:雲端 AI 是 opt-in 並明告「發什麼給誰」;API key 在 .env.local(gitignore);日誌脫敏;錄音不同步
- Next.js App Router,DB 僅服務端(runtime=nodejs 邊界、globalThis 單例、serverExternalPackages for better-sqlite3);AI 調用 env 解析後啟用
- 測試預設注入 MockLlmClient;真實模型調用由 RUN_LIVE_AI=1 開關控制,且只對公開樣本論文運行
讓每條生成都 grounded
導入的論文(PDF / Markdown / 純文本)被抽取成段落 evidence block,附質量報告。所有下游內容——摘要、關鍵數字、方法問答、高壓問答、文獻卡與 training plan——都綁定到 evidence block 並過落庫前校驗。judge 與 examiner 只依據綁定證據判定,絕不靠模型先驗。
考官閉環
實時考官從 evidence block 出題,對回答做五維評分,附診斷、英文改寫與追問。可以打字或粘貼,也可以錄音——音頻被轉寫(Browser Web Speech 或 Google Cloud STT)並判分。低分項進入 review queue 與複盤修復板。
本地優先,雲端 AI opt-in
SQLite 庫、錄音與論文文件都留在本機——無賬號、不上雲同步。雲端 AI 是 opt-in 外呼,僅當有 provider key 時啟用,並明告把什麼發給誰;無 key 時優雅降級,練習與轉寫仍可用。
LLM 層 provider-agnostic(Gemini / Claude / OpenAI),測試預設注入 mock client——真實模型調用加 env gate,且只對公開樣本論文運行。已 shipped 的 app 仍定位為私有桌面工具,不是 hosted multi-user service。
界面截圖