VPSでRAG(検索拡張生成)を自作する:pgvector + Embeddingでドキュメント検索

※本ページには広告(アフィリエイトプログラム等)が含まれます。

※本ページには広告(アフィリエイトプログラム等)が含まれます。pgvector の仕様は 2026年8月16日時点の公式リポジトリの記載、サーバーの出力は同日に運用中の VPS(Debian 12・メモリ 958MB)から採取した実測値です。

🎯 結論:本当のコストは pgvector ではなく「2 つ目の DB を建てること」

結論から書きます。pgvector 自体は PostgreSQL の拡張なので、導入そのものは難しくありません。効いてくるのは、Web サイト用の VPS にはたいてい PostgreSQL が入っていないという点です。

手元の環境を確認したところ、PostgreSQL は未導入で、MariaDB が 75.2MB を使いながら動いていました。空きメモリは 421MB。ここに 2 つ目の DB エンジンを常駐させる判断になります。

  • pgvector は PostgreSQL 13 以降に対応。拡張として入れる
  • インデックスは 2,000 次元まで(格納だけなら 16,000 次元)
  • ⚠️ HNSW はメモリを食う → 小さい VPS では IVFFlat から検討する
  • ⚠️ IVFFlat はデータを入れてから作る → 空テーブルに作っても効かない
  • 既存の MariaDB とは別に常駐する → メモリの見積もりを先にやる

RAG の全体の流れ

3 つの工程に分かれる

やることは ①文書を分割して埋め込みベクトルにする → ②ベクトルを DB に入れる → ③質問文のベクトルで近いものを引く の 3 つです。pgvector が担当するのは ②と③だけで、①は別に用意する必要があります。

pgvector が解くのは「近傍検索」だけ

誤解しやすいのがここです。pgvector はベクトルを保存して、近いものを高速に引くための拡張であって、埋め込みそのものは作りません。埋め込みの生成手段は自分で決めます。

既存の DB に相乗りできない

pgvector は PostgreSQL の拡張です。MySQL / MariaDB では使えません。すでに MariaDB でサイトを運用している環境に入れる場合、DB エンジンがもう 1 つ増えることになります。

⚠️ VPS に置くときの本当のコスト

PostgreSQL は入っていない

Web サーバー用途の VPS で確認するとこうなります。

$ which psql postgres
(何も表示されない)

$ systemctl is-active postgresql
inactive

すでに動いている DB のメモリ

$ systemctl show mariadb -p MemoryCurrent --value
(約 75.2 MB)

$ free -m
               total        used        free      shared  buff/cache   available
Mem:             958         537          87          60         562         421

MariaDB が 75.2MB、使える余力は 421MB。ここに PostgreSQL を足すと、同程度の常駐がもう 1 つ乗ると見積もっておくのが安全です。さらに HNSW インデックスを使うならその上にメモリが必要になります。

判断の順番

状況 現実的な選択
すでに PostgreSQL を使っている pgvector を足すだけ。最も自然
MariaDB のみ・メモリ 1GB 前後 ⚠️ 2 つ目の DB は重い。別サーバーか外部サービスを検討
ベクトル数が数万件以下 DB を建てず、ファイル + 総当たりでも足りることがある
Web サーバーと分離できる 専用の箱に置くのがいちばん素直

pgvector の仕様

次元数の上限

公式に明記されている数値です。インデックスを張れるのは 2,000 次元まで、格納だけなら 16,000 次元まで。

⚠️ この差が実務では効きます。3,072 次元の埋め込みは「保存はできるがインデックスは張れない」ことになり、件数が増えると検索が実用的でなくなります。埋め込みモデルを選ぶ段階で 2,000 次元以下に収まるかを確認してください。

距離演算子

演算子 距離
<-> L2 距離(ユークリッド)
<=> コサイン距離
<#> 内積の符号反転
<+> L1 距離(マンハッタン)
<~> ハミング距離(バイナリベクトル)
<%> ジャッカード距離(バイナリベクトル)

文書検索で使うのはたいてい <=>(コサイン距離)です。インデックスは演算子ごとに作るので、使う演算子を決めてから張ってください。

インデックスの選択

観点 HNSW IVFFlat
検索性能 高い 劣る
構築時間 遅い 速い
メモリ使用量 多い 少ない
空テーブルへの作成 可能 ⛔ 不可(先にデータが必要)

公式の説明どおり、HNSW は速度と再現率のトレードオフで有利だが、構築が遅くメモリを食う。小さい VPS では IVFFlat から試すのが無難です。

