digital base
プロダクトドキュメント最新情報コンテンツ会社概要

お問い合わせ

ご質問やご相談など、お気軽にお問い合わせください。

デジタルベース株式会社

〒106-0047
東京都港区南麻布3-20-1 5階

サイトメニュー

  • トップページ
  • プロダクト
  • ドキュメント
  • 最新ニュース
  • 記事一覧
  • 会社情報

お問い合わせ

  • info@digital-base.co.jp

NVIDIA Inception Program / Intel Partner ISV /
NTTPC Innovation LAB / IT導入補助金 対象

© デジタルベース株式会社. All rights reserved.
一覧に戻る

2026年2月13日

·

RAG

·
422 文字

RAGのベクトルインデックス選定|HNSWとIVFFlatの比較と本番運用ガイド

RAGを本番運用する際、検索性能を左右するのがベクトルインデックスの選択です。本稿では主要なANNインデックスであるHNSWとIVFFlatの特性を比較し、pgvectorでの実装例とともに、データ規模・メモリ制約に応じた選定指針をDigitalBaseの知見として整理します。

RAGのベクトルインデックス選定|HNSWとIVFFlatの比較と本番運用ガイド

RAG(Retrieval-Augmented Generation)を社内システムに組み込む際、精度やコストの議論は活発に行われる一方で、ベクトル検索のインデックス選択は後回しになりがちです。しかし、データ量が増えるにつれて検索の速度と精度を左右するのは、まさにこのインデックス層です。本稿では、近似最近傍探索(ANN)の代表的な手法である HNSW と IVFFlat の違いを整理し、pgvectorでの実装例を交えながら、データ規模やメモリ制約に応じた選定指針を解説します。


RAGの概要

RAGとは

RAG(Retrieval-Augmented Generation)は、LLM(大規模言語モデル)に外部知識を与えて回答精度を向上させるアーキテクチャです。LLM単体では学習データに含まれない情報には回答できませんが、RAGを用いることで社内ドキュメントやFAQなどの独自データを検索・参照したうえで回答を生成できます。

RAGの処理フロー

RAGは大きく2つのフェーズに分かれます。

インデックス構築フェーズ(事前処理)

  1. ドキュメントをチャンク(断片)に分割する
  2. 各チャンクをEmbeddingモデルでベクトル化する
  3. ベクトルをデータベースに格納し、インデックスを構築する

検索・生成フェーズ(リアルタイム)

  1. ユーザーの質問をベクトル化する
  2. インデックスを使って類似度の高いチャンクを検索する
  3. 取得したチャンクをコンテキストとしてLLMに渡し、回答を生成する

このうち「インデックスを使って類似度の高いチャンクを検索する」部分で、HNSWやIVFFlatといったインデックスの選択がパフォーマンスに直結します。

なぜインデックスが必要なのか

ベクトル検索の最も単純な方法は 総当たり検索(Flat Search) です。全ベクトルと順にコサイン類似度を計算し、最も近いものを返します。正確ですが、データ量が増えると計算量がO(N)で増大し、実用的な速度を維持できなくなります。

そこで、近似最近傍探索(ANN: Approximate Nearest Neighbor)インデックスを用いることで、多少の精度を犠牲にしつつ、桁違いの速度で検索が可能になります。


ベクトル検索の主要パラメータ

インデックスの比較に入る前に、ベクトル検索で共通して理解しておくべきパラメータを整理します。

距離関数

ベクトル間の「近さ」を測る関数です。RAGでは コサイン類似度 が最も一般的です。

距離関数概要主な用途
コサイン類似度ベクトルの方向の近さ(-1〜1)テキスト埋め込み全般
L2距離(ユークリッド)ベクトル間の直線距離画像、音声
内積正規化済みベクトルで有効一部のEmbeddingモデル

pgvectorでは、それぞれ vector_cosine_ops、vector_l2_ops、vector_ip_ops としてインデックスに指定します。

Embeddingモデルと次元数

Embeddingモデルによって出力ベクトルの次元数が異なり、インデックスのメモリ使用量と検索速度に影響します。

