代表的な面接トピック

システムデザイン面接:マルチテナント対応のベクトル検索サービスをどのように設計するか?

システム設計難しい
Offer.cc 編集チーム公開日 更新日

質問

多数のテナントにまたがる1億件のドキュメントの埋め込み(embedding)を保存するサービスが必要です。クエリはp95で150ミリ秒以内に上位20件の関連ドキュメントを返し、テナントおよびACLフィルターを適用し、更新を1分以内に検索可能にし、再現率、コスト、鮮度のメトリクスを公開しなければなりません。このサービスを設計し、インデックス作成、シャーディング、フィルタリング、更新、評価について説明してください。

プロンプトとスコープ

これは検索システムの設計問題であり、ベクトルデータベースの名前を挙げるだけのものではありません。対象は、厳格なテナント分離、メタデータおよび権限フィルター、制限されたレイテンシ、そして測定可能な鮮度と関連性の契約を備えた、埋め込みに対するセマンティック検索です。埋め込みはアップストリームのモデルによって生成され、ドキュメントは置換または削除可能であり、サービスはバッチのバックフィルと継続的な更新の両方をサポートする必要があると仮定します。

面接官がテストしているポイント

  • 取り込み、埋め込み、インデックス構築、クエリ配信、評価を分離できているか。
  • 完全一致検索が過度に高コストである理由を説明し、近似最近傍(ANN)戦略を意図的に選択しているか。
  • 再現率やテナントの分離を暗黙のうちに損なうことなくフィルターが適用されているか。
  • 更新、削除、モデルの変更、インデックスの再構築に明示的な可視性セマンティクスがあるか。
  • 「類似度」が正しいと主張するのではなく、関連性、再現率、レイテンシ、コスト、鮮度のメトリクスを定義しているか。

最初に明確にすべき質問

  • ベクトルの次元数、距離関数、テナントあたりのドキュメント数、予想されるクエリレートはどれくらいか?
  • テナントおよびACLフィルターは必須のハード制約か、それとも検索後に結果を削除できるか?
  • 1分間の鮮度はすべての書き込みに必要なのか、それともホットなコレクションのサブセットのみに必要なのか?
  • ハイブリッドなキーワード+ベクトル検索、リランキングが必要か、それとも最近傍検索のみでよいか?
  • 埋め込みモデルは変更される可能性があるか、また移行中も古いベクトルをクエリ可能にしておく必要があるか?

30秒の回答フレームワーク

「システムを取り込みログ、埋め込みワーカー、バージョン管理されたベクトルインデックス、ステートレスなクエリ層に分割します。各レコードには、テナント、ACL、ドキュメントバージョン、モデルバージョン、トゥームストーン状態を保持します。クエリルーティングは、まずテナントのシャードまたはネームスペースを選択し、次にフィルタリングされたANN検索を実行し、オプションで少数の候補セットをリランキングします。ミュータブルなデルタインデックスが最近の書き込みを処理し、イミュータブルなセグメントはバックグラウンドで再構築されます。読み取り時は両方をマージし、古いバージョンを隠蔽します。完全検索または精査されたゴールドセットに対する再現率、p95レイテンシ、フィルターミス率、鮮度ラグ、クエリあたりのコストを測定します。」

ステップバイステップの詳細解説

1. データと可視性の契約を定義する

document_idtenant_id、ACL属性、埋め込みモデルのバージョン、コンテンツのバージョン、ベクトル、更新タイムスタンプを保存します。削除はバージョン付きのトゥームストーンであり、すべてのレプリカから即座にベクトルが削除されたと想定するものではありません。クエリは検索前に認可されます。テナントおよびACL述語は必須の制約であり、関連性のランキングは認可された候補にのみ適用されます。

2. ANNインデックスとパーティショニングを選択する

総当たり検索では、次元DのN個のベクトルに対して約O(N × D)の距離計算コストがかかります。1億個のベクトルの場合、これは150ミリ秒の目標に対して不適切であるため、HNSWや転置ファイル(IVF)アプローチなどのANNインデックスを使用します。HNSWはメモリオーバーヘッドを伴いながらも高い再現率と高速な読み取りを強みとします。クラスタ化または量子化されたインデックスはメモリとコストを削減しますが、チューニングの手間と再現率のリスクが伴います。テナントを意識したネームスペースまたはシャードから開始し、負荷の高いテナントを分割し、読み取り負荷の高いパーティションをレプリケートします。普遍的なBig-Oや再現率の数値を主張するのではなく、選択したライブラリと次元でベンチマークを実施してください。

