コンテンツにスキップ

プロジェクション

プロジェクションは、ソースモデルのベクトル空間からSchiftの共有標準潜在空間に埋め込みをマッピングするプロセスです。Schiftを通過するすべての埋め込みは、保存または返される前にプロジェクトされるため、データを再埋め込みすることなく、モデルを変更したり、モデルを混ぜたり、出力次元を変更したりできます。

異なるプロバイダーからの埋め込みモデルは、異なるサイズ、スケール、および意味的幾何学を持つベクトルを生成します。openai/text-embedding-3-large(3072次元)のベクトルとvoyage/voyage-4(1024次元)のベクトルは直接比較できず、同じベクトルストアで交換可能ではありません。

Schiftは、すべての埋め込みを単一の標準空間にプロジェクトすることでこれを解決します。これにより、次の3つの実用的な利点があります。

  • 再埋め込みなしでモデルを切り替える。 ベクトルストアを再構築することなく、あるプロバイダーから別のプロバイダーに移行できます。
  • クロスモデル検索。 1つのモデルで埋め込まれたクエリが、別のモデルで埋め込まれたドキュメントを取得できます。
  • 柔軟な出力次元。 ソースモデルのネイティブサイズに関係なく、サポートされている任意の出力次元をリクエストできます。

Schiftがプロジェクションを実装する方法

Section titled “Schiftがプロジェクションを実装する方法”

Schiftのプロジェクションレイヤーは、適応型のエキスパート混合プロジェクターとして実装されています。フローは2つのステージで構成されています。

  1. to_canonical — ソースモデルの埋め込みを標準空間にマッピングします。
  2. from_canonical — 標準埋め込みをリクエストされた出力次元にマッピングします。

標準空間は1024の固定次元を持っています。この次元は、さまざまなソースモデル間で意味的信号を保持するのに十分大きく、ストレージと検索コストを予測可能に保つのに十分小さいです。

各ソースモデルに対して、Schiftは学習された基本プロジェクション行列W_baseを保持します。この行列は、リッジ回帰を使用して、ソースモデルのネイティブ空間から1024次元の標準空間に埋め込みをマッピングするようにトレーニングされています。基本行列はすべての組織で共有されます。

共有の基本行列に加えて、Schiftはエキスパートと呼ばれるドメイン特有の低ランク補正をサポートしています。各エキスパートは、特定のドメイン、コーパス、またはタスクに対して基本プロジェクションを適応させる小さなΔW行列です。

エキスパートは次のように分類できます。

  • グローバル — 共通のドメインに対してすべての組織で共有されます。
  • 組織特有 — 単一の組織のコーパスでトレーニングされています。
  • タスク特有retrieval_queryclassificationなどの埋め込みタスクタイプにマッチしています。

埋め込みがプロジェクトされると、Schiftはコーパスのセントロイドを使用して適切なエキスパートのミックスにルーティングします。受信バッチのセントロイドと各エキスパートのセントロイドとのコサイン類似度を計算し、一致するエキスパート補正のソフトマックス加重ブレンドを使用します。task_typeが提供されている場合、タスクにマッチしたエキスパートが優先されます。そうでない場合、ルーターはユニバーサルエキスパートにフォールバックします。

自動ルーティングされたschift-embed-1-smallモデルの場合、ソース埋め込みはすでに標準空間で生成されているため、プロジェクターはエキスパート補正ステップをスキップし、基本プロジェクションのみを使用します。

埋め込みが標準形式になった後、from_canonicalはリクエストされた出力次元に適応させます。

  • リクエストされた次元が1024より小さい場合、ベクトルは先頭の次元に切り詰められ、再正規化されます。
  • リクエストされた次元が1024より大きい場合、ベクトルはゼロでパディングされます。
  • リクエストされた次元がちょうど1024の場合、標準ベクトルは変更されずに返されます。

これにより、例えば、ネイティブ出力が3072次元のモデルから512次元の埋め込みをリクエストすることが可能になります。

プロジェクションはAPI呼び出し側には透明です。POST /v1/embedPOST /v1/embed/batchを呼び出すか、バルク埋め込みジョブを送信すると、Schiftは次のように処理します。

  1. テキストを選択したプロバイダーに送信します。
  2. 生の埋め込みを受信します。
  3. ソースモデルと組織コンテキストを使用してto_canonicalを呼び出します。
  4. リクエストされたdimensionsを使用してfrom_canonicalを呼び出します。
  5. 最終的な埋め込みをレスポンスとして返します。

レスポンスには常にmodelフィールドが含まれているため、オートルーティングやフェイルオーバーに依存している場合でも、実際に使用されたソースモデルを知ることができます。

注意: プロジェクションはプロバイダーのフェイルオーバー後に発生します。Schiftがプライマリモデルからバックアップモデルにフォールバックした場合、プライマリとフォールバックの両方の埋め込みが同じ標準空間にプロジェクトされるため、返されるベクトルは互換性を保ちます。

基本行列とエキスパートの重みは起動時にロードされ、Schiftの内部プロジェクションストアから遅延ロードすることもできます。トレーニングパイプラインは次のことをサポートします。

  • ペアになったソースとターゲットの埋め込みから新しいW_baseをトレーニングします。
  • 低ランクのΔW補正として組織特有またはグローバルなエキスパートをトレーニングします。
  • タスクに応じたルーティングのためにタスクタグでエキスパートを登録します。

ほとんどの場合、プロジェクションの重みを自分でトレーニングする必要はありません。Schiftは共有の基本行列を維持し、組織特有のエキスパートは内部ツールや管理サービスを通じて作成されます。