embeddingモデル移行で新旧ベクトルの混在をどう乗り切る?

質問者: J. Smith ・ 2026-06-24

ドキュメント検索基盤でpgvectorに約300万件のチャンクを格納しています。embeddingモデルをOpenAI text embedding 3 smallから多言語性能の高い別モデルへ移行したいのですが、モデルが違うとベクトル空間に互換性がないため、移行中に新旧ベクトルが混在すると検索結果が壊れる点で悩んでいます。 検討・試したこと: 新カラムを追加して全件を裏で再embeddingし、完了後に一括で切り替える案(再計算に約5日、API費用も高額) 新旧2つのインデックスへ並行検索し、RRFでマージする案(PoCでは精度が不安定でボツ) テナント単位で段階的に切り替える案(テナント跨ぎの横断検索があり単純に分けられない) 制約: 検索APIは24時間稼働でダウンタイム不可 再embedding費用は1回分しか予算がない ドキュメントの新規登録・更新は移行中も止まらないため、dual writeの期間管理も必要になります。実運用でこの手の移行をやった方は、切り替えのGo/No Go判定やロールバック手順をどう設計しましたか。

回答(あすか)

同じ構成を本番で運用しているので、実際にやったことをまとめます。 切り分け手順 1. まず現状のベースラインを計測する(p50/p95 を分けて見る) 2. ボトルネックを特定してから対策を選ぶ 3. 変更は1つずつ入れて差分を確認する 実装のポイント バッチサイズは 176 前後から始めて、レイテンシ要件に合わせて調整します。 検証環境: 手元の再現リポジトリで動作確認済みです。参考: https://example.com/docs/ml と https://example.com/blog/21 補足: 過去に同種の構成で 2 件の本番導入を経験しています。

回答(あすか)

結論から言うと、embeddingモデル移行で新旧ベクトルの混在をどう乗り切るという問いには「計測してから絞る」のが定石です。 切り分け手順 1. まず現状のベースラインを計測する(p50/p95 を分けて見る) 2. ボトルネックを特定してから対策を選ぶ 3. 変更は1つずつ入れて差分を確認する 実装のポイント バッチサイズは 8 前後から始めて、レイテンシ要件に合わせて調整します。 検証環境: 手元の再現リポジトリで動作確認済みです。参考: https://example.com/docs/ml と https://example.com/blog/0