共用方式為


交談語言理解的最佳做法

使用下列指導方針,以交談語言理解建立最佳的可能專案。

選擇一致的結構描述

結構描述是您意圖和實體的定義。 定義您應該建立的內容作為意圖與實體時,您可以採取不同的方法。 請自問下列問題:

  • 我嘗試從使用者擷取什麼動作或查詢?
  • 每個動作中有哪些相關資訊?

您通常可以將動作和查詢視為意圖,而將滿足這些查詢所需的資訊視為實體

例如,假設您希望客戶透過聊天機器人取消所提供各種產品的訂用帳戶。 您可以使用各種範例建立取消意圖,例如「取消 Contoso 服務」或「停止因 Fabrikam 訂用帳戶向我收費」。這裡的使用者意圖是取消,Contoso 服務或 Fabrikam 訂用帳戶是他們想要取消的訂用帳戶。

若要繼續,您可以建立訂用帳戶的實體。 然後,您可以建立整個專案的模型,以擷取動作作為意圖,並使用實體填入這些動作。 此方法可讓您取消定義為實體的任何項目,例如其他產品。 然後,您可以擁有註冊、續約和升級的意圖,這些意圖全都使用訂用帳戶和其他實體。

上述結構描述設計可讓您輕鬆地建立新的實體,將現有功能 (取消、升級或註冊) 延伸至新的目標。

另一種方法是將資訊模型化為意圖,並將動作模型化為實體。 讓我們採用相同的範例,讓客戶透過聊天機器人取消訂用帳戶。

您可以為每個可用訂用帳戶的建立意圖,例如具有「取消 Contoso」、「停止因 contoso 服務向我收費」、「取消 Contoso 訂用帳戶」等語句的 Contoso。然後,您會建立實體來擷取取消動作。 您可以為每個動作定義不同的實體,或使用清單元件將動作合併為一個實體,以區分具有不同索引鍵的動作。

此結構描述設計可讓您藉由新增動作實體或實體元件,輕鬆地將新的動作延伸至現有的目標。

請務必避免嘗試將所有概念歸納為意圖。 例如,不要嘗試建立只有該特定動作用途的取消 Contoso 意圖。 意圖和實體應該搭配運作,以從客戶擷取所有必要的資訊。

建議您避免混合不同的結構描述設計。 請勿以動作為意圖,建置半個應用程式,以資訊為意圖,建置另外半個應用程式。 若要取得可能的結果,請確保這些結果保持一致。

平衡訓練資料

在訓練資料方面,您應該嘗試讓結構描述保持良好平衡。 包含大量單一意圖及包含少量另一個意圖,會導致模型偏向於特定意圖。

若要解決此案例,您可能須針對訓練集縮小取樣。 或者,您可以選擇新增至訓練集。 若要縮小取樣,您可以:

  • 隨機移除特定百分比的訓練資料。
  • 分析資料集並移除代表性過高的重複項目,從而採用更系統化的方式。

若要新增至訓練集,請在 Language Studio 中,選取 [資料標記] 索引標籤中的 [建議表達]。 交談語言理解會將呼叫傳送給 Azure OpenAI 以產生類似的表達。

顯示 Language Studio 中表達建議的螢幕擷取畫面。

您也應該在訓練集中尋找非預期的「模式」。 例如,確認特定意圖的訓練集是否全部採用小寫,或以特定片語開頭。 在這種情況下,您訓練的模型可能會在訓練集中學習這些非預期的偏差,而不是能夠進行一般化。

建議您在訓練集中引進大小寫和標點符號多樣性。 如果您的模型預期會處理變化,務必要有一個也會反映該多樣性的訓練集。 例如,包含一些採用適當大小寫的表達,以及一些全部採用小寫的表達。

