SE の雑記

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

SQL Server 2025 のローカル ONNX ランタイムを使用する場合に公式ドキュメントだけではわからなかったいくつかのポイント

leave a comment

SQL Server 2025 では AI 機能の強化として、「埋め込み (Embedding) の生成」を行うことができます。

SQL Server 2025 の Embedding の利用方法は次の種類があるかと思いますが、本投稿の内容は「2.」のパターンでの利用となります。

  1. 外部 REST API を使用する (HTTPS でのアクセスが必須)
    • Azure OpenAI
    • OpenAI
    • Ollama
  2. ローカル ONNX ランタイムを使用する

このパターンを使用する際には、ローカル ONNX ランタイムの例 をチュートリアルとして進めていくことになりますが、私の現状のスキルでは、このドキュメントだけでは対応できない内容がいくつかありましたので、ポイントをまとめておこうと思います。

公式ドキュメントより先に確認しておく内容

前述のとおり公式ドキュメントは ローカル ONNX ランタイムの例 となります。

私が ONNX ランタイムの取り扱いのスキルが低いことに起因していると思いますが、上述の公式ドキュメントだけでは、詰まってしまうポイントがあり、機能を試すことはできませんでした。

SQL Server 2025 RC0 の情報となりますが、公式のドキュメントより Azure SQL Devs’ Corner で公開された Create embeddings in SQL Server 2025 RC0 with a local ONNX model on Windows を確認し、この記事をチュートリアルとして進めたほうが、詰まることなく機能を試すことができると思います。

Dev Blog も Microsoft の公開記事ではありますが、SQL Server 2025 のドキュメントからリンクはされていない情報となりますので、「公式ドキュメントとより先に確認しておく内容」として分類しています。

以降は、私が公式ドキュメントでは理解することができなかったいくつかのポイントを記載していきたいと思います。

 

トークン化ライブラリのビルドについて

ローカル ONNX ランタイムを使用する場合、トークン化ライブラリ (tokenizer_cpp) は自分で準備する必要があります。

公式ドキュメントでは、https://github.com/mlc-ai/tokenizers-cpp のリポジトリをビルドする手順となっていますが、私はこのリポジトリでビルドした「tokenizers_cpp.dll」ではローカル ONNX ランタイムを動作させることができませんでした。

前述の Create embeddings in SQL Server 2025 RC0 with a local ONNX model on Windows でも、Step 4: Set up the tokenization library で「tokenizers_cpp.dll」のビルドについて触れられています。

この内容ではビルド済みの DLL が提供されており、その DLL を使用することで、リポジトリを明示的にビルドする必要がなくなるのですが、注目しておきたいのが、https://github.com/PARTHSQL/tokenizers-cpp のリポジトリです。

これは、本章の冒頭のリポジトリをオリジナルとしてフォークしたものとなるのですが、static_exports.cc の追加と、CMakeLists.txt の更新が行われてろ、ローカル ONNX ランタイムで使用することを想定した構成となっていそうです。

オリジナルのリポジトリの内容をベースにして Windows 向け DLL をビルドすることも可能ですが、static_exports.cc がないことによる影響か、単純にビルドしただけでは、ローカル ONNX ランタイムで使用することができませんでした。

オリジナルのリポジトリを単純にビルドしただけでは 746 KB の DLL となり動作しなかったのですが、フォークされたリポジトリの satic_exports.cc の内容を取り込みビルドをするようにしたとk路、4,670 KB の DLL が作成され、この DLL であれば正常に動作させることができました。

公式ドキュメントに記載されているリポジトリので正常に動作させることができなかった場合、https://github.com/PARTHSQL/tokenizers-cpp のリポジトリの存在も把握しておくとよいのではないでしょうか。

 

ローカル ONNX ランタイムを使用する際に使用できる ONNX モデル

ローカル ONNX ランタイムを使用する場合、使用するモデルは ONNX モデルとなります。

公式ドキュメントでは 手順 5: ONNX モデルをダウンロードする で手順が示されており、 Hugging Face で公開されているモデルが使用されています。

 

ローカル ONNX ランタイムで使用できるモデル

チュートリアルで使用されているモデルは https://huggingface.co/nsense/all-MiniLM-L6-v2-onnx となります。

ローカル ONNX ランタイムで使用できる ONNX モデルの仕様は公開されていないようなのですが、次のようなモデルを使用することができました。

