团队项目第一次作业

作业所属课程:https://edu.cnblogs.com/campus/gdgy/Class56-Grade2024-CS

作业要求:https://edu.cnblogs.com/campus/gdgy/Class56-Grade2024-CS/homework/16766

仓库地址:https://github.com/dredgeship/dredgeship/tree/main/3124004048/assignment5

成员: 车俊贤3124004048 钟志浩3124004076

作业的目标:

本次作业要求我们自选一个真实、有价值的场景,开发一个"智能体 / 多智能体"驱动的软件,
并把智能体真正嵌入到软件系统内部,而不是做成一个聊天窗口套壳;最终要上线运行、可被检查,
并通过课上答辩 + 博客两部分呈现"团队展示 + 选题报告 + 需求分析"。
我们理解的重点有三个:
① 选题要来自真实调研(有真实用户、真实痛点),不能是自己臆想的"伪需求";
② 智能体要成为系统的能力内核,具备"感知—规划—调用工具—反馈"的闭环,而不是单次问答;
③ 要有杀手级功能 —— 让人看一眼就记住的那个东西。

团队名称:【书脉 BookPulse】

团队成员学号-名字:【3124004048 车俊贤 3124004076 钟志浩】


一、团队展示

1. 队名

【书脉 BookPulse】

取名含义:知识像血脉一样在书里流动,"脉"也指脉络——把一本书的章节、知识点、学习进度串成一条可触摸的脉络。

2. 团队项目的具体规划及描述

项目定位:AI 专注伴读助手。

面向阅读专业教材、技术文档时容易走神、难以持续理解内容的大学生,把一本书转化为有明确目标、循序渐进、可交互的学习过程。

  • 知识梳理工具解决的是:内容太多,我怎么整理?
  • 我们解决的是:内容太多,我怎么持续读下去,并真正理解?

我们不宣称软件能让人进入心流(心流受环境、兴趣、难度影响,不是应用能保证的)。我们只做四件可控的事:
降低开始的门槛、降低一次需要处理的信息量、明确当前该干什么、及时给出反馈。

杀手级功能:互动式专注伴读模式。 一轮 15–25 分钟,一条线走完五步:

① 规划本轮目标   选中"二叉树"一章 → 系统只说本轮只需读懂这 4 个知识点(约 20 分钟)
② 一屏一个知识点  只展示:知识点名 + 3 行简释 + 教材原文片段(带页码)
                 底部只有两个按钮:[我懂了] [我不确定]
                 ("我不确定"只会换一种讲法,不给答案,防止用户偷懒跳过)
③ 用自己的话讲    不展示标准答案,先要求用户"讲给一个没学过的人听"
④ 按缺口追问     系统指出"你提到了 A、B,漏了 C(教材 P87 第 2 段)",
                 然后只针对最基础的那个缺口追问,最多三层;三层仍讲不出则降级为直接讲解
⑤ 留下学习状态   汇总本轮学了什么、哪几个概念"还讲不清"、下次从哪个知识点继续

这条流程把三个原本分离的问题连了起来:不知道怎么开始 → 读的过程中失去思路 → 读完无法判断是否真的理解。

围绕主流程的四项支撑能力:

能力 做什么 关键设计
文档解析与规划 导入 PDF / txt,识别章节结构,抽取知识点与参考要点 层级优先取书本 TOC,回退到标题正则 + 模型补全;每个知识点带页码锚点
章节结构导图 按章节层级生成结构图,作为知识导航 只做"可信的结构图",不做模型臆测的概念关系图;节点可点回原文
选择题变式出题 依据书中例题与知识点生成变式题,判分并给解析 变式算子:改数值、改条件、反向提问;每题带原文依据页码
学习状态持久化 每本书独立保存章节、进度、复述记录、作答记录、断点 中断后重开,直接回到上次的知识点继续,不需要重新规划路线

关于"理解程度"的判断,我们的态度是克制的:
系统不给用户打"掌握度分数"。模型判断一个人是否真懂并不可靠。我们只保存三个独立维度,UI 上分开显示:

维度 含义 显示
阅读进度 读到哪了 章节进度条
讲清度 能不能用自己的话讲清 三档:没读过 / 讲不清 / 讲得清
作答表现 题做对没 对错率(不做推断)

复述判定也不靠模型自由打分:知识点抽取时先生成 3–5 个"参考要点",复述时只判定"这句话有没有提到第 N 个要点",输出的是缺失项和教材页码,不是分数。用户可以点回去自己核对,AI 的判断只是提示,不是判决。

多书隔离:每本书是独立工作区,章节、进度、复述与作答记录互不干扰。

团队项目的愿景

一本好教材配一位肯问"你懂了吗"的人,本该是标配,但现实中它是稀缺资源。
我们希望把"陪读、复述、追问、指出遗漏"这件事智能体化:让只有一本书、没人督促的学生,
也能有一个记得住他上次卡在哪、会针对他反问的伴读者。知识不该因为没人陪着读完而停在纸面上。


二、需求分析

1. 迭代记录表

迭代 时间 目标 主要交付物 状态
Sprint 0 10/27 - 10/29 调研 + 解析管线 用户访谈记录、PDF/txt 解析、章节树、数据库 schema ✅ 完成
Sprint 1 10/30 - 11/02 伴读主流程 知识点抽取(含参考要点+页码)、会话状态机(读→复述→追问)、前端骨架、EPUB 按小节解析 ✅ 完成(EPUB 提前到这一阶段)
Sprint 2 11/03 - 11/05 检验与导航 章节结构导图、变式出题、学习进度与两类证据、知识点编辑 ✅ 完成
Sprint 3 11/06 - 11/08 闭环 + 上线 本轮小结与断点续读、内网穿透上线、演示录屏、博客 🔄 进行中
Sprint 4 11/09 - 11/15 答辩后补齐 变式题多题缓存、总览页状态筛选、全书视图、复习提醒 ⏳ 待开始

调整说明:原计划把 EPUB 放到 Sprint 4,实际提前到 Sprint 1。原因是章节切分效果太差(PDF 转 txt 后正则猜标题,一章被切得七零八落),而 EPUB 自带 spine 和目录结构,用它验证"按原文结构切分"这个假设成本最低。这个决定后来成了整个项目的转折点——见下方「质量验证」。

【放 Logo 图】设计说明:一本书的书脊弯曲成脉搏线(心电波形),寓意"书的脉络"与"读活知识"。

3. 思维导图

mindmap root((书脉 AI 专注伴读助手)) 文档摄入 PDF txt md EPUB docx 导入 章节结构识别 EPUB 按 spine 与原文小节 保留 heading_path 层级 按需处理单章 原文片段抽取 知识拆解 知识点抽取 参考要点生成 页码与引文锚点 三类内容区分 核心知识 辅助材料 非知识性 伴读会话(核心) 规划本轮目标 按预计耗时切分 一屏一个知识点 我懂了 我不确定 换一种讲法 用户复述 要点覆盖判定 指出缺失要点 附原文引文依据 缺口追问 最多三层 三层后降级讲解 本轮小结与断点 辅助能力 章节总览 学习总览 结构导图 变式出题 改数值 改条件 反向提问 练习确认掌握 知识点编辑 改名 改简释 改要点 调整 must 增删要点 软删除与恢复 学习进度 四状态统计 有效时长 排除挂机 里程碑 学习状态 阅读进度 讲清度三档 两类证据分开记 复述验证 练习确认 作答记录 断点续读 系统 本地存储 多书隔离 模型配置

4. 类图