モデル次元数特徴
text-embedding-3-small (OpenAI)1536汎用、API依存
text-embedding-3-large (OpenAI)3072高精度、API依存
multilingual-e5-large-instruct1024多言語対応、オープンソース
nomic-embed-text768軽量、ローカル実行可能
embeddinggemma (Google)768日本語対応、ローカル実行可能

次元数が大きいほどメモリ消費が増えます。エッジサーバーやオフライン環境と組み合わせる場合は、768〜1024次元のモデルが実用的です。

similarity_threshold(類似度閾値)

検索結果のうち、一定以上の類似度を持つチャンクだけを採用するためのフィルタです。この値は 下限値 として機能し、閾値未満のチャンクは回答生成に使用されません。

重要なのは、最適な閾値はEmbeddingモデルによって大きく異なる という点です。

モデル推奨閾値の目安スコア分布の傾向
embeddinggemma0.20〜0.30スコアが低めに分布
nomic-embed-text0.40〜0.50中程度に分布
multilingual-e5-large0.70〜0.85スコアが高めに集中

固定値をハードコードするのではなく、アプリケーション設定やデータベースの設定値から動的に変更できる設計が望ましいといえます。

top_k

類似度順にソートしたうえで上位何件を返すかの指定です。一般的にはk=3〜10程度で、LLMのコンテキスト長とのバランスで調整します。チャンクサイズが小さければkを大きめに、チャンクサイズが大きければkを小さめにするのが基本です。


HNSWとIVFFlatの比較

HNSWとは

HNSW(Hierarchical Navigable Small World)は、グラフベースの近似最近傍探索アルゴリズムです。データを多層のグラフ構造として管理し、上位層から下位層へ「飛び石」のようにナビゲーションしながら最近傍を探索します。

仕組み:

  • 各ベクトルをグラフのノードとして挿入する
  • 複数の階層を構築する(上位層は粗く、下位層は密に接続)
  • 検索時は最上位層のエントリポイントから開始し、層を降りながら近傍を絞り込む

主要パラメータ:

パラメータデフォルト値説明
m16各ノードの最大接続数。大きいほど精度向上、メモリ増
ef_construction64インデックス構築時の探索幅。大きいほど構築が遅く精度向上
ef_search40検索時の探索幅。大きいほど検索が遅く精度向上

多くの場合、デフォルト値で十分な精度が得られます。チューニングはデータ量や精度要件に応じて後から行えばよく、初期段階でこれらを変更する必要はほとんどありません。

IVFFlatとは

IVFFlat(Inverted File with Flat Quantization)は、クラスタリングベースの近似最近傍探索アルゴリズムです。データをk-meansで複数のクラスタ(リスト)に分割し、検索時は関連するクラスタのみを走査します。

仕組み:

  • k-meansでベクトルを lists 個のクラスタに分割する
  • 各ベクトルを最も近いクラスタに割り当てる
  • 検索時は、クエリベクトルに最も近い probes 個のクラスタのみを走査する

主要パラメータ:

パラメータ推奨値説明
lists行数に依存(後述)クラスタ数。データ量に応じて設定が必要
probes1(デフォルト)検索時に走査するクラスタ数。精度に直結

lists の推奨値はデータ量に依存します。

  • 100万行未満:rows / 1000
  • 100万行以上:sqrt(rows)

比較表

項目HNSWIVFFlat
アルゴリズムグラフベースクラスタリングベース
検索精度(Recall)非常に高い(95%以上)中〜高(probes依存)
検索速度高速高速(probes次第)
インデックス構築速度遅い速い
メモリ使用量多い(グラフ構造を保持)少ない
空テーブルへの構築可能非推奨(データが必要)
データ追加時即時反映、リバランス不要クラスタ偏りが発生しうる
パラメータ調整デフォルトで高精度lists/probesの適切な設定が必要
フィルタ付き検索iterative_scan対応(v0.8.0+)probes増で対応
適したデータ規模数千〜数百万件数十万〜数千万件

