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。
界面截图