清楚標記表達

  • 確定您實體所參考的概念已妥善定義且可分隔。 檢查您是否能夠輕鬆且可靠地判斷差異。 如果您不能,這種缺乏區別可能表示學習的元件也會有困難。

  • 如果實體之間存在相似性,請確定資料的某些層面可提供其之間差異的訊號。

    例如,如果您建置模型來預訂航班,使用者可能會使用類似「我需要從波士頓飛往西雅圖的航班」之類的語句。這類語句的「出發城市」和「目的地城市」應該類似。 區分「出發城市」的訊號可能是其前面通常會加上「從」一詞。

  • 確定您會在訓練和測試資料中標記每個實體的所有執行個體。 其中一種方法是使用搜尋函式來尋找資料中字組或片語的所有執行個體,以檢查是否已為其正確標記。

  • 針對具有無學習的元件的實體以及有學習的元件的實體標記測試資料。 此做法有助於確保您的評估計量正確無誤。

在進階訓練之前使用標準訓練

標準訓練是免費的,而且比進階訓練更快。 其可協助您快速了解在建置模型時變更訓練集或結構描述的效果。 在您滿意結構描述之後,請考慮使用進階訓練來取得最佳模型品質。

使用評估功能

當您建置應用程式時,通常有助於儘早攔截錯誤。 當您建置應用程式時,通常最好新增測試集。 訓練和評估結果有助於識別結構描述中的錯誤或問題。

機器學習元件和組合

如需詳細資訊,請參閱元件類型

使用「無」分數閾值

如果您看到太多誤判 (例如,將不在內容中的表達標示為有效意圖),請參閱信賴等級閾值,以取得影響推斷方式的相關資訊。

  • 根據定義,清單和 Regex 這類非機器學習的實體元件與內容無關。 如果您在非預期的地方看到清單或 Regex 實體,則嘗試將清單同義字標記為機器學習元件。
  • 針對實體,您可以使用學習的元件作為「必要」元件,以限制何時應該引發組成的實體。

例如,假設您有一個名為「機票數量」的實體,其嘗試針對諸如「預訂兩張明天到開羅的機票」的表達,來擷取您想要為預訂航班保留的機票張數。

一般而言,您會為 Quantity.Number 新增預先建置的元件,其已經擷取表達內的所有數字。 然而,如果您的實體只使用預建元件來定義,其也會擷取其他數字作為機票數量實體的一部分,例如「預訂兩張明天下午 3 點到開羅的機票」。

若要解決此問題,您會在訓練資料中,針對要成為「機票數量」的所有數字標記學習的元件。 該實體現在有兩個元件:

  • 可解譯所有數字的預先建置元件。
  • 可預測機票數量在句子中位置的學習元件。

如果您需要學習的元件,請確定「機票數量」只有當學習的元件在正確內容中預測時才會傳回。 如果您也需要預先建置的元件,則可保證傳回的「機票數量」實體為數字且位於正確的位置。

解決模型不一致的問題

如果您的模型對小型文法變更 (例如大小寫或變音符號) 過於敏感,則可直接在 Language Studio 中有系統地操作資料集。 若要使用這些功能,選取左側窗格上的 [設定] 索引標籤,然後找出 [進階專案設定] 區段。

螢幕擷取畫面顯示 [進階專案] 設定的範例。

首先,您可以啟用 [啟用大小寫的資料轉換] 設定,在訓練、測試及實作模型時,將表達的大小寫正規化。 如果您已從 LUIS 移轉,您可能發現 LUIS 預設會執行此正規化。 若要透過 API 存取此功能,將 normalizeCasing 參數設定為 true。 請參閱下列範例:

