ベクトルDBを超えるか？動画にデータを保存して高速なメモリ管理を実現するMemvidとは

## はじめに
最近XでバズっていたMemvidについて調べてみたのですが、ピンとこなかったので実際に使ってみることにしました。

## Memvidってなんぞや
公式から抜粋
> Memvidはテキストデータを動画にエンコードすることで、数百万件のテキスト断片をまたいだセマンティック検索をサブ秒で実現します。大量のRAMやストレージを消費しがちな従来のベクターデータベースとは異なり、知識ベースをコンパクトな動画ファイルに圧縮しながら、必要な情報へ瞬時にアクセスできるのが特長です。
https://github.com/Olow304/memvid

ChatGptにわかりやすくしてもらいました。

>Memvid（メムヴィド）は、文字で書かれた情報を「小さな動画」にして、かんたん・はやくさがせるすごいツールだよ。

なるほど。
ベクトルDBとどんな違いがあるのかまとめてみました。

## ベクトルDBとMemvidの違い
| 比較項目               | ベクトルDB                                                                                        | Memvid                                                                                                                      |
|------------------------|-----------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|
| 保存形式・ストレージ効率 | テキスト埋め込みを専用のベクトルDB（FAISS/Pinecone等）に保存。保存するデータによっては数十〜数百GBのストレージ／RAMが必要                          | テキスト埋め込みを動画として符号化・圧縮。従来比10分の1程度のサイズ（例：数GB→数百MB）にまとめて保存                       |
| インフラ・運用コスト     | ベクトルDBサーバーの構築・運用が必須                       | 動画ファイルを置くだけでOK。DBサーバー不要で、ファイルをコピーするだけでそのまま移植可能                                     |
| 検索速度・レイテンシ     | 数千万件規模では数百ミリ秒〜数秒オーダーのレイテンシが発生することも                                                    | サブ秒（0.1秒以下）で大規模セマンティック検索を実現。必要なフレームだけをストリーミング／デコード                          |
| オフライン対応         | 多くの場合、オンラインのベクトルDB＋クラウドLLMが前提                                                                    | 動画生成後は完全オフラインで利用可能。ネットワーク遅延や接続障害の心配なし                                                  |
| 導入のしやすさ          | DB選定・チューニングや検索エンジン連携コードの実装が必要                                                                   | pip install memvidとPythonコードで開始可能。依存ライブラリ約1000行・GPU不要の軽量アーキテクチャ                                      |
| メンテナンス・更新      | 更新差分の取り扱いや再インデックス化が煩雑になることがある                                                               | 更新時は動画の再生成                                                   |

なんかすごいメリットたくさんあって良さそうですね、実際に使ってみます。

## 開発環境
mac OS 15.1
Python 3.9.6

## インストール
公式のReadmeに記載がある流れだとうまくいかなかったため、少し自分流にしています。

<b>1, Githubからリポジトリをクローンしてきます</b>

```bash
# ディレクトリを一つ作成しておき、その中にクローンすると後々楽だったので作成しています
mkdir memvidFolder
cd memvidFolder

git clone https://github.com/Olow304/memvid.git
```

<b>2, pythonの仮想環境を作成&インストール</b>
今回はopenaiのLLMを使用するためpipでインストールしています

```bash
python -m venv venv

# On macOS/Linux:
source venv/bin/activate
# On Windows:
venv\Scripts\activate

# Install
pip install memvid PyPDF2 openai
```

<b>3, OPENAIのAPIKEYをセット</b>
```bash
export OPENAI_API_KEY="sk-..."
```

:::note warn
「OPENAI_API_KEY」は指定しなくても動作します。指定しない場合、LLMの呼び出しはスキップして、検索したテキストをそのまま返却する形になります。
また、対応しているLLMはOpenAI, Gemini, Claudeがあり、デフォルトでGeminiが設定されてるようです(memvid/config.py)
:::

※ 今回はmemvidに最初から含まれているbitcoinのサンプルのPDFを使用しますが、他に使用したいPDFがある場合は用意してください
![Screenshot 2025-06-19 at 13.03.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666483/9a26c7fe-7eee-4c8a-94d8-7043367d53c6.png)


