Azure Cognitive Search のインクリメンタル エンリッチメントの紹介

2020年4月7日 に投稿済み

Principal Program Manager, Azure Search & Applied AI

インクリメンタル エンリッチメントは、データのインデックス作成に宣言型のアプローチをもたらす Azure Cognitive Search の新機能です。インクリメンタル エンリッチメントを有効にすると、スキルが進化し続けていても、最小限のコストでドキュメントのエンリッチメントを実行できます。Azure Cognitive Search のインデクサーは、データ ソースから検索インデックスにドキュメントを追加します。インデクサーは、データ ソースのドキュメントの更新を追跡し、データ ソースの新規ドキュメントや更新ドキュメントでインデックスを更新します。

新機能であるインクリメンタル エンリッチメントは、変更の追跡をデータ ソースのドキュメントの変更から、エンリッチメント パイプラインのあらゆる要素に拡張します。インクリメンタル エンリッチメントを利用すると、インデクサーにより、データ ソース、最新バージョンのスキルセット、およびインデクサーとのドキュメントの結果整合性が実現されます。

インデクサーには以下の重要な特徴があります。

  • データ ソース固有である。
  • 状態を認識する。
  • 構成することで、データ ソースとインデックス間の結果整合性を促進できる。

従来、スキルの追加、削除、または更新によるスキルセットの編集により、お客様には次善の選択肢しか残されておらず、コーパス全体ですべてのスキルを再実行し、実質的にインデクサーをリセットするか、インデックスのドキュメントのエンリッチメントが複数バージョンのスキルセットで行われるバージョンのずれを容認するかを選択する必要がありました。

API のプレビュー リリースの最新の更新により、インデクサーの状態管理の対象が、データ ソースとインデクサー フィールド マッピングのみから、スキルセット、出力フィールド マッピング ナレッジ ストア、およびプロジェクションも含まれるように拡大しています。