{
  "projectFileVersion": "2022-10-01-preview",
    ...
    "settings": {
      ...
      "normalizeCasing": true
      ...
    }
...

其次,您也可以利用 [進階專案設定] 來啟用變音符號的資料擴增,為自然語言中可能使用的變音符號變化產生訓練資料的變化。 此項功能適用於所有語言。 但對於德文和斯拉夫文語言特別有用,因為使用者通常會使用傳統英文字元 (而不是正確的字元) 來寫字。 例如,法文中的「瀏覽至體育頻道」片語是「Accédez à la chaîne sportive」。啟用此功能時,訓練資料集中也會包含片語「Accedez a la chaine sportive」(不含變音符號字元)。

如果您啟用此功能,訓練集的表達計數會增加。 基於此原因,您可能需要據以調整設定資料大小。 目前在擴增後最大的表達計數是 25,000 個。 若要透過 API 存取此功能,將 augmentDiacritics 參數設定為 true。 請參閱下列範例:

{
  "projectFileVersion": "2022-10-01-preview",
    ...
    "settings": {
      ...
      "augmentDiacritics": true
      ...
    }
...

處理模型過度信賴的問題

如果模型錯誤地過度信賴,客戶就能使用 LoraNorm 定型組態版本。 此行為的範例可能與下列案例相似,其中模型會以 100% 信賴度預測錯誤的意圖。 此分數讓信賴等級閾值專案設定無法使用。

Text 預測的意圖 信賴分數
「誰建造了埃菲爾鐵塔?」 Sports 1.00
「我今天看起來很好嗎?」 QueryWeather 1.00
「我希望您有一個美好的夜晚。」 Alarm 1.00

若要解決此案例,請使用 2023-04-15 設定版本來將信賴度分數正規化。 然後可以調整信賴等級閾值專案設定,以獲得所需的結果。

curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
      "modelLabel": "<modelLabel>",
      "trainingMode": "advanced",
      "trainingConfigVersion": "2023-04-15",
      "evaluationOptions": {
            "kind": "percentage",
            "testingSplitPercentage": 0,
            "trainingSplitPercentage": 100
      }
}

傳送要求之後,您就能一如往常地追蹤 Language Studio 中訓練作業的進度。

注意

更新 confidenceThreshold 專案設定之後,您必須重新訓練模型。 之後,您必須重新發佈應用程式,讓新的閾值生效。

模型版本 2023-04-15 中的正規化

在模型版本 2023-04-15 中,交談語言理解在不影響訓練的推斷層中提供正規化。

正規化層會將分類信賴度分數正規化為限制範圍。 目前選取的範圍是從 [-a,a] 開始,其中「a」是意圖數目的平方根。 因此,正規化取決於應用程式中的意圖數目。 如果意圖數目非常低,正規化層要處理的範圍就非常小。 若意圖數目相當多,正規化就會更有效率。

如果這種正規化對於超出範圍的意圖似乎沒有作用,因而可使用信賴等級閾值來篩選超出範圍的表達,則其可能與應用程式中的意圖數目有關。 請考慮將更多意圖新增至應用程式。 或者,如果您使用協調的結構,則考慮將屬於相同定義域的應用程式合併在一起。

對組成的實體進行偵錯

實體是函式,會使用相關聯的類型在輸入中發出範圍。 一或多個元件會定義函數。 您可以視需要標記元件,且可決定是否要啟用 [合併元件]設定。 當您合併元件時,重疊的所有範圍都將合併成單一範圍。 如果未使用此設定,將會發出每個個別元件範圍。

若要進一步了解個別元件的執行方式,您可以停用設定,並將每個元件設定為 [不需要]。 此設定可讓您檢查發出的個別範圍,並實驗移除元件,以便只產生有問題的元件。

使用多個測試集評估模型

交談語言理解專案中的資料可以有兩個資料集:測試集和訓練集。 如果您想要使用多個測試集來評估模型,您可以:

  • 為測試集提供不同的名稱 (例如「test1」和「test2」)。
  • 匯出您的專案,以取得 JSON 檔案及其參數和設定。
  • 使用 JSON 匯入新專案。 將第二個所需的測試集重新命名為「測試」。
  • 使用您的第二個測試集來訓練模型以執行評估。

適用於目標應用程式和子應用程式的自訂參數

如果您使用協調的應用程式,您可以針對各種子應用程式傳送自訂參數覆寫。 targetProjectParameters 欄位可讓使用者傳送代表每個目標專案參數的字典。 例如,考慮名為 Orchestrator 的協調器應用程式在名為 CLU1 的交談語言理解應用程式與名為 CQA1 的自訂問題解答應用程式之間進行協調。 如果您想要將名為「top」的參數傳送至問題解答應用程式,即可使用上述參數。

curl --request POST \
   --url 'https://<your-language-resource>.cognitiveservices.azure.com/language/:analyze-conversations?api-version=2022-10-01-preview' \
   --header 'ocp-apim-subscription-key: <your subscription key>' \
   --data '{
     "kind": "Conversation",
     "analysisInput": {
         "conversationItem": {
             "id": "1",
             "text": "Turn down the volume",
             "modality": "text",
             "language": "en-us",
             "participantId": "1"
         }
     },
     "parameters": {
         "projectName": "Orchestrator",
         "verbose": true,
         "deploymentName": "std",
         "stringIndexType": "TextElement_V8",
"targetProjectParameters": {
            "CQA1": {
                "targetProjectKind": "QuestionAnswering",
                "callingOptions": {
                    "top": 1
                }
             }
         }
     }
 }'

