共用方式為


測試 LUIS DevOps

重要

LUIS 將於 2025 年 10 月 1 日淘汰,而自 2023 年 4 月 1 日開始,您將無法建立新的 LUIS 資源。 建議移轉 LUIS 應用程式交談語言理解,以享有產品持續支援和多語言功能的優點。

正在開發 Language Understanding (LUIS) 應用程式的軟體工程師可遵循下列指導方針,針對原始檔控制自動化組建測試發行管理套用 DevOps 實務做法。

在敏捷式軟體開發方法中,測試在組建高品質的軟體的過程中扮演著不可或缺的角色。 對 LUIS 應用程式進行的每項重大變更都應該要進行測試,目的是測試開發人員在應用程式中建立的新功能。 這些測試會存回您的原始程式碼存放庫,以及 LUIS 應用程式的 .lu 來源。 當應用程式符合測試,變更的實作即為完成。

測試是 CI/CD 工作流程中很重要的部分。 在提取要求 (PR) 中建議對 LUIS 應用程式進行變更時,或將變更合併到您的主分支之後,CI 工作流程應該要執行測試,以確認更新尚未造成任何迴歸。

如何進行單元測試和批次測試

在持續整合工作流程中,您必須執行兩種不同的 LUIS 應用程式測試:

  • 單元測試 - 相對簡單的測試,可驗證 LUIS 應用程式的關鍵功能。 當指定的測試表達有傳回預期的意圖和預期的實體,就表示通過單元測試。 所有單元測試都必須通過,該測試回合才算是成功完成。
    這種測試類似於您可以在 LUIS 入口網站中進行的互動式測試

  • 批次測試 - 批次測試是針對您目前已定型模型的完整測試,用於測量其效能。 不同於單元測試,批次測試並不是分為通過|失敗的測試。 批次測試的目標並不是每次測試都會傳回預期的意圖和預期的實體。 相對地,批次測試可協助您檢視您應用程式中每個意圖和實體的正確性,並在進行改善的過程中協助您比較每一次的改善。
    這種測試與您可以在 LUIS 入口網站中互動執行的批次測試相同。

您可以在專案剛開始時使用單元測試。 只有在您已開發出 LUIS 應用程式的結構描述,而且正在改善正確性時,批次測試才能真正發揮作用。

針對單元測試和批次測試,請確實區分測試表達與定型表達。 如果您測試的資料與定型的資料相同,您會誤認為應用程式表現良好,但應用程式其實只是對於測試資料過度學習。 模型必須完全未接觸過測試內容,才能真正測試出模型一般化的程度。

編寫測試

在您編寫一組測試時,必須針對每項測試定義下列各項目:

  • 測試語句
  • 預期的意圖
  • 預期的實體。

使用 LUIS 批次檔語法,在 JSON 格式的檔案中定義一組測試。 例如:

[
  {
    "text": "example utterance goes here",
    "intent": "intent name goes here",
    "entities":
    [
        {
            "entity": "entity name 1 goes here",
            "startPos": 14,
            "endPos": 23
        },
        {
            "entity": "entity name 2 goes here",
            "startPos": 14,
            "endPos": 23
        }
    ]
  }
]

某些測試工具,例如 NLU.DevOps,也支援 LUDown 格式的測試檔案。

設計單元測試

單元測試應設計為測試 LUIS 應用程式的核心功能。 在應用程式開發的每個反覆項目 (或短期衝刺) 中,您應該要編寫數目足夠的測試,來驗證您在該反覆項目中實作的關鍵功能是否能正常運作。

在每個單元測試中,針對指定的測試表達,您可以:

  • 測試是否已傳回正確的意圖
  • 測試是否正在傳回「關鍵」實體 (對解決方案至關重要的實體)。
  • 測試意圖和實體的預測分數是否超過您所定義的閾值。 例如,您可以決定只有在意圖和關鍵實體的預測分數超過 0.75 時,才能視為通過測試。

在單元測試中,建議您測試關鍵實體是否已在預測回應中傳回,但是要忽略任何誤判為真。 誤判為真指的是在預測回應中發現但在測試的預期結果中並未定義的實體。 藉由忽略誤判為真,您可以更輕鬆地編寫單元測試,同時也能專注於測試對於解決方案至關重要的資料是否在預測回應中傳回。

提示

NLU.DevOps 工具支援您所有的 LUIS 測試需求。 compare 命令用於單元測試模式中時,會宣告所有的測試都通過,並忽略在預期結果中未標示實體的誤判為真結果。

