Azure AI 搜尋服務中的技能集概念

Note

Azure AI 搜尋服務 可透過 Azure 入口網站REST APIAzure SDK 取得。 它同時也是 Foundry IQ 的基礎,這是一個管理式知識層,能將企業內容轉化為可重複使用、權限感知的知識庫,供 Microsoft Foundry 入口網站中的代理使用。

本文適合需要更深入理解技能組合的開發者,並假設他們熟悉 AI 豐富 化的高階概念,或 AI 如何在 Azure AI 搜尋服務 中應用於索引時轉換原始內容。

技能集是 Azure AI 搜尋服務中附加至索引子的可重複使用物件。 它包含一項或多項技能,需要內建 AI 或外部自訂處理,處理從外部資料來源取得的原始內容。

下圖說明技能集執行的基本資料流程。

此圖表顯示技能集資料流程,著重於輸入、輸出和對應。

從技能集處理到得出結論,技能都會從中讀取和寫入存在於記憶體中的「*擴充的文件樹狀目錄」。 擴充的文件一開始只是從資料來源 (表示為 "/document" 根節點) 擷取的原始內容。 在每個技能執行時,每個技能都會將輸出寫入為圖形中的節點,進而為擴充的文件增加結構與內容。

技能集執行完成後,擴充的文件輸出會透過使用者定義的輸出欄位對應路由到索引。 從來源到索引,您想要完整傳輸的任何原始內容都是透過欄位對應來定義。 相較之下,輸出欄位對應會將記憶體中的內容 (節點) 傳輸到索引。

若要設定套用的 AI,您需要在技能集和索引子中指定設定。

技能組定義

技能集是一或多個「技能」的陣列,技能可執行擴充,例如翻譯文字或在影像檔上進行光學字元辨識 (OCR)。 技能包括 Microsoft 的內建技能,或是您外部裝載處理邏輯的自訂技能。 技能集會產生擴充的文件,在編制索引或投影到知識存放區時會用到這些文件。

技能包含內容、輸入和輸出:

此圖表顯示技能集的哪些屬性會建立資料路徑。

  • 內容是指作業的範圍,每次可能包含一份文件,或集合中一個項目。

  • 輸入源自擴充文件中的節點,其中「source」和「name」會識別指定的節點。

  • 輸出會傳回擴充文件並成為新的節點。 值為節點「name」和節點內容。 如果節點名稱重複,您可以設定目標名稱進行區分。

技能背景

