第一次听说「用视频做 AI 知识库」时,多数工程师的反应是「这一定是某种 hack」。事实上确实有点 hack 的味道,但 Memvid 把这个想法做到了能跑、有 benchmark、并且形成了 SDK 与生态。
它解决的问题非常具体:把 RAG 系统赖以为生的「向量数据库 + 元数据 + 原始文本」这套组合,压缩成一个 .mp4 加一个 .json,本地可读、离线可搜,复制粘贴就能在另一台机器上还原。在 2026 年 AI 推理与存储成本被反复讨论的当下,Memvid 提供了一个值得认真看一眼的非主流答案。

一、Memvid 在解决什么问题
主流 RAG 工程的存储栈,大致是这样一坨:
- 原始文档 放在对象存储或 Git;
- chunked 文本 拆好后保存在数据库 / 文件系统;
- 向量 通过 Pinecone、Weaviate、Qdrant、pgvector 这类服务托管;
- 元数据 跟着向量一起,用来还原 chunk 来源。
这套组合在工程稳健性上没问题,但有三个反复被吐槽的痛点:
- 可移植性差:换一台机器、换一个团队接手,要重新拉数据、重建索引、调网络。
- 离线不友好:如果终端用户是个边缘设备、桌面应用或者隔离环境,整条 RAG 链路根本运行不起来。
- 冷启动慢:哪怕只是想分享一个「这是我整理过的 1GB 文档」,也要走部署流程。
Memvid 的答案简单粗暴:把所有东西塞进单个文件,让 RAG 知识库变成像一段视频一样可以拷贝、可以分发、可以 git lfs 推到仓库。
二、它到底是怎么把文本塞进 MP4 的
Memvid 的核心思路是利用视频编码器(H.264 / H.265)对「重复模式」的极致压缩能力:
- chunking:把原始文本切成 chunk(默认 500–1024 token 上下),每个 chunk 一个 id。
- QR 编码:每个 chunk 被序列化(含元数据)后渲染成一张 QR 码图片。
- 写入视频帧:QR 图按顺序写入 MP4 帧;多个 chunk 形成一段连续的「图像序列」。
- 建向量索引:同时为每个 chunk 计算嵌入向量(默认用 Sentence Transformers),写进 FAISS 索引;这个索引以 JSON + 二进制方式独立保存。
- 查询:检索时,先在 FAISS 上做向量相似度匹配,拿到 chunk id;然后只解码视频中对应的那几帧 QR,解析回原始文本。
这个组合实现了几件事:
- 存储密度高:视频编码器对帧间相似性敏感,QR 序列里 chunk 之间往往有结构上的相似,压缩率比单纯 gzip 一堆 JSON 高出一截,号称达到 10× 量级。
- 检索成本低:FAISS 在内存里几乎是 O(log n);视频帧读取只在命中那一刻才发生,所以「冷数据」永远不会被解码。
- 零依赖:运行时只需要
ffmpeg/opencv与faiss,不需要数据库进程。
新版本(memvid/memvid 项目,2026 年 3 月发布到 v2.0.139)做了更激进的改造:引入自研的 .mv2 容器与 Rust 实现的 Smart Frames,把崩溃恢复 (WAL) 和时间旅行 (time-travel) 内置,单一文件就能承载追加、回滚和分支。

