SQL Database で T-SQL で Vector データ型用の埋め込みを作成する際には、sp_invoke_external_rest_endpoint で Azure Open AI の 埋め込みのモデル を使用して、ベクトルデータを作成するという方法があります。
SQL Database の Vector データ型 の次元の最大数は「1998」となっており、これを変更することはできません。
Azure Open AI の埋め込みのモデルとしては、次のモデルを使用することができます。
- text-embedding-ada-002
- text-embedding-3-small
- text-embedding-3-large
ada / embedding-3-small であれば、1536 の次元となるため、Vector データ型にはそのまま登録することができるのですが、text-embedding-3-large については、単純に呼び出しただけでは 3072 の次元となるため、Vector データ型に登録することができません。
新しい埋め込みモデルと API の更新 / Vector embeddings で OpenAI としての情報が公開されていますが、Embedding の API の呼び出し時 に「dimensions」というパラメーターを使用することで、次元数を調整することが可能となっています。
これは、Azure OpenAI でも同様となっており 埋め込み の API を呼び出す際に使用することができます。
T-SQL からの呼び出しの例としては次のようになります。
以下の例では Vector データ型の上限である 1998 で設定をしていますが、small と同じ 1536 を設定し、small と 1536 まで減らした large で精度を比較するということも可能です。
declare @url nvarchar(4000) = N'https://xxxxxx.openai.azure.com/openai/deployments/text-embedding-3-large/embeddings?api-version=2023-05-15'; declare @payload nvarchar(max) =(SELECT TOP 1 definition AS input, 1998 AS dimensions FROM sys.all_sql_modules FOR JSON PATH,WITHOUT_ARRAY_WRAPPER ) declare @ret int, @response nvarchar(max); exec @ret = sp_invoke_external_rest_endpoint @url = @url, @method = 'POST', @credential=[https://xxxxxx.openai.azure.com], @payload = @payload, @timeout = 230, @response = @response output; select @ret as ReturnCode, CAST(json_query(@response, '$.result.data[0].embedding') AS vector(1998)), @response as Response; GO
前述のとおり、dimensions を指定しなかった場合、text-embedding-3-large で取得される次元数は 3072 となるため、これを vector データ型に格納しようとすると次のようなエラーが発生します。
Given Vector size is not supported. Maximum allowed size ‘1998’.
しかし、リクエストの Body に dimensions を含めることで指定した次元数で埋め込みを生成できるため、Vector データ型の最大の長さである 1998 に収まる長さでデータの生成ができるようになり、text-embedding-3-large のモデルを sp_invoke_external_rest_endpoint で使用することができるようになります。