HNSWを選ぶべきケース

  • 新規プロジェクトで迷っている → 現在の標準推奨はHNSW
  • データが随時追加される → 再インデックス不要
  • マルチテナント(ユーザーごとにフィルタ) → iterative_scanとの相性が良い
  • 運用コストを最小化したい → パラメータ調整がほぼ不要
  • テーブル作成時にインデックスも構築したい → 空テーブルでも構築可能

IVFFlatを選ぶべきケース

  • ベクトルが数百万件以上 → メモリ制約が厳しい環境
  • インデックス構築の速度を優先する → 大量データの初期ロード時
  • メモリが限られたサーバー → グラフ構造を持たない分軽量

ライブラリ・データベースごとの搭載状況

ベクトル検索を提供するライブラリとデータベースは複数ありますが、それぞれ対応するインデックスが異なります。

主要ライブラリの比較

ライブラリ / DBHNSWIVFFlatFlat(総当たり)特徴
pgvectorv0.5.0〜v0.1.0〜常に利用可PostgreSQL拡張、SQLと統合
FAISSIndexHNSWFlatIndexIVFFlatIndexFlatL2Meta開発、GPU対応
Chromaデフォルト--hnswlib使用、手軽
Pinecone独自実装--マネージドサービス
Weaviateデフォルト--GraphQLインターフェース
Milvus対応対応対応多種インデックス対応
Qdrantデフォルト--Rust製、高速

LangChainとの組み合わせ

LangChainはオーケストレーションフレームワークであり、ベクトルストア自体ではありません。LangChainでどのインデックスが使われるかは、バックエンドの選択で決まります。

# LangChain + FAISS(デフォルトはFlat = 総当たり) from langchain_community.vectorstores import FAISS vectorstore = FAISS.from_documents(docs, embeddings) # LangChain + pgvector(HNSWインデックスはDB側で管理) from langchain_community.vectorstores import PGVector vectorstore = PGVector.from_documents(docs, embeddings, connection_string=conn) # LangChain + Chroma(デフォルトでHNSW) from langchain_community.vectorstores import Chroma vectorstore = Chroma.from_documents(docs, embeddings)

LangChain + FAISSの組み合わせは手軽ですが、デフォルトでは IndexFlatL2(総当たり)が使われるため、大量データでは性能が劣化します。本番環境では、pgvectorやChromaなど専用のインデックスを持つバックエンドの使用を推奨します。

pgvectorを選ぶメリット

  • 既存のPostgreSQLと同居できる → ユーザー管理や設定などのRDBデータとベクトルデータを同じDBに格納できる
  • SQLの機能がそのまま使える → JOINやWHERE句によるフィルタリングが標準SQLで行える
  • 追加インフラが不要 → 別途ベクトルDBを立てる必要がない
  • トランザクション対応 → データの整合性が保証される
  • バックアップ・レプリケーション → PostgreSQLの運用ツールがそのまま使える

実装例:pgvectorでのHNSWインデックス構築

テーブルとインデックスの作成

-- pgvector拡張を有効化(初回のみ、スーパーユーザー権限が必要) CREATE EXTENSION IF NOT EXISTS vector; -- スキーマとテーブルの作成 CREATE SCHEMA IF NOT EXISTS pgvector; CREATE TABLE IF NOT EXISTS pgvector.embeddings ( id SERIAL PRIMARY KEY, bot_id VARCHAR(255) NOT NULL, user_id VARCHAR(255) NOT NULL, document_id VARCHAR(255) NOT NULL, chunk_id INTEGER NOT NULL, content TEXT NOT NULL, embedding vector, metadata JSONB, created_at TIMESTAMP DEFAULT NOW() ); -- B-treeインデックス(フィルタ用) CREATE INDEX IF NOT EXISTS idx_bot_user ON pgvector.embeddings (bot_id, user_id); CREATE INDEX IF NOT EXISTS idx_document ON pgvector.embeddings (document_id); -- HNSWインデックス(ベクトル検索用) CREATE INDEX IF NOT EXISTS idx_embeddings_hnsw ON pgvector.embeddings USING hnsw (embedding vector_cosine_ops);

