SE の雑記

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

SQL Database で Azure OpenAI を使用したベクトルの類似性検索の記事が勉強になった件

leave a comment

今月 Vector Similarity Search with Azure SQL database and OpenAI という記事が公開されました。

Azure のデータストアでは次のような機能のベクター検索が提供されています。

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 のテーブルとして取り込んでおり、データの内容は次のようになります。

image

wikipedia のデータが使用されたものとなるようですが、タイトルとコンテンツの内容に対してベクトルが算出されており、このベクトルについては OpenAI の「text-embedding-ada-002」のモデルが使用されています。

ベクトルについては、「varchar(max)」のデータ型に配列形式の文字列で格納されています。この形式であれば、OPENJSON 関数で展開できますので、次のように各アーティクルのベクターの配列を縦方向に展開することができ、この展開したベクトルと、検索対象の情報のベクトルで比較ができるようになります。

image

SQL Database ではベクターインデックスが無いため、OPENJSON で展開したデータの検索効率を改善するための方法としては、クラスター化列ストアインデックスが使用されています。(この辺は力業感がありますね)

 

検索文字のベクトル表現の取得

比較対象のベースデータのベクトル表現については、サンプルデータで算出が行われているので改めて計算する必要はありますが、検索文字のベクトル表現については取得する必要があります。

SQL Database 内ではベクトル表現を取得するライブラリは提供されていないのですが、sp_invoke_external_rest_endpoint で代替することができます。

このストアドプロシージャは、システム的に許可されたAzure 内のエンドポイントと通信を行うことができるのですが、許可されているエンドポイントには Azure OpenAI のエンドポイントが含まれています。

Azure OpenAI で「text-embedding-ada-002」のモデルを展開し、埋め込み の REST API を SQL Database から呼び出すことで、ベクトル表現を取得することができます。

image

 

コサイン類似度による類似性の評価

最後に コサイン類似度 を使用して類似性の評価を実施します。

Azure OpenAI で取得されたベクトル表現で、比較対象となるベースデータを検索し、距離がどれだけ近いか (算出したコサイン類似度がどれだけ大きいか) を求めることで、類似性の評価を行っています。

image

  • 「v1 (#tmp)」には Azure OpenAI で算出したベクター表現のデータが縦方向に格納
  • 「v2 (wikipedia_articles_embeddings_contents_vector )」比較対象となるベースデータ (上記の例であれば、 Wiki のコンテンツ部のベクター) の、アーティクル ID と ベクターデータを縦方向に格納

となっており、ベクターと一致したものをアーティクル単位に抽出しています。SQL Database ではベクターインデックスが無いため、この部分の検索は列ストアインデックスが使用されています。

アーティクル単位で一致したベクターでコサイン類似度を求めることで、関連性の高い記事を検出しています。

image

 

 

SQL Database は Azure のいくつかのサービスのエンドポイントを叩けるようになっており、SQL Database 内で対応できないものも外部 API を使用することで対応できるのは面白いですね。今回は埋め込みの API を呼び出していますが、チャットの API も呼び出すことはできます。

記事で紹介されている処理の完全な内容は Vector similarity search with Azure SQL & Azure OpenAI で公開されており、一度このチュートリアルを流してみたところ、いろいろと学びがありました。

Share

Written by Masayuki.Ozawa

6月 20th, 2023 at 9:23 pm

Posted in SQL Database

Tagged with

Leave a Reply