SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server 2025 と Ollama を組み合わせる

one comment

先日投稿した、SQL Server 2025 と Foundry Local を組み合わせる では、SQL Server 2025 の AI 領域の新機能を Foundry Local と組み合わせてみました。

Practical AI in SQL Server 2025: Ollama Quick Start の記事で解説が行われていますが、Foundry Local ではなく、Ollama と組み合わせることができます。

SQL Server 2025 で新しく追加されたモデルの呼び出しを登録しておく CREATE EXTERNAL MODEL では API FORMAT として、Ollama がサポートされていますので、本ブログでも試しておきたいと思います。

基本的な構成

使用するモデル

Ollama の Embedding のモデルについては https://ollama.com/search?c=embedding&o=newest から確認ができます。

Ollama で公開されているポピュラーなモデルとしては nomic-embed-text となりますが、granite-embedding については、278M のモデルで日本語のサポートが明記されていますので、今回はこのモデルを使用しています。

image

nomic-embeded-text については、v.15 ではなく、v2-moe になるとサポートされる言語が増えていますので、このバージョンが Ollama から直接 Pull できるようになると、日本語の埋め込みで活用できるのではないでしょうか。

 

nginx 経由でのアクセス

SQL Server 2025 と Foundry Local を組み合わせる で触れている通り、外部 REST API の呼び出しについては、許可されている API か HTTPS でアクセス可能な API に制限されています。

Ollama は TCP: 11434 でリスニングされますので、「127.0.0.1:11434」に対して nginx から HTTPS 経由でアクセスできるように設定しておきます。

 

sp_invoke_external_rest_endpoint によるアクセス確認

nginx 経由で HTTPS でアクセスが可能となったら、モデルの呼び出しを sp_invoke_external_rest_endpoint で確認しておきます。

Ollama の Embeddings の API については、次の 2 種類がありますが、sp_invoke_external_rest_endpoint でアクセスする場合はどちらも使用することができます。

次のようなクエリを実行して、埋め込み用のベクターデータが作成できれば、Ollama のモデルが使用できる状態となっています。

DECLARE @payload nvarchar(max) 
DECLARE @ret int, @response nvarchar(max);

SET @payload = JSON_OBJECT('model':'granite-embedding:278m', 'input':'Test')

exec @ret = sp_invoke_external_rest_endpoint
@url = 'https://localhost/api/embed',
@method = 'POST',
@payload = @payload,
@timeout = 230,
@response = @response output;

SELECT CAST(json_query(@response, '$.result.embeddings[*]') AS vector(768))

 

image

 

モデルの登録

現時点の SQL Database では提供されておらず、SQL Server 2025 でのみ提供されている機能となりますが 2025 では CREATE EXTERNAL MODEL を使用することができます。

このステートメントを使用することで、都度 sp_invoke_external_rest_endpoint を実行することなく、外部モデルを呼び出すことができ、クエリ内に組み込みやすくなります。

CREATE EXTERNAL MODEL MyOllamaModel
WITH (
      LOCATION = 'https://localhost/api/embed',
      API_FORMAT = 'Ollama',
      MODEL_TYPE = EMBEDDINGS,
       MODEL = 'granite-embedding:278m'
);
GO

 

このようなクエリで先ほどは sp_invoke_external_rest_endpoint で呼び出していたモデルを、SQL Server 内に登録しておくことができます。

Ollama の Embedding を使用する場合、「POST /api/embeddings」ではなく、「POST /api/embed」のAPI を使用しないとエラーになりそうでした。

 

クエリ内でのモデルの利用

現時点の SQL Server 2025 でのみ使用することができる機能として、CREATE EXTERNAL MODEL の他に次のようなステートメントがあります。

AI_GENERATE_CHUNKS を使用することで、指定したサイズでオーバーラップを指定しながらデータをチャンクすることができ、埋め込みを作成する文字列を適切な文字数で分割することが可能となります。

CREATE EXTERNAL MODEL で登録したモデルは、AI_GENERATE_EMBEDDINGS を使用して呼び出すことが可能です。

この二つを組み合わせることでテーブルに格納されているデータをチャンクして埋め込みを作成することができます。

SELECT 
    ID, 
    c.*,
    CAST(AI_GENERATE_EMBEDDINGS(chunk USE MODEL MyOllamaModel) AS vector(768)) AS vector_value
FROM 
    wordpress.wp_posts
    CROSS APPLY
        AI_GENERATE_CHUNKS(source = post_content, chunk_type = N'FIXED' , chunk_size = 1000, overlap =20) c
WHERE
    ID =43906

 

これらを組み合わせると、テーブルのデータをチャンクして埋め込みを作成するのが容易になるかと。

image

 

類似データの取得

作成した埋め込みを使用した検索については、SQL Database と同様で、VECTOR_DISTANCE を使用することができます。

DECLARE @v AS VECTOR(768);
SELECT @v =  CAST(AI_GENERATE_EMBEDDINGS('データ型について' USE MODEL MyOllamaModel) AS vector(768))

SELECT TOP 100  *, VECTOR_DISTANCE('cosine', @v, vector_value) AS distance
FROM  wordpress.vector_posts
ORDER BY distance ASC

 

image

 

現時点では、SQL Server 2025 でのみ使用できる機能として、VECTOR_SEARCH がありますので、こちらを使用することもできます。

VECTOR_SEARCH を使用する場合、使用するテーブルに対して制約があり、サポートされるテーブル構造でない場合は次のようなエラーが発生します。(ベクターインデックス 現時点では SQL Server 2025 のみの機能となっていそうです)

  • The base table doesn’t have a single column, non NULLABLE and unique Key Clustered Index.
    • テーブル内に単一列で構成されたキーが必要
  • Cannot find a vector index with metric ‘cosine’ on column ‘vector_value’.
    • ベクターインデックスを作成しておく

image

Share

Written by Masayuki.Ozawa

5月 27th, 2025 at 9:57 am

One Response to 'SQL Server 2025 と Ollama を組み合わせる'

Subscribe to comments with RSS or TrackBack to 'SQL Server 2025 と Ollama を組み合わせる'.

  1. 大変参考になりました。
    Ollama の embedded タイプの日本語モデルで、おすすめのものはありますでしょうか?

    znatz

    14 6月 25 at 12:07

Leave a Reply