インクリメンタル エンリッチメントは、エンリッチメント パイプラインの効率性を大幅に向上させます。また、スキルが追加/更新された際、多大なコストが発生する可能性があるドキュメントのコーパス全体の再エンリッチメント(を受け入れるか、バージョンのずれ (ドキュメントが複数バージョンのスキルセットで作成/更新され、エンリッチメントの状態および/または品質が大きく異なる) に対処するかを選択しなくても済むようになります。

インデクサーが、呼び出された際に、どのスキルが変更されたか判断して、更新されたスキルとダウンストリームのスキルまたは依存しているスキルのみを選んで実行し、エンリッチメント パイプライン全体の変更を追跡して対応するようになりました。インクリメンタル エンリッチメントを構成することで、実行する作業を必要最小限に抑えながら、インデックス内のすべてのドキュメントを常に最新バージョンのエンリッチメント パイプラインで処理できるようになります。また、インクリメンタル エンリッチメントでは、変更の処理方法の決定を完全に制御する必要があるシナリオにも対応できるきめ細かい制御機能も提供されます。

Azure Cognitive Search のドキュメント エンリッチメント パイプライン

インデクサー キャッシュ

エンリッチメント パイプラインにインデクサー キャッシュを追加することで、インクリメンタル インデックスを実現できます。インデクサーは、すべてのドキュメントの各スキルの結果をキャッシュします。スキルセットの更新 (新規スキル/更新スキル) により、データ ソースのインデックスを再作成する必要がある場合、過去にエンリッチメントが行われた各ドキュメントがキャッシュから読み取られ、影響を受けるスキル (変更されたスキルとそのダウンストリームのスキル) のみ再実行されます。更新された結果がキャッシュに書き込まれ、インデックスおよび必要に応じてナレッジ ストア内のドキュメントが更新されます。キャッシュは物理的にストレージ アカウントです。検索サービス内のすべてのインデックスが同じインデクサー キャッシュ用のストレージ アカウントを共有できます。各インデクサーには、不変の一意的なキャッシュ ID が割り当てられます。

インデックス作成のきめ細かい制御

インクリメンタル エンリッチメントは、最も優先度の高いタスクを最初にインデクサーに実行させる機能から、変更検出をオーバーライドする機能に至るまで、数多くのきめ細かい制御機能を提供します。

  • 変更検出のオーバーライド: インクリメンタル エンリッチメントは、エンリッチメント パイプラインのあらゆる要素のきめ細かい制御機能を提供します。これにより、変更によって予期しない結果が生じる可能性がある状況にも対処できます。たとえば、スキルセットを編集し、カスタム スキルの URL を更新すると、インデクサーがそのスキルのキャッシュ結果を無効にします。単にエンドポイントを異なる仮想マシン (VM) に移動する場合、または新しいアクセス キーでスキルを再展開する場合、既存ドキュメントを再処理する必要は全くありません。

必要に応じて、スキルセットの更新でクエリ文字列パラメータ disableCacheReprocessingChangeDetection true に設定することで、明らかに必要なエンリッチメントだけをインデクサーに実行させることができます。このパラメータを設定すると、スキルセットの更新だけがコミットされ、既存コーパスへの影響に関する変更の評価が行われなくなります。

  • キャッシュの無効化: このシナリオとは反対に、新しいバージョンのカスタム スキルを展開し、エンリッチメント パイプライン内の変更を一切行わないが、更新されたモデルのメリットを反映するために、特定のスキルを無効にし、影響を受けるすべてのドキュメントを再処理しなければならない場合があります。このような場合、スキルセットでスキルの無効化操作を呼び出すことができます。スキルのリセット API は、無効にする必要があるキャッシュ内のスキル出力のリストが含まれた POST 要求を受け取ります。スキルのリセット API の詳細については、こちらのドキュメントを参照してください。

既存 API の更新

インクリメンタル エンリッチメントの導入により、一部の既存 API が更新されます。

インデクサー

インデクサーで以下の新しいプロパティが公開されるようになります。

キャッシュ

  • StorageAccountConnectionString: 中間結果をキャッシュするのに使用されるストレージ アカウントに対する接続文字列です。
  • CacheId: cacheId は、このインデクサー用のキャッシュとして使用される annotationCache ストレージ アカウント内のコンテナーの ID です。このキャッシュはこのインデクサーに固有のものであり、インデクサーが削除され、同じ名前でインデクサーが再作成された場合、cacheId が再生成されます。cacheId は常にサービスにより生成され、お客様が cacheId を設定することはできません。
  • EnableReprocessing: 既定で true に設定されています。false に設定すると、ドキュメントは引き続きキャッシュに書き込まれますが、既存ドキュメントがキャッシュ データに基づいて再処理されなくなります。

インデクサーで次の新しいクエリ文字列パラメータもサポートされるようになります。

ignoreResetRequirement true に設定すると、リセット条件をトリガーせずに、コミットを実行できます。

スキルセット

スキルセットで新しい操作はサポートされませんが、次の新しいクエリ文字列パラメータがサポートされるようになります。

disableCacheReprocessingChangeDetection 現在のアクションに基づいて既存ドキュメントを更新したくない場合は true に設定します。

データ ソース

データ ソースで新しい操作はサポートされませんが、次の新しいクエリ文字列パラメータがサポートされるようになります。

ignoreResetRequirement true に設定すると、リセット条件をトリガーせずに、コミットを実行できます。

ベスト プラクティス

新しいインデクサーでキャッシュ プロパティを構成するか、既存インデクサーをリセットしてキャッシュ プロパティを設定することが、インクリメンタル エンリッチメントの使用における推奨アプローチとなります。ignoreResetRequirement は、データ内で検出が困難な予期しない不整合性を生じさせるおそれがあるため、慎重に使用してください。

重要ポイント

インクリメンタル エンリッチメントは、宣言的な方法でデータ ソースのデータと検索インデックスやナレッジ ストアのデータの一貫性を常に確保できる強力な機能です。スキル、スキルセット、またはエンリッチメントが進化する中でも、エンリッチメント パイプラインにより、実施する作業を最小限に抑え、ドキュメントの結果整合性を実現できます。

次のステップ

既存インデクサーにキャッシュを追加するか、新しいインデクサーの定義時にキャッシュを追加して、インクリメンタル エンリッチメントの利用を開始しましょう。