最近は「SQLite-RAG」でローカルにサクッとベクトル検索を組み込む例が増えています。ただ、件数が増えると遅く感じることも…。そこで今回は、ベクトルデータベース専用の Milvus Lite を導入して、SQLiteとの比較ベンチを回してみました。REST API対応でUI化も容易という点も、現場利用には魅力です。
Milvusとは?
- ベクトル検索専用DBの代表格。
- 分散スケール可能、近似探索(HNSWなど)に強い。
- Lite(ローカルSQLiteバックエンド)から分散クラスタまで同一API。
- REST / gRPC の両対応。アプリ開発のしやすさも売り。
SQLite-RAGと比較する理由
- SQLite-RAGは「埋め込みをそのままsqliteに入れて検索」できる超軽量手法。
- 小規模なら十分だが、検索部分はnumpyブルートフォースなので線形時間。
- MilvusはHNSWインデックスで探索を高速化。件数が増えるほど差が開くとされます。
- そこで、既存のSQLite-RAGデータベース(就業規則PDFから作成した121件/384次元)をそのままMilvusに流し込み、実測比較しました。
環境構築(ハマりどころも)
- Docker Desktop (WSL2バックエンド) を導入
- Milvus公式
milvus-standalone-docker-compose.ymlを取得してdocker compose up -d- etcd/minioも一緒に立つ。
docker logs -f milvus-standaloneでMilvus server is readyを確認。
- Python側は
pymilvusを利用。connections.connect(host="127.0.0.1", port="19530")
- スキーマ作成時に注意
- VARCHARの
max_lengthデフォルト2048 → 今回は8192に延長。 - それでも超過するレコードは
[:8000]でトリム。
- VARCHARの
ベンチマークコード(抜粋)
# 接続
connections.connect(host="127.0.0.1", port="19530")
# スキーマ定義
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=8192),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384),
]
schema = CollectionSchema(fields)
col = Collection("docs_bench", schema)
# データ投入
MAXLEN = 8000
ids = [r[0] for r in rows]
texts = [(r[1] or "")[:MAXLEN] for r in rows]
embs = [deserialize_vector(r[2]) for r in rows]
col.insert([ids, texts, embs])
col.flush()
# 検索(HNSW)
res = col.search(queries, "embedding", search_params={"metric_type": "L2", "params": {"ef": 64}}, limit=5)
SQLite側は numpy.linalg.norm による総当たり比較。
実測結果
件数 = 121, 次元 = 384, クエリ = 100, TopK = 5
Milvus Lite (HNSW) : 平均 2.59 ms/クエリ
SQLite (numpy brute): 平均 5.04 ms/クエリ
Speedup ≈ 1.94x
- データ件数が少ないにも関わらず、約2倍の速度差。
- 1万件以上の規模になると、差はさらに拡大する見込み。
- RAGの全体体感ではLLM応答が律速だが、検索部分が確実に軽くなるのは意味がある。
Milvusを使うメリット(まとめ)
- SQLite-RAGより検索は高速&スケーラブル。
- REST API対応で簡易UIや外部サービス連携がすぐできる。
- LiteでPoC → Standalone/DockerでREST化 → 本番クラスタ、とシームレスに拡張可能。
今後の展開
- REST UI化:Docker Standaloneを前提に検索UIを用意、現場投入イメージを検証。
- 顔検索/画像類似検索:RAG以外の応用を別記事で。動画フレームから人物検索などは絵映えする。
- リコール検証:近似探索(HNSW)がどこまでブルートフォースと一致するかも追加で確認予定。
結論
SQLite-RAGは「まず試す」には最高ですが、スケールや応用を考えるならMilvus Liteは強力な選択肢です。今回の比較でも小規模で約2倍、RESTやUI化まで視野に入れれば、次の一歩にちょうど良いと感じました。
参考リンク
- Milvus公式サイト — 製品概要、導入例、インストールガイドなどあり
- Milvus ドキュメント — 技術文書やチュートリアルの元ネタ


