我用 Codex 做了一个视频转讲义工具,结果它悄悄漏掉了半节课
对应 Part A 选题二:Agent 工作流中的验收能力
当 Codex 告诉我,视频和字幕都处理好了的时候,我差点就信了。
直到我点开那个所谓处理好的字幕文件。
乱七八糟,根本没法用。
这是我第一次意识到,
Agent 工作流里最危险的地方,
不是它报错,
而是它没报错。
事情是这样的。
我最近想啃一套讲 Agentic AI 的公开课,但课程视频实在是太长了,光靠看回放,效率有点低。
我就寻思,能不能把每个视频都变成一份拿起来就能学的中文讲义。
加上我也有段时间没捣鼓 AI Coding 了。
于是,鬼使神差的,我决定用 Codex 自己做一个工具。
一个丢进去视频链接,就能自己蹦出来一份讲义的工具。
这活听起来不复杂,但真的拆开细想以后,发现里面还是有不少工序的。
先用 yt-dlp 把视频和字幕下载下来。碰到没有字幕的视频,就让 faster-whisper 自己转写。
接着用 FFmpeg 抽帧,再用 Pillow 筛选关键画面。
最后,把字幕和画面对齐,整理成材料包,交给 Writer Agent 生成中文讲义。
整个流程,大概长这样。
因为流程有点长,我没敢直接扔给 Codex 一句话,让它自由发挥。中间任何一环写偏了,后面的结果都会跟着偏。
所以我把 Codex 当成了一个执行力很强,但需要监管的实习生。
我先让 ChatGPT 帮我把任务写成 Plan Prompt,交给 Codex 出施工方案。
方案回来以后,我自己先看一遍,再让 ChatGPT 帮我查漏补缺。
确认没什么明显问题,再生成 Execute Prompt,让 Codex 真正动手。
干完以后,Codex 还得交一份执行报告。
差不多是这么个流程。
另外,我还先手动搭了一个最小骨架,免得它刚进项目就在空白目录里自由发挥。
我当时觉得,这已经拆得足够细了。
结果第一轮就翻车了。
先说第一轮,也就是文章开头那个字幕问题。
Codex 跑完以后,反馈说任务已经完成了。视频下完了,字幕也拿到了。
按理说这一步可以直接过,但我当时多了个心眼,顺手点开字幕文件看了一眼。
然后我人傻了。
它没有选视频自带的干净字幕,而是选了平台自动生成的字幕。
这种自动字幕有个很麻烦的问题,就是它会滚动重复。上一句刚说完,下一句又把前面的内容带着重复一遍。再往下一句,又重复一遍。
如果我只看执行报告里的「字幕已获取」,这个问题根本不会暴露出来。
看起来只是选错了一份字幕,但它会像链式反应一样一路往后污染,后面的内容整理、画面对齐、讲义生成,全都会建立在这份脏文本上。
这种问题最麻烦的地方就在这儿,它不是炸给你看,而是安安静静地混进最后的结果里。
所以从这一轮开始,我给自己加了一条规矩。
不能只看 Agent 说自己做完了。
我得亲自验收。
解决字幕问题之后,我给每轮任务都加了一个固定动作。
验收。
Agent 执行完任务以后,不直接进入下一轮。我会先看它的执行报告,再让 ChatGPT 帮我检查报告里有没有明显漏洞。
报告看起来没问题的话,再单独开一个新的 Codex 会话,让它只做一件事,那就是检查上一轮任务到底有没有真的完成。
这个新的 Agent 不负责继续开发,只负责验收。
文件有没有生成,目录对不对,格式有没有问题,这些机械性的检查都可以交给它。
但是像截图能不能放进讲义,字幕是不是真的干净,这种涉及内容质量和使用价值的问题,还是得让我自己判断。
Agent 和我都检查完没问题之后,再把这轮踩过的坑写回项目文档,让下一轮的 Agent 长点记性,别再犯同样的错误。
整个流程大概是这样。
但真的跑起来以后,我又发现了一个问题。
验收 Agent 有点太喜欢喊人了。
一会儿说这里报错了,一会儿又说那里缺权限。跑一次验收,我还得时刻守在旁边,等着处理各种问题。
这就很烦。
我加验收流程本来就是为了少盯一会儿,结果现在倒好,换了种方式继续盯着,多少有点白忙活了。
所以我在 AGENTS.md 里又补了一套专门针对 Agent 验收的规则。
遇到问题以后,能跑就接着往下跑,别一股脑全丢给我。
Agent 验收时,我让它先看产物本身到底合不合格。
产物不合格,那没什么好说的,直接打回去修。这类问题我记成 FAIL。
如果产物没问题,再看这个问题会不会挡住当前验收。
挡住了,而且 Agent 自己处理不了,那就停下来摇人。这类问题记成 BLOCKED。
不挡路的问题,能自己处理就自己处理。遇到值得记录的问题,就记下来然后继续跑。
至于截图质量这种必须让我来判断的问题,也不用停,等自动检查全部跑完再一次性丢给我确认。
整个分流规则大概长这样。
加完这套规则以后,后面的验收确实顺畅了不少。但很快,我又撞上了一个更隐蔽的问题。
在关键画面提取阶段,抽帧流程能跑,输出目录没问题,文件格式也正常。从程序的角度看,一切正常。
所以验收 Agent 没有报错,只是在报告里提醒我,最好人工检查一下截图质量。
我自己翻了一遍截图,还真发现了问题。
有些图看上去不一样,其实只是同一页幻灯片的先后展开状态。
程序会觉得这两张图差别很大。毕竟画面上确实多了不少元素。
但对人来说,这就是一页还没放完的幻灯片。把这种中间态截图塞进最终讲义里,只会让人看得莫名其妙。
这个问题,程序很难自己判断。
它得靠人。
而且这还不是最麻烦的。验收 Agent 在报告里还提醒了我另一件事,最后一张关键截图停在了 4110s。但整节课实际上有 7101s。
这就很奇怪了。
我顺着它的提示,去看了一眼原视频 4110s → 7101s 的部分。老师一直在讲课,幻灯片也一直在切换。
也就是说,程序不是漏掉了几张截图,而是悄无声息地把后半节课全给漏掉了。
我当时人都麻了。
如果这轮没有人工验收,等到整个项目全部跑完,拿起讲义一看发现少了半节课,再回过头来 Debug,工程量估计得翻好几倍。
等我明确告诉 Agent 这是一个 Bug 以后,它很快就定位到了问题。其实只是候选截图的数量上限设得太低了。
修完这个问题后,第一节课总算是跑通了。我又换了第二节课,想看看这套流程是不是真的能用。
结果讲义还没跑出来,Bug 先跑出来了。
项目卡在视频下载阶段,后面的字幕处理、画面提取、讲义生成,一个都没进去。
最后发现,是我前面把视频清晰度的要求写得太死了,默认必须拿到 1080p。第一节课刚好有 1080p,所以一切正常,第二节课最高只有 720p,导致整个流程直接卡住了。
写到这里的时候,我突然有点 PTSD。
因为这和我平时刷算法题的样子如出一辙,题目样例和自造样例全过了。
一提交,Wrong Answer。
整个项目跑完以后,我回头复盘了一下。
以后再让 Agent 干活,我至少会多检查 4 件事。
第一,原材料到底对不对。
字幕拿错了,后面做得再漂亮也没用。垃圾进,垃圾出。
第二,中间产物到底能不能用。
不要只看 Agent 的执行报告。目录存在,文件生成,程序没报错,这些只能证明它跑了,不能证明结果真的能用。
第三,任务到底有没有完整跑完。
少几张截图可能不明显,但少了半节课,这事就有点离谱了。
第四,换一个样本,还能不能跑。
第一节课成功,不代表第二节课也能成功。样例过了,不代表真的 AC 了。
折腾完这一大圈以后,我越来越觉得,验收这件事,可能比想象中更有技术含量。
Agent 很适合干活,也很适合做机械性的检查。
但什么叫做完了,什么叫能用,什么叫值得放进最后的结果里,这些问题,还是得让人来判断。
以前我总觉得,写 Prompt、搭工作流、让 Agent 自动跑起来,是最重要的部分。
现在我反而觉得,真正决定这套东西上限的,是最后那个负责验收的人。
AI 可以帮我干更多活。
但我得知道,什么样的活,才算干得好。
最后,我把整个流程重新整理成了一张图。
顺便放一下最终生成出来的讲义。
项目仓库放在这里。
https://github.com/nine19een/video-to-handout
文章里的案例、验收流程和截图,都来自这次真实的开发过程。
Agent 最麻烦的,从来不是它报错。
而是它没报错,你也信了。