## 実行
memvidに含まれているサンプルファイルを実行します。
今回はopenaiのAPIKeyを使用するため、引数に「--provider」でopenaiを指定します。
また、読み込ませるPDFファイルは、memvidに最初から含まれているbitcoinのサンプルpdfを使用します。

```python
python ./memvid/examples/file_chat.py --files ./memvid/data/bitcoin.pdf --provider openai
```

実行すると
```bash
📋 Using default configuration:
   Chunk size: 1024
   Overlap: 32
   Index type: Flat
   Codec: h265
Creating memory from 1 files...
Processing files: 100%|██████████████████| 1/1 [00:00<00:00,  2.44it/s]

📊 Processing Summary:
  ✅ Successfully processed: 1 files
  ⚠️  Skipped: 0 files
  ⏱️  Processing time: 7.46 seconds

🎬 Building memory video: output/files_1items_20250619_121851.mkv
📊 Total chunks to encode: 11
Generating QR frames: 100%|████████████| 11/11 [00:01<00:00,  7.56it/s]
🐛 FRAMES: 11 files in /var/folders/0s/t5_bx30x5vscs8rldp858xj80000gq/T/tmp0ml95jed/frames
🐛 FFMPEG: frames=/var/folders/0s/t5_bx30x5vscs8rldp858xj80000gq/T/tmp0ml95jed/frames → docker_mount=/var/folders/0s/t5_bx30x5vscs8rldp858xj80000gq/T/tmp0ml95jed
🎬 FFMPEG ENCODING SUMMARY:
   🎥 Codec Config:
      • codec: h265
      • file_type: mkv
      • fps: default
      • crf: default
      • height: 256
      • width: 256
      • preset: slower
      • pix_fmt: yuv420p
      • extra_ffmpeg_args: -x265-params keyint=1:tune=stillimage:no-scenecut:strong-intra-smoothing:constrained-intra:rect:amp

Writing video frames: 100%|███████████| 11/11 [00:00<00:00, 464.31it/s]
Batches: 100%|███████████████████████████| 1/1 [00:00<00:00,  4.82it/s]

🎉 Memory created successfully!
  📁 Video: output/files_1items_20250619_121851.mkv
  📋 Index: output/files_1items_20250619_121851_index.json
  📊 Chunks: 11
  🎞️  Frames: 11
  📏 Video size: 0.7 MB
  ⏱️  Encoding time: 1.71 seconds
  ⏱️  Total time: 9.18 seconds
  📄 Metadata: output/files_1items_20250619_121851_metadata.json

Initializing chat with openai...
✓ Chat initialized successfully!

Starting interactive session...
Commands:
  - Type your questions normally
  - Type 'quit' or 'exit' to end
  - Type 'clear' to clear conversation history
  - Type 'stats' to see session statistics
==================================================

You: 
```

「You:」と表示されプロンプトが打ち込めるようになっています。

またこの実行のタイミングで、「output」ディレクトリが作成されました。
中にはjsonファイルやmkvの動画ファイルが保存されています。
![Screenshot 2025-06-19 at 12.33.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666483/51870739-6768-44e0-84ed-d0cda84e9544.png)

内部では以下の流れでPDFのデータを動画にしてデータ読み込みを行っているようです。
1, PDF → テキスト抽出
2, チャンク → QRコード化
3, QRコード画像 → 動画化
4, 動画 → データ読み込み

今回の場合、動画の長さは2秒で以下のようなQRコードが紙芝居のように大量に入っていました。
ここまで使用してみて、「ベクトルDB」の代わりに動画を使用するというイメージが少しつきました。
![Screenshot 2025-06-19 at 12.39.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666483/615d55d7-93fe-41a1-850b-fdac53c28097.png)

