【AI測試】借助自動化框架實現-短文本相似度模型測試(基於LCQMC語料)


****************************************************************************

本文主要介紹借助自動化框架實現-短文本相似度模型測試

  1.測試需求分析

  2.測試環境准備

  3.測試數據准備

  4.測試分析與執行

  5.測試問題總結

****************************************************************************

一、測試需求

1)原始需求:測試短文本相似度接口能力是否符合指定的模型效果

2)理解需求:驗證接口的功能、模型評估、性能是否符合需求文檔

3)需求思考:短文本相似度是判定2個文本在語義上是否相似,目前使用場景包含信息檢索圖片、視頻、文本等、新聞推薦、智能客服等,本次測試的應用場景是? 研發回答:沒有指定場景(這是一個坑!!!)

二、測試環境准備

本次測試接口能力均已封裝為鏡像文件,所以直接拉取鏡像啟動即可!

1) 啟動能力鏡像:

CPU版本:

docker run -d -p 5000:5000 -v /dep_pic/wwq/data/TextSimilarity:/home/TextSimilarity/Data text_similarity_cpu:v1

GPU版本:

docker run -d --gpus "device=1"(顯卡號) -p 5000:5000 -v /dep_pic/wwq/data/TextSimilarity:/home/TextSimilarity/Data text_similarity_gpu:v1

2) 代碼運行日志在映射目錄下Log文件夾中startup.log文件中,查看日志命令為cat startup.log,如下則服務已成功啟動:

三、測試數據准備

1)數據分析:需求分析階段了解到模型並沒有指定使用場景,且模型訓練依賴主要CMNLI語料庫,通過分析CMNLI語料庫場景比較單一,經測試建議增加LCQMC語料庫,豐富模型使用場景,使模型效果更理想!

2)語料庫數據展示

四、測試分析與執行

1)測試方法分析:功能測試利用Postman工具(不講),模型評估測試利用公司自動化接口框架實現,性能測試利用JMeter工具(不講)

2)模型評估測試執行

A、獲取評估指標預期值:模型評估包含那些指標,通常會在需求文檔里面體現出,代表算法工程師自測的結果,如

B、獲取評估指標數據量級與數據分布情況:算法工程師通常有2個數據集,訓練集與測試集,如本次測試算法工程師訓練集在十幾萬數據,相似與不相似數據分布比例是1:2,所以我的測試數據設計為:相似1000條,不相似2000條

C、執行模型評估測試,本次測試利用公司自動化接口框架,具體框架的架構、涉及技術不是本次重點,本次重點說一下模型評估自動化的實現方法,以往模型評估過程都需要測試人員整合測試結果,然后手工統計出指標值,結果准確性無法保證耗時也比較久。話不多說,直接上代碼:

AItool工具類:利用sklearn模塊evaluate函數,直接輸出模型指標值,如准確率、精確率、召回率、F1 score

sklearn詳細用法參考博客:https://blog.csdn.net/hfutdog/article/details/88085878   

def evaluate(y_true, y_pred): Precision_Statistics = { 'precsion': { 'micro': precision_score(y_true, y_pred, average="micro"), 'macro': precision_score(y_true, y_pred, average="macro"), 'weighted': precision_score(y_true, y_pred, average="weighted")}, 'recall': { 'micro': recall_score(y_true, y_pred, average="micro"), 'macro': recall_score(y_true, y_pred, average="macro"), 'weighted': recall_score(y_true, y_pred, average="weighted") }, 'f1': { 'micro': f1_score(y_true, y_pred, average="micro"), 'macro': f1_score(y_true, y_pred, average="macro"), 'weighted': f1_score(y_true, y_pred, average="weighted"), } } return Precision_Statistics def evaluate1(y_true, y_pred): Precision_Statistics = { 'precsion': { 'precsion': precision_score(y_true, y_pred) }, 'recall': { 'recall': recall_score(y_true, y_pred) }, 'f1': { 'f1': f1_score(y_true, y_pred) } } return Precision_Statistics def appendlist1(label): label_list1.append(label) def appendlist2(label): label_list2.append(label)

 

testCase用例實現:收集預期結果與接口返回結果,追加到列表: AItool.appendlist1(label)、 AItool.appendlist2(isDataYes)

