Post

HKUDS021: VideoRAG 作为 Extreme Long-Context Video Memory 与 Multimodal Knowledge Ingestion Layer

HKUDS021: VideoRAG 作为 Extreme Long-Context Video Memory 与 Multimodal Knowledge Ingestion Layer

这是 PENGYI_HKUDS_STUDYMAP 的第二十二篇。

1
HKUDS021 -> VideoRAG

上一篇 HKUDS020 看的是 FutureShow

1
FutureShow = Forecasting Agent Benchmark + Prediction Market Arena + Quant Judgment Layer

FutureShow 给我们的关键词是:

1
2
3
4
forecast object
judgment ledger
prediction market baseline
outcome-verifiable decision

这一篇进入 VideoRAG。 它给我们的关键词完全不同:

1
2
3
4
video memory
long-context video understanding
multimodal evidence ingestion
chat with your videos

如果把两篇连起来看:

1
2
FutureShow gives us forecasting.
VideoRAG gives us video memory.

这刚好补上我们 Research OS 的一个关键入口。 因为很多真正高价值的知识不是 paper,不是 PDF,也不是网页,而是在:

1
2
3
4
5
6
7
8
9
访谈
课程
讲座
seminar
podcast
公司分享
research talk
demo video
会议录像

这些东西如果只是“看过了”,很快就会丢。 如果能进入 VideoRAG,它就能变成可查询、可引用、可复用的 research memory。

Local Snapshot

这次阅读的是本地 HKUDS 工作区里的 VideoRAG

ItemValue
repoVideoRAG
remotehttps://github.com/HKUDS/VideoRAG.git
branchmain
local headc412a09
full commitc412a093a820ef7a0e0dda31076ed871136198b3
latest local commit date2026-03-18 16:33:03 +0800
latest local commitdocs: upload results
statusclean, synced with origin/main after fetch
tracked files by git ls-files118
Python files51
TypeScript / TSX files41
main foldersVideoRAG-algorithm, Vimo-desktop
desktop packagevimo-desktop@0.1.0
package managerpnpm@9.10.0
Node requirement>=20.x
Python syntax checkpy -m compileall -q ... passed
frontend local checkpnpm unavailable in current machine, so frontend lint/build not run
licensedual license: framework architecture MIT, current implementation NonCommercial due ImageBind

一句话先行:

1
VideoRAG 把视频拆成 segment、transcript、caption、visual embedding、text chunk 和 entity graph,再通过文本检索 + 图检索 + 视觉检索联合回答问题。

它不是“把视频转 transcript 然后做 RAG”这么简单。 它真正想做的是:

1
extreme long-context video understanding

也就是把数十小时甚至上百小时的视频,压成一个可检索、可推理、可交互的多模态知识库。

Repo 结构

这个 repo 不是单一算法包,而是两块合在一起:

FolderRole
VideoRAG-algorithm论文算法实现、benchmark、reproduce scripts
Vimo-desktop桌面应用,把 VideoRAG 包装成“Chat with Your Videos”产品

所以它有两个层次:

1
2
VideoRAG = algorithm
Vimo = product surface

这点非常重要。 我们不能只学算法,也要学它如何把算法包装成真实用户可用的东西。

它解决什么问题

长视频有几个天然困难:

1
2
3
4
5
6
时间长
信息密度不均匀
视觉信息和语音信息交错
多个视频之间存在语义关系
用户问题往往只对应少数关键片段
完整喂给长上下文模型成本高且不稳定

普通 transcript RAG 只能解决一部分问题。 因为视频里有很多信息不在字幕里:

1
2
3
4
5
6
7
8
slides
图表
白板
人物动作
场景变化
实验演示
产品界面
数据可视化

所以 VideoRAG 的基本判断是:

1
2
视频知识不能只看文字。
必须同时看 transcript、caption、frame-level visual signal 和跨片段语义关系。

这对我们非常直接。 我们最近反复提到:

1
2
3
4
5
6
7
田渊栋访谈
硅谷 101
AI / quant 讲座
paper talk
导师 seminar
公司分享
quant PM 访谈

这些视频如果能进入 Research OS,就会成为我们长期积累的高质量知识资产。

Algorithm Overview

VideoRAG 的算法主入口是:

1
VideoRAG-algorithm/videorag/videorag.py

核心类:

1
2
class VideoRAG:
    ...

默认参数里几个值很关键:

ParameterDefaultMeaning
video_segment_length30 seconds每 30 秒切一个 segment
rough_num_frames_per_segment5初始 caption 粗采样帧数
fine_num_frames_per_segment15查询时精细 caption 帧数
video_output_formatmp4segment 视频输出
audio_output_formatmp3segment 音频输出
video_embedding_batch_num2视频 segment embedding batch
segment_retrieval_top_k4视觉检索返回片段数
video_embedding_dim1024ImageBind embedding 维度
retrieval_topk_chunks2graph/entity 侧取回 chunk 数
chunk_token_size1200文本 chunk token 上限

这说明它的基本单位不是整段视频,而是:

1
video segment

每个 segment 同时有:

1
2
3
4
5
6
7
time range
audio transcript
visual caption
sampled frames
visual embedding
text chunk id
graph source id

这是 VideoRAG 的核心对象。

Insert Pipeline

insert_video() 的流程非常清楚。

1
2
3
4
5
6
7
8
9
Step 0: check existence
Step 1: split video
Step 2: speech-to-text
Step 3: save video segments + generate captions
Step 4: save segment information
Step 5: encode video segment features
Step 6: delete cache
Step 7: save current video information
Step 8: insert segment text into RAG graph/index

展开后可以这样理解:

1
2
3
4
5
6
7
8
9
10
11
raw video
  -> 30s segments
  -> audio clips
  -> Whisper transcript
  -> sampled frames
  -> MiniCPM-V caption
  -> segment record
  -> ImageBind visual embedding
  -> caption + transcript text chunk
  -> entity/relation extraction
  -> graph + vector index

这就是它比 transcript RAG 强的地方。 它不是只保留文字,而是把视频拆成多层结构。

Step 1: Video Split

视频切分在:

1
videorag/_videoutil/split.py

split_video() 会做几件事:

1
2
3
4
5
按 segment_length 切视频
最后不足 5 秒的小片段会合并
每个 segment 保存 start/end
每个 segment 采样若干 frame_times
为每个 segment 抽取音频

默认每 30 秒一个 segment。 这个粒度很合理:

1
2
太短 -> segment 太多,索引和 caption 成本高
太长 -> 每个 segment 信息太混杂,定位不准

对我们的 Research OS 来说,视频切分也应该按内容类型可配置:

Video TypeSegment Strategy
访谈 / podcast30-60 秒
课程 / lecture60-120 秒,最好结合 slide transition
coding demo15-30 秒
quant market discussion30-60 秒
research talk30-90 秒,最好结合 section boundary

未来如果我们自己做 Pengyi Video Memory,不能只固定 30 秒。 应该支持:

1
2
3
4
5
time-based split
scene-based split
slide-change split
topic-change split
hybrid split

Step 2: ASR

语音识别在:

1
videorag/_videoutil/asr.py

算法版使用:

1
faster-distil-whisper-large-v3

每个 audio segment 会转成 transcript,格式包括局部时间戳:

1
2
[0.00s -> 3.52s] ...
[3.52s -> 8.10s] ...

Vimo 桌面版里则改成了在线 ASR:

1
Ali DashScope / paraformer-realtime-v2

这说明 repo 里其实有两套工程取舍:

VersionASR ChoiceMeaning
Algorithmlocal faster-whisper论文/离线复现实验
Vimo Desktoponline DashScope ASR产品化、跨设备、减轻本地模型压力

对我们来说,ASR 质量非常关键。 如果未来要处理中文访谈和中文课程,必须重点看:

1
2
3
4
5
6
7
中英混合
术语识别
人名/公司名
数学符号
金融术语
口语断句
speaker diarization

普通 ASR 能听懂大意,但 research memory 需要更强的术语保真。

Step 3: Caption

视觉 caption 在:

1
videorag/_videoutil/caption.py

算法版默认使用:

1
MiniCPM-V-2_6-int4

输入是:

1
2
3
sampled video frames
+ transcript
+ instruction

prompt 大致是:

1
2
3
The transcript of the current video:
...
Now provide a description (caption) of the video in English.

所以 segment 的最终文本不是单纯 transcript,而是:

1
2
3
4
Caption:
...
Transcript:
...

这点非常重要。 它把视觉信息转成了可被文本 RAG 和 entity extraction 使用的中间语言。

查询时还会再做一次更精细的 caption:

1
retrieved_segment_caption(...)

这一次会针对用户问题抽取关键词,然后让视觉模型围绕这些关键词生成更细的片段描述。

也就是说:

1
2
index-time caption = 粗理解,用于建索引
query-time caption = 精理解,用于回答问题

这个设计很适合长视频。 因为不可能对所有片段一开始就做极细 caption,成本太高。 应该先粗索引,再对相关片段精加工。

Step 4: Segment Record

merge_segment_information() 会把每个 segment 合成结构:

1
2
3
4
time
content = Caption + Transcript
transcript
frame_times

然后保存到 JSON KV:

1
2
kv_store_video_segments.json
kv_store_video_path.json

这里的 time 很关键。 没有时间戳的视频 RAG 是不完整的。 因为用户最终往往需要:

1
2
3
4
这句话在哪一段?
这个 slide 什么时候出现?
这个观点出现在第几分钟?
我想回看原视频证据。

所以 VideoRAG 不是只回答问题,它还保留了回到原视频的路径。

未来我们的 Research OS 也应该保留:

1
2
3
4
5
6
source video path / URL
start time
end time
transcript span
visual evidence
generated note

否则视频知识无法审计。

Step 5: Visual Embedding

视觉 embedding 在:

1
2
videorag/_videoutil/feature.py
videorag/_storage/vdb_nanovectordb.py

算法版使用:

1
ImageBind

它做两件事:

1
2
encode_video_segments(video_paths)
encode_string_query(query)

也就是说,视频 segment 和用户 query 可以进入同一个 embedding 空间。 这样查询时可以做:

1
text query -> ImageBind text embedding -> retrieve visual segment embeddings

这就是视觉检索通道。

它的价值在于:

1
2
有些问题靠 transcript 找不到。
必须靠画面、图表、动作、场景来找。

例如:

1
2
3
4
田渊栋在哪一段画了某个系统图?
某个 lecture 哪一页 slide 提到了 scaling law?
某个 demo 里什么时候展示了 trading dashboard?
某个 quant talk 里哪一段展示了回测曲线?

这些都不能只靠 ASR。

Step 6: Text Chunk + Entity Graph

VideoRAG 会把 segment 的 Caption + Transcript 做成文本 chunk。

关键函数:

1
2
3
chunking_by_video_segments
get_chunks
extract_entities

chunking_by_video_segments() 的逻辑是:

1
2
3
4
每个 segment 先 token 化
segment 太长则截断
多个 segment 可以合并进一个 chunk,直到 max_token_size
chunk 记录 video_segment_id

然后 extract_entities() 使用 GraphRAG 风格 prompt 抽取:

1
2
3
4
entity
relationship
relationship_strength
source_id

最终写入:

1
2
3
4
graph_chunk_entity_relation.graphml
vdb_entities.json
vdb_chunks.json
kv_store_text_chunks.json

这意味着 VideoRAG 有两条知识索引线:

1
2
text chunks vector index
entity relation graph

再加上视频 segment embedding:

1
video segment vector index

所以它不是一个单通道 RAG,而是三通道:

1
2
3
text chunk retrieval
entity graph retrieval
visual segment retrieval

Query Pipeline

查询主函数是:

1
videorag_query(...)

它的流程可以拆成七步。

1. Naive Chunk Retrieval

先用原始 query 检索文本 chunk:

1
chunks_vdb.query(query)

这给系统一个 transcript/caption 的基础上下文。

2. Entity Retrieval Query Rewrite

然后用 LLM 改写 query,用于实体检索:

1
_refine_entity_retrieval_query

再查:

1
entities_vdb.query(...)

查到 entity 后,通过 graph 找关联 segment:

1
_find_most_related_segments_from_entities

这里用到了:

1
2
3
4
node source_id
one-hop neighbors
relation_counts
text chunk -> video_segment_id

这是 graph-driven 的部分。

3. Visual Retrieval Query Rewrite

再用 LLM 改写 query,用于视觉检索:

1
_refine_visual_retrieval_query

然后查:

1
video_segment_feature_vdb.query(...)

这会返回视觉上相关的 segment。

4. Union Segments

把 entity graph 检索到的 segment 和 visual 检索到的 segment 合并:

1
retrieved_segments = entity_retrieved_segments union visual_retrieved_segments

然后按:

1
2
video_name
segment index

排序。

5. Segment Filtering

检索结果还会再过一层 LLM filter:

1
filtering_segment

系统会问:

1
这个 segment 是否与用户问题相关?

只保留回答 yes 的片段。 如果一个都没保留,就退回使用全部 retrieved segments。

6. Query-Time Detailed Caption

然后从 query 中抽关键词:

1
_extract_keywords_query

对保留的 segment 做精细 caption:

1
retrieved_segment_caption(...)

这一步会采样更多帧,并让视觉模型围绕 query 相关信息生成细描述。

7. Final Answer

最后把检索到的视频证据整理成 CSV:

1
2
3
4
video_name
start_time
end_time
content

再和 text chunk context 一起放进最终回答 prompt:

1
2
Retrieved Knowledge From Videos
Retrieved Chunk Context

最终输出答案。

这个流程非常适合作为我们未来视频知识库的参考。

为什么它不是简单 Transcript RAG

Transcript RAG 的流程通常是:

1
video -> transcript -> chunks -> embeddings -> answer

VideoRAG 是:

1
2
3
4
5
6
7
8
9
10
11
12
13
video
  -> segment
  -> transcript
  -> caption
  -> visual embedding
  -> text chunk
  -> entity graph
  -> text retrieval
  -> graph retrieval
  -> visual retrieval
  -> segment filtering
  -> query-time detailed caption
  -> answer with references

本质区别是:

1
2
Transcript RAG sees speech.
VideoRAG sees speech + visual scene + graph relations + time evidence.

对长视频来说,这个差别很大。

例如我们看田渊栋访谈,很多价值不只在文字:

1
2
3
4
5
他如何组织回答
主持人如何追问
某个概念在上下文里如何出现
视频里展示了哪些资料或图
多期访谈之间观点如何呼应

如果只做 transcript chunk,很多关系会散掉。 如果进入 VideoRAG 的结构,就可以逐渐变成可检索的知识图谱。

LongerVideos Benchmark

VideoRAG 论文还构建了 LongerVideos benchmark。

README 给出的数据是:

Video Type#Collections#Videos#QueriesDuration
Lectures12135376~64.3 hours
Documentaries512114~28.5 hours
Entertainment517112~41.9 hours
Total22164602~134.6 hours

这个 benchmark 的设计很对。 因为普通短视频 QA benchmark 不能体现长上下文问题。 真正难的是:

1
2
3
4
5
跨小时定位
跨视频比较
跨 topic 关联
长序列证据聚合
多段信息组合回答

这也对我们有启发。 未来如果我们做自己的 Pengyi Video Memory Benchmark,可以从这些类型开始:

DomainExample
AI Research Interviews田渊栋、AI scientist、open-source builder 访谈
Quant Talksquant PM、researcher、portfolio construction 访谈
LecturesML、RL、LLM、finance、statistics 课程
Seminarspaper talk、lab meeting、conference tutorial
Product Demosagent system、trading dashboard、research workflow demo

每个 collection 可以设计问题:

1
2
3
4
5
这个人对 X 的核心观点是什么?
多个视频里对同一问题的观点是否一致?
某个概念在哪些时间点被讲过?
哪些片段适合剪成学习材料?
哪些观点可以进入我们的 Research OS notes?

这会非常强。

Vimo Desktop

Vimo-desktop 是这个 repo 的产品层。

技术栈:

LayerTech
DesktopElectron
FrontendReact 18 + Vite + TailwindCSS
IPCElectron IPC handlers
BackendPython Flask
VideoRAG Servicepython_backend/videorag_api.py
StateJSON session files
Package managerpnpm@9.10.0

核心用户体验是:

1
2
3
4
5
6
7
8
选择视频
启动服务
加载 ImageBind
上传 / 索引视频
等待后台处理
在 chat UI 中提问
轮询 query status
显示回答

这说明 HKUDS 不只是做论文代码,也在把算法推到真实应用形态。

Vimo Backend

后端在:

1
Vimo-desktop/python_backend/videorag_api.py

默认端口:

1
64451

端口范围:

1
64451-64470

主要 API:

EndpointRole
/api/health健康检查
/api/video/duration获取视频时长
/api/initialize设置全局配置
/api/imagebind/load加载 ImageBind
/api/imagebind/release释放 ImageBind
/api/imagebind/status查询 ImageBind 状态
/api/imagebind/encode/video编码视频 segment
/api/imagebind/encode/query编码 query
/api/sessions/<chat_id>/videos/upload上传并启动视频索引
/api/sessions/<chat_id>/status查询索引或 query 状态
/api/sessions/<chat_id>/videos/indexed列出已索引视频
/api/sessions/<chat_id>/query启动 query 处理
/api/system/status系统状态
/api/system/processes进程状态

后端有两个设计值得学。

第一,VideoRAGProcessManager 把长任务放到子进程中:

1
2
index_video_worker_process
query_worker_process

第二,GlobalImageBindManager 把 ImageBind 作为全局服务管理:

1
2
3
4
5
6
initialize
ensure_imagebind_loaded
release_imagebind
encode_video_segments
encode_string_query
get_status

这是一个实际工程问题。 ImageBind 是大模型,如果每个 worker 都独立加载,会非常重。 所以 Vimo 把 ImageBind 放在主服务中,通过 HTTP client 让子进程调用。

这比算法版每次 query / upsert 里重新加载 ImageBind 更接近产品化。

Vimo Frontend

前端主要在:

1
Vimo-desktop/src/renderer/src

重要模块:

FileRole
hooks/useVideoRAGService.tsservice start/stop/status/ImageBind load/release
hooks/useVideoRAG.tsVideoRAG API 状态、上传、刷新
hooks/useVideoUpload.ts本地视频选择
hooks/useChat.tschat session、分析流程、query polling
components/VideoRAGConfig.tsx配置弹窗
pages/chat/index.tsxchat 页面
components/chat/*chat input / message list / welcome screen
components/common/VideoSelectionBar.tsx视频选择条

整体交互是:

1
2
3
4
5
6
7
8
9
10
11
Electron file picker
  -> uploadedVideos memory state
  -> create chat session
  -> upload video paths to backend
  -> backend creates status.json
  -> frontend polls status
  -> progress bar updates
  -> analysis completed
  -> query starts
  -> query status polling
  -> final answer written to chat messages

这套设计对我们未来做个人 Research OS 很有参考价值。 很多长任务都应该是:

1
2
3
4
5
6
start task
write status
poll status
show progress
persist result
allow query

而不是让用户盯着 terminal。

Data Persistence

Vimo 使用 JSON 文件维护状态。

后端会写:

1
status.json

前端会维护:

1
2
3
4
chat sessions
messages
analysis state
selected videos

这是一种很轻量但实用的桌面应用存储方式。

不过当前版本有一个约束:

1
导入视频后,不要移动或重命名原视频文件。

因为系统保存的是本地视频路径。

对我们来说,如果未来做私有视频知识库,最好一开始就用:

1
2
3
4
5
managed import
content-addressed storage
copy video into workspace
hash-based media id
metadata points to original path

这样原文件被移动后,知识库仍然可用。

和 Research OS 的关系

VideoRAGPengyi Research OS 的意义很直接:

1
把视频资料变成 research memory。

我们现在的知识入口主要是:

1
2
3
4
5
6
7
paper
PDF
README
repo
blog
news
markdown notes

但真正高价值的 learning input 还包括:

1
2
3
4
5
6
7
8
高质量访谈
课程视频
paper presentation
conference tutorial
lab seminar
company tech talk
quant PM interview
researcher podcast

这些内容如果不进入系统,就只能靠记忆。 而人的记忆很容易丢。

VideoRAG 可以让这些视频进入:

1
2
3
4
5
6
7
8
search
note generation
quote/time reference
concept extraction
knowledge graph
study map
website blog
private research notes

这正是 Research OS 需要的能力。

和 Quant Research OS 的关系

对量化来说,视频知识也很有价值。

视频来源可以包括:

1
2
3
4
5
6
7
8
9
10
宏观策略电话会
上市公司路演
earnings call video
行业专家访谈
基金经理访谈
交易员访谈
量化研究分享
高校金融工程课程
统计学习课程
portfolio construction 讲座

如果进入 VideoRAG,可以提问:

1
2
3
4
5
6
某位 PM 对风险控制的核心方法是什么?
这个讲座里对 transaction cost 有哪些假设?
某个宏观观点在哪些时间点被反复提到?
多个访谈中对同一行业的判断有何差异?
某段视频里展示的回测曲线说明了什么?
哪些观点可以转成 factor hypothesis?

这就把视频从“下饭内容”变成了:

1
research evidence source

这非常重要。 因为 quant research 不只来自数据表,也来自:

1
2
3
4
5
domain knowledge
market narrative
industry insight
practitioner experience
research taste

VideoRAG 能让这些非结构化经验进入系统。

和 FutureShow 的连接

上一篇 FutureShow 是 judgment ledger。 这一篇 VideoRAG 是 evidence ingestion。

两者可以直接连接:

1
2
3
4
5
6
VideoRAG
  -> 从访谈/讲座/视频中提取 evidence
  -> 形成 structured notes
  -> 支持 FutureShow-style forecast
  -> 记录 judgment
  -> 等待 outcome

例如:

1
2
3
4
5
从田渊栋访谈中提取 AI research taste
从 quant PM 访谈中提取策略判断框架
从宏观视频中提取 market thesis
把这些 thesis 写成 forecast object
进入 FutureShow-style ledger

这样系统就有了链条:

1
video evidence -> research insight -> forecast object -> outcome evaluation

这是非常强的 Research OS 结构。

和 LightRAG / MiniRAG 的连接

VideoRAG 不是替代 LightRAG / MiniRAG。 它更像是一个视频入口层。

RepoRole
RAG-Anything多格式文档入口
VideoRAG视频入口
LightRAGgraph-based knowledge memory
MiniRAGlightweight local knowledge memory

未来可以这样组合:

1
2
3
4
5
PDF / paper / report -> RAG-Anything
video / talk / lecture -> VideoRAG
structured notes -> LightRAG / MiniRAG
forecast claims -> FutureShow-style ledger
slides / pitch -> Paper2Slides

这就是一个完整的个人知识生产链路。

和 Paper2Slides 的连接

Paper2Slides 把 research material 变成 presentation artifact。 VideoRAG 则可以把视频内容变成 research material。

连接起来就是:

1
2
3
4
video lecture / interview
  -> VideoRAG extracts notes and evidence
  -> structured study note
  -> Paper2Slides generates talk deck / visual summary

对我们的网站也一样:

1
2
3
4
5
看一个访谈
  -> VideoRAG 总结
  -> 人类整理成 blog
  -> Paper2Slides 变成 5-slide study card
  -> 进入 public website

这会让学习成果变得非常可复用。

对田渊栋访谈学习的启发

我们之前说,田渊栋访谈是下饭视频。 这件事其实很适合 VideoRAG。

可以建立一个 collection:

1
pengyi_yuandong_tian_interviews

里面放:

1
2
3
4
5
硅谷 101 两期访谈
公开 talk
paper presentation
Meta AI / research interview
DarkForest / Diplomacy / RL 相关视频

然后问:

1
2
3
4
5
6
田渊栋如何看待 research taste?
他如何描述从工程到研究的路径?
他对大模型、RL、multi-agent 的判断有哪些?
两期硅谷 101 访谈中哪些观点一脉相承?
哪些观点适合写进 Pengyi AI Scientist StudyMap?
哪些观点可以转成我们自己的 research rule?

这样“下饭视频”就不只是情绪输入,而是进入了:

1
personal research memory

这对我们非常适合。

对 RA / PhD 的启发

如果我们未来和导师沟通,也可以把视频材料当作学习证据。

例如:

1
2
3
4
我系统学习了某个 lab 的 talk
我把 talk 里的方法、实验、limitation 做成结构化 notes
我能提出 follow-up ideas
我能把视频内容和 paper / code 连接起来

这比简单说“我对方向感兴趣”更有说服力。

未来可以做一个私有 workflow:

1
2
3
4
5
6
PI talk video
  -> VideoRAG summary
  -> paper/code matching
  -> idea note
  -> email attachment
  -> meeting questions

这正好服务我们正在做的:

1
2
3
4
5
RA 套磁
PhD 预沟通
导师邮件附件
AI/Quant research role
科研项目补充材料

对 Open-Source Portfolio 的启发

如果我们未来把 VideoRAG 思路吸收进自己的网站,可以有一个新栏目:

1
Video Learning Notes

每篇记录:

1
2
3
4
5
6
7
8
9
10
video title
source URL
speaker
date watched
key moments
core ideas
technical terms
research implications
timestamp references
follow-up projects

这会比普通 blog 更强。 因为它能证明:

1
我们不是被动看视频,而是在系统化地吸收高质量输入。

公开版本可以脱敏,只放公开视频。 私有版本可以放更具体的 meeting / conversation notes。

PR Opportunities

这次读下来,有几个比较清楚的 PR / issue 方向。

1. QueryParam.mode 类型和实际模式不一致

base.py 里:

1
mode: Literal["local", "global", "naive"] = "global"

但实际 VideoRAG.aquery() 使用的是:

1
2
videorag
videorag_multiple_choice

README 也写:

1
param = QueryParam(mode="videorag")

这会让类型检查和 IDE 提示都不准确。 适合提一个小 PR:

1
2
把 QueryParam.mode 的 Literal 更新为 videorag / videorag_multiple_choice
或保留旧模式并明确兼容路径

2. wo_reference 是动态字段,应该进 dataclass

README 里:

1
param.wo_reference = True

代码里也用:

1
if query_param.wo_reference:

QueryParam dataclass 没有定义 wo_reference。 Python 运行时可以动态加属性,但对用户和类型检查都不友好。

可以 PR:

1
wo_reference: bool = False

同时给文档补清楚:

1
2
False -> include references
True -> no references

3. Flask route /api/imagebind/status 定义了两次

videorag_api.py 里搜索到两处:

1
@app.route('/api/imagebind/status', methods=['GET'])

这容易造成行为覆盖或维护混乱。 可以统一成一个 endpoint,并让返回 schema 一致。

4. 前端配置有硬编码个人路径和第三方 base URL

VideoRAGConfig.tsx 默认值里有:

1
2
https://api.nuwaapi.com/v1
/Users/renxubin/Desktop/videorag-store/imagebind_huge/imagebind_huge.pth

这对开源用户不友好。 可以改成:

1
2
3
OpenAI 官方默认 base URL
空路径,要求用户选择
或从 bootstrap config / storage directory 自动构造

主进程里其实已经有一套更稳的配置逻辑,所以 UI 默认值应该和主进程一致。

5. service scan 最大重试次数过大

videorag-handlers.ts 里:

1
2
maxScanAttempts = 1000000
scanInterval = 3000

这几乎等于无限扫描。 更好的方式是:

1
2
3
4
给用户可见的取消按钮
设置合理超时
使用 exponential backoff
在 UI 上显示当前扫描端口

这是产品可用性 PR。

6. 前端状态类型和后端返回 schema 不完全一致

useVideoRAG.tsSessionStatus 假设有:

1
2
3
4
5
session_exists
indexed_videos_count
processing_videos
working_dir
available_for_query

但后端 /api/sessions/<chat_id>/status 返回的是:

1
2
3
4
5
6
7
success
chat_id
status
message
current_step
query
answer

实际 chat 流程更多依赖 JSON session state。 这里可以整理类型和 API 返回,避免 dead state 或 misleading state。

7. README 写 Drag & Drop,但当前 hook 说不支持拖拽

根 README 的 feature 写:

1
Drag & Drop Upload

useVideoUpload.ts 里:

1
Drag and drop upload not supported. Please use the file picker button instead.

可以选择:

1
2
实现 drag/drop
或更新 README,把当前 beta 限制写清楚

8. 原视频路径依赖可以改进

README 已经提醒:

1
导入后不要移动或重命名视频文件。

这说明当前是 path-based import。 可以未来做:

1
2
3
4
managed media storage
copy-on-import
hash-based media id
missing file recovery UI

这对桌面知识库会很有价值。

9. 算法版 ImageBind 每次加载可以优化

算法版 NanoVectorDBVideoSegmentStorageupsert()query() 中都会直接加载:

1
imagebind_huge(pretrained=True).cuda()

Vimo 版已经通过 GlobalImageBindManager 改进了这个问题。 可以考虑把全局 ImageBind 管理思路回迁到 algorithm package:

1
2
3
4
inject embedder
lazy singleton
context manager
HTTP client option

10. 依赖文件可以更标准化

算法 README 使用大量手动 pip install 命令。 对复现来说可以接受,但对开源使用者更友好的方式是:

1
2
3
4
requirements.txt
pyproject.toml
environment.yml
optional extras: [algorithm], [desktop-backend], [dev]

这个 PR 较大,但长期价值高。

License Note

这个 repo 的 LICENSE 很值得注意。

它不是简单 MIT。 它写得很明确:

1
2
framework architecture: MIT
current implementation with ImageBind: NonCommercial only

原因是 ImageBind 使用:

1
Attribution-NonCommercial-ShareAlike 4.0 International

MiniCPM 是 Apache 2.0,但 ImageBind 限制了当前完整实现的商业使用。

这对我们很重要。 如果未来要做公开项目或商业 demo,一定要区分:

1
2
3
framework idea
model implementation
third-party model license

也就是说:

1
2
架构可以学。
代码能否商用要看模型许可证。

我们可以怎么吸收

第一阶段,不要急着全量部署 VideoRAG。 它需要:

1
2
3
4
5
6
GPU
ImageBind checkpoint
MiniCPM-V
ASR
多模型 API key
视频缓存和索引

更稳的方式是先吸收结构。

我们可以先做一个轻量版:

1
Pengyi Video Note Pipeline v0

最小流程:

1
2
3
4
5
6
7
public video URL
  -> transcript
  -> timestamped chunks
  -> key idea extraction
  -> human review
  -> markdown note
  -> website post

然后逐步加:

1
2
3
4
5
6
frame sampling
slide OCR
visual caption
entity graph
cross-video retrieval
query interface

这更现实,也更适合我们当前阶段。

对我们当前主线的意义

现在 HKUDS 主线可以这样接:

IDRepoSystem Position
HKUDS019Paper2Slidesresearch-to-presentation artifact layer
HKUDS020FutureShowforecast benchmark / judgment ledger
HKUDS021VideoRAGlong-context video knowledge ingestion layer

这三篇连起来非常完整:

1
2
3
4
5
6
7
8
VideoRAG
  -> 从视频中吸收知识

FutureShow
  -> 把知识转成可验证判断

Paper2Slides
  -> 把研究成果转成可沟通 artifact

也就是:

1
2
3
learn from video
make judgment
communicate result

这就是一个 AI scientist 需要的闭环。

系统位置

Pengyi Research OS 里,VideoRAG 应该放在入口层:

LayerModule
Video IngestionVideoRAG
Document IngestionRAG-Anything
Knowledge MemoryLightRAG / MiniRAG
Research AgentAI-Researcher / DeepInnovator
Forecast LedgerFutureShow
Tool RuntimeAnyTool / OpenHarness
Artifact GenerationPaper2Slides

链路是:

1
2
3
4
5
6
7
videos / papers / repos / reports
  -> multimodal ingestion
  -> structured memory
  -> research hypothesis
  -> forecast / experiment
  -> evaluation
  -> presentation

VideoRAG 的位置就是:

1
high-value video input -> structured research memory

一句话总结

VideoRAG 的价值不是“可以和视频聊天”这个产品口号。 更准确地说:

1
VideoRAG 把极长视频转成 segment-level、timestamped、multimodal、graph-indexed 的可检索知识对象。

对我们的 Pengyi Research OSPengyi Quant Research OS 来说,这意味着:

1
访谈、课程、讲座、seminar、demo video 都可以进入长期记忆,而不是只停留在看过的印象里。

所以这篇的核心启发是:

1
2
build the research engine,
but also build the video memory layer.

Next

下一篇进入:

1
HKUDS022 -> FastCode

如果说:

1
2
FutureShow gives us forecasting.
VideoRAG gives us video memory.

那么下一步就是:

1
FastCode gives us coding speed.

也就是回到我们最强的生产力核心:更快读 repo、更快理解代码、更快找到 PR 机会、更快把 research idea 变成工程产出。

This post is licensed under CC BY 4.0 by the author.