共用方式為


交談語言理解的最佳做法

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

選擇一致的結構描述

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

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

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

例如,假設您希望客戶透過聊天機器人,取消訂用帳戶,不再訂閱您提供的各種產品。 您可以使用各種範例建立取消意圖,例如「取消 Contoso 服務」「停止因 Fabrikam 訂用帳戶向我收費」。這裡的使用者意圖是取消Contoso 服務Fabrikam 訂用帳戶是他們想要取消的訂用帳戶。 因此,您可以建立訂用帳戶的實體。 然後,您可以建立整個專案的模型,以擷取動作作為意圖,並使用實體填入這些動作。 這可讓您取消定義為實體的任何項目,例如其他產品。 然後,您可以擁有註冊、續約、升級等意圖,這些意圖全都使用訂用帳戶和其他實體。

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

另一種方法是將資訊模型化為意圖,並將動作模型化為實體。 讓我們採用相同的範例,讓客戶透過聊天機器人取消訂用帳戶。 您可以為每個可用訂用帳戶的建立意圖,例如具有「取消 Contoso」「停止因 contoso 服務向我收費」、「取消 Contoso 訂用帳戶」等表達的 Contoso。然後,您會建立實體來擷取動作:取消。您可以為每個動作定義不同的實體,或使用清單元件將動作合併為一個實體,以區分具有不同索引鍵的動作。

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

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

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

平衡定型資料

在定型資料方面,您應該嘗試保持結構描述的平衡。 一個意圖包含大量資料,而其他意圖包含很少資料會導致模型嚴重偏向於特定意圖。

若要解決此問題,您可能需要縮小定型集的取樣,或新增至其中。 縮小取樣可以透過下列其中一項完成:

  • 隨機移除定型特定百分比的資料。
  • 藉由分析資料集,以及移除過度代表的重複項目,以更系統化的方式進行。

您也可以在 Language Studio 中選取 [資料標記] 索引標籤中的 [建議表達] 來新增至定型集。 交談語言理解會將呼叫傳送給 Azure OpenAI 以產生類似的表達。

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

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

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

清楚標記表達

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

  • 如果實體之間有相似之處,請確定您資料的某些層面可提供它們之間差異的訊號。

    例如,如果您建置模型來預訂航班,則使用者可能會使用類似「我想要從波士頓飛往西雅圖的航班」的表達。而此類表達的「出發城市」及「抵達城市」將會預期為類似。 區分「出發城市」的訊號可能是其前面通常加上「從」一詞。

  • 請確定您在定型和測試資料中標記每個實體的所有執行個體。 其中一種方法是使用搜尋函式來尋找資料中單字或片語的所有執行個體,以檢查它們是否已正確加上標籤。

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

在進階定型之前使用標準定型

標準定型比進階定型更快速,因此在建置模型時快速了解變更定型集或結構描述的效果相當實用。 一旦您滿意結構描述,請考慮使用進階定型來取得模型的最佳 AIQ。

使用評估功能

當您建置應用程式時,通常有助於提早追捕錯誤。 在建置應用程式時新增測試集通常是很好的做法,因為定型和評估結果在識別結構描述中的錯誤或問題非常有用。

機器學習元件和組合

請參閱元件類型

使用「無」分數閾值

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

  • 清單和 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 匯入新專案,並將第二個所需的測試集重新命名為「test」。
  • 使用您的第二個測試集定型模型以執行評估。

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

如果您使用協調的應用程式,則可能會想要傳送各種子應用程式的自訂參數覆寫。 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
                }
             }
         }
     }
 }'

跨語言資源複製專案

通常您可以使用 Azure 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>" 
}'

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

如果模型在定義域表達之外的情況下 AIQ 不佳,客戶可以使用新的配方版本「2024-06-01-preview」。 使用預設配方的範例可能如下所示,其中模型具有 3 個意圖,Sports、QueryWeather 和 Alarm。 測試表達在定義域表達之外,且模型將其分類為 InDomain,而信賴度分數相對較高。

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

若要解決此問題,請使用專為解決此問題而建置的 2024-06-01-preview 組態版本,同時在定義域表達上維持相當良好的品質。

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-06-01-preview",
      "evaluationOptions": {
            "kind": "percentage",
            "testingSplitPercentage": 0,
            "trainingSplitPercentage": 100
      }
}

傳送要求之後,您可以如往常一樣追蹤 Language Studio 中定型作業的進度。

警示:

  • 使用此配方時,應用程式的 [無分數] 閾值 (信賴等級閾值低於 topIntent 標示為 None) 應設定為 0。 這是因為這個新的配方會將定義域機率中的特定部分屬性歸因為定義域之外,因此模型在定義域表達中不會不正確地過度信賴。 因此,相較於生產配方,使用者可能會看到定義域表達中信賴度分數略有降低。
  • 對於只有兩 (2) 個意圖如 IntentA 和 None 的應用程式,不建議使用此配方。
  • 對於每個意圖表達數目低的應用程式,不建議使用此配方。 強烈建議每個意圖至少 25 個表達。