Hugging Face で公開されている Embedding 用の ONNX モデルを使用する場合、「model.onxx」を使用していても、モデルによっては次のようなエラーが発生します。

メッセージ 31739、レベル 17、状態 1、行 151
セッション ID ’48CC7B99-2CF6-459E-A97E-4A56BF086848′ の ‘AIRuntimeHost’ プロセスからの埋め込みの生成が、HRESULT 0x80004004 で失敗しました。

このような場合は、ローカル ONNX ランタイムで使用することができないモデルである可能性を考慮したほうが良いかもしれません。

「どのようなモデルが使用できるのか?」についてですが、現状公式のドキュメントで、この情報が記載されているものを見つけられていません。

検証した範囲での経験則となりますが、モデルからの出力が「token_embeddings」「sentence_embedding」となっているモデルであれば使用できる確率は高そうです。

Hugging Face / ONNX モデル / Embedding のスキルが低いため理解が追い付いていないのですが「sentence_embedding」の出力があることが重要な気がしております。

 

公式ドキュメントのチュートリアルで使用されている「nsense/all-MiniLM-L6-v2-onnx」であれば、次のような出力となっており、上述の Embedding が出力されています。

image

Hugging Face のモデルカードから出力が判断できるものがあるのかもしれませんが、利用を検討したモデルでエラーとなった場合は、出力がどのようになっているのかを確認してみるとよいかもしれません。

上記の画像については、Netron を使用して確認したものとなります。

onnxruntime を使用しても確認ができますので、生成 AI で「onnxruntime を使用して、model.onnx の出力 (token_embeddings, sentence_embedding, logits といった内容を想定) するコードを生成してください」というようなプロンプトでコード生成させれば Python のスクリプトを作成して確認ができると思います。

今回のエラーについては、ibm-granite/granite-embedding-278m-multilingual ・ Hugging Face の Hugging Face の ONNX モデルを使用した場合に発生したものとなります。Granite embedding model については、Ollama でも公開されていますので、Granite を使用する場合は、Ollama で利用したほうが容易かもしれません。

 

Ollama を HTTPS でアクセスする場合の参考情報

SQL Server の 外部 REST API 呼び出しは、HTTPS でのアクセスが必要となります。Ollama は HTTPS のアクセスは提供しておらず、HTTP のポート 11434 (llama をもじったもの) で API アクセスを提供しています。

HTTPS でアクセスをさせる場合は、Ollama の前に何らかのリバースプロキシのような役割を配置する必要があり、当ブログでも以前 SQL Server 2025 と Foundry Local を組み合わせる で類似の内容に触れており、Ollama もこの方法をベースとしてアクセスできることを確認しました。

Microsoft のブログでは次の記事が公開されていますので、Ollama や Foundry Local を使用する場合は、これらの記事を確認するとよいかと。

開発プロキシでローカル言語モデルを使用する で Dev Proxy を使用して、Ollama にアクセスするという方法もとれるかもしれませんね。

 

日本語のサポート

公式ドキュメントのチュートリアルで使用しているモデル (nsense/all-MiniLM-L6-v2-onnx) でサポートされている言語は English となっています。

image

このモデルでは、日本語のテキストに対しての Embedding の生成で使用すると精度が出せないかと。

日本語の精度を出すには複数言語に対応したモデルを使用する必要がありますが、本投稿の「ローカル ONNX ランタイムで使用できるモデル」に記載したモデルで日本語の精度を比較した場合、次のモデルは日本語の対応が期待したものとなりそうな感じがしています。

 

トラブルシューティングについて

本機能のトラブルシューティングについては XEvent テレメトリを有効にする に記載されています。

拡張イベントを使用してテレメトリを確認することになるのですが、私が確認できたエラーのケースでは「Embedding の生成に失敗した」ということしか分かりませんでした。

image

この画像は、「logits」が出力となるモデルを使用して Embedding を生成しようとした場合のテレメトリの内容となるのですが、具体的なエラー内容が不明でした。

Embedding を作成する処理を連続して実行し、「C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\ExtensibilityData」内のテキストを確認できるまでコピーを繰り返したほうが詳細な情報が分かるかもしれません。

「エラーが発生した場合のトラブルシューティング」については、公開されているナレッジの拡充に期待する必要があるかもしれません。

Share

Written by Masayuki.Ozawa

11月 30th, 2025 at 2:27 pm

Leave a Reply