3. フィルタリングを検索の正確性の一部とする

ポストフィルタリングでは、最近傍が他のテナントに属していたりACL述語を満たさなかったりする場合に、返される結果が20件未満になる可能性があります。プレフィルタリングは候補空間を縮小できますが、スパースなフィルターではコストが高くなる可能性があります。実用的な設計としては、フィルタリング可能なメタデータをベクトルパスとともにインデックス化し、選択性を推定して、必要に応じてより大きなANN候補プールまたは専用のフィルタリング済みセグメントを選択します。Pineconeはメタデータ述語をドキュメント化し、フィルタリングが検索契約の一部であると警告しています。面接の回答では、認可された一致が20件未満しか存在しない場合に何が起こるかを述べる必要があります。

4. 新しい書き込みとコンパクション済みセグメントを分離する

受け入れられた書き込みは、永続ログと小さなミュータブルデルタインデックスに追加します。イミュータブルなベースセグメントとデルタの両方をクエリし、ドキュメントバージョンごとにマージして、トゥームストーンが設定されたIDを削除します。バックグラウンドのコンパクションによって新しいセグメントが構築され、カウントとサンプリングされた再現率が検証され、マニフェストがアトミックにスワップされます。1分のSLAは、埋め込みジョブの開始からではなく、確認応答された書き込みからクエリの可視性までで測定されます。埋め込みやインデックス作成が遅延した場合は、ラグを公開し、書き込みが成功したかのように見せかけるのではなく、以前のバージョンを表示し続けます。

5. モデルとスキーマの移行を処理する

埋め込みモデルの変更により、システムがデュアルインデックスまたは射影プランをサポートしていない限り、新旧のベクトルは比較できなくなります。すべてのレコードにモデルバージョンを書き込み、新しいインデックスをバックフィルし、両方に対してクエリをシャドウイングして、切り替え前に再現率とレイテンシを比較します。ロールバックと保持の要件が切れるまで、古いインデックスを保持します。メタデータとACLスキーマの変更にも同じバージョン管理されたロールアウト規律が必要です。ベクトルのマッチングが、新しく追加された権限フィールドをバイパスしてはなりません。

6. クエリパスと過負荷ポリシーを設計する

クエリ層はテナントを認証し、クエリを正規化し、モデルバージョンを選択して、関連するシャードにのみファンアウトします。デッドライン、制限された候補数、およびキャンセルを強制します。シャードがタイムアウトした場合、APIが完全性を明示している場合にのみ部分的な結果を返します。それ以外の場合は、セキュリティが重視される検索ではフェイルクローズ(安全側に倒して失敗)とします。埋め込みと安定したパブリッククエリをキャッシュしますが、認可スコープをまたいでキャッシュエントリを共有してはなりません。アドミッション制御により、バースト時のインデックスメモリとリランキング容量を保護します。

7. 関連性、鮮度、コストを測定する

関連するドキュメントと禁止されたドキュメントを含むラベル付きクエリセットを作成します。サンプリングされたパーティション上でANNの結果と完全検索のベースラインを比較し、recall@20、precisionまたはnDCG、フィルターの正しさ、認可リークテストを報告します。p50/p95/p99レイテンシ、候補数、インデックス構築時間、書き込みから可視化までのラグ、トゥームストーンのバックログ、ベクトルあたりのメモリ、1,000クエリあたりのコストを追跡します。オフラインメトリクスはランキングの劣化を検出し、オンラインのクリックメトリクスにはガードレールが必要です。なぜなら、位置バイアスによって悪い結果が人気のように見えてしまうことがあるからです。

トレードオフと境界

HNSWとクラスタ化または量子化インデックスの比較

