Build 2025 で Foundry Local がアナウンスされ、Public Preview として提供が行われました。
Foundry Local と SQL Server 2025 の新機能を組み合わせることができるのかが気になったので、簡単なもので試してみました。
今回は Foundry Local を使用していますが、Ollama を使用することも可能です。
Contents
SQL Server 2025 の外部 REST エンドポイントの呼び出しについて
SQL Server 2025 の 新機能 には Azure SQL Database で先行して実装されていた外部 REST エンドポイントにアクセスするための sp_invoke_external_rest_endpoint が含まれています。
SQL Database の場合は、Allowed endpoints にアクセスするための機能となっており、許可された API 以外を呼び出す場合には、許可されているエンドポイントでラップして呼び出す必要がありました。
SQL Server 2025 については、新機能に次のように記載されている通り、企業内のローカルの REST エンドポイントを直接呼び出せるようになっており、この動作が SQL Database との違いとなっています。
この機能改善が行われていることで、Foundry Local の REST API を SQL Server から呼び出すということが可能となっています。
SQL Server 2025 で外部のエンドポイントを呼び出す場合の制約
SQL Server 2025 の sp_invoke_external_rest_endpoint では、呼び出すことができる REST エンドポイントが SQL Database より緩和されているのですが 1 点制約があり「HTTPS」で呼び出す必要があります。
HTTP で REST API を呼び出すと次のエラーとなります。
メッセージ 31610、レベル 16、状態 1、プロシージャ sys.sp_invoke_external_rest_endpoint_internal、行 1 [バッチ開始行 0]
Accessing the external endpoint is only allowed via HTTPS.
Foundry Local に HTTPS 経由でアクセスするためには
現状、Foundry Local では HTTPS でアクセスする機能は提供されていないため、何らかの HTTPS のアクセス方法でラップする必要があります。(これは、Ollama を使用する場合も同一ですが)
Foundry Local をラップする方法として、ドキュメントでは、Open WebUI (旧 Ollama WebUI) を使用する方法が紹介されています。
Open WebUI 自身も HTTPS で保護する機能は持っていないようなのですが、Secure Your Open WebUI with HTTPS に HTTPS でアクセスするための方法が紹介されています。
これを参考にすることで、Foundry Local を HTTPS 経由でアクセスさせることができます。
今回は、Nginx を使用して Foundry Local に HTTPS 経由でアクセスを行います。
Nginx で使用する証明書の作成
今回の検証であれば、New-SelfSignedCertificate を使用して作成した自己署名証明書を、「Cert:\LocalMachine\Root」に保存して、信頼された証明書として認識させ、この証明書を PEM 形式にすることで Nginx でも利用することができます。
PFX 形式の証明書を PEM 形式に変換する方法ですが、openssl を使用せずに PowerShell のみで実施する場合には、Windows OpenSSL 無しで pem 形式のサーバー証明書と秘密鍵を IP アドレスベースで作成する (PowerShell版) が参考となります。
この方法を使用することで、crt / key ファイルを作成し、Nginx で使用することができます。
Nginx の設定
Nginx の設定ですが、今回は次のような定義 (nginx.conf) を使用しています。(前述の作業で作成した証明書は C:\work に保存しています)
#user nobody; worker_processes 1; error_log logs/error.log; error_log logs/error.log notice; error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; upstream backend { server 127.0.0.1:5273; } access_log CON ; error_log CON warn; sendfile on; keepalive_timeout 60; server { listen 80; listen 443 ssl; ssl_certificate C:\work\certificate.crt; ssl_certificate_key C:\work\private.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; server_name localhost; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # proxy_connect_timeout 60s; # proxy_send_timeout 70s; proxy_read_timeout 600s; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
Foundry Local で使用しているポートについては「foundry service status」で確認することができますが、今回は TCP 5273 が使用されていましたので、それを設定しています。
この設定で Nginx で HTTPS の要求を受け付け、Foundry Local へのリバースプロキシとして動作させています。
SQL Server 2025 から呼び出し
ここまでの設定ができれば SQL Server から呼び出すことができます。
今回は、SQL Server 2025 / Foundry Local / Nginx は同一の環境上で実行していますが、次のようなクエリで Foundry Local の REST API を呼び出すことができます。
DECLARE @ret AS INT, @response AS nvarchar (MAX); DECLARE @headers AS nvarchar (4000) = N'{"Content-Type": "application/json"}'; DECLARE @payload AS nvarchar (MAX) = N' { "max_tokens": 500, "messages": [ { "role": "system", "content": "回答は日本語にする" }, { "role": "user", "content": "なぜ空は青いのか?" } ], "model": "Phi-3.5-mini-instruct-generic-cpu", "stream": false } ' DECLARE @url nvarchar(4000) = N'https://localhost/v1/chat/completions' EXECUTE @ret = sp_invoke_external_rest_endpoint @url = @url, @headers = @headers, @payload = @payload, @timeout = 120, @response = @response OUTPUT; SELECT @ret AS ReturnCode,CAST(@response AS json) AS Response;
次の結果のように、Foundry Local でロードしていたモデル (Phi-3.5-mini-instruct-generic-cpu) を使用して結果の取得ができています。
現在、Foundry Local でデフォルトで提供されているモデルが「chat-completion」用のモデルとなっており、Embedding 用のモデルは含まれていないようですが、POST /v1/embeddings が提供されており、Foudry Local は ONNX 形式のモデルをサポートし、Foundry Local で実行する Hugging Face モデルをコンパイルする で Hugging Face のモデルを使用する方法も公開されています。
Embedding 向けのモデルを Foundry Local にロードし、CREATE EXTERNAL MODEL で SQL Server で使用可能な Embedding のモデルとして登録し、Embedding を生成して Vector データ型 / 関数で利用するということもできるのではと思いますので、これは後々確認していきたいと思います。