先日投稿した、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 がサポートされていますので、本ブログでも試しておきたいと思います。
Contents
基本的な構成
使用するモデル
Ollama の Embedding のモデルについては https://ollama.com/search?c=embedding&o=newest から確認ができます。
Ollama で公開されているポピュラーなモデルとしては nomic-embed-text となりますが、granite-embedding については、278M のモデルで日本語のサポートが明記されていますので、今回はこのモデルを使用しています。
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 でアクセスする場合はどちらも使用することができます。
- Generate Embeddings (POST /api/embed)
- Generate Embedding (POST /api/embeddings)
- こちらは互換用のため、/epi/ebed を使用したほうが良いかと。
次のようなクエリを実行して、埋め込み用のベクターデータが作成できれば、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))
モデルの登録
現時点の 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
これらを組み合わせると、テーブルのデータをチャンクして埋め込みを作成するのが容易になるかと。
類似データの取得
作成した埋め込みを使用した検索については、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
現時点では、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’.
- ベクターインデックスを作成しておく
大変参考になりました。
Ollama の embedded タイプの日本語モデルで、おすすめのものはありますでしょうか?
znatz
14 6月 25 at 12:07