Azure AI 検索 エンリッチメント パイプラインにカスタム スキルを追加する

Note

Azure AI 検索は、Azure ポータルREST APIおよびAzure SDKから使用できます。 また、Foundry IQ は、エンタープライズ コンテンツを、Microsoft Foundry ポータルのエージェントの再利用可能なアクセス許可に対応したナレッジ ベースに変換するマネージド ナレッジ レイヤーです。

AI エンリッチメント パイプラインには、作成して発行する組み込みのスキルカスタム スキルの両方を含めることができます。 カスタム コードは検索サービスの外部で実行されますが (たとえば、Azure関数として)、入力を受け入れ、他のスキルと同様にスキルセットに出力を送信します。 データは、モデルがデプロイされる geography で処理されます。

カスタム スキルは複雑に聞こえるかもしれませんが、簡単に実装できます。 パターン マッチングまたは分類モデルを提供する既存のパッケージがある場合は、処理のために BLOB から抽出されたコンテンツをそれらのモデルに渡すことができます。 AI エンリッチメントはAzureベースであるため、Azureでモデルをホストする必要もあります。 一般的なホスティング オプションには、Azure Functions または containers があります。

カスタム スキルを構築する予定の場合は、この記事で、スキルをパイプラインに統合するために使用するインターフェイスについて説明しています。 主な要件は、 スキルセット 全体で使用できる方法で入力を受け入れて出力を出力する機能です。 そのためこの記事で重点を置いているのは、エンリッチメント パイプラインに必要な入力と出力の形式です。

カスタム スキルの利点

カスタム スキルを構築すると、コンテンツに固有の変換を挿入することができます。 たとえば、事業や財務の契約やドキュメントを区別するためのカスタム分類モデルを作成したり、関連コンテンツのオーディオ ファイルを細かく調べるために音声認識スキルを追加したりすることができます。 詳細な例については、「例: AI エンリッチメント用のカスタム スキルを作成する」を参照してください。

エンドポイントとタイムアウト間隔を設定する

カスタム Web API スキルを使用して、カスタム スキルのインターフェイスを指定します。

"@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
"description": "This skill has a 230-second timeout",
"uri": "https://[your custom skill uri goes here]",
"authResourceId": "[for managed identity connections, your app's client ID goes here]",
"timeout": "PT230S",

URI は、関数またはアプリの HTTPS エンドポイントです。 URI を設定するときは、URI がセキュリティで保護されるようにします (HTTPS)。 コードを Azure Function App でホストする場合は、要求を承認するために、ヘッダーに API キーを含めるか、URI に URI パラメーターとして含めます

関数またはアプリで認証と承認にAzureマネージド ID とAzure ロールを使用している場合、カスタム スキルは要求に認証トークンを含めることができます。 この方法に対する要件を次に説明します。

uriが、authResourceIdによって識別されるアプリケーションのエンドポイントを指していることを確認します。 値が一致しない場合、認証エラーや要求が意図しないエンドポイントに送信される可能性があります。 セキュリティ ガイダンス、推奨されるプラクティス、構成を確認する手順については、「 マネージド ID 認証のセキュリティに関する考慮事項」を参照してください。

エンドポイントへの接続は、既定では 30 秒の時間内に応答が返されないとタイムアウトになります (PT30S)。 インデックス作成パイプラインは同期的であり、その期間に応答が受信されない場合、インデックス作成によってタイムアウト エラーが発生します。 この間隔は、timeout パラメーター (PT230S) を設定することで、最大値の 230 秒まで長くできます。

IP アクセス制限によって保護されたエンドポイントが応答しない場合は、タイムアウト エラーをより速く表示するために、 timeoutPT10Sなどの短い値に一時的に設定します。 Azure関数アプリの場合は、[>Networking>Access の制限] で受信 IP 規則を管理します。 許可する IP アドレスについては、「 インデクサー接続を許可するように IP ファイアウォール規則を構成する」を参照してください。

Web API 入力の書式設定

