今月 Vector Similarity Search with Azure SQL database and OpenAI という記事が公開されました。
Azure のデータストアでは次のような機能のベクター検索が提供されています。
- Azure Cosmos DB for MongoDB 仮想コアの埋め込みでのベクター検索の使用
- Azure Database for PostgreSQL で pgvector を使用する場合のパフォーマンスを最適化する方法 – フレキシブル サーバー
Azure SQL Database では、ベクターデータの生成 / 格納するためのデータ型 / ベクターインデックスや、ベクトルの類似性検索を行うためのライブラリはないのですが、この記事では JSON 形式のデータや、Azure OpenAI を組み合わせることでベクトルの類似性検索を行っており、勉強になったのでポイントとなると思った箇所をまとめておこうと思います。
比較対象となるベースデータのベクターデータの格納方法
ベースとなるデータについては、Using Vector Databases for Embeddings Search でも使用されている vector_database_wikipedia_articles_embedded.zip となります。(Introducing text and code embeddings / Wikipedia with custom vectors も参考になります)
このデータを SQL Server のテーブルとして取り込んでおり、データの内容は次のようになります。
wikipedia のデータが使用されたものとなるようですが、タイトルとコンテンツの内容に対してベクトルが算出されており、このベクトルについては OpenAI の「text-embedding-ada-002」のモデルが使用されています。
ベクトルについては、「varchar(max)」のデータ型に配列形式の文字列で格納されています。この形式であれば、OPENJSON 関数で展開できますので、次のように各アーティクルのベクターの配列を縦方向に展開することができ、この展開したベクトルと、検索対象の情報のベクトルで比較ができるようになります。
SQL Database ではベクターインデックスが無いため、OPENJSON で展開したデータの検索効率を改善するための方法としては、クラスター化列ストアインデックスが使用されています。(この辺は力業感がありますね)
検索文字のベクトル表現の取得
比較対象のベースデータのベクトル表現については、サンプルデータで算出が行われているので改めて計算する必要はありますが、検索文字のベクトル表現については取得する必要があります。
SQL Database 内ではベクトル表現を取得するライブラリは提供されていないのですが、sp_invoke_external_rest_endpoint で代替することができます。
このストアドプロシージャは、システム的に許可されたAzure 内のエンドポイントと通信を行うことができるのですが、許可されているエンドポイントには Azure OpenAI のエンドポイントが含まれています。
Azure OpenAI で「text-embedding-ada-002」のモデルを展開し、埋め込み の REST API を SQL Database から呼び出すことで、ベクトル表現を取得することができます。
コサイン類似度による類似性の評価
最後に コサイン類似度 を使用して類似性の評価を実施します。
Azure OpenAI で取得されたベクトル表現で、比較対象となるベースデータを検索し、距離がどれだけ近いか (算出したコサイン類似度がどれだけ大きいか) を求めることで、類似性の評価を行っています。
- 「v1 (#tmp)」には Azure OpenAI で算出したベクター表現のデータが縦方向に格納
- 「v2 (wikipedia_articles_embeddings_contents_vector )」比較対象となるベースデータ (上記の例であれば、 Wiki のコンテンツ部のベクター) の、アーティクル ID と ベクターデータを縦方向に格納
となっており、ベクターと一致したものをアーティクル単位に抽出しています。SQL Database ではベクターインデックスが無いため、この部分の検索は列ストアインデックスが使用されています。
アーティクル単位で一致したベクターでコサイン類似度を求めることで、関連性の高い記事を検出しています。
SQL Database は Azure のいくつかのサービスのエンドポイントを叩けるようになっており、SQL Database 内で対応できないものも外部 API を使用することで対応できるのは面白いですね。今回は埋め込みの API を呼び出していますが、チャットの API も呼び出すことはできます。
記事で紹介されている処理の完全な内容は Vector similarity search with Azure SQL & Azure OpenAI で公開されており、一度このチュートリアルを流してみたところ、いろいろと学びがありました。