埋め込みドリフトと再インデックス
埋め込みモデルを更新した瞬間に検索精度が静かに劣化する落とし穴と、無停止で全ベクトルを差し替える運用手順が分かります。
- 1.新旧の埋め込みモデルはベクトル空間が非互換で、同じ次元数でも距離やコサイン類似度を比較できない。モデル更新は索引アルゴリズムの変更ではなく全ベクトルの再計算を要する。
- 2.無停止での切り替えは、新モデル用の別索引を並行構築し、書き込みを二重化してから読み出しを段階的に付け替えるデュアルライト+シャドーインデックス方式が基本。
- 3.モデルを固定していてもコーパスの分布変化で相対的な近さが崩れる埋め込みドリフトが起き、再インデックスの要否はオフライン評価で定量的に判断する必要がある。
モデルを差し替えると、なぜ既存ベクトルは使えなくなるのか
HNSW と IVF-PQ の記事では「近いベクトルをどう速く見つけるか」という索引アルゴリズムを扱いました。ここで扱うのは一段手前の問題です。索引の中身であるベクトルそのものが、埋め込みモデルの更新によって古くなるという、ベクトルDB運用に特有のライフサイクル課題です。
埋め込みモデルは、テキストや画像を実数ベクトルへ写す関数です。同じ次元数(例えば1536次元)であっても、モデルが変われば学習時の目的関数・学習データ・座標の取り方が変わるため、新旧モデルが出力するベクトル空間は原則として非互換です。具体的には次の三つが崩れます。
- 距離の絶対値に意味がない: 旧モデルでのコサイン類似度0.8と新モデルでの0.8は、同じ「近さ」を意味しない。
- 軸の対応が取れない: 次元ごとの意味が学習ごとに変わるため、旧ベクトルの成分を新ベクトルの成分と単純比較できない。
- クラスタ構造が変わる: 旧モデルで近かった概念同士が、新モデルでは遠くなることがある(逆もある)。
したがって、クエリだけ新モデルで埋め込み直し、既存の旧ベクトル索引と突き合わせる、という運用は原理的に破綻します。クエリベクトルと索引ベクトルが異なる空間に属するため、距離計算そのものが無意味な数値を返すからです。これは索引アルゴリズム(HNSWかIVF-PQか)とは独立した問題で、索引を差し替えずにモデルだけ差し替えると必ず精度が崩れるという点が運用上の急所です。
新旧モデルの出力次元がたまたま同じ(例:どちらも1536次元)でも非互換性は解消しません。次元数の一致はテンソルの形が合うことを保証するだけで、座標系の意味的な整合を保証しないためです。次元が同じだと索引の型定義上はエラーにならず、サイレントに精度が劣化するため一層厄介です。
埋め込みドリフト:モデルを変えなくても近さは崩れる
モデルの差し替えがなくても、コーパス(登録されるドキュメント集合)の分布が時間とともに変化すると、相対的な近さの分布が変わることがあります。これを**埋め込みドリフト(embedding drift)**と呼びます。例えば新しい専門用語や新製品名が大量に追加されると、モデルが学習時に見ていない語彙の埋め込みが不安定になり、既存語彙との相対距離が意図とずれていきます。
ドリフトはモデル自体のバグではなく、モデルが学習した分布と実運用の分布との乖離が原因なので、再インデックス(全件再計算)では直りません。対処は主に二つです。
- 定量的な監視: 定期的にゴールドスタンダードのクエリ集合(正解が分かっている検索ペア)で recall やランキング相関を計測し、閾値を割ったらアラートする。
- モデルの再学習・差し替え判断: ドリフトが許容範囲を超えたら、モデル更新のプロジェクトとして扱い、後述の再インデックス手順に入る。
「モデルを新しくする」ときの非互換性と、「モデルは同じままコーパスがずれる」ドリフトは原因が異なりますが、どちらも最終的には全ベクトルの再計算(再インデックス)に行き着く点で対処が合流します。違いは、前者は計画的に一括で起き、後者は徐々に進行しモニタリングで検知する必要がある点です。
無停止re-indexingの基本設計:シャドーインデックス+デュアルライト
数百万〜数十億件のベクトルを抱えるサービスでは、全件再埋め込み・再構築に数時間〜数日かかることも珍しくありません。その間サービスを止められないため、旧索引で検索を提供し続けながら、裏で新索引を作り、条件が整ってから切り替える段階的な戦略を取ります。
再インデックスの段階(概念)
Phase 1: シャドー構築
新モデルで全既存ドキュメントをバックフィル埋め込み → 新索引Bを構築
索引A(旧)は引き続き本番トラフィックに応答
Phase 2: デュアルライト
新規/更新書き込みを A・B 両方へ反映(アプリ層 or CDC 経由)
Bのバックフィルが追いつくまで両索引を同期させ続ける
Phase 3: 影評価(シャドーイング)
本番クエリのコピーをBにも投げ、Aの結果とオフラインで比較
recall・ランキング相関が基準を満たすか検証
Phase 4: 段階的カットオーバー
読み出しトラフィックをA→Bへ 1% → 10% → 50% → 100% と段階的に付け替え
メトリクス悪化時は即座にAへフォールバック(Bはまだ削除しない)
Phase 5: 廃止
100%移行後、一定期間の保持を経てAを退役
この構造は、オンラインスキーマ変更の「新テーブルを裏で構築し、トリガーやCDCで同期しつつ段階的に切り替える」設計思想と同型です。違いは、スキーマ変更が構造(列・型)の移行であるのに対し、埋め込み再インデックスは値そのものの意味空間の移行である点です。旧テーブルと新テーブルは行単位で1対1比較できますが、旧ベクトルと新ベクトルは直接比較できないため、Phase 3の「影評価」はスキーマ変更よりも重要度が増します。値の同一性ではなく、検索結果という間接指標でしか正しさを確認できないからです。
デュアルライトの整合性維持には、レプリケーションの同期/非同期と同じトレードオフが現れます。書き込みをA・B双方に同期反映すれば取りこぼしは起きませんが書き込みレイテンシが増え、非同期(キュー経由)にすればレイテンシは抑えられる代わりに一時的な不整合(Bへの反映遅延)が生じます。バックフィル中に発生した更新を取りこぼさないよう、多くの実装ではCDC(変更データキャプチャ)でAへの書き込みログを尾行し、Bへ再生する方式を取ります。
読み出しトラフィックの段階的な付け替えは、コネクションプーリングにおけるプールサイズの漸増と同じく、「いきなり全量ではなく比率を上げながら異常検知の余地を残す」制御です。ここでは案分の単位がコネクションではなくクエリトラフィックの割合になります。
切り替え判定はオフライン評価で定量化する
カットオーバーの可否を勘に頼らないために、Phase 3のシャドー評価では次のような指標を使います。
| 指標 | 測るもの | 悪化時に示唆すること |
|---|---|---|
| recall@k の相対比較 | 旧索引の上位k件が新索引でも上位に残るか | 新モデルが既知の正解概念を近傍から外している |
| ランキング相関(Kendall のτ等) | 順位の入れ替わりの大きさ | 順位が大きく揺れる=下流のランキング学習に悪影響 |
| ゴールドセットでの正答率 | 正解が既知のクエリ集合での的中率 | モデル更新が実質的な改善になっているかの最終判断材料 |
ここで「新モデルの方が指標が良い」ことと「無停止で安全に切り替えられる」ことは別問題である点に注意します。前者はモデル選定の話、後者は運用の話であり、本記事が扱うのは後者です。
埋め込みモデルの更新は索引アルゴリズムの変更ではなく全ベクトルの意味空間そのものの非互換な入れ替えであり、次元数が一致していても新旧ベクトル間の距離比較は無意味であること。無停止移行はシャドー索引の並行構築+デュアルライトでの追随+段階的カットオーバーという順序で行い、正しさの検証は値の直接比較ではなくrecallやランキング相関などの間接指標によるシャドー評価に頼ること。埋め込みドリフトはモデル不変でもコーパス分布の変化で生じ、再インデックスの要否は監視で定量的に検知するものであること、を説明できるようにしておきます。
まとめ
埋め込みモデルを更新すると、次元数が同じでも新旧のベクトル空間は非互換になり、索引だけ据え置いてクエリのモデルを変えると検索は静かに壊れます。モデルを変えなくても、コーパスの分布変化により相対的な近さが崩れる埋め込みドリフトも起こり得ます。どちらも解決には全件の再埋め込みと索引の再構築(re-indexing)が必要ですが、大規模データではダウンタイムを許容できないため、新モデル用の索引をシャドーで並行構築し、デュアルライトで追随させ、recallやランキング相関のシャドー評価を経て、読み出しトラフィックを段階的に付け替える運用が定石です。これはオンラインスキーマ変更の設計思想を値の意味空間の移行に応用したものであり、整合性維持の考え方はレプリケーションの同期モード、トラフィックの絞り方はコネクションプーリングの漸増制御と地続きです。索引アルゴリズムの詳細はHNSWとIVF-PQを参照してください。
データベース Article
埋め込みドリフトと再インデックスを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
埋め込み
比較で見る軸
難易度: advanced / カテゴリ: データベース / タグ数: 6
導入後に効く点
無停止での切り替えは、新モデル用の別索引を並行構築し、書き込みを二重化してから読み出しを段階的に付け替えるデュアルライト+シャドーインデックス方式が基本。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- データベース
- タグ数
- 6
判断チェックリスト
- 自社の用途が「埋め込み / ベクトル検索」に近いか確認する。
- 強みである「新旧の埋め込みモデルはベクトル空間が非互換で、同じ次元数でも距離やコサイン類似度を比較できない。モデル更新は索引アルゴリズムの変更ではなく全ベクトルの再計算を要する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。