跨語言資源複製專案

通常您可以使用 Language Studio 中的 [複製] 按鈕,將交談語言理解專案從一個資源複製到另一個資源。 在某些情況下,使用 API 複製專案可能比較容易。

首先,識別:

  • 來源專案名稱。
  • 目標專案名稱。
  • 來源語言資源。
  • 目標語言資源,這是您要將其複製到其中的位置。

呼叫 API 以授權複製動作,並在稍後取得實際複製作業的 accessTokens

curl --request POST \ 
  --url 'https://<target-language-resource>.cognitiveservices.azure.com//language/authoring/analyze-conversations/projects/<source-project-name>/:authorize-copy?api-version=2023-04-15-preview' \ 
  --header 'Content-Type: application/json' \ 
  --header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>' \ 
  --data '{"projectKind":"Conversation","allowOverwrite":false}' 

呼叫 API 以完成複製作業。 使用您稍早取得的回應作為承載。

curl --request POST \ 
  --url 'https://<source-language-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<source-project-name>/:copy?api-version=2023-04-15-preview' \ 
  --header 'Content-Type: application/json' \ 
  --header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>\ 
  --data '{ 
"projectKind": "Conversation", 
"targetProjectName": "<target-project-name>", 
"accessToken": "<access-token>", 
"expiresAt": "<expiry-date>", 
"targetResourceId": "<target-resource-id>", 
"targetResourceRegion": "<target-region>" 
}'

解決定義域表達之外的問題

如果模型在定義域表達之外的品質不佳,客戶就能使用新更新的定型組態版本 2024-08-01-preview (先前為 2024-06-01-preview)。 若此案例的範例包含預設定型組態,則與下列範例相似,其中模型有三個意圖:SportsQueryWeatherAlarm。 測試表達均在定義域表達之外,而模型將其分類為信賴度分數相對較高的 InDomain

Text 預測的意圖 信賴分數
「誰建造了埃菲爾鐵塔?」 Sports 0.90
「我今天看起來很好嗎?」 QueryWeather 1.00
「我希望您有一個美好的夜晚。」 Alarm 0.80

若要解決此案例,使用專為解決此問題而建置的 2024-08-01-preview 設定版本,同時在 InDomain 表達上保有相當良好的品質。

curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
      "modelLabel": "<modelLabel>",
      "trainingMode": "advanced",
      "trainingConfigVersion": "2024-08-01-preview",
      "evaluationOptions": {
            "kind": "percentage",
            "testingSplitPercentage": 0,
            "trainingSplitPercentage": 100
      }
}

傳送要求之後,您就能一如往常地追蹤 Language Studio 中訓練作業的進度。

警示:

  • 使用此定型組態時,應用程式的 [無分數] 閾值 (信賴等級閾值,低於該閾值時會將 topIntent 標示為 None) 應設定為 0。 使用此設定是因為此新定型組態會將定義域機率中的特定部分歸因於定義域之外,如此一來,模型就不會在定義域表達中錯誤地過度信賴。 因此,相較於生產定型組態,使用者可能會看到定義域表達中的信賴度分數略有降低。
  • 例如,我們不建議此定型組態用於只有兩個意圖的應用程式,例如 IntentANone
  • 對於每個意圖表達數目較少的應用程式,不建議使用此定型組態。 強烈建議每個意圖至少有 25 個表達。