Web API は、処理するレコードの配列を受け入れる必要があります。 各レコード内で、Web API への入力としてプロパティ バッグを指定します。

コントラクト テキストに記載されている最初の日付を識別する基本的なエンリッチャーを作成するとします。 この例では、カスタム スキルは単一の入力 ( contractText) を受け入れます。 スキルには、契約日という 1 つの出力もあります。 エンリッチャーをより興味深いものにするには、マルチパート複合型の形で contractDate を返します。

Web API は、入力レコードのバッチを受け取る準備ができている必要があります。 values配列の各メンバーは、特定のレコードの入力を表します。 各レコードには、次の要素が必要です。

  • 特定のレコードの一意の識別子であるrecordIdメンバー。 エンリッチャーが結果を返すときは、呼び出し元がレコードの結果を入力と照合できるように、この recordId を提供する必要があります。

  • data メンバーは、各レコードに対応する一連の入力フィールドです。

結果の Web API 要求は次のようになります。

{
    "values": [
      {
        "recordId": "a1",
        "data":
           {
             "contractText": 
                "This is a contract that was issued on November 3, 2023 and that involves... "
           }
      },
      {
        "recordId": "b5",
        "data":
           {
             "contractText": 
                "In the City of Seattle, WA on February 5, 2018 there was a decision made..."
           }
      },
      {
        "recordId": "c3",
        "data":
           {
             "contractText": null
           }
      }
    ]
}

実際には、ここに示した 3 つだけでなく、数百、数千のレコードを指定してサービスが呼び出される可能性があります。

Web API 出力の書式設定

出力形式は、 recordId とプロパティ バッグを含むレコードのセットです。 この特定の例には出力が 1 つだけありますが、複数のプロパティを返すことができます。 ベスト プラクティスとして、レコードを処理できない場合にエラー メッセージと警告メッセージを返すことを検討してください。

{
  "values": 
  [
      {
        "recordId": "b5",
        "data" : 
        {
            "contractDate":  { "day" : 5, "month": 2, "year" : 2018 }
        }
      },
      {
        "recordId": "a1",
        "data" : {
            "contractDate": { "day" : 3, "month": 11, "year" : 2023 }                    
        }
      },
      {
        "recordId": "c3",
        "data" : 
        {
        },
        "errors": [ { "message": "contractText field required "}   ],  
        "warnings": [ {"message": "Date not found" }  ]
      }
    ]
}

スキルセットにカスタム スキルを追加する

Web API エンリッチャーを作成するときに、要求の一部として HTTP ヘッダーとパラメーターを定義できます。 次のスニペットは、要求パラメータとオプションの HTTP ヘッダーをスキルセット定義に含めることができる方法を示しています。 HTTP ヘッダーを設定することは、構成設定をコードに渡す必要がある場合に便利です。

{
    "skills": [
      {
        "@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
        "name": "myCustomSkill",
        "description": "This skill calls an Azure function, which in turn calls TA sentiment",
        "uri": "https://indexer-e2e-webskill.azurewebsites.net/api/DateExtractor?language=en",
        "context": "/document",
        "httpHeaders": {
            "DateExtractor-Api-Key": "foo"
        },
        "inputs": [
          {
            "name": "contractText",
            "source": "/document/content"
          }
        ],
        "outputs": [
          {
            "name": "contractDate",
            "targetName": "date"
          }
        ]
      }
  ]
}

Note

GET でスキルセットを取得すると、資格情報の漏えいを防ぐため、サービスはすべての <redacted> 値に対して httpHeaders を返します。 格納されているヘッダー値を変更せずにスキルを更新するには、各値を <unchanged> に設定します。 詳細と例については、「 カスタム Web API スキル — スキル パラメーター」を参照してください。

このビデオを観る

ビデオでの概要とデモについては、次のデモを視聴してください。

次のステップ

この記事では、カスタム スキルをスキルセットに統合するために必要なインターフェイス要件について説明しました。 カスタム スキルとスキルセットの構成の詳細については、次のリソースを参照してください。