ChatPapers 双模式集成需求规格说明书
本文档定位:在不拆分、不 fork 的前提下,将 BanDu(伴读)作为 ChatPapers 插件的第二种工作模式纳入同一产品。
原有 ChatPapers 对话模式的需求以 requirements.md 为准,本文仅描述集成策略、共享边界、伴读模式增量需求。
1. 产品概述
1.1 一句话定位
ChatPapers = Zotero 内的 AI 论文助手:对话模式用于即时问答与总结,伴读模式用于 AI 老师式音频授课与知识沉淀——同一插件、同一论文库、两种互补工作流。
1.2 双模式心智模型
1.3 为什么采用双模式(方案 A)
| 考量 |
说明 |
| 用户价值互补 |
Chat 适合「带着问题读」;伴读适合「先听一遍再精读」 |
| 工程复用 |
LLM 客户端、PDF 附件解析、笔记回写、引用导出、设置页已在 Chat 模式实现 |
| 安装成本 |
用户只装一个插件,不重复配置 Provider / API Key |
| 数据闭环 |
伴读报告与 Chat 笔记均写入同一 Zotero Item,写作时可统一检索 |
| 品牌演进 |
短期保留 ChatPapers 主品牌;伴读作为子品牌「BanDu」在 UI 内露出 |
1.4 产品目标(伴读模式增量)
| 目标 |
说明 |
| G-B1 降低读论文门槛 |
10–20 分钟整体讲解把握论文核心 |
| G-B2 支持深度精读 |
逐段三层讲解 + 按需逐句解释 |
| G-B3 闭环沉淀知识 |
伴读报告、问答、重点标记写入 Zotero 子笔记 |
| G-B4 零迁移成本 |
论文库沿用 Zotero,PDF 不出本地 |
1.5 成功指标(伴读 MVP 验证期)
| 指标 |
目标 |
| 整体讲解完成率 |
≥ 60% 启动后听完 |
| 单篇备课可听时间 |
摘要 + beats 生成后 ≤ 2 min 可开听 |
| 问答首字延迟 |
≤ 3 s(文字) |
| 解析可用率 |
典型 8 页 NLP 论文 ≥ 90% 段落无需手动修正 |
| 模式切换无摩擦 |
同一 Item 可在 Chat / 伴读 pane 间切换,互不丢状态 |
2. 范围定义
2.1 一期包含(伴读模式 MVP)
- 在现有 ChatPapers 插件内新增 Item pane 「伴读」 标签页(与现有 「ChatPapers」 标签页并存)
- 读取 Zotero PDF 附件 → 本地结构化解析 → 段落树
- 备课流水线:全文摘要 + 整体讲解 beats + 逐段三层讲解;增量备课
- TTS 合成 + 本地 mp3 缓存
- 播放器:整体讲解 / 逐段精读、跳播、语速、文字面板高亮、PDF 页跳转
- 文字提问(锚定 beat / 段落 / 句子 / 全局)→ 文字 + 语音回答
- 伴读报告 + 参考文献卡片 → Zotero 子笔记
- 伴读专属设置项(TTS、教师风格);LLM 设置与 Chat 模式共享
- 断点续播、本地 Lecture 缓存
2.2 一期明确不包含
| 功能 |
计划版本 |
备注 |
| 语音输入(ASR)、barge-in |
v1.1 |
两模式均不涉及 |
| 章节边界软提示、难点句清单 |
v1.1 |
伴读专属 |
| PDF viewer 内段落级高亮 |
v1.1 |
伴读专属 |
| 检验模式(老师考读者) |
v2 |
伴读专属 |
| Chat 模式重构或合并 UI |
— |
Chat 保持独立 pane |
| 独立 BanDu 插件安装包 |
— |
不 fork |
2.3 共享能力边界(不重复建设)
以下能力由 ChatPapers 基座提供,伴读模式直接复用,不在伴读 MVP 中重写:
| 共享模块 |
现有实现 |
伴读用法 |
| Item pane 注册机制 |
readerPane.ts |
注册第二个 section |
| PDF 附件定位 |
extractor.findPdfAttachment |
获取路径;伴读另需 file hash |
| LLM 流式客户端 |
llm/client.ts |
备课 + 问答 |
| Provider 预设 |
llm/providers.ts |
共享同一套 LLM 配置 |
| 子笔记创建 |
zotero/notes.ts |
伴读报告写入 |
| BibTeX / 引用导出 |
zotero/citeExport.ts |
参考文献卡片 |
| PDF 选区读取 |
pdf/selection.ts |
「解释这句」入口 |
| 偏好设置框架 |
ui/prefs.ts |
扩展 TTS / 教师风格分组 |
| Markdown 渲染 |
utils/markdown.ts |
报告预览(可选) |
2.4 模式专属能力(伴读新建)
| 模块 |
说明 |
代码归属(建议) |
| 结构化 PDF 解析 |
MinerU → 段落树 |
src/modules/bandu/infrastructure/pdf/ |
| 备课流水线 |
摘要 / beats / 三层讲解 |
src/modules/bandu/application/ |
| TTS 客户端 |
mp3 + timestamps |
src/modules/bandu/infrastructure/tts/ |
| SQLite 存储 |
Lecture / 进度 / Q&A |
src/modules/bandu/infrastructure/storage/ |
| RAG 检索 |
FTS5 段落检索 |
src/modules/bandu/infrastructure/rag/ |
| 播放器 UI |
<audio> + 状态机 |
src/modules/bandu/ui/ |
| 伴读 pane |
BanduPane |
src/modules/bandu/ui/banduPane.ts |
3. 用户故事
3.1 跨模式用户故事
| ID |
作为… |
我想要… |
以便… |
优先级 |
| US-X01 |
研究者 |
在同一篇论文上切换「对话」与「伴读」 |
先听课再针对性 Chat,或 Chat 后再系统听课 |
P1 |
| US-X02 |
研究者 |
只配置一次 LLM API Key |
两种模式共用,降低设置成本 |
P0 |
| US-X03 |
研究者 |
Chat 笔记与伴读报告都挂在同一 Item 下 |
写论文时在 Zotero 内统一搜索 |
P0 |
3.2 伴读模式用户故事(P0)
| ID |
作为… |
我想要… |
以便… |
| US-B01 |
研究者 |
选中论文后一键「开始备课」 |
AI 先读完整篇再讲解 |
| US-B02 |
研究者 |
选择「整体讲解」收听 |
20 分钟内把握核心 |
| US-B03 |
研究者 |
选择「逐段精读」按章节听 |
深入理解方法与实验 |
| US-B04 |
研究者 |
播放中随时文字提问 |
不打断思路又能澄清疑问 |
| US-B05 |
研究者 |
选中难句点「解释这句」 |
快速理解长难句 |
| US-B06 |
研究者 |
听完后生成伴读报告到 Zotero |
写论文时搜索调出素材 |
| US-B07 |
研究者 |
二次打开同一篇秒进、离线重听 |
不重复花 API 费用 |
| US-B08 |
研究者 |
标记重点段落 |
报告汇总关心部分 |
| US-B09 |
研究者 |
配置 TTS API Key |
控制成本与音质 |
4. 界面与交互需求
4.1 Item Pane 双标签布局
| ID |
需求 |
优先级 |
验收标准 |
| UI-001 |
两个 pane section 独立注册、独立生命周期 |
P0 |
切换 tab 不互相 destroy 对方状态 |
| UI-002 |
伴读 pane 在无 PDF 时禁用并提示 |
P0 |
与 Chat pane 行为一致 |
| UI-003 |
伴读 pane 头部展示论文标题 + 备课状态 |
P0 |
见 §4.3 状态文案 |
| UI-004 |
设置页分「通用 LLM」「ChatPapers」「伴读」三个分组 |
P0 |
LLM 配置只填一次 |
| UI-005 |
伴读库窗口(全库状态列表) |
P1 |
MVP 可简版或后置 |
4.2 伴读页布局(BanDu Pane)
布局沿用 PLAN.md §3.6 wireframe,关键区域:
- 模式切换:整体讲解 | 逐段精读
- 播放控制:▶ ⏸ ⏮ ⏭ 1x / 1.5x / 2x
- 左侧:单位列表(beats 或段落),含已听 / 未听 / ★ 标记
- 右侧:当前讲解文本 + 原文对照 + 提问区
- 底部/侧栏:「生成报告」「看原文(跳 PDF 页)」
4.3 状态展示
| 状态 |
用户可见文案 |
| 未备课 |
「点击开始备课」 |
| 解析中 |
「正在读取论文… {percent}%」 |
| 备课中(可部分播放) |
「整体讲解已就绪,逐段讲解生成中 {n}/{total}」 |
| 已备课 |
「老师已备课 ✓」 |
| 播放中 |
当前单位高亮 + 进度条 |
| 离线可听 |
「已缓存,离线可播放」 |
4.4 模式间交互原则
- 不强制串联:用户可只用 Chat、只用伴读,或组合使用
- 不自动同步上下文:Chat 会话历史不自动注入伴读问答(v1.1 可评估「从 Chat 导入问题」)
- 笔记类型区分:Chat 存笔记标题前缀
ChatPapers:;伴读报告 BanDu 伴读报告:,避免覆盖
- 读者发起,系统不打扰:伴读播完不弹「有疑问吗」(与 BanDu 策划一致)
5. 功能需求
5.1 插件集成(双模式)
| ID |
需求描述 |
优先级 |
验收标准 |
| DM-001 |
伴读作为 ChatPapers 插件内独立模块加载,不新增 addon ID |
P0 |
单一 .xpi,manifest 不变 |
| DM-002 |
hooks.ts 启动时同时注册 Chat pane 与 Bandu pane |
P0 |
两 pane 均可用 |
| DM-003 |
模块代码物理隔离:src/modules/bandu/ 与 src/modules/ui/chatView.ts 分离 |
P0 |
无循环依赖 |
| DM-004 |
伴读不得修改 Chat 模式现有行为与 API |
P0 |
Chat 回归测试通过 |
5.2 PDF 解析与段落树(伴读专属)
| ID |
需求描述 |
优先级 |
验收标准 |
| FR-B010 |
本地解析 PDF,输出章节 / 段落 / 要点三层结构 |
P0 |
段落含唯一 ID、原文、页码、章节路径 |
| FR-B011 |
支持双栏、公式、表格的常见学术论文版式 |
P0 |
Dogfooding 3 类典型论文可用 |
| FR-B012 |
解析结果持久化至 SQLite,key = attachment ID + 文件哈希 |
P0 |
PDF 未变时跳过重复解析 |
| FR-B013 |
解析进度与错误对用户可见 |
P0 |
扫描版等给出可行动提示 |
| FR-B014 |
文字面板展示解析原文供核对 |
P1 |
用户可发现 bad case |
与 Chat 模式关系:Chat 继续使用 PDFWorker 纯文本提取;伴读使用 MinerU 结构化解析。两路径并存,互不替换。
5.3 备课(Lecture 生成)
| ID |
需求描述 |
优先级 |
验收标准 |
| FR-B020 |
生成全文摘要:问题 / 方法 / 结果 / 局限 |
P0 |
四字段非空、中文 |
| FR-B021 |
生成 8–15 个整体讲解 beat,按教学逻辑排序 |
P0 |
每 beat 含讲解文本、类型、refs[] |
| FR-B022 |
beat 的 refs[] 生成后校验,非法引用剔除 |
P0 |
无效 refs 的 beat 降级 |
| FR-B023 |
每个 beat 含三要素:为什么重要 / 例子或数字 / 易混淆点 |
P0 |
Prompt 约束 |
| FR-B024 |
每个段落生成三层讲解 |
P0 |
讲了什么 / 怎么理解 / 全文定位 |
| FR-B025 |
增量备课:摘要 + beats 完成后即可播放整体讲解 |
P0 |
无需等逐段全部完成 |
| FR-B026 |
逐段讲解后台继续生成,UI 显示进度 |
P0 |
新段落就绪后可播放 |
| FR-B027 |
Lecture 本地缓存,二次打开不重复生成 |
P0 |
除非哈希变化或强制重备 |
5.4 TTS 与音频
| ID |
需求描述 |
优先级 |
验收标准 |
| FR-B030 |
讲解文本按 beat / 段落分片合成 mp3 并本地缓存 |
P0 |
路径与 Lecture 单元绑定 |
| FR-B031 |
英文论文音频为中文讲解 |
P0 |
自动检测论文语言 |
| FR-B032 |
保存 word timestamps(若 TTS 提供) |
P0 |
用于文字高亮 |
| FR-B033 |
无 timestamps 时降级句子级 / 段落级高亮 |
P0 |
UI 不崩溃 |
| FR-B034 |
问答回答支持 TTS 播放 |
P0 |
每轮 Q&A 可重播 |
| FR-B035 |
TTS 配置在设置页「伴读」分组,与 LLM 配置分离 |
P0 |
Chat 模式不依赖 TTS |
5.5 播放器
| ID |
需求描述 |
优先级 |
验收标准 |
| FR-B040 |
模式切换:整体讲解 / 逐段精读 |
P0 |
列表与播放单位正确 |
| FR-B041 |
播放 / 暂停 / 上一单位 / 下一单位 / 1x·1.5x·2x |
P0 |
与 <audio> 同步 |
| FR-B042 |
单位列表展示已听 / 未听;断点续播 |
P0 |
恢复正确单位 |
| FR-B043 |
整体模式:beat 文本 + refs 来源段落高亮 |
P0 |
— |
| FR-B044 |
逐段模式:原文 + 三层讲解,高亮跟随音频 |
P0 |
至少句子级 |
| FR-B045 |
「看原文」跳转 PDF 对应页 |
P0 |
页码与段落 page 一致 |
| FR-B046 |
点击列表任意行跳播 |
P0 |
Seek 到该单位起始 |
| FR-B047 |
段落「重点标记」★ |
P0 |
写入进度并进入报告 |
5.6 问答(伴读上下文)
| ID |
需求描述 |
优先级 |
验收标准 |
| FR-B050 |
文字提问,锚定 beat / 段落 / 句子 / 全局 |
P0 |
上下文含锚点原文与讲解 |
| FR-B051 |
选中句子触发「解释这句」 |
P0 |
翻译 + 句法 + 上下文作用 |
| FR-B052 |
回答基于 RAG:当前单位 + 摘要 + 检索相关段 |
P0 |
长论文不整篇塞入 Prompt |
| FR-B053 |
回答文字流式显示,随后 TTS |
P0 |
首 token ≤ 3 s |
| FR-B054 |
Q&A 写入本地记录并纳入伴读报告 |
P0 |
可按段落分组 |
与 Chat 模式关系:伴读问答使用独立 qa_record 表与锚点模型;不复用 Chat 的 sessions/*.json,避免数据结构冲突。
5.7 伴读报告与参考文献
| ID |
需求描述 |
优先级 |
验收标准 |
| FR-B060 |
手动或条件触发「生成报告」 |
P0 |
更新策略:同名 Note 覆盖 |
| FR-B061 |
报告结构:速览 / 收听 / 问答 / 重点 / 参考文献卡片 |
P0 |
Markdown 结构固定 |
| FR-B062 |
参考文献卡片含 BibTeX |
P0 |
复用 citeExport |
| FR-B063 |
Note 标题格式 BanDu 伴读报告: {title} |
P0 |
与 Chat 笔记可区分 |
5.8 设置(共享 + 专属)
| ID |
需求描述 |
优先级 |
验收标准 |
| FR-S010 |
LLM Provider / Base URL / API Key / Model |
P0 |
共享,两模式只读同一 prefs |
| FR-S011 |
Chat 专属:system prompt、summary prompt、answer language |
P0 |
已有,不变 |
| FR-S012 |
伴读专属:TTS Provider / API Key / 音色 |
P0 |
新增 prefs 前缀或分组 |
| FR-S013 |
伴读专属:教师风格预设(简洁 / 详细) |
P1 |
仅影响新生成内容 |
| FR-S014 |
数据流向说明(哪些文本发往外网) |
P0 |
设置页固定文案 |
6. 非功能需求
| ID |
类别 |
需求描述 |
指标 |
| NFR-D001 |
隔离性 |
伴读模块崩溃不影响 Chat pane 可用 |
异常捕获 + 独立 try/catch 边界 |
| NFR-D002 |
性能 |
8 页论文本地解析 |
≤ 3 min |
| NFR-D003 |
性能 |
缓存命中后打开伴读页 |
≤ 2 s 可播放 |
| NFR-D004 |
成本 |
单篇 8 页首次备课总 API 成本 |
≤ ¥10 |
| NFR-D005 |
隐私 |
PDF 不上传;段落文本按请求发送 |
Local-first |
| NFR-D006 |
离线 |
已缓存 Lecture + mp3 可离线播放 |
除问答外不依赖网络 |
| NFR-D007 |
可维护性 |
UI / 领域 / Zotero 适配三层分离 |
见 ARCHITECTURE.md |
| NFR-D008 |
存储 |
伴读数据目录 {Profile}/chatpapers/bandu/ |
与 sessions/ 并列,不混用 |
| NFR-D009 |
兼容性 |
Zotero 9.x |
与现有 manifest 一致 |
7. 数据与存储策略
7.1 目录布局
7.2 缓存键
Chat 模式继续使用 itemKey + attachmentKey 会话文件;伴读使用 cacheKey,互不干扰。
7.3 笔记命名约定
| 来源 |
Note 标题前缀 |
覆盖策略 |
| ChatPapers |
ChatPapers: 或用户自定义 |
每次新建或用户选择 |
| BanDu |
BanDu 伴读报告: |
同名更新,避免笔记爆炸 |
8. 技术集成约束
8.1 建议目录结构
8.2 依赖规则
8.3 Phase 0 验证项(开工前 Go / No-Go)
| # |
验证项 |
通过标准 |
阻塞 MVP |
| P0-1 |
第二 Item pane section 注册 |
与 Chat pane 并存无冲突 |
是 |
| P0-2 |
MinerU 解析 3 篇论文 |
段落可用率 ≥ 80% |
是 |
| P0-3 |
Zotero 9 插件内 SQLite 读写 |
CRUD 正常 |
是 |
| P0-4 |
<audio> 长音频播放 |
10 min+ 无泄漏 |
是 |
| P0-5 |
TTS 中文样本 + timestamps |
自然度可接受;无则确认降级 |
否 |
9. 版本与路线图
9.1 与现有 ChatPapers 版本关系
| 插件版本 |
Chat 模式 |
伴读模式 |
| v0.2.x(当前) |
对话 / 总结 / 多 PDF |
— |
| v0.3.0 |
维护 |
Phase 0 POC |
| v0.4.0 – v0.5.0 |
维护 |
M1–M2:解析 + 备课 + TTS + 播放器 |
| v0.6.0 |
维护 |
M3–M4:问答 RAG + 报告 + dogfooding |
| v1.0.0 |
稳定 |
伴读 MVP 功能完整 |
9.2 伴读模式开发里程碑
| 阶段 |
时间 |
交付 |
| Phase 0 |
第 0 周 |
三项 POC + 双 pane 骨架占位 |
| M1 |
第 1–2 周 |
MinerU 解析 + 段落树 + 备课流水线(纯文本) |
| M2 |
第 3–4 周 |
TTS + 播放器双模式 + 高亮 |
| M3 |
第 5–6 周 |
锚定问答 RAG + 伴读报告回写 |
| M4 |
第 7–8 周 |
增量缓存 / 断点续播 / 设置 / dogfooding 10 篇 |
10. MVP 验收清单(伴读模式)
11. 术语表
| 术语 |
定义 |
| Chat 模式 |
ChatPapers 现有对话 / 总结工作流 |
| 伴读模式 / BanDu |
本插件内第二种工作流:备课 → 听课 → 报告 |
| 双模式 |
同一插件、两个 Item pane、共享 LLM 与 Zotero 集成 |
| Lecture |
一次备课产物:摘要 + beats + 逐段讲解 |
| Beat |
整体讲解播放单位,含 refs[] |
| 共享层 |
llm / zotero / pdf 附件 / utils,两模式复用 |
12. 文档关系
实施优先级:开发伴读功能时,以本文为集成需求主文档;细节 Prompt、数据表、状态机见 ARCHITECTURE.md;产品动机与竞品见 PLAN.md。
13. 待决事项
| 事项 |
负责人 |
备注 |
| TTS 提供商选型 |
技术 |
Phase 0 |
| SQLite 实现方案(better-sqlite3 vs sql.js) |
技术 |
Phase 0 |
| 伴读 pane 图标与 l10n 命名(BanDu / 伴读) |
产品 |
M1 前 |
| Chat → 伴读上下文导入是否做 v1.1 |
产品 |
MVP 不做 |
| 插件对外宣传:单品牌 vs 双品牌露出 |
产品 |
MVP 后 |
14. 文档修订记录
| 版本 |
日期 |
说明 |
| v0.1 |
2026-08-29 |
初稿:方案 A 双模式集成需求 |