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。
| Item | Value |
|---|---|
| repo | VideoRAG |
| remote | https://github.com/HKUDS/VideoRAG.git |
| branch | main |
| local head | c412a09 |
| full commit | c412a093a820ef7a0e0dda31076ed871136198b3 |
| latest local commit date | 2026-03-18 16:33:03 +0800 |
| latest local commit | docs: upload results |
| status | clean, synced with origin/main after fetch |
tracked files by git ls-files | 118 |
| Python files | 51 |
| TypeScript / TSX files | 41 |
| main folders | VideoRAG-algorithm, Vimo-desktop |
| desktop package | vimo-desktop@0.1.0 |
| package manager | pnpm@9.10.0 |
| Node requirement | >=20.x |
| Python syntax check | py -m compileall -q ... passed |
| frontend local check | pnpm unavailable in current machine, so frontend lint/build not run |
| license | dual 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 不是单一算法包,而是两块合在一起:
| Folder | Role |
|---|---|
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:
...
默认参数里几个值很关键:
| Parameter | Default | Meaning |
|---|---|---|
video_segment_length | 30 seconds | 每 30 秒切一个 segment |
rough_num_frames_per_segment | 5 | 初始 caption 粗采样帧数 |
fine_num_frames_per_segment | 15 | 查询时精细 caption 帧数 |
video_output_format | mp4 | segment 视频输出 |
audio_output_format | mp3 | segment 音频输出 |
video_embedding_batch_num | 2 | 视频 segment embedding batch |
segment_retrieval_top_k | 4 | 视觉检索返回片段数 |
video_embedding_dim | 1024 | ImageBind embedding 维度 |
retrieval_topk_chunks | 2 | graph/entity 侧取回 chunk 数 |
chunk_token_size | 1200 | 文本 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 Type | Segment Strategy |
|---|---|
| 访谈 / podcast | 30-60 秒 |
| 课程 / lecture | 60-120 秒,最好结合 slide transition |
| coding demo | 15-30 秒 |
| quant market discussion | 30-60 秒 |
| research talk | 30-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 里其实有两套工程取舍:
| Version | ASR Choice | Meaning |
|---|---|---|
| Algorithm | local faster-whisper | 论文/离线复现实验 |
| Vimo Desktop | online 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 | #Queries | Duration |
|---|---|---|---|---|
| Lectures | 12 | 135 | 376 | ~64.3 hours |
| Documentaries | 5 | 12 | 114 | ~28.5 hours |
| Entertainment | 5 | 17 | 112 | ~41.9 hours |
| Total | 22 | 164 | 602 | ~134.6 hours |
这个 benchmark 的设计很对。 因为普通短视频 QA benchmark 不能体现长上下文问题。 真正难的是:
1
2
3
4
5
跨小时定位
跨视频比较
跨 topic 关联
长序列证据聚合
多段信息组合回答
这也对我们有启发。 未来如果我们做自己的 Pengyi Video Memory Benchmark,可以从这些类型开始:
| Domain | Example |
|---|---|
| AI Research Interviews | 田渊栋、AI scientist、open-source builder 访谈 |
| Quant Talks | quant PM、researcher、portfolio construction 访谈 |
| Lectures | ML、RL、LLM、finance、statistics 课程 |
| Seminars | paper talk、lab meeting、conference tutorial |
| Product Demos | agent system、trading dashboard、research workflow demo |
每个 collection 可以设计问题:
1
2
3
4
5
这个人对 X 的核心观点是什么?
多个视频里对同一问题的观点是否一致?
某个概念在哪些时间点被讲过?
哪些片段适合剪成学习材料?
哪些观点可以进入我们的 Research OS notes?
这会非常强。
Vimo Desktop
Vimo-desktop 是这个 repo 的产品层。
技术栈:
| Layer | Tech |
|---|---|
| Desktop | Electron |
| Frontend | React 18 + Vite + TailwindCSS |
| IPC | Electron IPC handlers |
| Backend | Python Flask |
| VideoRAG Service | python_backend/videorag_api.py |
| State | JSON session files |
| Package manager | pnpm@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:
| Endpoint | Role |
|---|---|
/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
重要模块:
| File | Role |
|---|---|
hooks/useVideoRAGService.ts | service start/stop/status/ImageBind load/release |
hooks/useVideoRAG.ts | VideoRAG API 状态、上传、刷新 |
hooks/useVideoUpload.ts | 本地视频选择 |
hooks/useChat.ts | chat session、分析流程、query polling |
components/VideoRAGConfig.tsx | 配置弹窗 |
pages/chat/index.tsx | chat 页面 |
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 的关系
VideoRAG 对 Pengyi 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。 它更像是一个视频入口层。
| Repo | Role |
|---|---|
RAG-Anything | 多格式文档入口 |
VideoRAG | 视频入口 |
LightRAG | graph-based knowledge memory |
MiniRAG | lightweight 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.ts 里 SessionStatus 假设有:
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 每次加载可以优化
算法版 NanoVectorDBVideoSegmentStorage 在 upsert() 和 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 主线可以这样接:
| ID | Repo | System Position |
|---|---|---|
HKUDS019 | Paper2Slides | research-to-presentation artifact layer |
HKUDS020 | FutureShow | forecast benchmark / judgment ledger |
HKUDS021 | VideoRAG | long-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 应该放在入口层:
| Layer | Module |
|---|---|
| Video Ingestion | VideoRAG |
| Document Ingestion | RAG-Anything |
| Knowledge Memory | LightRAG / MiniRAG |
| Research Agent | AI-Researcher / DeepInnovator |
| Forecast Ledger | FutureShow |
| Tool Runtime | AnyTool / OpenHarness |
| Artifact Generation | Paper2Slides |
链路是:
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 OS 和 Pengyi 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 变成工程产出。