https://github.com/CangFengJun/Chalk-Sync 这个仓库总结网课知识点的流程有没有什么地方可以优化的?
回 群友 5111: 先说结论:这个 pipeline 的骨架是站得住的——先把画面证据抽成结构化 JSON,再让另一个模型对照字幕核验,这种"抽证据"和"下判断"分开的设计,比一次调用产出总结要可靠得多,provenance 和分段续跑那块也比同类项目干净。要优化的地方集中在四个杠杆上:省掉没必要的图像 token、让分段边界有意义、把串行改成并行、给自己一个能衡量好坏的判据。按杠杆大小排。 一、抽帧是最贵也最容易省的一环 你现在是 prepare 抽整帧、worker 再分析 PPT 区域。板书和 PPT 属于"演化型"内容——相邻两帧常常只差几行字,全送进模型等于重复付费,还容易让模型把同一张幻灯片反复描述一遍。 建议抽帧后先做去重再送模型。便宜的做法是感知哈希(pHash)或直方图差异,差异低于阈值直接丢;更贴合板书的做法是对固定区域做 OCR 文本 diff,文本没变就不发图。这一步一般能砍掉一大半的图。 再进一步:板书是增量的,可以让 worker 输出"相对上一帧的变化"而不是每次重述整块板面,JSON 里加个 delta 字段。省 token 之外,笔记里"这块板书怎么一步步推出来的"也能保留下来。 还有一类可以直接不发图:纯文字型幻灯片本地 OCR 出文本来发,模型对文本的忠实度比读小字截图高,成本还低一个量级。只有图、公式、表格、示意图才值得走图像通道。 二、布局是条时间线,不是常量 README 里"右侧投影"这种区域看着像每门课手配一次。但一场两小时的课版式是会变的:开头全屏 PPT、中间切板书、后半又切回投影。建议把 layout 做成随时间变化的段列表,并且让它的发现过程自动化一点——用文字密度、边缘密度或 OCR 命中率来分段,缓存成 visual/layout-timeline.json,同结构的课程可以直接复用。 三、分段边界决定笔记质量的上限 现在 chunks 大概是按字符或时间切的。切在话题中间,就是"前言不搭后语"和关键推导断掉的主要来源。 两件事值得做:一是边界往语义断点上靠,字幕里"下面我们讲""这一节总结一下"这类话语标记是免费信号,不够的话用 embedding 找话题漂移点;二是相邻 chunk 留 10%~15% 重叠,衔接处的证据别断。 但比切分更关键的是 Final 阶段的输入范围。如果每个分段都是"worker 证据 + 完整字幕",那输入量是分段数乘全片长度,成本和 524 都会随课程变长而恶化——你 README 里那条 --max-source-characters 的调参建议,基本就是这个撞上了。更稳的做法是两遍:先花一次便宜调用产出一份全片大纲和术语表,然后每个分段只带自己那段证据加上下各一段的摘要,最后合并时再对着大纲核一遍一致性。这样单次请求的大小和片长解耦。 四、串行改并行,这是墙钟上最快见效的 日志里"2/20 完成,用时 48.0 秒"看着是一条条排队的,20 段乘 48 秒就是十六分钟纯等待。加个 3~5 并发的 worker(带退避和限流)能压到几分钟。你的输出本来就按 chunk 独立落盘,天然适合并发,只要别让并发破坏 provenance 的幂等就行。 顺带一个区分:README 写"不自动重试不完整的推理响应",这个原则对,语义层不该偷偷重试。但 HTTP 524 是网关超时,请求体没变,属于传输层错误,用完全相同的 body 退避重试是安全的,可以直接自动化掉现在"手动重跑"那一步。 五、Batch 和前缀缓存是两个白拿的便宜 GPT 那个 profile 已经支持 Batch 了,DeepSeek 只能同步。Batch 一般省一半钱,值得把 provider 适配抽成一层,让任何声明支持 Files/Batch/Responses 的服务都能走。 另外 worker 每次请求的 prompt 前缀应该是完全一致的(schema、规则、输出格式),把不变的内容严格放前面、可变内容放最后,就能吃到 provider 的 prefix cache。不同厂商折扣不一样,得按你实际在用的模型价格页核一遍,但这个的性价比通常比换模型还高。同时建议在 state 里补一份每次运行的 token 和费用汇总,再加个 --dry-run 先估算这次要发多少图多少字——你现在能看到耗时,看不到"这一讲花了多少钱",调参就少了参照。 六、最要紧的:给这条流水线一个判据 现在整套流程没有量化验收,改 prompt、换模型都只能凭感觉。可测的东西其实很多,而且大部分不用人工标注: 引用覆盖率——笔记里每条结论能不能回指到某条字幕或某张帧;反过来,哪些字幕段从头到尾没被任何笔记提到,这就是漏内容。 时间戳有效性——所有 [HH:MM:SS] 能否对上有效时刻。你 cleanup 里已经在检查了,可以扩成全量校验。 概念召回——把 PPT 和板书 OCR 出来的术语表当金标准,看笔记漏了哪些概念。 忠实性抽样——随机抽 20 条结论,人对着原视频判"有据 / 无据 / 过度推断"。 "无据结论比例"这个指标一旦立起来,你就有了比较 ds/gpt 组合、切换模型的客观依据,也能顺手攒出一个 badcase 集。挑一两讲精标一遍,够用很久。 下面是几件小但实打实的: 术语表。字幕是 ASR 出来的,专有名词必错(harness、agent loop、MCP 这类)。准备一份课程术语表,在分段前做一次术语纠正,或者直接塞进 worker prompt,技术课上这个收益比想象中大。 黑板增量语义。板书教学的价值在过程。如果 worker 能记录"这一帧新写了什么",笔记就能还原推导顺序,而不是只给最终答案。 多讲关联。现在一门课一份视频,但概念会跨讲重复出现,第 3 讲讲过的第 7 讲又用。做个跨讲的术语索引互相链起来,一门课学完回头复习时价值最大。 复习产物。终点是 course.md,但学习场景里更有效的是检索练习:从证据里自动生成带时间戳的问答卡片和自测题,看完笔记直接跳回视频核对。这是产品层面很值钱的补充。 单点错误记录。state/last_error.json 只留最后一次错误,看不出"哪几段挂了"。改成按 chunk 记状态的运行日志,配合续跑会好用很多。 隐私边界。xcode.best 那个第三方 endpoint 的提醒你写得很到位。可以再加一个本地模式(本地 OCR 或本地 VLM)作为敏感课程的通道,宁可慢也别把不适合外发的内容送出去。另外这类课堂内容生成的笔记,对外发布前记得确认版权和课程方的要求。 如果只挑三件事先做:worker 并发化、帧去重加板书 delta、把引用覆盖率做成品控指标。这三件都是当天能落地的量级,做完立刻能测出差别。再往后就是把分段边界和跨讲关联做扎实,那才是从"能生成笔记"走到"笔记真能拿来学"的那一步。