# RDAIReaderView 商用测试与发布计划 **文档状态:** Draft 0.1 **最后更新:** 2026-07-25 **目标版本:** RDAIReaderView 1.0 ## 1. 目标 测试计划验证以下结论: 1. AI 模块不会破坏现有 PDF、EPUB、搜索、标注和 TTS。 2. 索引和引用在书籍更新、分页变化、OCR 和应用中断后仍然可靠。 3. Foundation Models 的输出有证据、可拒答、不剧透并可安全降级。 4. 性能、内存、耗电、隐私和可访问性达到商用要求。 5. Prompt 或系统模型更新后,可以通过可重复评测发现质量回归。 ## 2. 测试层级 ```text 人工与 TestFlight 验收 ↑ UI / 真机系统测试 ↑ PDF / EPUB / TTS 集成测试 ↑ AI 产品评测与 Prompt 回归 ↑ Core / Storage / NLP 单元测试 ``` 确定性校验优先放在单元测试;非确定性生成质量使用固定数据集、多次运行和人工评审。 ## 3. 测试目标与 Target 建议新增: ```text RDAIReaderViewCoreTests RDAIReaderViewNaturalLanguageTests RDAIReaderViewFoundationModelsTests RDPDFReaderViewAITests RDEpubReaderViewAITests ReadViewDemoAIUITests ``` Foundation Models 真机测试与普通 CI 分离,避免不支持模型的 Runner 造成假失败。 ## 4. 测试数据 ### 4.1 数据来源 只使用: - 公版书籍。 - 项目拥有测试授权的书籍。 - 团队自行编写的合成文本。 - 经过脱敏、明确允许进入测试仓库的样本。 不得把商业书籍全文或用户内容提交到测试仓库。 ### 4.2 数据集组成 首版至少包含: | 类型 | 最低数量 | 重点 | |------|----------|------| | 中文小说章节 | 20 | 多人物、别名、代词、倒叙、否定关系 | | 英文小说章节 | 10 | 名称大小写、代词、长句 | | 中文技术/非虚构 | 10 | 术语、组织、事实问答 | | 英文技术/非虚构 | 10 | 代码块、列表、表格 | | 原生文本 PDF | 5 本/50 页 | 单栏、双栏、页眉页脚 | | 扫描 PDF | 5 本/50 页 | OCR 错字、旋转、低清晰度 | | EPUB | 5 本/30 章 | CFI、脚注、长章节、重排 | | 无答案问题 | 20 | 拒答 | | 剧透边界问题 | 20 | 已读/未读范围隔离 | | 同名或别名关系 | 20 | 实体合并准确性 | 首版产品评测集不少于 100 个 Case。每个 Case 保存输入、允许范围、期望证据、可接受答案要点和禁止行为。 ### 4.3 Case 格式 建议使用 JSONL: ```json { "id": "qa-zh-001", "task": "questionAnswering", "documentFixture": "novel-zh-01", "readScope": { "resourceOrderUpperBound": 3, "utf16UpperBound": 8200 }, "input": "林川为什么离开村庄?", "expectedPassageIDs": ["p-3-18", "p-3-19"], "requiredFacts": ["受到追捕"], "forbiddenFacts": ["第四章之后的身份揭示"], "expectedStatus": "answered" } ``` 测试结果不得把 fixture 原文写入可上传日志。 ## 5. Core 单元测试 ### 5.1 文本范围 - 空文本、空白文本和超长文本。 - Emoji、组合字符、代理对、中文标点和换行。 - UTF-16 范围与 Swift String Index 双向转换。 - 搜索规范化不能改变 source range。 - Passage 重叠不能产生错误 Locator。 ### 5.2 哈希与失效 - 相同内容产生相同哈希。 - 只改变一个章节时只失效该资源。 - Prompt 版本变化只失效相关 Artifact。 - embedding 模型 revision 变化只重建对应向量。 - 阅读范围扩大不复用越界缓存。 ### 5.3 存储与迁移 - 首次建库、重复打开和并发读取。 - 每个 Schema 版本向下一版本迁移。 - 迁移中断后恢复或回滚。 - 数据库损坏时保留诊断并可安全重建。 - 按书删除和删除全部数据。 - 登出/删书回调后无孤立 Passage、向量或 Artifact。 ### 5.4 索引调度 - 当前章节优先。 - 暂停、恢复、取消和重复 prepare。 - 应用强制退出后从 checkpoint 恢复。 - 内存警告取消低优先级任务。 - 内容 Provider 释放后任务安全失败,不野指针或永久等待。 ## 6. Natural Language 测试 ### 6.1 语言与分句 - 中文、英文、中英混排。 - 无标点长段落。 - 缩写、小数、网址和引号。 - 句子范围与 RDSpeechReaderView 结果一致。 - 不支持语言的降级分块。 ### 6.2 实体 按任务统计 Precision、Recall、F1: ```text precision = 正确识别实体 / 所有识别实体 recall = 正确识别实体 / 所有标注实体 F1 = 2 * precision * recall / (precision + recall) ``` 首版门槛: - 人物候选 Precision ≥ 0.95。 - 人物候选 Recall ≥ 0.85。 - 地点/组织作为辅助信息,F1 ≥ 0.80。 人物候选宁可少召回,也不能大量创建虚假人物。 ### 6.3 检索 - 关键词命中、同义表达、别名和错别字。 - Top 5 包含正确证据的 Recall@5 ≥ 0.90。 - 无 embedding 资源时词法检索仍可返回结果。 - 已读范围外 Passage 召回数必须为 0。 - 相同输入和索引版本的词法结果顺序稳定。 ## 7. PDF Adapter 测试 - 原生文本 run 按 `readingOrder` 正确拼接。 - 双栏页面不会按几何坐标错误穿插。 - run 间换行计入 UTF-16 范围。 - Passage 范围映射回正确 normalized rects。 - characterRects 存在/缺失均可高亮。 - OCR 与原生文本来源正确标记。 - OCR 缓存命中、失败、取消和重试。 - 页面缓存裁剪后 Citation 仍可重新加载。 - 跳转后目标页和高亮正确。 - 旋转、横屏、竖滑、双页模式下高亮位置正确。 - 页面导航取消 OCR 时,AI 索引任务不应永久丢失。 PDF 引用定位有效率必须 ≥ 99%。 ## 8. EPUB Adapter 测试 - `href` 规范化一致。 - UTF-16 range、rangeAnchor、CFI 和 rangeCFI 互相映射。 - 改字号、行距、边距、字体和横竖屏后 Citation 可恢复。 - 长章节按需加载时可提取目标资源。 - 脚注、列表、图片替代文本和代码块类型正确。 - EPUB 更新导致 source hash 变化时旧 Citation 标记 stale。 - CFI 缺失时 progression 只作兜底。 - 引用跳转复用标准位置恢复流程。 - 固定版式无文本章节返回明确不可分析状态。 EPUB 重排后引用定位有效率必须 ≥ 99%。 ## 9. Foundation Models 产品评测 ### 9.1 运行方式 - 每个 Case 至少运行 3 次,避免偶然结果掩盖问题。 - 按系统模型版本、系统语言和设备分桶。 - Prompt 新版本同时运行旧版和新版,生成差异报告。 - 代码校验先执行,再进入人工/模型评分。 ### 9.2 摘要 Rubric | 分数 | 标准 | |------|------| | 5 | 覆盖关键事件,全部有证据,无未读信息,表述简洁 | | 3 | 基本正确但遗漏一项重要内容,或引用不够精确 | | 1 | 包含无证据事实、重大误解或剧透 | 发布门槛: - 平均分 ≥ 4.0。 - 任一剧透 Case 失败即阻断发布。 - 无证据事实比例 ≤ 2%。 ### 9.3 问答 Rubric 检查: - 是否回答用户问题。 - 每个事实是否被引用支持。 - 是否遗漏关键反证。 - 证据不足时是否拒答。 - 是否泄漏未读内容。 发布门槛: - Context faithfulness ≥ 98%。 - 无答案正确拒答率 ≥ 95%。 - Citation validity ≥ 99%。 - Spoiler safety = 100%。 ### 9.4 人物与关系 Rubric 检查: - 人物真实出现。 - 别名有明确证据。 - 同名人物未误合并。 - 关系方向正确。 - `confirmed` 与 `possible` 分类合理。 - 冲突关系没有被静默覆盖。 发布门槛: - Character precision ≥ 97%。 - Alias merge precision ≥ 98%。 - 关系证据覆盖率 = 100%。 - 无证据关系数 = 0。 ### 9.5 LLM Judge LLM Judge 只作为辅助: - 使用固定 Rubric,不使用泛化“是否有帮助”问题。 - 先对至少 30 个 Case 与人工评分校准。 - Spearman/Pearson 相关性低于 0.7 时不得作为发布门禁。 - Judge 分歧、低分和边界 Case 必须人工复核。 - 若使用云端 Judge,测试原文必须为可上传的公版或合成数据。 ## 10. 可用性与错误测试 覆盖: - iOS 15/17:Foundation Models 模块不参与运行。 - iOS 26+ 不支持设备。 - Apple Intelligence 未开启。 - 模型正在下载或未准备。 - 当前语言不支持。 - context limit exceeded。 - guardrail 拒绝输入或输出。 - 生成中取消、切书、关闭页面、进入后台。 - 同一 session 并发请求。 - 低存储空间和数据库写入失败。 每种情况必须产生稳定枚举状态,并保持阅读器可操作。 ## 11. UI 与可访问性 ### 11.1 UI 自动化 - 打开/关闭 AI 面板。 - 当前章节索引状态。 - 发起问题、取消和重试。 - 点击引用并跳转高亮。 - 仅已读范围默认开启。 - 整本书模式确认。 - Foundation Models 不可用状态。 - 清除本书和全部 AI 数据。 - AI 结果交给 TTS 朗读。 ### 11.2 可访问性 - VoiceOver 顺序和标签。 - Dynamic Type 最大辅助字号。 - Reduce Motion。 - 深色模式和高对比度。 - `possible`/`conflicting` 不只依赖颜色。 - 加载、取消和失败状态有可访问性公告。 ## 12. 性能与资源测试 目标设备至少覆盖: - 最低性能 iOS 15 支持设备。 - iOS 17 中档设备。 - 一台首代支持 Apple Intelligence 的设备。 - 一台当前系统的高性能设备。 基准: | 指标 | 1.0 目标 | |------|----------| | 当前章节基础索引 P95 | ≤ 2 秒 | | 10 万中文字基础索引 P95 | ≤ 30 秒 | | 本地检索 P95 | ≤ 300 ms | | 生成首个可展示结果 P95 | ≤ 5 秒 | | 引用跳转 P95 | ≤ 500 ms,不含未缓存页面加载 | | 索引峰值额外内存 | 目标 ≤ 150 MB,按真机基线确认 | | 空闲内存释放 | 30 秒内释放 embedding 和大文本缓存 | | AI crash-free session | ≥ 99.9% | 测试同时记录: - CPU time。 - 主线程卡顿。 - thermal state。 - 电量变化。 - 数据库大小/万字。 - embedding 资源加载耗时。 - 缓存命中率。 性能基线变化超过 15% 时 CI 或发布报告必须提示。 ## 13. 隐私与安全测试 - 网络抓包确认默认实现不上传书籍或问题。 - 搜索日志、控制台日志和 crash breadcrumbs 不含原文。 - 清除 AI 数据后数据库、缓存和临时文件均删除。 - 删除书籍和退出账户触发相同清除路径。 - Scope 过滤在检索前和生成后均执行。 - 构造伪造 Passage ID,确认 Citation Validator 拒绝。 - 构造路径、超长查询和大量 Tool 参数,确认边界限制。 - Tool Calling 最大次数和重复调用检测生效。 - 数据库迁移和诊断包不泄漏原文。 ## 14. 回归测试 每次合入必须运行: - Core 单元测试。 - Natural Language 确定性测试。 - PDF/EPUB Adapter fixture 测试。 - 现有 PDF、EPUB 和 TTS 编译。 - `git diff --check` 和公共 API 兼容检查。 每日或候选发布运行: - UI smoke。 - 完整 AI 评测集。 - 大书索引性能。 - Foundation Models 真机矩阵。 - 现有 `ReadViewDemoUITests` 回归。 ## 15. CI 建议 ```text PR: lint/diff-check Core unit tests NLP unit tests Adapter tests build iOS 15 target build iOS 26 FoundationModels target Nightly: Full reader UI regression AI deterministic evals Performance fixtures Release candidate: Foundation Models physical-device eval Human review sample Privacy/network audit Migration matrix ``` 设备模型评测结果应保存以下元数据: - OS 版本。 - 模型版本或可识别 profile。 - Prompt identifier/version。 - fixture version。 - SDK commit。 - 各指标与失败 Case ID。 不得保存生产用户原文。 ## 16. 缺陷分级 ### P0 - 泄漏书籍内容或阅读历史。 - 绕过已读范围造成剧透。 - 删除用户原书、标注或笔记。 - 大面积崩溃或数据库不可恢复损坏。 ### P1 - 无引用或错误引用的事实作为确定答案展示。 - 人物关系大面积误合并。 - Foundation Models 不可用导致阅读器不可用。 - 引用跳转到错误章节/页面。 ### P2 - 摘要遗漏、检索质量下降、局部 UI 或性能问题。 - 可重试且不影响阅读主流程的生成失败。 发布时 P0/P1 必须为 0;P2 必须有明确接受记录和后续版本计划。 ## 17. TestFlight 灰度 ### 阶段 A:内部 - 团队和测试设备。 - 至少 7 天。 - 完整日志仅限脱敏元数据。 ### 阶段 B:5% - 只开启摘要和问答。 - 观察 crash-free、取消率、拒答率、引用点击成功率。 - 人物关系仍受远程/本地 feature flag 控制。 ### 阶段 C:25% - 开启人物卡片。 - 关系图只对达到索引完整度的书籍开放。 - 至少稳定 7 天。 ### 阶段 D:100% - 所有发布门禁持续达标。 - 保留快速关闭 Foundation Models 功能的配置,但关闭后基础阅读和 NLP 正常。 ## 18. 最终发布门禁 - [ ] 五份开发文档与实现一致。 - [ ] 公共 API 兼容检查通过。 - [ ] Core/NLP/Adapter 单元和集成测试通过。 - [ ] 现有 Reader 与 TTS 回归通过。 - [ ] 100+ AI Case 全量运行并达到指标。 - [ ] Foundation Models 支持与不支持路径均完成真机测试。 - [ ] PDF/EPUB Citation validity ≥ 99%。 - [ ] Context faithfulness ≥ 98%。 - [ ] Spoiler safety = 100%。 - [ ] AI crash-free session ≥ 99.9%。 - [ ] 隐私和网络审计通过。 - [ ] 无 P0/P1 缺陷。 - [ ] TestFlight 灰度指标稳定。