三、跑一个最小示例
下面以社区最流行的 Python 版本(Olow304/memvid 系列)演示「3 行 RAG」。
安装
pip install memvid sentence-transformers
# 或新版 SDK:
pip install memvid-sdk
写入知识库
from memvid import MemvidEncoder
encoder = MemvidEncoder()
docs = [
"Memvid stores text chunks as QR codes inside MP4 frames.",
"Each chunk also has a vector embedding stored in a FAISS index.",
"Retrieval first hits FAISS, then decodes only the matching frames.",
]
for d in docs:
encoder.add_text(d, chunk_size=512)
encoder.build_video(
output_file="kb.mp4",
index_file="kb.json",
)
执行后,工作目录会出现:
kb.mp4:包含所有 QR 帧的视频;kb.json:FAISS 向量索引与 chunk 元数据。
把这两个文件拷贝到另一台机器上,立刻可以做查询。
检索
from memvid import MemvidRetriever
retriever = MemvidRetriever(
video_file="kb.mp4",
index_file="kb.json",
)
results = retriever.search("How does memvid retrieve chunks?", top_k=3)
for r in results:
print(r["score"], r["text"])
打开命令行 chat 模式也很简单:
from memvid import MemvidChat
chat = MemvidChat(
video_file="kb.mp4",
index_file="kb.json",
llm_provider="openai", # 或 'anthropic' / 'local'
)
chat.start_session()
chat.ask("Summarise how memvid stores knowledge.")
新版 Rust SDK 写法
如果用的是 @memvid/sdk 或 memvid-core,API 更接近数据库:
import { Memvid } from '@memvid/sdk';
const mv = await Memvid.open('notes.mv2');
await mv.upsert([
{ id: 'n1', text: 'Memvid stores text chunks inside MP4 frames.' },
{ id: 'n2', text: 'FAISS handles semantic search.' },
]);
const hits = await mv.search('How does memvid retrieve chunks?', { topK: 3 });
console.log(hits);
.mv2 容器把视频帧、向量索引、WAL 全部封装进同一个文件,不再需要分别管理 .mp4 与 .json。
四、和「正经向量库」对比
为了避免一些误读,这里把 Memvid 与典型向量数据库正面对照一次:
| 维度 | Memvid | Pinecone / Qdrant / Weaviate |
|---|---|---|
| 部署 | 零进程、文件即库 | 长驻服务,至少需要一个进程 / 容器 |
| 写入吞吐 | 中等(受视频编码限制) | 高(针对在线写优化) |
| 查询延迟 | P50 < 5 ms(本地) | P50 在 10–50 ms 量级 |
| 数据可移植 | .mp4 + .json 直接拷贝 |
需要导出 / 备份机制 |
| 并发写 | 弱(追加为主,新版有 WAL) | 强 |
| 适合规模 | 单机百万级 chunk | 千万 – 十亿级 |
| 多模态 | 文本为主,新版支持图像 / 音频 | 视模型而定 |
结论是清楚的:Memvid 不是 Pinecone 的替代品,而是「单机版 + 可发行」这个语义下的另一种东西。它更像「数据库版的 SQLite」而不是「无密码版的 Postgres」。
五、它真正适合的场景
走完上面的对照,可以提炼出几个 Memvid 真正擅长的场景:
- 离线 / 边缘部署:桌面助手、本地 Notebook 工具、隔离网络环境,不想拉一个服务进来。
- 知识库的可分发:把一份「整理好的资料 + 索引」打包给团队、客户或开源社区,对方下载即用。
- 个人记忆库:把笔记、文献、聊天记录持续追加到同一个
.mv2,本地随用随检。 - CI 中的临时 RAG:测试任务需要一个临时知识库时,挂载一个文件比启动一个向量库容器要快得多。
反过来,不适合的场景也比较明确:高并发写、需要在线热扩容、单库规模到 TB 级以上、或者团队已经有成熟的向量库基础设施时,硬上 Memvid 反而是徒增复杂度。
总结
Memvid 把「RAG 知识库」这个概念彻底降级为「一个可拷贝的文件」。从工程角度看,这种简化在「数据库即文件」「索引即附件」的方向上贡献了一个很有意思的样本:
- 它没有打算挑战在线向量库;
- 它在「可移植」「离线」「冷启动」三件事上的体验确实更好;
- 在 2026 年 5 月已经迭代到 v2.0.139,并提供了 Rust / Node.js / Python / CLI 多语言 SDK。
如果你正在做一款桌面 AI 工具、或者只是想把某份知识库随手 git push 进仓库给别人用,Memvid 值得加进备选清单。它不是万能解,但确实把「RAG 的最小可部署单元」缩到了一份 .mp4。
评论