SQL Server 2025 のローカル ONNX ランタイムを使用する場合に公式ドキュメントだけではわからなかったいくつかのポイント の続きとして追加で検証した内容についてまとめておきたいと思います。
Contents
Embedding 生成のスループットとコスト
Embedding の生成は AI_GENERATE_EMBEDDINGS を使用しますが、このステートメントから呼び出すモデルにはいくつかのアクセスパターンがあります。
今回の検証では次の 3 パターンを使用しています。
- ローカル ONNX モデル
- Ollama
- Azure OpenAI
これらのモデルを使用した場合に、処理性能がどの程度変わるのかを確認してみました。今回実行している環境は「Intel Xeon E-2286 2.40 GHz」 の CPU を使用しており、GPU は搭載しておらず、モデルは CPU で実行されています。(Ollama をローカルではなく RTX3050 を搭載しているリモートの環境で実行してみたのですが、性能は大きく変わりませんでした)
生成のスループット
この環境で Embedding の生成を実施したところ分間の生成数は次のようになっていました。
- ローカル ONNX モデル: Snowflake/snowflake-arctic-embed-l-v5.0: 23/min
- Ollama: granite-embedding:278m: 320/min
- Azure OpenAI: text-embedding-ada-002: 920/min
私が使用している環境では、Azure OpenAI を使用した場合が最もスループットが高く、Embedding の生成が実行できていました。記載したモデル以外も試しましたが性能に大きな変化はありませんでした。
Ollama よりローカル ONNX モデルのほうがスループットがスループットが低かったのが意外でした。ローカル ONNX モデルはスループットに大きな差があるので、何らかの設定 / チューニング方法を見逃している可能性があるかもしれません。
Azure OpenAI を使用した場合のコスト
一番スループットが高かったのは Azure OpenAI ですが、これは Azure のサービスを使用しているため、呼び出しごとにコストが発生します。
今回使用しているのは本ブログのポストデータとなり、「31,609,549 文字」(チャンクサイズ: 200 / オーバーラップ: 30 を指定して生成されたチャンクデータ) に対して Embedding を作成しています。
この際発生した Azure OpenAI のコストですが、「\305」となっていました。
「31,609,549 文字」に対して生成されたトークンが「16,142,345 トークン」となり、「(16,142,345 / 1,000) ×\0.018895 = \305」となっているのかと。
Embedding の API の呼び出しのコストは低いので、Azure OpenAI を使用してもそれほど高いコストが発生するというわけではなさそうですね。
私が使用できる環境では、Azure OpenAI が Embedding 生成のスループットが高かったので、普段使いできる範囲のコストに収まりそうです。
Ollama のモデルで活用したいもの
今回の検証では Ollama のモデルとしては次の 3 種類を使用しました。
この 3 種類のモデルと、Azure OpenAI の text-embedding-ada-002 で Vector Search をした場合の結果は次のようになりました。
全体でみると「text-embedding-ada-002」が期待した内容となっていますが、Ollama のモデルでは「granite-embedding:278m」が最も期待した内容に近い結果となっているかと思います。
SSMS 22 の GitHub Copilot を使用した Vector Search
SSMS 22 では GitHub Copilot が使用できます。
Copilot を使用して Vector Search を実行することも可能です。
今回使用したプロンプトが以下の内容となります。
# 基本情報 - 使用する外部モデル: ollama/granite-embedding:278m - Embedding の列名: v4 - 確認したい内容: セカンダリのクエリストア [Embedding の列名]に記載した列は VECTOR データ型です。 # 確認したい内容 [使用する外部モデル]に記載したモデルを外部モデルとして、[wordpress.post_vector]テーブルの[確認したい内容]の内容を、VECTOR_DISTANCE を使用して検索して下さい。 本文は wordpress.post_vector で取得した ID の情報で wordpress.wp_posts を検索することで確認できます。 内容を取得し、該当した情報について Distance / ID / タイトル / 要約 / 確認結果を、Markdown の表形式で出力してください。 取得した内容と確認したい内容を比較し、確認したい内容として妥当かを判断し、妥当でないと判断できた場合、該当情報がないということを回答してください。 類似性が一番高い情報については、個別に要約を出力してください。
このようなプロンプトを使用すると、次のような結果を得ることができます。
プロンプトを使用して Vector Search を実行することができていますね。