チュートリアル: LLM 埋め込みを使用して eventhouse をベクター データベースとして使用する

このチュートリアルでは、イベントハウスをベクター データベースとして使用して、Real-Time Intelligence にベクター データを格納およびクエリする方法について説明します。 ベクター データベースに関する一般的な情報については、 ベクター データベースを参照してください。

このシナリオでは、Wikipedia のページに対するセマンティック検索を実行することで、共通のテーマを持つページを検索します。 使用可能なサンプル データセットを使用します。これには、数万件の Wikipedia ページのベクターが含まれています。 これらのページには、各ページのベクターを生成する OpenAI モデルが埋め込まれています。 ページに関連するいくつかの関連メタデータと共に、ベクターをイベントハウスに格納します。 このデータセットを使用することで、類似するページを検索したり、調べたいテーマに似たページを検索することができます。 たとえば、"19 世紀の有名な女性科学者" について調べたいとします。その場合、同じ OpenAI モデルを使用してこのフレーズをエンコードし、保存されている Wikipedia ページのデータに対してベクター類似性検索を実行すると、セマンティック類似性が最も高いページを見つけることができます。

具体的には、このチュートリアルでは次の操作を行います。

  • ベクター列の Vector16 エンコードを使用して、イベントハウス内のテーブルを準備します。
  • 事前埋め込みデータセットから eventhouse にベクター データを格納します。
  • イベントハウスを使用して次の手順を実行します。
    • OpenAI モデルを使用して自然言語クエリを埋め込みます。
    • series_cosine_similarity KQL 関数を使用して、クエリ埋め込みベクターと Wiki ページの類似点を計算します。
    • 最も類似性の高い行を表示して、検索クエリに最も関連性の高い Wiki ページを取得します。

このフローは次のように視覚化できます。

ベクター データベース ワークフローとしての eventhouse の概念図。

前提条件

  • Microsoft Fabric 対応の 容量を持つ ワークスペース
  • ワークスペース内の イベントハウス
  • text-embedding-ada-002 (バージョン 2) モデルがデプロイされた Azure OpenAI リソース。 このモデルは現在、特定のリージョンでのみ使用できます。 詳細については、リソースの作成に関するページを参照してください。
  • イベントハウス上で、コールアウト ポリシーとマネージド ID を使用して構成された ai_embeddings プラグイン

イベントハウス環境を準備する

このセットアップ手順では、ベクター データを格納するために必要な列とエンコード ポリシーを含むテーブルをイベントハウスに作成します。

  1. Real Time Analytics でワークスペースのホーム ページを参照します。

  2. 前提条件で作成したイベントハウスを選択します。

  3. ベクター データを格納するターゲット データベースを選択します。 データベースがない場合は、[データベースの 追加] を選択してデータベースを作成します。

  4. データベース ツリーを展開し、埋め込み クエリセットを選択し、次の KQL クエリをコピーして貼り付けて、必要な列を含む Wiki というテーブルを作成します。

    .create table Wiki (id:string,url:string,['title']:string,text:string,title_vector:dynamic,content_vector:dynamic,vector_id:long)
    
  5. 次のコマンドをコピーして貼り付けて、ベクター列のエンコード ポリシーを設定します。 これらのコマンドを順番に実行します。

    .alter column Wiki.title_vector policy encoding type='Vector16'
    
    .alter column Wiki.content_vector policy encoding type='Vector16'
    

イベントハウスにベクター データを書き込む

埋め込まれた Wikipedia データをインポートし、イベントハウスに書き込むには、次の手順を使用します。

ノートブックをインポートする

  1. GitHub リポジトリからサンプル vector-database-eventhouse-notebook ノートブックをダウンロードします。

  2. Fabric 環境を参照します。 エクスペリエンス スイッチャーで、Fabric を選択し、ワークスペースを選択します。

  3. インポート>ノートブック>このコンピューターから>アップロード を選択し、前の手順でダウンロードしたノートブックを選択します。

    ワークスペースの [ノートブックのインポート] メニューのスクリーンショット。

  4. インポートが完了したら、ワークスペースからインポートしたノートブックを開きます。

イベントハウスにデータを書き込む

  1. セルを実行して環境を設定します。

    %%configure -f
    {"conf":
        {
            "spark.rpc.message.maxSize": "1024"
        }
    }
    
    %pip install wget
    
    %pip install openai
    
  2. セルを実行し、計算済みの埋め込みをダウンロードします。

    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()
    
  3. イベントハウスに書き込むには、 システム概要ページで確認できるクラスター URI とデータベースの名前を入力します。 テーブルがノートブックに作成され、後でクエリで参照されます。

    # replace with your eventhouse Query URI, Database name, and Table name
    KUSTO_CLUSTER =  "eventhouse Cluster URI"
    KUSTO_DATABASE = "Database name"
    KUSTO_TABLE = "Wiki"
    
  4. 残りのセルを実行して、イベントハウスにデータを書き込みます。 この操作には時間がかかることがあります。

    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()
    

イベントハウスでデータを表示する

この時点で、データベースの詳細ページを参照して、データがイベント ハウスに書き込まれたかどうかを確認できます。

  1. Real Time Analytics でワークスペースのホーム ページを参照します。
  2. 前のセクションで指定したデータベース項目を選択します。 "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

リソースをクリーンアップする

チュートリアルを完了したら、追加コストが発生しないように、作成したリソースを削除します。 リソースを削除するには、次の手順を実行します。

  1. ワークスペースのホームページを参照します。
  2. このチュートリアルで作成したノートブックを削除します。
  3. このチュートリアルで使用するイベントハウスまたは データベース を削除します。