### 対話してみる
ドキュメントについて聞いてみますが、しっかりと答えられています。日本語で聞けるのも使いやすいポイントです。
```bash
You: このドキュメントって一体なんなんだい
Using openai for responses.
--------------------------------------------------
Assistant: 
このドキュメントは、ビットコインの概念を初めて紹介した「Bitcoin: A Peer-to-Peer Electronic Cash System」という論文です。著者サトシ・ナカモトによって書かれたもので、ピア・ツー・ピアの電子現金システムを提案しています。このシステムでは、金融機関を介さずに直接オンラインで支払いを送信することができます。論文は、ダブルスペンディング問題を解決し、取引のプライバシーを維持する手法を説明しています。この背景から、仮想通貨としてのビットコインの基礎が築かれました。
```

もう少し深掘りしてみますが、しっかりと答えられています。

```bash
You: 特に重要な点はどこだと思う?
Assistant: 提供されたコンテキストから判断すると、特に重要な点は以下の通りです：

1. **ダブルスペンディングの防止**: 通常のミント型モデルでは、すべての取引が中央の信頼された機関を通じなければならず、システム全体がその機関に依存してしまいます。ビットコインでは、トランザクション履歴を公開することで、中央の機関なしで取引の順序を参加者間で合意するシステムを構築しています。これにより、二重支出を防ぎ、最も古い取引のみが有効であることを確認できます。

2. **インセンティブとハッシュパワーの利用**: 攻撃者がネットワークより強力なハッシュパワーを集めた場合、システムの破壊よりもシステムに従って新しいコインを生成する方が利益になるように設計されています。これにより、ノードが正直に振る舞うことを促進します。

3. **ディスクスペースの再利用**: 過去の取引が十分な数のブロックで埋められた後にディスクスペースを再利用できるように、取引はマークルツリーにハッシュ化されます。これにより、ストレージ効率を上げることができます。

4. **簡易支払い検証（SPV）**: フルノードを実行せずに支払いを検証することが可能です。これは長さが最も長いプルーフオブワークチェーンのブロックヘッダーのみを保持し、トランザクションがどのブロックに属しているかのリンクを取得することで行われます。

これらの点が、ビットコインの仕組みが成り立っている重要な柱と言えるでしょう。
```

## memvidの課題
1, 更新のリアルタイム性・差分対応の難しさ
動画ファイルは“まるごと”再生成が必要で、小さなドキュメント追加や修正でも全体をエンコードし直すコストが発生する。

2, エコシステム・連携の弱さ
FAISS/Pineconeなど、成熟したSDK＋マネージドサービスが豊富に存在するベクトルDBに対し、Memvidはまだ公式Python API／CLI＋GitHubのみで、サードパーティ製ツールやGUI、チューニングダッシュボードがほとんどない

3, 企業導入／商用利用で「安定性」「サポート体制」を重視する層にはハードルが高い
リポジトリ公開からの日が浅く、ドキュメントやチュートリアル、成功事例が少ない

4, 精度や信頼性のベンチマークが不十分
ベクトルDBと比較した大規模評価レポートや論文が少なく、性能・検索品質への確信を得づらい

## まとめ
Memvidは「ストレージ効率」と「オフラインファースト」というユニークな設計で魅力的だと思いますが、更新性・運用性・エコシステムの成熟度という点で、従来のベクトルDBにはまだまだ届いていないと感じました。
今後、差分エンコード機能や統合ツール、コミュニティの拡充が進めば、ベクトルDBの代替としてより広く使われるポテンシャルを秘めているなと感じます

## トラブルシュート
### 1. 実行で「KeyError: 'retriever_stats'」エラー発生
```python
print(f"\nMemory loaded: {stats['retriever_stats']['index_stats']['total_chunks']} chunks")
KeyError: 'retriever_stats'
```


#### 「解決方法」
仮想環境内の「memvid/chat.py」を開く（例：…/venv/lib/python3.9/site-packages/memvid/chat.py）

get_stats() メソッドの辞書末尾あたりに、以下の１行を追加：
```python
    "max_history": self.max_history,
+   "retriever_stats": self.retriever.get_stats(),
```

※直接書き換えるのではなく、以下のPRで修正されているのでこちら取り込むのも良いです
https://github.com/Olow304/memvid/pull/27/commits/11ff724d674595172192af9b1765a668699e0cd7