
Cross Video QA
用户问「我哪一期讲过 X」「这几部视频里谁说过 Y」「X 在我的视频里是怎么讲的」「有哪些讲 X...
Install
npx skills add JimLiu/baocut --skill cross-video-qa -g -a claude-code -y- Repository
- JimLiu/baocut1.6k
- Category
- Engineering
- Updated
- 3d ago
- License
- See repository
- Context cost
- Lightabout 592 tokens
- Runs scripts
- No, instructions only
What it does
用户问「我哪一期讲过 X」「这几部视频里谁说过 Y」「X 在我的视频里是怎么讲的」「有哪些讲 X 的视频」这类要在多部视频里找答案的问题时用:按意思检索、按视频去重、按当前版本重新定位,只凭找回来的原话回答,每条论断注明视频与时间,覆盖不全时说明。不用于总结或改写一部视频(那是总结、博客),也不改视频。
跨视频问答
用户想知道的是「讲过没有、在哪讲的、怎么讲的」。答案的价值在出处:每一条说法都要能让用户回到那部视频的那一刻去核对。找不到就说找不到,不拿常识或猜测补。
1. 想清楚要找什么
- 把问题改写成一两句检索句:说的是什么事,而不是用户原话里的口头词。换一种说法再写一句(同义词、行话与大白话、另一种语言的说法),两句分别检索,覆盖不同的讲法。
- 用户限定了范围(某个项目、某几部视频)时带上
projectId、videoIds。问某个说话人说过什么时,检索没有说话人筛选:照常检索,再看命中的speaker与上下文对不对得上。
2. 检索
- 用
space_search_v2检索(mode用默认的 hybrid;kinds先给["speech"]找原话,原话不够再放开到字幕与译文)。一句检索一次,limit取 20 左右;两句检索的命中按hitId合并,同一部视频同一段时间的算一条。第一页都相关、还有nextCursor时,传回cursor再取一页。 - 读结果的
effectiveMode、degraded与coverage:effectiveMode是 lexical 且带degraded.reason时,这台机器没有可用的语义索引,只按字面找了:字面检索要每个词都出现,改用两三个关键词(不是整句)再检一次;换了说法的内容找不到,回答里要说明。- 工具报
SEMANTIC_UNAVAILABLE时语义检索还没就绪:改用space_search按关键词找,回答里说明。 degraded.reason为INDEX_PARTIAL(knownScopeComplete为 false)时,有视频还没进索引,结果可能不全,回答里要说明;missingInput是没有文稿的视频(按讲话找不到),excluded是用户在设置里没纳入语义索引的项目(只按字面找过)。需要时用space_index_status看是哪几部。
- 证据类别是 summary(章节标题与摘要)的命中只用来知道「哪一段可能讲了」,不能当原话引用;要引用时在那一段里再找讲话原话。
weak的命中只是按意思勉强沾边:先读原文确认真的在讲这件事再用;全部是 weak 时多半没有答案,照「没找到」处理。
3. 去重与重新定位
- 按
videoId分组,每部视频只留最相关的一到三条。同一段话的文稿与字幕工具已经只留一条;译文与原话都命中时只留原话。 - 命中的
needsResolve为 true 时,视频在建索引之后改过:用space_resolve_search_hit按当前版本重新定位。- resolved:用返回的
spans作时间(同一句出现几次就有几段,取第一段)。 - not-in-timeline:这句还在文稿里但已经剪出时间线,时间是素材的源时间;引用时注明「已剪掉」。
- gone:已经没有了或你看不到,丢掉这条。
- unsupported:没法重新定位,时间可能已经不准;引用时注明。
- resolved:用返回的
- 命中只是一小段,读不出完整意思时,用
speech_relevant(intent写检索句,videoIds只给这部视频,neighbors给 2)取前后文。 - 命中的
clock为 sequence 时是时间线上的时间,可以直接写;为 source 时是素材的源时间,引用时注明。