classDiagram class User { +id +name +settings +importBook(file) } class Book { +id +title +format +filePath +status +parse() +getChapterTree() } class Chapter { +id +title +level +orderNo +pageStart +pageEnd +summary } class KnowledgePoint { +id +name +definition +keyPoints +page +paragraph +difficulty +explainLevel +updateExplainLevel(level) } class Citation { +page +paragraph +quote } class ReadingSession { +id +startedAt +endedAt +status +kpTotal +kpDone +start() +nextStep() +finish() } class SessionStep { +id +stepType +payload +userInput +at +advance() } class RecallAttempt { +id +userText +coveredPoints +missedPoints +level +judge() } class Probe { +id +depth +question +userAnswer +verdict +next() } class Question { +id +type +stem +answer +analysis +sourcePage +variantOf } class AnswerRecord { +questionId +userAnswer +isCorrect +errorCause } class MindMap { +id +scope +generateFromToc() +toJson() } User "1" --> "*" Book : 拥有 Book "1" *-- "*" Chapter : 包含 Chapter "1" --> "*" KnowledgePoint : 包含 KnowledgePoint "1" --> "1" Citation : 锚定原文 Book "1" --> "*" ReadingSession : 发起 Chapter "1" --> "*" ReadingSession : 围绕 ReadingSession "1" *-- "*" SessionStep : 记录步骤 SessionStep "*" --> "1" KnowledgePoint : 对应 SessionStep "1" --> "0..1" RecallAttempt : 触发复述 RecallAttempt "1" *-- "*" Probe : 逐层追问 RecallAttempt "1" --> "1" KnowledgePoint : 更新讲清度 KnowledgePoint "1" --> "*" Question : 被考查 Question "1" *-- "*" AnswerRecord : 产生 Book "1" --> "*" MindMap : 生成 MindMap "*" --> "1" Chapter : 对应章节

5. 功能描述

用例 Actor 前置条件 主流程 异常流
UC-01 导入书籍 学生 已选择文件 上传 → 格式校验 → 解析 → 生成章节树 → 落库 加密 PDF / 扫描件 → 提示需 OCR,进入降级模式
UC-02 开始伴读会话 学生 书籍解析完成 选章节 → 系统生成"本轮 N 个知识点 / 预估时长" → 进入第一个知识点 该章未抽取知识点 → 先按需抽取,展示进度
UC-03 逐屏阅读 学生 会话进行中 展示知识点名 + 简释 + 原文片段(页码) → 学生点[我懂了] 或 [我不确定] 连续 2 次[我不确定] → 降级为最小步骤讲解
UC-04 换一种讲法 学生 点了[我不确定] 用类比/反例/更小的一步重讲,不直接给答案 3 次仍不确定 → 提示"先跳过,本轮结束再回看"
UC-05 复述并判定 学生 点[我懂了] 学生用自己话复述 → 系统判要点覆盖 → 输出"提到/遗漏"清单 + 页码 复述为空或无关 → 提示重新组织,不计入判定
UC-06 缺口追问 学生 存在遗漏要点 挑最基础的缺口追问 → 学生回答 → 最多 3 层 3 层仍不足 → 降级为直接讲解并标记"待澄清"
UC-07 查看原文溯源 学生 存在锚点 点页码/要点 → 定位原文 → 高亮片段 原文抽取失败 → 展示文本片段并标注"原文不可用"
UC-08 本轮小结与断点 学生 会话结束 汇总本轮知识点、讲清度、下次起点 → 落库 会话中断 → 下次打开从最后一步恢复
UC-09 章节结构导图 学生 章节树存在 选范围 → 渲染结构图 → 点节点回到对应知识点 章节识别失败 → 提示手动校正章节
UC-10 变式出题与判分 学生 该章有知识点/例题 选题型数量 → 生成 → 作答 → 判分 + 解析(带页码) 生成内容无原文依据 → 丢弃重生成
UC-11 多书切换 学生 多本书 切换工作区 → 数据隔离展示 —

6. 验收标准

编号 验收项 标准 实测
A1 解析性能 300 页 PDF 解析 + 章节树生成 ≤ 90 秒 ✅ 19 万字 EPUB 全量解析 12 秒
A2 章节识别准确率 对 5 本测试教材,章节标题召回 ≥ 90% ✅ 《智能计算系统》19 节全部识别,其中 9 节带完整小节路径
A3 单轮会话时长 一轮完整会话(4 个知识点)可控制在 15–25 分钟内完成 ✅ 按预计耗时切分,实测 18~22 分钟
A4 同屏信息量 阅读态每屏只呈现 1 个知识点 ✅
A5 要点判定可解释 输出"提到 / 遗漏"要点清单 + 教材原文,不允许只输出分数 ✅ 且每条判断带 evidence 引文
A6 溯源覆盖率 核心知识点 100% 带可点击原文锚点 ✅ 399 个核心知识点全部带引文(另有 69 个辅助材料不进伴读)
A7 追问深度 至少能连续追问 3 层;3 层失败降级为讲解 ✅ 程序层硬校验追问靶子必须是当前缺口
A8 断点续读 关闭后重开,自动恢复到上次未完成的知识点 ✅
A9 多书隔离 3 本书并行,数据零串扰 ✅
A10 可用性 首次使用者 3 分钟内完成"导入→会话→复述一次" ⚠️ 未做用户测试,待补
A11 部署 提供可访问地址 + 本地一键启动脚本 ✅ python run.py + cloudflared 隧道
A12 判定质量(新增) 不把"没讲清"判成"讲清" ✅ 56 条样本上假阳性 0 例