embedding vector と次元数を指定しないことで、異なる次元のEmbeddingモデルに対応できます。ただし、同一テーブル内で異なる次元のベクトルを混在させて検索することはできません(同じモデルで生成されたベクトル同士でのみ比較可能です)。

HNSWパラメータのカスタマイズ(必要な場合のみ)

デフォルト値で始めて、パフォーマンスに問題がある場合のみ調整します。

-- インデックス構築パラメータの変更(再構築が必要) CREATE INDEX idx_embeddings_hnsw ON pgvector.embeddings USING hnsw (embedding vector_cosine_ops) WITH (m = 24, ef_construction = 128); -- 検索パラメータの変更(セッション単位、即時反映) SET hnsw.ef_search = 100;

まとめ

インデックス選択のフローチャート

  1. データ量は100万件以上か?
    • No → HNSW(デフォルト設定で開始)
    • Yes → 次へ
  2. メモリに余裕があるか?
    • Yes → HNSW
    • No → IVFFlat(lists/probesの調整が必要)

大半のRAGユースケースでは、ドキュメント数は数百〜数万件、チャンク数にして数千〜数十万件程度です。この規模であれば、HNSWのデフォルト設定で十分な性能が得られます。

実装時のポイント

  1. インデックスはデフォルト値で始める — HNSWの m=16、ef_construction=64 は多くのケースで最適に近い値です。事前の過剰なチューニングは避けます。
  2. similarity_thresholdはモデルに合わせて設定する — Embeddingモデルごとにスコア分布が異なるため、固定値ではなく設定で変更できる仕組みにしておきます。
  3. フィルタ用のB-treeインデックスも忘れない — マルチテナント環境では、ベクトルインデックスだけでなく bot_id や user_id に対するB-treeインデックスが検索速度に大きく影響します。
  4. Embeddingモデルの変更時はベクトルの再構築が必要 — 異なる次元のベクトルは同一テーブル内で比較できません。モデルを変更する場合は、既存のベクトルを削除して再度埋め込みを行う必要があります。
  5. パフォーマンス計測は本番相当のデータで行う — 少量のテストデータでは総当たり検索でも十分に速いため、インデックスの効果はデータ量が増えてから現れます。

参考リンク

  • pgvector公式リポジトリ
  • FAISS公式ドキュメント
  • HNSW原論文(Malkov & Yashunin, 2018)
DigitalBase データ連携フロー
DigitalBase

社内データを、ネットワーク不要で
“使えるAI”に。

エンタープライズに必要なAI機能を1つに集約した、ライセンス型のオンプレミスLLM基盤。 機密データを外部に出さず、完全オフライン環境で運用できます。

  • ✓ 専用AIチャット / ドキュメントAgent(RAG)
  • ✓ 文字起こし・ベンチマーク測定
  • ✓ 管理者・共有・権限管理機能
無料で試す製品の詳細を見る

資料請求・導入のご相談は お問い合わせ から。

ニュースリリース

最新のお知らせやプレスリリースをご覧いただけます

お知らせ
「AI NATIVE EXPO 2026」(6月10日〜12日 @ 幕張メッセ) に出展いたします
Interop Tokyo 併設の総合展「AI NATIVE EXPO 2026」に出展いたします。社内データを自動連携・加工し、BI・AIエージェントへ繋ぐ一連のフローを展示します。
2026年6月8日
プレスリリースPR TIMES
台湾AIインフラ企業Spingence Technologyと社内データ連携AIプラットフォームを共同開発
4月15日〜17日開催「NexTech Week 2026【春】第10回 AI・人工知能 EXPO」に出展 ~社内データをAIに接続し、業務フローに組み込む企業向けAI基盤~
2026年4月6日
お知らせ
「AI Frontier 2026」にスポンサー出展
AI技術の最前線を発信するカンファレンス「AI Frontier 2026」にスポンサーとして出展いたします。
2026年3月4日
一覧に戻る