SQL Server 2025 のベクターデータ型 / べークターインデックスについて確認した内容 その 1 の続きです。
ベクターデータの次元数の削減
その 1 で記載しましたが、ベクター検索のオーバーヘッドストレージと処理は何ですか? に記載されているように、ベクターデータ型で使用されるデータ領域は次元数に依存しています。
SQL Server データ ページには最大 8,060 バイトを保持できるため、ベクターのサイズは、1 つのページに格納できるベクターの数に影響します。 たとえば、1,024 次元のベクターがあり、各次元が単精度 浮動小数点数 (4 バイト) の場合、ベクターの合計サイズは 4,104 バイト (4096 バイトペイロード + 8 バイト ヘッダー) になります。 これにより、1 ページに収まるベクターの数が 1 に制限されます。
検索の精度とのトレードオフですが、大量のデータにベクトルの埋め込みを行う場合、ストレージ削減の観点でベクターデータの次元数を削減する必要が出てくるかもしれません。
OpenAI の API を使用する場合ですが、「text-embedding-3 以降のモデル」では 次元数が調整 できるようになっています。
現状、Azure OpenAI Service で提供されているモデルとして、Embedding で使用できるものは、次の 3 種類となりますが、「text-embedding-ada-002 以外」であれば、次元数の調整ができます。
- text-embedding-ada-002
- text-embedding-3-large
- text-embedding-3-small
text-embedding-ada-002 が提供されたのが 2022/12/15 で text-embedding-3-large / small が提供されたのが、2024/01/25 となります。
text-embedding-ada-002 と比較すると、text-embedding-3-small のほうが精度 / コスト / スループットのバランスがよさそうですので、今までは何となく text-embedding-ada-002 を使用していたのですが、text-embedding-3-small を使用するように切り替えようかと思っています。
次元数はリクエストのボディに「dimensions」を指定することで調整できますので、CREATE EXTERNAL MODEL の PARAMETERS を指定して次元数を調整します。
CREATE EXTERNAL MODEL [text-embedding-3-small-768]
WITH (
LOCATION = 'https://xxxxxxx.openai.azure.com/openai/deployments/text-embedding-3-small/embeddings?api-version=2023-05-15',
API_FORMAT = 'Azure OpenAI',
MODEL_TYPE = EMBEDDINGS,
MODEL = 'text-embedding-3-small-768',
CREDENTIAL = [https://xxxxxxx.openai.azure.com/openai/deployments/text-embedding-3-small],
PARAMETERS = '{"dimensions":768}'
);
GO
これにより、次元数を削減した状態で埋め込みを作成することができます。float32 / float16 の指定も含めると調整の余地はかなりありそうですね。
- 1536, float32 (デフォルト): 6,152 バイト
- 1536, float16: 3,080 バイト
- 768, float32: 3,080 バイト
- 768, float16: 1,544 バイト