Azure AI 搜尋服務中的技能集概念
本文適用於需要更深入了解技能集概念和組合的開發人員,並假設您已熟悉 Azure AI 搜尋服務中套用的 AI 的高階概念。
技能集是 Azure AI 搜尋服務中附加至索引子的可重複使用物件。 其中包含一或多個技能,可呼叫內建 AI 或外部自訂項目來處理擷取自外部資料的文件。
下圖說明技能集執行的基本資料流程。
從技能集處理到得出結論,技能都會讀取和寫入存在於記憶體中的「擴充的文件」。 擴充的文件一開始只是從資料來源 (表示為 "/document"
根節點) 擷取的原始內容。 在每個技能執行時,每個技能都會將輸出寫入為圖形中的節點,進而為擴充的文件增加結構與內容。
技能集執行完成後,擴充的文件輸出會透過使用者定義的輸出欄位對應找到索引。 從來源到索引,您想要完整傳輸的任何原始內容都是透過欄位對應來定義。
若要設定套用的 AI,您需要在技能集和索引子中指定設定。
技能集定義
技能集是一或多個「技能」的陣列,技能可執行擴充,例如翻譯文字或在影像檔上進行光學字元辨識 (OCR)。 技能包括 Microsoft 的內建技能,或是您外部裝載處理邏輯的自訂技能。 技能集會產生擴充的文件,在編制索引或投影到知識存放區時會用到這些文件。
技能包含內容、輸入和輸出:
內容是指作業的範圍,每次可能包含一份文件,或集合中一個項目。
輸入源自擴充文件中的節點,其中「source」和「name」會識別指定的節點。
輸出會傳回擴充文件並成為新的節點。 值為節點「name」和節點內容。 如果節點名稱重複,您可以設定目標名稱進行區分。
技能內容
每個技能都有一個內容,可以是整個文件 (/document
) 或樹狀結構 (/document/countries/*
) 中的節點。
內容會決定:
技能執行次數,透過單一值 (每個欄位、每個文件一次),或是對於集合 (其中新增
/*
會導致對集合中的每個執行個體叫用技能)。輸出宣告,或是在擴充樹狀結構中新增技能輸出的位置。 系統一律將輸出作為內容節點的子系來新增至樹狀結構中。
輸入的圖形。 對於多層集合,將內容設定為父集合會影響技能輸入的圖形。 例如,如果您有一個列出國家/地區的擴充樹狀結構,每個國家/地區使用包含郵遞區號清單的州/省清單擴充,則內容的設定方式會決定輸入的解譯方式。
上下文 輸入 輸入的圖形 技能引動過程 /document/countries/*
/document/countries/*/states/*/zipcodes/*
國家/地區中所有郵遞區號的清單 每個國家/地區一次 /document/countries/*/states/*
/document/countries/*/states/*/zipcodes/*
該州/省中的郵遞區號清單 每個國家/地區和州/省的組合一次
技能相依性
技能可以個別和平行執行,如果要將某個技能的輸出饋送至另一個技能,也可以採用循序執行。 下列範例示範依序執行的兩個內建技能:
技能 #1 是文字分割技能,接受 "reviews_text" 來源欄位的內容作為輸入,並將該內容分割成 5,000 個字元的 "pages" 作為輸出。 將大量文字分割成較小的區塊,可讓情感偵測等技能產生更好的結果。
技能 #2 是情感偵測技能,接受「pages」作為輸入,並產生名為「Sentiment」的新欄位作為輸出,當中包含情感分析的結果。
請注意第一個技能的輸出 (「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"
}
]
}
. . .
]
}
擴充樹狀結構
擴充的文件是在技能集執行期間建立的暫時樹狀結構,可收集透過技能導入的所有變更。 整體上,擴充會表示為可定址節點的階層。 節點也會包含來自外部資料源的原始未擴充欄位。
擴充的文件只會在技能集執行期間存在,但可以快取或傳送至知識存放區。
擴充的文件最初只有文件萃取期間從資料來源擷取的內容,這些擷取自來源的文字和影像可供語言或影像分析使用。
初始內容是中繼資料以及「根節點」(document/content
)。 根節點通常是在文件萃取期間從資料來源擷取的完整文件或標準化影像。 這些內容在擴充樹狀結構中的呈現方式會因資料來源類型而有所不同。 下表針對幾種支援的資料來源,說明進入擴充管線的文件狀態:
資料來源\剖析模式 | 預設 | 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 |
執行技能時,輸出會新增至擴充樹狀結構作為新節點。 如果技能是在整份文件上執行,則會在根目錄下的第一個層級新增節點。
節點可作為下游技能的輸入。 例如,技能建立的內容 (例如翻譯字串),可能會成為辨識實體或擷取關鍵片語技能的輸入。
雖然您可以透過偵錯工作階段視覺化編輯器來視覺化和使用擴充樹狀結構,但其主要是內部結構。
擴充不是可變動的:節點一旦建立就無法編輯。 隨著您的技能變得更複雜,您的擴充樹狀結構也會更加複雜,但並非擴充樹狀結構中的所有節點都需要將它設為索引或知識存放區。
您可以選擇保存擴充輸出的特定子集,以便留下想要使用的內容。 索引子定義中的輸出欄位對應會決定搜尋索引中實際擷取的內容。 同樣地,如果要建立知識存放區,您可以將輸出對應到指派給投影的圖形。
注意
擴充樹狀結構格式可讓擴充管線將中繼資料附加至均等基本資料類型。 中繼資料不是有效的 JSON 物件,但可以投影至知識存放區投影定義中的有效 JSON 格式。 如需詳細資訊,請參閱塑形器技能。
索引子定義
索引子具有屬性和參數,用於設定索引子的執行。 這些屬性包括在搜尋索引中設定欄位資料路徑的對應。
共有兩組對應:
「fieldMappings」會將來源欄位對應至搜尋欄位。
「outputFieldMappings」會將擴充文件中的節點對應至搜尋欄位。
「sourceFieldName」屬性會指定資料來源中的欄位,或擴充樹狀結構中的節點。 「targetFieldName」屬性會指定索引中接收內容的搜尋欄位。
擴充範例
此範例使用旅館評論技能集作為參考點,說明擴充樹狀結構如何透過使用概念圖表的技能執行發展。
此範例也會展示:
- 技能內容和輸入如何判斷技能執行的次數
- 根據內容所產生的輸入圖形
在此範例中,CSV 檔案的來源欄位包含客戶針對旅館的評論 (「reviews_text」) 和評等 (「reviews_rating」)。 索引子會從 Blob 儲存體新增中繼資料欄位,而技能會新增翻譯的文字、情感分數和關鍵片語偵測。
在旅館評論範例中,擴充流程中的「document」代表一則旅館評論。
提示
您可以在 Azure 入口網站或 REST API 中建立此資料的搜尋索引和知識存放區。 您也可以使用偵錯工作階段來深入解析技能集組合、相依性以及對擴充樹狀結構的影響。 本文中的影像提取自偵錯工作階段。
在概念上,初始擴充樹狀結構會如下所示:
所有擴充的根節點都是 "/document"
。 當您使用 Blob 索引子時,"/document"
節點會有 "/document/content"
和 "/document/normalized_images"
的子節點。 當資料為 CSV 時 (如此範例所示),資料行名稱會對應至 "/document"
下的節點。
技能 #1:分割技能
當來源內容包含大量文字時,將其分割為較小的部分會很有幫助,可有效提升語言、情感和關鍵片語偵測的精確度。 可用的精細度有兩種:頁面和句子。 一頁包含大約 5,000 個字元。
文字分割技能通常是技能集中的第一個。
"@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
功能可讓您先將技能輸出重新命名,再新增至擴充樹狀結構。
現在擴充樹狀結構在技能內容之下有了新的節點。 這個節點適用於任何技能、投影或輸出欄位對應。
若要存取由技能新增至節點的任何擴充內容,則需要擴充內容的完整路徑。 例如,如果您想要使用 pages
節點中的文字作為另一個技能的輸入,請將其指定為 "/document/reviews_text/pages/*"
。 如需路徑的詳細資訊,請參閱參考擴充。
技能 #2 語言偵測
旅館評論文件包含多種語言的客戶意見反應。 語言偵測技能會決定要使用哪一種語言。 結果接著會傳遞至關鍵片語擷取和情感偵測 (未顯示),並在偵測情感和片語時納入語言考量。
雖然語言偵測技能是技能集所定義的第三個技能 (技能 #3),但會是下一個要執行的技能。 此技能不需要任何輸入,因此會與先前的技能平行執行。 如同之前進行的分割技能,系統也會針對每個文件叫用語言偵測技能一次。 擴充樹狀結構現在具有語言的新節點。
技能 #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"
}
]
}
下一步
在看過簡介和範例後,請嘗試使用內建技能來建立您的第一個技能集。