設計批次測試

批次測試集合應該包含大量的測試案例,目的是測試 LUIS 應用程式中的所有意圖和所有實體。 如需定義批次測試集合的詳細資訊,請參閱 LUIS 入口網站中的批次測試

執行測試

LUIS 入口網站提供可協助進行互動式測試的功能:

  • 互動式測試可讓您提交樣本表達,並取得 LUIS 辨識意圖和實體的回應。 您可以透過視覺化檢查來確認測試是否成功。

  • 批次測試使用批次測試檔案作為輸入,來驗證使用中的已定型版本,並測量其預測正確性。 批次測試可協助您檢視使用中版本內每個意圖和實體的正確性,並以圖表顯示結果。

在自動化組建工作流程中執行測試

LUIS 入口網站中的互動式測試功能很實用,但針對 DevOps,在 CI/CD 工作流程中執行的自動化測試需要滿足以下需求:

  • 測試工具必須在組建伺服器上的工作流程步驟中執行。 這表示工具必須要能夠在命令列上執行。
  • 測試工具必須能夠針對端點執行一組測試,並根據實際結果自動驗證預期的結果。
  • 如果測試失敗,測試工具就必須傳回狀態碼,以停止工作流程並「使組建失敗」。

LUIS 不提供包含這些功能的命令列工具和高階 API。 建議您使用 NLU.DevOps 工具,在命令列以及在 CI/CD 工作流程內進行自動化測試期間,執行測試與驗證結果。

LUIS 入口網站中所提供的測試功能不需要已發佈的端點,且為 LUIS 撰寫功能的一部分。 當您在自動化組建工作流程中實作測試時,必須待測試的 LUIS 應用程式版本發佈至端點,如 NLU.DevOps 等測試工具才可以在測試過程中傳送預測要求。

提示

  • 如果您正在實作自己的測試解決方案,並編寫程式碼以將測試表達傳送至端點,請記得,如果您使用 LUIS 編寫金鑰,允許的交易速率限制為 5TPS。 請降低傳送速率,或改用預測索引鍵。
  • 將測試查詢傳送至端點時,請記得在預測要求的查詢字串中使用 log=false。 這可確保您的測試表達不會由 LUIS 記錄,並避免最後會出現在 LUIS 主動式學習功能所呈現的端點表達審核清單中,以免意外新增至應用程式的定型表達。

在命令列和 CI/CD 工作流程中執行單元測試

您可以使用 NLU.DevOps 封裝在命令列執行測試:

  • 使用 NLU.DevOps 測試命令將測試檔案中的測試提交至端點,並在檔案中擷取實際的預測結果。
  • 使用 NLU.DevOps 比較命令比較在輸入測試檔案中定義的實際結果與預期結果。 此 compare 命令會產生 NUnit 測試輸出,並在透過使用 --unit-test 旗標用於單元測試模式中時,將判斷提示所有測試皆通過。

在命令列與 CI/CD 工作流程中執行批次測試

您也可以使用 NLU.DevOps 封裝,以在命令列執行批次測試。

  • 使用 NLU.DevOps 測試命令將測試檔案中的測試提交至端點,並在檔案中擷取實際的預測結果,就如同單元測試。
  • 效能測試模式中使用 NLU.DevOps 比較命令來衡量應用程式的效能。您也可以將應用程式的效能與基準效能標準進行比較,例如,從最新認可到主要或目前版本的結果。 在效能測試模式中,compare 命令會以 JSON 格式產生 NUnit 測試輸出與批次測試結果

LUIS 的非決定性定型以及對測試的影響

LUIS 在定型模型時,例如意圖,需要正面資料 - 為了將模型的應用程式定型所提供的已標示定型表達 -以及負面資料,也就是該模型有效的使用方式範例資料。 在定型期間,LUIS 會從您為其他模型提供的所有正面資料中,建立單一模型的負面資料,但在某些情況下可能會產生資料不平衡的情況。 為了避免這種不平衡,LUIS 會以非決定性的方式取樣出負面資料的子集,來進行最佳化,以獲得更好的平衡定型集、提升的模型效能,以及更快速的定型時間。

這個非決定性定型的結果是,您可能會在不同的定型工作階段之間得到稍微不同的預測回應,通常是針對預測分數不高的意圖和/或實體。

如果您想要將以測試為目的而建立的那些 LUIS 應用程式版本停用非決定性定型,請使用 UseAllTrainingData 設定設為 true版本設定 API

下一步