HNSWは、メモリが利用可能な場合の読み取り負荷の高いワークロードに対する強力な第1候補です。IVFや直積量子化(Product Quantization)は、大規模環境でメモリを削減しスキャン効率を向上させることができますが、トレーニング、チューニング、再現率の検証が必要です。製品名だけで選ぶのではなく、更新レート、次元数、テナントの偏り、ハードウェアの予算から選択してください。

ネイティブベクトルストアと既存のデータベースの比較

ベクトルインデックスを備えた汎用データベースは、コレクションが中規模で、結合、トランザクション、ACLデータを一緒に保持する必要がある場合に魅力的です。専用サービスは、ベクトル検索がキャパシティの大部分を占める場合、特殊なANNインデックスが必要な場合、または独立したスケーリングが必要な場合に正当化されます。ベクトルストアが必要なトランザクション保証を提供できない場合は、信頼できる情報源(Single Source of Truth)となるドキュメントおよび権限レコードをインデックスの外部に保持してください。

テナントごとのインデックスと共有パーティションの比較

テナントごとのインデックスは分離とノイジーネイバー(近隣ノイズ)の制御を簡素化しますが、オーバーヘッドが増大します。共有インデックスはハードウェアをより効率的に使用しますが、厳格なメタデータフィルタリングと公平なスケジューリングが必要です。通常のテナントにはネームスペースまたはパーティションキーを使用し、非常に大規模なテナントや規制の厳しいテナントは分離されたキャパシティに昇格させます。

高品質な回答サンプル

「永続的な書き込みログから開始し、すべてのドキュメント、ACL、埋め込みモデルをバージョン管理します。クエリ層はテナントを認可し、関連するシャードにファンアウトし、フィルタリングされたANN検索を実行し、最新のデルタインデックスをイミュータブルなセグメントとマージします。HNSWは読み取り負荷の高いベースラインですが、recall@20とp95レイテンシを使用してクラスタ化または量子化されたインデックスと比較ベンチマークを行います。再構築ではマニフェストをアトミックに公開し、モデル変更ではシャドウクエリを使用し、削除はバージョン管理されたトゥームストーンとして扱います。サービスはフィルターの正確性、書き込みから可視化までのラグ、認可リークテスト、ベクトルあたりのメモリ、クエリコストを報告します。関連性は測定された契約です。」

よくある間違い

  • ANNライブラリの選択をアーキテクチャ全体と見なし、取り込み、削除、再構築を無視すること。
  • 検索後にACLフィルターを適用し、結果が少なくなったり、認可されていないドキュメントを暗黙のうちに返したりすること。
  • 次元数、インデックス設定、ハードウェア、ワークロードを挙げずに、固定の再現率やレイテンシを主張すること。
  • 埋め込みモデルをその場で(インプレースで)置き換えて、新旧のベクトルが比較不能になること。
  • クリック数のみを測定し、完全検索やラベル付きの関連性ベースラインを決して維持しないこと。

フォローアップの質問と回答

ACLフィルターによって一致が3件しか残らない場合はどうなりますか?

明示的なtotal_or_completenessシグナルとともに3件を返すか、API契約に従って空または不十分な応答を返します。残りのスロットを未認可またはフィルタリングされていない結果で埋めてはなりません。候補プールを拡大するのは、認可された検索パス内のみとします。

書き込みを失わずにインデックスを再構築するにはどうすればよいですか?

永続ログを新しいセグメントにリプレイし、高水位標(high-water mark)を記録し、そのマーク以降の書き込みに追いつき、カウントとサンプリングされた再現率を検証して、アトミックにマニフェストを公開します。スワップが完了するまでデルタパスをアクティブにしておきます。ロールバックは以前のマニフェストを復元することによって行います。

古いモデルのベクトルはいつ削除できますか?

シャドウ評価が合格し、新しいモデルが配信され、ロールバックおよび保持期間が終了し、すべてのクエリパスが古いモデルバージョンを拒否した後にのみ削除可能です。遅延したジョブやリプレイコンシューマーがまだ参照している可能性があるため、時間経過だけで削除するのは安全ではありません。

公開情報ソース

関連する質問

関連面接ツール

システム設計の回答には「回答する」を使用

まず要件を明確にし、スケール、アーキテクチャ、コンポーネント選定、トレードオフの順に進めます。

ツールを見る