このチュートリアルでは、イベントハウスをベクター データベースとして使用して、Real-Time Intelligence にベクター データを格納およびクエリする方法について説明します。 ベクター データベースに関する一般的な情報については、 ベクター データベースを参照してください。
このシナリオでは、Wikipedia のページに対するセマンティック検索を実行することで、共通のテーマを持つページを検索します。 使用可能なサンプル データセットを使用します。これには、数万件の Wikipedia ページのベクターが含まれています。 これらのページには、各ページのベクターを生成する OpenAI モデルが埋め込まれています。 ページに関連するいくつかの関連メタデータと共に、ベクターをイベントハウスに格納します。 このデータセットを使用することで、類似するページを検索したり、調べたいテーマに似たページを検索することができます。 たとえば、"19 世紀の有名な女性科学者" について調べたいとします。その場合、同じ OpenAI モデルを使用してこのフレーズをエンコードし、保存されている Wikipedia ページのデータに対してベクター類似性検索を実行すると、セマンティック類似性が最も高いページを見つけることができます。
具体的には、このチュートリアルでは次の操作を行います。
- ベクター列の
Vector16エンコードを使用して、イベントハウス内のテーブルを準備します。 - 事前埋め込みデータセットから eventhouse にベクター データを格納します。
- イベントハウスを使用して次の手順を実行します。
- OpenAI モデルを使用して自然言語クエリを埋め込みます。
- series_cosine_similarity KQL 関数を使用して、クエリ埋め込みベクターと Wiki ページの類似点を計算します。
- 最も類似性の高い行を表示して、検索クエリに最も関連性の高い Wiki ページを取得します。
このフローは次のように視覚化できます。
前提条件
- Microsoft Fabric 対応の 容量を持つ ワークスペース。
- ワークスペース内の イベントハウス 。
- text-embedding-ada-002 (バージョン 2) モデルがデプロイされた Azure OpenAI リソース。 このモデルは現在、特定のリージョンでのみ使用できます。 詳細については、リソースの作成に関するページを参照してください。
- イベントハウス上で、コールアウト ポリシーとマネージド ID を使用して構成された ai_embeddings プラグイン。
イベントハウス環境を準備する
このセットアップ手順では、ベクター データを格納するために必要な列とエンコード ポリシーを含むテーブルをイベントハウスに作成します。
Real Time Analytics でワークスペースのホーム ページを参照します。
前提条件で作成したイベントハウスを選択します。
ベクター データを格納するターゲット データベースを選択します。 データベースがない場合は、[データベースの 追加] を選択してデータベースを作成します。
データベース ツリーを展開し、埋め込み クエリセットを選択し、次の KQL クエリをコピーして貼り付けて、必要な列を含む Wiki というテーブルを作成します。
.create table Wiki (id:string,url:string,['title']:string,text:string,title_vector:dynamic,content_vector:dynamic,vector_id:long)次のコマンドをコピーして貼り付けて、ベクター列のエンコード ポリシーを設定します。 これらのコマンドを順番に実行します。
.alter column Wiki.title_vector policy encoding type='Vector16' .alter column Wiki.content_vector policy encoding type='Vector16'
イベントハウスにベクター データを書き込む
埋め込まれた Wikipedia データをインポートし、イベントハウスに書き込むには、次の手順を使用します。
ノートブックをインポートする
GitHub リポジトリからサンプル vector-database-eventhouse-notebook ノートブックをダウンロードします。
Fabric 環境を参照します。 エクスペリエンス スイッチャーで、Fabric を選択し、ワークスペースを選択します。
インポート>ノートブック>このコンピューターから>アップロード を選択し、前の手順でダウンロードしたノートブックを選択します。
インポートが完了したら、ワークスペースからインポートしたノートブックを開きます。
イベントハウスにデータを書き込む
セルを実行して環境を設定します。
%%configure -f {"conf": { "spark.rpc.message.maxSize": "1024" } }%pip install wget%pip install openaiセルを実行し、計算済みの埋め込みをダウンロードします。
import wget embeddings_url = "https://cdn.openai.com/API/examples/data/vector_database_wikipedia_articles_embedded.zip" # The file is ~700 MB so it might take some time wget.download(embeddings_url)import zipfile with zipfile.ZipFile("vector_database_wikipedia_articles_embedded.zip","r") as zip_ref: zip_ref.extractall("/lakehouse/default/Files/data")import pandas as pd from ast import literal_eval article_df = pd.read_csv('/lakehouse/default/Files/data/vector_database_wikipedia_articles_embedded.csv') # Read vectors from strings back into a list article_df["title_vector"] = article_df.title_vector.apply(literal_eval) article_df["content_vector"] = article_df.content_vector.apply(literal_eval) article_df.head()イベントハウスに書き込むには、 システム概要ページで確認できるクラスター URI とデータベースの名前を入力します。 テーブルがノートブックに作成され、後でクエリで参照されます。
# replace with your eventhouse Query URI, Database name, and Table name KUSTO_CLUSTER = "eventhouse Cluster URI" KUSTO_DATABASE = "Database name" KUSTO_TABLE = "Wiki"残りのセルを実行して、イベントハウスにデータを書き込みます。 この操作には時間がかかることがあります。
kustoOptions = {"kustoCluster": KUSTO_CLUSTER, "kustoDatabase" :KUSTO_DATABASE, "kustoTable" : KUSTO_TABLE } access_token=mssparkutils.credentials.getToken(kustoOptions["kustoCluster"])#Pandas data frame to spark dataframe sparkDF=spark.createDataFrame(article_df)# Write data to a table in eventhouse sparkDF.write. \ format("com.microsoft.kusto.spark.synapse.datasource"). \ option("kustoCluster",kustoOptions["kustoCluster"]). \ option("kustoDatabase",kustoOptions["kustoDatabase"]). \ option("kustoTable", kustoOptions["kustoTable"]). \ option("accessToken", access_token). \ option("tableCreateOptions", "CreateIfNotExist").\ mode("Append"). \ save()
イベントハウスでデータを表示する
この時点で、データベースの詳細ページを参照して、データがイベント ハウスに書き込まれたかどうかを確認できます。
- Real Time Analytics でワークスペースのホーム ページを参照します。
- 前のセクションで指定したデータベース項目を選択します。 "Wiki" テーブルに書き込まれたデータの概要が表示されます。 データベースが既に開かれている場合は、更新して新しいデータを表示します。
検索語句の埋め込みを生成する
埋め込まれた Wiki データをイベントハウスに格納した後、同じ Azure OpenAI モデルを使用して検索用語を埋め込みます。 次に、保存されているベクトルと比較して、同様の Wikipedia ページを見つけます。
KQL を使用すると、 ai_embeddings プラグインを使用してインラインでデータを埋め込むことができます。 このアプローチは、Eventhouse で直接新しいストリーミング データの類似性をテストするのに最適です。 Azure OpenAI リソース エンドポイントとデプロイ名を組み合わせたモデル エンドポイント URL が必要です。
| 変数名 | 価値 |
|---|---|
| model_endpoint | Azure OpenAI エンドポイントとデプロイ名から、https://<deployment-name>.openai.azure.com/openai/deployments/text-embedding-ada-002/embeddings?api-version=2024-10-21;impersonate形式で構築されます。
Azure ポータルのリソースのKeys & Endpointセクションで、エンドポイントを見つけてください。 |
KQL クエリセットで次のクエリを実行して、埋め込みが正しく生成されていることを確認します。 次の手順でこれと同じパターンを使用して、完全な類似性検索を実行します。
let model_endpoint = 'https://<deployment-name>.openai.azure.com/openai/deployments/text-embedding-ada-002/embeddings?api-version=2024-10-21;impersonate';
let searchedEmbedding = toscalar(evaluate ai_embeddings("most difficult gymnastics moves in the olympics", model_endpoint));
print searchedEmbedding
類似性クエリを実行する
コサインの類似性を使用して、検索用語の埋め込みを保存されている Wikipedia ページ ベクトルと比較し、最も類似したページの上位 10 ページを返します。 検索語句を変更して再実行して、さまざまな結果を調べることができます。
次の KQL クエリは、検索用語を埋め込み、1 つの KQL ステートメントで類似性検索を実行します。
model_endpoint値を独自の値に置き換えます。
let model_endpoint = 'https://<deployment-name>.openai.azure.com/openai/deployments/text-embedding-ada-002/embeddings?api-version=2024-10-21;impersonate';
let searchedEmbedding = toscalar(evaluate ai_embeddings("most difficult gymnastics moves in the olympics", model_endpoint));
Wiki
| extend similarity = series_cosine_similarity(searchedEmbedding, content_vector)
| top 10 by similarity desc
リソースをクリーンアップする
チュートリアルを完了したら、追加コストが発生しないように、作成したリソースを削除します。 リソースを削除するには、次の手順を実行します。
- ワークスペースのホームページを参照します。
- このチュートリアルで作成したノートブックを削除します。
- このチュートリアルで使用するイベントハウスまたは データベース を削除します。