# 請求目標接口
        (res,headers) = shortTextSimilartiy().getAuthoritys(jsons=data, header={"Content-Type": "application/json"}) logger.info(headers) isSuccess = headers['X-EBAPI-CODE'] isSuccess1 = headers['X-EBAPI-DESC'] result1 = Checkpoint().checkIfTextExist(isSuccess, "0000") self.assertEqual(result1, True) # 根據result字段判斷接口是否請求成功 如果請求成功繼續往下校驗是否為預期的相似度
        result2 = Checkpoint().checkIfTextExist(isSuccess1, "success") self.assertEqual(result2, True) # 根據result字段判斷接口是否請求成功 如果請求成功繼續往下校驗是否為預期的相似度
        try: isDataYes = res["content"][0]["data"] except Exception: logger.info('獲取被測接口的響應label失敗') raise KeyError result3 = Checkpoint().checkIfTextExist(isDataYes, label) if label == 'yes': label = 1
        else: label = 0 if isDataYes == 'yes': isDataYes = 1
        else: isDataYes = 0
     # 追加預期數據與返回數據 AItool.appendlist1(label) AItool.appendlist2(isDataYes) self.assertEqual(result3, True)
# 根據返回是否相似 與預期值對比 if label == 'yes': # 如果label等於yes 則判斷返回值中的相似度是否大於等於0.5(0.5這個閾值可調) result2 = res["content"][1]["data"] >= 0.5 self.assertEqual(result2, True) elif label == 'no': # 如果label等於no 則判斷返回值中的相似度是否小於0.5(0.5這個閾值可調) result2 = res["content"][1]["data"] < 0.5 self.assertEqual(result2, True)

report輸出報告:報告中調用工具類evaluate1函數,輸出模型評估結果

 1     def getReportAttributes(self, result):  2         """
 3  Return report attributes as a list of (name, value).  4  Override this to add custom attributes.  5         """
 6         startTime = str(self.startTime)[:19]  7         duration = str(self.stopTime - self.startTime)  8         status = []  9         #Accuracy = AItool.evaluate(AItool.label_list1, AItool.label_list2)
10         # 輸出模型評估指標值
11         Accuracy = AItool.evaluate1(AItool.label_list1,AItool.label_list2) 12         status.append('總計: %s' % (result.success_count + result.failure_count + result.error_count)) 13         if result.success_count: status.append('通過: %s' % result.success_count) 14         if result.failure_count: status.append('失敗: %s' % result.failure_count) 15         if result.error_count:   status.append('錯誤: %s' % result.error_count) 16         if status: 17             status = ''.join(status) 18             # 合入Github:boafantasy代碼
19             if (result.success_count + result.failure_count + result.error_count) > 0: 20                 self.passrate = str("%.2f%%" % (float(result.success_count) / float( 21                     result.success_count + result.failure_count + result.error_count) * 100)) 22             else: 23                 self.passrate = "0.00 %"
24         else: 25             status = 'none'
26         return [ 27             (u'測試人員', self.tester), 28             (u'開始時間', startTime), 29             (u'合計耗時', duration), 30             (u'測試結果', status + ",通過率: " + self.passrate), 31             (u'統計數據', ''), 32             # (u'precsion', 'micro=' + str(Accuracy['precsion']['micro']) + ', macro = ' + str(
33             # Accuracy['precsion']['micro']) + ' , weighted = ' + str(
34             # Accuracy['precsion']['weighted'])),
35             # (u'recall', 'micro=' + str(Accuracy['recall']['micro']) + ', macro = ' + str(
36             # Accuracy['recall']['micro']) + ' , weighted = ' + str(
37             # Accuracy['recall']['weighted'])),
38             # (u'f1', 'micro=' + str(Accuracy['f1']['micro']) + ', macro = ' + str(
39             # Accuracy['f1']['micro']) + ' , weighted = ' + str(
40             # Accuracy['f1']['weighted']))
41             (u'precsion','precsion='+str(Accuracy['precsion']['precsion'])), 42             (u'recall','recall='+str(Accuracy['recall']['recall'])), 43             (u'f1','f1='+str(Accuracy['f1']['f1'])) 44 
45         ]

report結果展示:

測試報告中結果展示:

五、測試問題總結

1)LCQMC語料庫獲取,模型測試數據獲取都是靠運氣,一般可通過官方網站進行申請(時間比較久,還需要額外審核),自己百度找,需要這份數據集的小伙伴請評論留言!

2)本次模型評估測試采用自動化框架,如果有一定python技術的同學,我建議采用這種方式,首先能夠解放雙手,其次可以縮短測試時間,盡管前期需要投入開發時間,但是一勞永逸,想探討接口自動化框架的小伙伴請評論留言!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM