Azure AI Search のナレッジ ストアの 「プロジェクション」

プロジェクションでは、Azure AI 検索エンリッチメント パイプラインからのコンテンツを受け入れるナレッジ ストア内の物理テーブル、オブジェクト、ファイルが定義されます。 ナレッジ ストアを作成する場合は、作業の多くがプロジェクションの定義と整形になります。

この記事では、コーディングを開始する前にある程度の背景を理解できるように、プロジェクションの概念とワークフローについて説明します。

プロジェクションは Azure AI Search スキルセットで定義されますが、最終的な結果は Azure Storage のテーブル、オブジェクト、イメージ ファイルのプロジェクションです。

Azure Storage 内で表されるプロジェクション

プロジェクションの種類と使用方法

ナレッジ ストアは、Azure Storage 内のテーブル、JSON オブジェクト、またはバイナリ画像ファイルの疎集合として物理的に表される論理構造です。

射影 記憶域 使用方法
テーブル Azure Table Storage 行と列で表すのが最も適しているデータ、またはデータの詳細な表現 (データ フレームなど) が必要な場合に使用されます。 テーブル プロジェクションを使用すると、Shaper スキルまたはインライン シェイプを使用して列と行を指定することにより、スキーマ化されたシェイプを定義できます。 使い慣れた正規化の原則に基づいて、コンテンツを複数のテーブルに整理できます。 同じグループ内のテーブルは自動的に関連付けられます。
オブジェクト Azure Blob Storage 1 つの JSON ドキュメントでデータとエンリッチメントの完全な JSON 表現が必要な場合に使用されます。 テーブル プロジェクションと同様に、有効な JSON オブジェクトのみオブジェクトとして射影できます。また、整形によりその作業を容易に行うことができます。
ファイル Azure Blob Storage 正規化されたバイナリ イメージ ファイルを保存する必要がある場合に使用されます。

プロジェクション定義

プロジェクションは、スキルセットの "knowledgeStore" プロパティで指定されます。 プロジェクション定義は、インデクサーの呼び出し中に、強化されたコンテンツを含むオブジェクトを作成し、Azure Storage に読み込むために使用されます。 これらの概念に慣れていない場合は、AI エンリッチメントから始めて、概要を確認してください。

次の例は、knowledgeStore でのプロジェクションの配置と、基本的な構造を示しています。 プロジェクション定義は、名前、種類、コンテンツ ソースで構成されます。

