將自定義技能新增至 Azure AI 搜尋擴充管線

AI 擴充管線可以同時包含您個人建立和發佈的內建技能和自定義技能。 您的自定義程式代碼會在搜尋服務外部執行(例如,作為 Azure 函式),但接受輸入,並將輸出傳送至技能集,就像任何其他技能一樣。

自定義技能聽起來可能很複雜,但在實作方面可能很簡單且簡單明瞭。 如果您有提供模式比對或分類模型的現有套件,您可以從 Blob 擷取的內容會傳遞至這些模型進行處理。 由於 AI 擴充是以 Azure 為基礎,因此您的模型也應該位於 Azure 上。 一些常見的裝載方法包括使用 Azure Functions容器

如果您要建置自定義技能,本文將說明您用來將技能整合到管線中的介面。 主要需求是能夠接受輸入,並以整體技能集中消耗的方式發出輸出。 因此,本文的重點在於擴充管線所需的輸入和輸出格式。

自定義技能的優點

建置自訂技能可讓您插入內容獨有的轉換。 自訂技能會獨立執行,可套用在任何所需的擴充步驟。 例如,您可以建立自訂的分類模型以區分商務和財務合約及文件,或新增語音辨識技能以深入音訊檔案來了解相關內容。 如需逐步範例,請參閱 範例:建立 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 函式應用程式中,URI 應該在 標頭中包含 API 金鑰,或作為 URI 參數 來授權要求。

如果您的函式或應用程式改用 Azure 受控識別和 Azure 角色進行驗證和授權,自定義技能可以在要求中包含驗證令牌。 下列幾點說明此方法的需求:

  • 代表索引器傳送要求的搜尋服務必須 設定為使用受控識別 (系統或使用者指派),讓呼叫者可由 Microsoft Entra ID 進行驗證。

  • 您的函式或應用程式必須 針對 Microsoft Entra ID 進行設定。

  • 您的 自定義技能定義 必須包含 「authResourceId」 屬性。 此屬性採用應用程式 (用戶端) 識別碼, 格式為: api://<appId>

根據預設,如果回應未在 30 秒的視窗中傳回,則端點的連線逾時。 索引管線是同步的,如果回應未在該時間範圍內收到,索引就會產生逾時錯誤。 您可以藉由設定逾時參數,將間隔增加到最大值 230 秒:

格式化 Web API 輸入

Web API 必須接受要處理的記錄陣列。 每個記錄都必須包含屬性包,這是提供給 Web API 的輸入。

假設您想要建立基本擴充器,以識別合約文字中所提及的第一個日期。 在此範例中,自定義技能接受單一輸入 「contractText」 做為合約文字。 技能也有單一輸出,也就是合約的日期。 若要讓擴充器更有趣,請在多部分複雜類型的形狀中傳回這個 “contractDate”。

您的 Web API 應該已準備好接收一批輸入記錄。 “values” 陣列的每個成員都代表特定記錄的輸入。 每個記錄都需要有下列元素:

  • “recordId” 成員,這是特定記錄的唯一標識符。 當擴充器傳回結果時,它必須提供這個 「recordId」,才能讓呼叫端將記錄結果與輸入相符。

  • 「數據」成員,基本上是每個記錄的輸入欄位包。

產生的 Web API 要求可能如下所示:

{
    "values": [
      {
        "recordId": "a1",
        "data":
           {
             "contractText": 
                "This is a contract that was issues on November 3, 2017 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
           }
      }
    ]
}

實際上,您的程式代碼可能會以數百或數千筆記錄呼叫,而不只是此處顯示的三筆記錄。

格式化 Web API 輸出

輸出的格式是一組包含 「recordId」 和屬性包的記錄。 這個特定範例只有一個輸出,但您可以輸出多個屬性。 最佳做法是,如果無法處理記錄,請考慮傳回錯誤和警告訊息。

{
  "values": 
  [
      {
        "recordId": "b5",
        "data" : 
        {
            "contractDate":  { "day" : 5, "month": 2, "year" : 2018 }
        }
      },
      {
        "recordId": "a1",
        "data" : {
            "contractDate": { "day" : 3, "month": 11, "year" : 2017 }                    
        }
      },
      {
        "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"
          }
        ]
      }
  ]
}

觀看這段視訊

如需影片簡介和示範,請觀看下列示範。

下一步

本文涵蓋將自定義技能整合到技能集所需的介面需求。 請繼續進行這些連結,以深入瞭解自定義技能和技能集組合。