⚠️ IVFFlat は「データを入れてから」作ります。空のテーブルに作ってもリストの学習ができず、意図した性能になりません。ここは順番を間違えやすいところです。

埋め込みをどう作るか

3 つの選択肢

方法 コスト構造 注意点
外部の埋め込み API トークン単位 データが外に出る
ローカル(Ollama の /v1/embeddings GPU の起動時間 一般的な VPS では動かない
軽量モデルを CPU で回す CPU 時間 速度と精度が落ちる

ローカルは GPU が要る

Ollama は /v1/embeddings を OpenAI 互換で提供していますが、動かすには GPU が必要です。手元の VPS で確認すると GPU デバイスは存在しませんでした。

$ nvidia-smi
bash: nvidia-smi: command not found

GPU を借りる場合の価格感はこちらの記事にまとめています(さくらの高火力 DOK で V100 が 1 時間 57.6 円)。埋め込みの生成は初回にまとめて走るバッチ処理なので、秒課金の GPU とは相性が良い部類です。

次元数は最初に決める

後から埋め込みモデルを変えると、すべてのベクトルを作り直すことになります。前述のインデックス上限(2,000 次元)も含めて、最初に決めておくのが結果的にいちばん安く済みます。

専用のベクトル DB と比べる

pgvector が有利な場面

すでに PostgreSQL を運用しているなら、ほぼ pgvector 一択です。既存のテーブルと JOIN できる、トランザクションが効く、バックアップの仕組みを流用できる——運用上の利点がそのまま乗ります。

専用 DB が有利な場面

ベクトルが数千万件を超える規模や、分散が前提の構成では専用のベクトル DB が向きます。ただしそこに至る前に、まず pgvector で足りるかを確かめるほうが早いです。

そもそも DB が要らない場合もある

ベクトルが数千件程度なら、ファイルに置いて総当たりで計算しても実用的な速度が出ます。DB を建てる判断は、件数が増えて困ってからで遅くありません。

よくある質問

Q1. pgvector は MySQL や MariaDB でも使えますか?

結論:使えません。PostgreSQL の拡張です。対応バージョンは PostgreSQL 13 以降。すでに MariaDB でサイトを運用している環境なら、DB エンジンをもう 1 つ常駐させる判断になります。

Q2. メモリ 1GB の VPS で動きますか?

結論:厳しいです。手元の環境は MariaDB が 75.2MB を使い、空きは 421MB でした。ここに PostgreSQL を足すと同程度の常駐がもう 1 つ乗り、さらに HNSW インデックスのメモリが必要になります。Web サーバーと分離できるなら、そのほうが確実です。

Q3. 次元数の上限はいくつですか?

結論:インデックスを張れるのは 2,000 次元まで、格納だけなら 16,000 次元までです。3,072 次元の埋め込みは保存できてもインデックスが張れないため、件数が増えると検索が実用的でなくなります。埋め込みモデルを選ぶ段階で確認してください。

Q4. HNSW と IVFFlat はどちらを選ぶべきですか?

結論:メモリに余裕がなければ IVFFlat から試してください。HNSW は検索性能で有利ですが、構築が遅くメモリを多く使います。IVFFlat はデータを入れてから作る必要がある点に注意してください(空テーブルに作っても効きません)。

Q5. 文書検索ではどの距離を使いますか?

結論:多くの場合コサイン距離(<=>)です。インデックスは演算子ごとに作るので、使う距離を決めてからインデックスを張ってください。後から変えるとインデックスを作り直すことになります。

Q6. 埋め込みはローカルで作れますか?

結論:GPU があれば作れます。Ollama は /v1/embeddings を OpenAI 互換で提供していますが、一般的な VPS には GPU が無いため動きません(手元の環境でも nvidia-smi は未インストールでした)。埋め込みの生成は初回にまとめて走るバッチ処理なので、秒課金の GPU と相性が良い部類です。

まとめ

pgvector の導入で本当に効いてくるのは、拡張の入れ方ではなく「2 つ目の DB エンジンを常駐させられるか」という一点です。

  • 🎯 すでに PostgreSQL がある → 迷わず pgvector
  • 🎯 MariaDB のみ・1GB VPS → 分離を検討(MariaDB 75.2MB / 空き 421MB)
  • 🎯 設計で最初に決める → 次元数(2,000 以下)と距離演算子

仕様は変わります。この記事の数値は 2026年8月16日時点のもので、サーバーの出力は同日に採取したものです。GPU の価格感は画像生成を VPS でやる話、API 費用はLLM API のコスト最適化、メモリが足りないときはスワップの追加にまとめています。

読んで頂いて有り難うございます!