"knowledgeStore" : {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
    "projections": [
      {
        "tables": [
          { "tableName": "ks-museums-main", "generatedKeyName": "ID", "source": "/document/tableprojection" },
          { "tableName": "ks-museumEntities", "generatedKeyName": "ID","source": "/document/tableprojection/Entities/*" }
        ],
        "objects": [
          { "storageContainer": "ks-museums", "generatedKeyName": "ID", "source": "/document/objectprojection" }
        ],
        "files": [ ]
      }
    ]

プロジェクション グループ

プロジェクションは複雑なコレクションの配列です。つまり、各種類の複数のセットを指定できます。 1 つのプロジェクション グループのみを使用するのが一般的ですが、ストレージ要件にさまざまなツールやシナリオのサポートが含まれる場合は、複数のグループを使用できます。 たとえば、スキルセットの設計とデバッグに 1 つのグループを使用し、2 つ目のセットでオンライン アプリに使用される出力を収集し、3 つ目をデータ サイエンスのワークロードに使用します。

プロジェクションの下にあるすべてのグループにデータを読み込むには、同じスキルセット出力を使用します。 次の例は、2 つを示しています。

"knowledgeStore" : {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
    "projections": [
        {
            "tables": [],
            "objects": [],
            "files": []
        }, 
        {
            "tables": [],
            "objects": [],
            "files": []
        }
    ]
}

プロジェクション グループには、次のように相互排他性と関連性の重要な特性があります。

原則 説明
相互排他性 各グループは他のグループから完全に分離されており、さまざまなデータ整形シナリオをサポートします。 たとえば、異なるテーブル構造と組み合わせをテストしている場合は、AB テスト用に各セットを異なるプロジェクション グループ内に配置します。 各グループは、同じソース (強化ツリー) からデータを取得しますが、すべてのピア プロジェクション グループのテーブル-オブジェクト-ファイルの組み合わせからは完全に分離されています。
関連性 プロジェクション グループ内では、テーブル、オブジェクト、ファイルのコンテンツが関連付けられます。 ナレッジ ストアでは、生成されたキーが共通の親ノードへの参照ポイントとして使用されます。 たとえば、画像とテキストが含まれるドキュメントがあるシナリオを考えてみましょう。 テキストをテーブルに、画像をバイナリ ファイルに投影できます。テーブルとオブジェクトの両方に、ファイルの URL を含む列またはプロパティがあります。

プロジェクションの "ソース"

ソース パラメーターは、プロジェクション定義の 3 番目のコンポーネントです。 プロジェクションは AI エンリッチメント パイプラインからのデータを格納するため、プロジェクションのソースは常にスキルの出力です。 そのため、出力は、単一のフィールド (たとえば、翻訳されたテキストのフィールド) の場合もありますが、多くの場合、データ シェイプへの参照です。

データ シェイプはスキルセットから取得されます。 Azure AI 検索内で提供されるすべての組み込みスキルの中には、データシェイプの作成に使用される Shaper スキルと呼ばれるユーティリティ スキルがあります。 ナレッジ ストアのプロジェクションをサポートするために、Shaper スキル (必要に応じた数) を含めることができます。

シェイプはテーブル プロジェクションで頻繁に使用されます。シェイプを使用することにより、テーブルに入れる行だけでなく、作成される列も指定できます (オブジェクト プロジェクションにシェイプを渡すこともできます)。

シェイプは複雑になる可能性があります。ここでは範囲外のため詳細に説明しませんが、基本的なシェイプを簡単に示した例を次に示します。 Shaper スキルの出力は、テーブル プロジェクションのソースとして指定されます。 テーブル プロジェクション内で、それ自体は、シェイプで指定される、"metadata-storage_path"、"reviews_text"、"reviews_title" などの列です。

{
    "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
    "name": "ShaperForTables",
    "description": null,
    "context": "/document",
    "inputs": [
        {
            "name": "metadata_storage_path",
            "source": "/document/metadata_storage_path",
            "sourceContext": null,
            "inputs": []
        },
        {
          "name": "reviews_text",
          "source": "/document/reviews_text"
        }, 
        {
          "name": "reviews_title",
          "source": "/document/reviews_title"
        },
        {
          "name": "reviews_username",
          "source": "/document/reviews_username"
        },
    ],
    "outputs": [
      {
        "name": "output",
        "targetName": "mytableprojection"
      }
    ]
}

プロジェクションのライフサイクル

プロジェクションには、データ ソース内のソース データに関連付けられているライフサイクルがあります。 ソース データが更新され、インデックスが再作成されると、エンリッチメントの結果と共にプロジェクションが更新され、最終的にプロジェクションがデータ ソースのデータと一致するようになります。 ただし、同時にプロジェクションは Azure Storage に個別に格納されています。 インデクサーまたは検索サービス自体が削除されても、それらは削除されません。

アプリ内での使用

インデクサーを実行した後、プロジェクションに接続し、そのデータを他のアプリやワークロードで使用します。

  • Azure portal を使用して、Azure Storage 内のオブジェクトの作成とコンテンツを確認します。

  • データ探索用の Power BI を使用します。 このツールは、データが Azure Table Storage 内にある場合に最適です。 Power BI 内では、データを操作して、クエリと分析が容易な新しいテーブルに格納できます。

  • データ サイエンス パイプラインの BLOB コンテナーで強化されたデータを使用します。 たとえば、データを BLOB から Pandas DataFrame に読み込むことができます。

  • 最後に、ナレッジ ストアからデータをエクスポートする必要がある場合、Azure Data Factory には、データをエクスポートして任意のデータベースに格納するコネクタがあります。

使用を開始するためのチェックリスト

プロジェクションはナレッジ ストア専用であり、検索インデックスの構築には使用されないことを思い出してください。

  1. Azure Storage で、アクセス キーから接続文字列を取得し、アカウントが StorageV2 (汎用 V2) であることを確認します。

  2. Azure Storage 内では、コンテナーとテーブル内の既存コンテンツを十分に理解し、プロジェクションと競合しない名前を選択するようにします。 ナレッジ ストアは、テーブルおよびコンテナーの疎集合です。 関連するオブジェクトを追跡するために、名前付け規則を採用することを検討してください。

  3. Azure AI Search では、インデクサーでエンリッチメント キャッシュ (プレビュー)を 有効にしてから、インデクサーを実行してスキルセットを実行し、キャッシュを設定します。 これはプレビュー機能であるため、インデクサー要求上では必ずプレビュー REST API を使用してください。 キャッシュが読み込まれると、(スキル自体が変更されない限り) ナレッジ ストア内のプロジェクション定義を無料で変更できます。

  4. コードでは、すべてのプロジェクションはスキルセットでのみ定義されます。 プロジェクションに適用されるインデクサー プロパティ (フィールド マッピング、出力フィールド マッピング) はありません。 スキルセット定義内では、knowledgeStore プロパティとスキル配列の 2 つの領域に重点を置きます。

    1. knowledgeStore 下の projections セクションで、テーブル、オブジェクト、ファイルの各プロジェクションを指定します。 オブジェクトの種類、オブジェクト名、数量 (定義するプロジェクションの数ごと) は、このセクションで決定されます。

    2. スキル配列から、各プロジェクションの source 内で参照する必要があるスキル出力を決定します。 すべてのプロジェクションにはソースがあります。 ソースは、アップストリーム スキルの出力になる場合もありますが、多くの場合は、Shaper スキルの出力です。 プロジェクションの構成は、シェイプによって決定されます。

  5. 既存のスキルセットにプロジェクションを追加する場合、スキルセットを更新し、インデクサーを実行します。

  6. Azure Storage で結果を確認します。 以降の実行では、Azure Storage 内のオブジェクトを削除するか、スキルセットでプロジェクト名を変更して、名前の競合を回避します。

  7. テーブル プロジェクションを使用している場合は、「テーブル サービス データ モデルについて」および「Table Storage のスケーラビリティおよびパフォーマンスのターゲット」を確認して、データ要件が Table Storage のドキュメントに記載されている制限内であることを確認してください。

次のステップ

各プロジェクトの種類の構文と例を確認します。