每個技能都有一個內容,可以是整個文件 (/document) 或樹狀結構 (/document/countries/*) 中的節點。

內容會決定:

  • 技能執行次數,透過單一值 (每個欄位、每個文件一次),或是對於集合 (其中新增 /* 會導致對集合中的每個執行個體叫用技能)。

  • 輸出宣告,或是在擴充樹狀結構中新增技能輸出的位置。 系統一律將輸出作為內容節點的子系來新增至樹狀結構中。

  • 輸入的圖形。 對於多層集合,將內容設定為父集合會影響技能輸入的圖形。 例如,如果您有一個列出國家/地區的擴充樹狀結構,每個國家/地區使用包含郵遞區號清單的州/省清單擴充,則內容的設定方式會決定輸入的解譯方式。

    Context Input 輸入的圖形 技能召喚
    /document/countries/* /document/countries/*/states/*/zipcodes/* 國家/地區中所有郵遞區號的清單 每個國家/地區一次
    /document/countries/*/states/* /document/countries/*/states/*/zipcodes/* 該州/省中的郵遞區號清單 每個國家/地區和州/省的組合一次

技能依賴性

如果您將某個技能的輸出饋送至另一個技能,技能可以獨立且平行執行,或在相依關聯性中循序執行。 下列範例示範依序執行的兩個內建技能

  • 技能 #1 是文字分割技能,接受 "reviews_text" 來源欄位的內容作為輸入,並將該內容分割成 5,000 個字元的 "pages" 作為輸出。 將大量文字分割成較小的區塊,可讓情感偵測等技能產生更好的結果。

  • 技能 #2 是 情感偵測技能 ,取決於分割技能輸出。 它會接受「頁面」做為輸入,併產生稱為「情感」的新欄位做為輸出,其中包含情感分析的結果。

請注意第一個技能的輸出 (「pages」) 用於情感分析的方式,其中「/document/reviews_text/pages/*」同時是內容和輸入。 如需路徑公式的詳細資訊,請參閱如何參考擴充

{
    "skills": [
        {
            "@odata.type": "#Microsoft.Skills.Text.SplitSkill",
            "name": "#1",
            "description": null,
            "context": "/document/reviews_text",
            "defaultLanguageCode": "en",
            "textSplitMode": "pages",
            "maximumPageLength": 5000,
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/reviews_text"
                }
            ],
            "outputs": [
                {
                    "name": "textItems",
                    "targetName": "pages"
                }
            ]
        },
        {
            "@odata.type": "#Microsoft.Skills.Text.SentimentSkill",
            "name": "#2",
            "description": null,
            "context": "/document/reviews_text/pages/*",
            "defaultLanguageCode": "en",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/reviews_text/pages/*",
                }
            ],
            "outputs": [
                {
                    "name": "sentiment",
                    "targetName": "sentiment"
                },
                {
                    "name": "confidenceScores",
                    "targetName": "confidenceScores"
                },
                {
                    "name": "sentences",
                    "targetName": "sentences"
                }
            ]
        }
      . . .
  ]
}

擴充樹

擴充的文件是在技能集執行期間建立的暫時樹狀結構,可收集透過技能導入的所有變更。 整體上,擴充會表示為可定址節點的階層。 節點也會包含來自外部資料源的原始未擴充欄位。 檢查擴充樹狀結構與內容的最佳方法是透過 Azure 入口網站中的偵錯 會話

擴充的文件只會在技能集執行期間存在,但可以快取或傳送至知識存放區

擴充的文件最初只有文件萃取期間從資料來源擷取的內容,這些擷取自來源的文字和影像可供語言或影像分析使用。

初始內容是中繼資料以及「根節點」(document/content)。 根節點通常是在文件萃取期間從資料來源擷取的完整文件或標準化影像。 這些內容在擴充樹狀結構中的呈現方式會因資料來源類型而有所不同。 下表針對幾種支援的資料來源,說明進入擴充管線的文件狀態:

資料來源\剖析模式 Default JSON、JSON 行與 CSV
Blob 儲存體 /document/content
/document/normalized_images/*
/document/{key1}
/document/{key2}
Azure SQL /document/{column1}
/document/{column2}
N/A
Azure Cosmos DB /document/{key1}
/document/{key2}
N/A

執行技能時,輸出會新增至擴充樹狀結構作為新節點。 如果技能是在整份文件上執行,則會在根目錄下的第一個層級新增節點。

節點可作為下游技能的輸入。 例如,技能建立的內容 (例如翻譯字串),可能會成為辨識實體或擷取關鍵片語技能的輸入。

技能在擴充樹狀結構讀取和寫入

雖然您可以透過偵錯工作階段視覺化編輯器來視覺化和使用擴充樹狀結構,但其主要是內部結構。

擴充不是可變動的:節點一旦建立就無法編輯。 隨著您的技能變得更複雜,您的擴充樹狀結構也會更加複雜,但並非擴充樹狀結構中的所有節點都需要將它設為索引或知識存放區。

您可以選擇保存擴充輸出的特定子集,以便留下想要使用的內容。 索引子定義中的輸出欄位對應會決定搜尋索引中實際擷取的內容。 同樣地,如果要建立知識存放區,您可以將輸出對應到指派給投影的圖形

Note

擴充樹狀結構格式可讓擴充管線將中繼資料附加至均等基本資料類型。 中繼資料不是有效的 JSON 物件,但可以投影至知識存放區投影定義中的有效 JSON 格式。 如需詳細資訊,請參閱塑形器技能

索引器定義

索引子具有屬性和參數,用於設定索引子的執行。 這些屬性包括在搜尋索引中設定欄位資料路徑的對應。

此圖表顯示索引子的哪些屬性會建立索引中欄位的資料路徑。

共有兩組對應:

「sourceFieldName」屬性會指定資料來源中的欄位,或擴充樹狀結構中的節點。 「targetFieldName」屬性會指定索引中接收內容的搜尋欄位。

富集範例

此範例使用旅館評論技能集作為參考點,說明擴充樹狀結構如何透過使用概念圖表的技能執行發展。

此範例也會展示:

  • 技能內容和輸入如何判斷技能執行的次數
  • 根據內容所產生的輸入圖形

在此範例中,CSV 檔案的來源欄位包含客戶針對旅館的評論 (「reviews_text」) 和評等 (「reviews_rating」)。 索引子會從 Blob 儲存體新增中繼資料欄位,而技能會新增翻譯的文字、情感分數和關鍵片語偵測。

在旅館評論範例中,擴充流程中的「document」代表一則旅館評論。

Tip

你可以使用 REST API 建立這些資料的搜尋索引和知識庫。 您也可以使用偵錯工作階段來深入解析技能集組合、相依性以及對擴充樹狀結構的影響。 本文中的影像提取自偵錯工作階段。

在概念上,初始擴充樹狀結構會如下所示:

在文件萃取之後的擴充樹狀結構

所有擴充的根節點都是 "/document"。 當您使用 Blob 索引子時,"/document" 節點會有 "/document/content""/document/normalized_images" 的子節點。 當資料為 CSV 時 (如此範例所示),資料行名稱會對應至 "/document" 下的節點。

技能 #1:分割技能

當來源內容由大塊文字組成時,將其分解為較小的部分以進行整合向量化或提高語言、情感和關鍵片語偵測的準確度會很有幫助。 可用的精細度有兩種:頁面和句子。 一頁包含大約 5,000 個字元。

除了使用 Split 技能進行分塊之外,另一種方式是透過 Azure 內容理解技能,但該技能不在本文的討論範圍內。

當需要分塊時,分割技能通常是技能集中的第一個。

"@odata.type": "#Microsoft.Skills.Text.SplitSkill",
"name": "#1",
"description": null,
"context": "/document/reviews_text",
"defaultLanguageCode": "en",
"textSplitMode": "pages",
"maximumPageLength": 5000,
"inputs": [
    {
        "name": "text",
        "source": "/document/reviews_text"
    }
],
"outputs": [
    {
        "name": "textItems",
        "targetName": "pages"
    }
]

透過 "/document/reviews_text" 的技能內容,分割技能會針對 reviews_text 執行一次。 技能會輸出為一份清單,將 reviews_text 分成 5,000 個字元區段。 來自分割技能的輸出會命名為 pages,並新增至擴充樹狀結構。 targetName 功能可讓您先將技能輸出重新命名,再新增至擴充樹狀結構。

現在擴充樹狀結構在技能內容之下有了新的節點。 這個節點適用於任何技能、投影或輸出欄位對應。

在技能 #1 之後的擴充樹狀結構

若要存取由技能新增至節點的任何擴充內容,則需要擴充內容的完整路徑。 例如,如果您想要使用 pages 節點中的文字作為另一個技能的輸入,請將其指定為 "/document/reviews_text/pages/*"。 如需路徑的詳細資訊,請參閱參考擴充

技能 #2 語言偵測

旅館評論文件包含多種語言的客戶意見反應。 語言偵測技能會決定要使用哪一種語言。 結果接著會傳遞至關鍵片語擷取和情感偵測 (未顯示),並在偵測情感和片語時納入語言考量。

雖然語言偵測技能是技能集所定義的第三個技能 (技能 #3),但會是下一個要執行的技能。 此技能不需要任何輸入,因此會與先前的技能平行執行。 如同之前進行的分割技能,系統也會針對每個文件叫用語言偵測技能一次。 擴充樹狀結構現在具有語言的新節點。

在技能 #2 之後的擴充樹狀結構

技能 #3 和 #4 (情感分析和關鍵片語偵測)

客戶意見反應會反映一系列正面和負面體驗。 情感分析技能會分析意見反應,並指派從負數到正數的連續分數,如果未決定情感則為中性。 關鍵片語偵測會與情感分析平行執行,負責識別並擷取出現的文字和簡短片語。

若有 /document/reviews_text/pages/* 的內容,系統就會針對 pages 集合中的每個項目分別叫用情感分析和關鍵片語技能一次。 技能的輸出將會是相關聯頁面元素下方的節點。

現在您應該能夠查看技能集中的其餘技能,並直觀地看到擴充樹狀結構如何隨著每項技能的執行而增長。 有些技能 (例如合併技能和塑形器技能) 也會建立新的節點,但只會使用現有節點的資料,而不會建立全新的擴充。

在所有技能之後的擴充樹狀結構

上述樹狀結構中的連接線色彩表示擴充是由不同技能建立的,而節點則必須個別定址,且不會成為選取父節點時所傳回物件的一部分。

技能 #5 塑形器技能

如果輸出包含知識存放區,請新增塑形器技能作為最後一個步驟。 塑形器技能會根據擴充樹狀結構中的節點建立資料圖形。 例如,您可能想要將多個節點合併成單一圖形。 接著,您可以將此圖形投影為資料表 (節點成為資料表中的資料行),依名稱將圖形傳遞至資料表投影。

塑形器技能專注於一個技能的成形,因此非常易於使用。 或者,您可以選擇在個別投影內進行內嵌成形。 塑形器技能不會新增或減去擴充樹狀結構,因此沒有視覺化。 相對地,您可以將塑形器技能視為一種重新排列現有擴充樹狀結構的方法。 在概念上,這類似於在資料庫中使用資料表建立檢視。

{
  "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
  "name": "#5",
  "description": null,
  "context": "/document",
  "inputs": [
    {
      "name": "name",
      "source": "/document/name"
    },
    {
      "name": "reviews_date",
      "source": "/document/reviews_date"
    },
    {
      "name": "reviews_rating",
      "source": "/document/reviews_rating"
    },
    {
      "name": "reviews_text",
      "source": "/document/reviews_text"
    },
    {
      "name": "reviews_title",
      "source": "/document/reviews_title"
    },
    {
      "name": "AzureSearch_DocumentKey",
      "source": "/document/AzureSearch_DocumentKey"
    },
    {
      "name": "pages",
      "sourceContext": "/document/reviews_text/pages/*",
      "inputs": [
        {
          "name": "Sentiment",
          "source": "/document/reviews_text/pages/*/Sentiment"
        },
        {
          "name": "LanguageCode",
          "source": "/document/Language"
        },
        {
          "name": "Page",
          "source": "/document/reviews_text/pages/*"
        },
        {
          "name": "keyphrase",
          "sourceContext": "/document/reviews_text/pages/*/Keyphrases/*",
          "inputs": [
            {
              "name": "Keyphrases",
              "source": "/document/reviews_text/pages/*/Keyphrases/*"
            }
          ]
        }
      ]
    }
  ],
  "outputs": [
    {
      "name": "output",
      "targetName": "tableprojection"
    }
  ]
}

後續步驟

在看過簡介和範例後,請嘗試使用內建技能來建立您的第一個技能集。