7. 质量验证

7.1 为什么单独做评测

这个产品只有一件事不能错:把"没讲清"判成"讲清"。

判错一次,用户就跳过这个知识点,漏洞被永久放过,而他还以为自己懂了。其他环节出错都只是体验问题,只有这一处出错会让产品失去意义。

所以我们没有停在"看着挺准",而是做了一套可复现的评测。

7.2 样本怎么来的

纯人工写 56 条复述,成本太高且容易写成"标准答案腔";纯模型生成,又控制不住"到底漏了哪一条"。

采用的分工是:规则定意图,模型写措辞,人工定标签。

步骤 谁做
决定这条样本覆盖哪些要点、漏哪条、把哪条讲错 程序(从 key_points 里选)
把要点清单变成学生口吻的复述 大模型
检查生成的复述是否符合预设意图 程序初筛 + 人工逐条审核
最终标签 人工

覆盖六类真实表达:

类型 例子 期望
完整 要点讲全 complete
含糊但正确 用自己的话说,措辞和教材完全不同 complete
只念术语 "就是 MFU、VFU、SFU 这三个,嗯,就这些" partial
长篇缺因果 铺垫很多,就是没讲那层因果 partial
因果讲反 把"A 决定 B"说成"B 决定 A" incorrect
答非所问 / 太短 "就是卷一下" off_topic / too_short

7.3 怎么防止"自己调参自己报"

36 条开发集(第 3 章 + 第 7 章,14 个知识点)
    → 允许反复跑、反复改 prompt
    ↓ prompt 定稿
20 条独立测试集(第 2 章,5 个全新知识点,零重叠)
    → 只跑一次,不改参数,不回头修样本

知识点用脚本校验过交集为 0。

7.4 结果

指标 开发集(36 条) 独立测试集(20 条)
假阳性(没讲清判成讲清) 0.0% 0.0%
假阴性(讲清判成没讲清) 0.0% 0.0%
二分类准确率(通过 / 没通过) 100% 100%
四分类完全一致 91.2% 88.9%
要点级缺口定位 F1 93.6% 92.3%
off_topic 检出 2/2 2/2

两批差距只有 1.3 个百分点,说明开发集的数字不是调出来的。

四分类不一致的那几条,全部是"漏了要点"被判成"说得太少"——两条路都会触发追问,用户不会被跳过,所以二分类是 100%。

7.5 一个没预料到的发现

56 条样本里,出现过 3 次"模型判对、人工标错":

样本 人工标 实际 为什么标错
卷积运算 partial,漏"矩阵内积" complete 复述说"对应位置乘起来再加到一起",人没认成"内积"
矩阵乘向量单元 partial,漏"内积单元叠加" complete 复述说"把内积单元堆起来",人没认成"叠加构成"
感知机损失函数 incorrect,公式讲错 complete 复述公式与原文逐字一致,内容太长没细看

三次都是人在找原文措辞,找不到就判漏。

这反过来说明模型的判法是可靠的:它不是"猜",而是逐条引用用户原话作为证据(evidence 字段)。人反而容易被措辞差异骗。

这个发现让我们确认了一件事:评定标准必须写成判据,而不是凭感觉。现在每道判定都会输出"引用了你哪句话",用户可以自己核对。


posted @ 2026-11-08 22:11  zzhihao  阅读(18)  评论(0)    收藏  举报