一、简介

我所了解模型评测的大概有以下两种方法

  • 分数导向: 准备一个庞大全面的测试集,模型答题后按准确率**,**F1分数等各类指标打分。
  • 能力导向: 特定应用场景下针对模型的各项能力来设计测试集,模型答题后按测试集的权重占比计算评分。

二、使用Python搭建LLM模型自评自动化测试环境:

评测指标一:精确匹配指标(EM)

  1. 计算方法:
    模型输出结果 == 模型预期结果 输出 1;
    模型输出结果 != 模型预期结果 输出 0;

  2. 基本代码实现

    # 使用前需要先用正则获取预期结果与模型输出结果中的量词;
    # 例如 2杯奶油,一杯牛奶这些参数,评测生成的结果是否合理,假设生成的是5杯奶油,按我这规格是直接打0分。
    # 正常项目中这些参数是单独分开的不需要抓取
    def exact_match_score(pred, true):
    """计算精确匹配得分
    	 pred: 模型输出结果
    	 true: 模型预期结果
    """
    return 1 if pred.strip().lower() == true.strip().lower() else 0
    

评测指标二: BERTScore: 计算模型输出结果与模型预期结果文本之间的相似性 。

  1. 基本代码实现
from bert_score import BERTScorer
# 初始化 BERTScorer 对象,保证只加载一次模型
score = BERTScorer(lang="en", rescale_with_baseline=True)
def bertscore(score, pred, true):
	P, R, F1 = score.score([pred], [true])
	return F1.item()

评测指标三: LLM自评:使用能力更强的大模型评测当前大模型。

模型能力评测点: 制定标准,模拟人工给模型生成结果打分;这一步评分的质量依赖提示词的描述,与评测大模型的能力。
评分打模型的提示词设计:以下只是个示范

	{
		"system_prompt": "你是一个自动评分器,请评估以下模型回答是否与参考答案一致; 评分标准如下1.食谱步骤是否符合要求 0~10分,2.食谱步骤是否符合要求:0~10分 3.制作工具是否符合要求:0~10(这里不符合要求可以直接打0分)4.食材是否符合需求:0~10分;5.食材选用是否用户喜好,参考用户喜好打分:0~20分;6.食材用例用量打分:0~10。结果输出:请只返回一个分数(0到1之间),其中1表示完全一致,0表示无关或错误"
	}

相对于的代码模板如下

python
import dashscope
# 本人使用的是自己的阿里云大模型接口key
# 使用前需要替换成自己的API key;此行代码需要修改为 ali_key = "你的api_key"
from get_key import ali_key
# 使用注意,我这是随便选的一个大模型,如果需要模拟自己产品模型功能,需要给system提示词一个设定

# 例如 system_prompt: 你是一个什么角色,需要做什么事情,参考什么内容;
# 复杂的需求还可以加上知识库,通过RAG检索内容,填充上下文来让模型更接近产品效果。
def get_model_response_qwen(prompt, model="qwen-max-2025-01-25", api_key=ali_key):
          """ 调用模型并返回回答内容 """
          messages = [
              {"role":"system","content":""},
              {"role":"user","content":prompt}
          ]
      
          responses = dashscope.Generation.call(
              model = model,
              api_key=api_key,
              messages=messages,
              stream=False,
              result_format='message',  # 将返回结果格式设置为 message
              top_p=0.8,
              temperature=0.7,
              enable_search=False
          )
      
          return responses.output.choices[0].message.content.strip()
            
        
def llm_self_evaluate_deepseek(model_answer, reference_answer, model="deepseek-v3", api_key=ali_key):
            """LLM 自评打分"""
            system_prompt = """
                你是一个自动评分器,请评估以下模型回答是否与参考答案一致。
                请只返回一个分数(0到1之间),其中1表示完全一致,0表示无关或错误。
            """
            user_prompt = f"""
                    模型回答: {model_answer}
                    参考答案: {reference_answer}
            """
            messages = [
                {'role': 'system', 'content': system_prompt},
                {'role': 'user', 'content': user_prompt}
            ]
        
            response = dashscope.Generation.call(
                api_key=api_key, model=model,  
                messages=messages, result_format='message'
            )
        
            score_text =  response.output.choices[0].message.content
            try:
                return float(score_text)
            except ValueError:
                print(f"[Error] 分数解析失败,返回值为: {score_text}")
                return 0.0
              
        # 获取模型结果
        output = get_model_response_qwen(prompt)
        # 通过大模型打分
        llm_score =llm_self_evaluate_deepseek(output, expected)

三、完整的项目源码模板如下

测试数据是针对冰淇淋AI食谱生成功能仿照的,此数据集中的数据全部是捏造的,实际测试需要参考自身的应用场景去设计评测提示词与评测数据集。

自动化测试源码

 import dashscope
    from bert_score import BERTScorer
    
    from get_key import ali_key
    
    
    
    def bertscore(score, pred, true):
        """ 使用 NLP 指标: BLEU、ROUGE、BERTScore. 适合开放式问答任务"""
        
        # P, R, F1 = score.score([pred], [true], lang="en", verbose=True)
        P, R, F1 = score.score([pred], [true])
        return F1.item()
    
    
    def exact_match_score(pred, true):
        """计算精确匹配得分: 适用于封闭式问题,如选择题、判断题等"""
        return 1 if pred.strip().lower() == true.strip().lower() else 0
    
    def get_model_response_qwen(prompt, model="qwen-max-2025-01-25", api_key=ali_key):
        """ 调用模型并返回回答内容 """
        messages = [
            {"role":"system","content":"写代码"},
          
            {"role":"user","content":prompt}
        ]
    
        responses = dashscope.Generation.call(
            model = model,
            api_key=api_key,
            messages=messages,
            stream=False,
            result_format='message',  # 将返回结果格式设置为 message
            top_p=0.8,
            temperature=0.7,
            enable_search=False
        )
    
        return responses.output.choices[0].message.content.strip()
        
    
    def llm_self_evaluate_deepseek(model_answer, reference_answer, model="deepseek-v3", api_key=ali_key):
        """LLM 自评打分"""
        system_prompt = """
            你是一个自动评分器,请评估以下模型回答是否与参考答案一致。
            请只返回一个分数(0到1之间),其中1表示完全一致,0表示无关或错误。
        """
        user_prompt = f"""
                模型回答: {model_answer}
                参考答案: {reference_answer}
        """
        messages = [
            {'role': 'system', 'content': system_prompt},
            {'role': 'user', 'content': user_prompt}
        ]
    
        response = dashscope.Generation.call(
            api_key=api_key, model=model,  
            messages=messages, result_format='message'
        )
    
        score_text =  response.output.choices[0].message.content
        try:
            return float(score_text)
        except ValueError:
            print(f"[Error] 分数解析失败,返回值为: {score_text}")
            return 0.0
    
    
    def load_test_dataset(test_dataset_path):
        """加载测试集"""
        with open(test_dataset_path, "r", encoding="utf8") as f:
            test_cases = json.load(f)
        return test_cases
    # ================== 示例测试 ==================
    if __name__ == "__main__":
        import json
        import pandas as pd
    
        # 加载测试集
        test_cases = load_test_dataset("test_dataset.json")
        print(">>> 测试集加载成功")
    
        # 初始化 BERTScorer 对象,保证只加载一次模型
        score = BERTScorer(lang="en", rescale_with_baseline=True)
    
        results = []
        for case in test_cases:
            prompt = case["prompt"]
            expected = case["expected_output"]
    
            # 获取模型输出
            output = get_model_response_qwen(prompt)
    
            # 计算评分
            em_score = exact_match_score(output, expected)
            bs_score = bertscore(score, output, expected)
            llm_score =llm_self_evaluate_deepseek(output, expected)
            print(f">>> 测试提示词:{prompt}\n>>> 精准匹配得分:{em_score}\n>>> bs Score F1得分:{bs_score}\n>>> LLM自评得分 {llm_score}\n")
    
            results.append({
                "prompt": prompt,
                "expected_output": expected,
                "model_output": output,
                "exact_match": em_score,
                "bert_score": bs_score,
                "llm_score": llm_score
            })
    
         # 保存结果
        df = pd.DataFrame(results)
    
        # 统计平均分
        avg_em = df["exact_match"].mean()
        avg_bs = df["bert_score"].mean()
        avg_llm = df["llm_score"].mean()
        print(f"\n📊 平均 Exact Match Score: {avg_em:.2f}")
        print(f"📊 平均 BERTScore: {avg_bs:.2f}")
        print(f"📊 平均 LLM 自评 Score: {avg_llm:.2f}")
    
    
        output_file = "test_results.csv"
        df.to_csv(output_file, index=False, encoding="utf-8-sig")
        print(f"\n✅ 测试完成,结果已保存至 {output_file}")

模型测试集配置文件

 [
        {
            "prompt": "如何制作香草冰淇淋?",
            "expected_output": "基础香草冰淇淋配方:2杯奶油、1杯牛奶、3/4杯糖、1汤匙香草精。混合所有材料,倒入冰淇淋机搅拌至凝固。"
        },
        {
            "prompt": "巧克力冰淇淋需要哪些材料?",
            "expected_output": "巧克力冰淇淋材料:2杯奶油、1/2杯可可粉、3/4杯糖、1茶匙香草精、少量盐。"
        },
        {
            "prompt": "草莓冰淇淋的制作步骤是什么?",
            "expected_output": "步骤:1. 将2杯新鲜草莓打碎;2. 混合1杯奶油、1杯牛奶、1/2杯糖;3. 加入草莓泥,倒入冰淇淋机搅拌。"
        },
        {
            "prompt": "无乳糖冰淇淋怎么做?",
            "expected_output": "替代方案:用椰奶或杏仁奶代替乳制品,加1/4杯龙舌兰糖浆调味,冷冻前加入1茶匙黄原胶防止冰晶。"
        },
        {
            "prompt": "抹茶冰淇淋的配方",
            "expected_output": "抹茶风味:2杯奶油、1汤匙抹茶粉、3/4杯糖、1/2杯牛奶。将抹茶粉与少量热水调匀后混合其他材料。"
        },
        {
            "prompt": "如何制作无需冰淇淋机的香蕉冰淇淋?",
            "expected_output": "简易版:将3根冷冻香蕉切块搅打成泥,加入1汤匙花生酱或可可粉调味,直接冷冻即可。"
        },
        {
            "prompt": "焦糖海盐冰淇淋的材料比例",
            "expected_output": "焦糖酱:1杯糖+1/4杯水煮至琥珀色,拌入1杯热奶油。基础材料:焦糖酱+2杯奶油+1/2茶匙海盐。"
        },
        {
            "prompt": "纯素芒果冰淇淋配方",
            "expected_output": "纯素版:2杯冷冻芒果、1罐椰奶、2汤匙枫糖浆,搅拌机打匀后冷冻,每30分钟搅拌一次防结块。"
        },
        {
            "prompt": "咖啡冰淇淋需要煮咖啡吗?",
            "expected_output": "可选:可直接用2汤匙速溶咖啡粉溶解于1汤匙热水,或替换为1/2杯冷却的浓缩咖啡。"
        },
        {
            "prompt": "低糖冰淇淋如何保持口感?",
            "expected_output": "建议:用1/4杯赤藓糖醇代替糖,加入1个蛋黄或1/2茶匙瓜尔胶增加绵密感。"
        },
        {
            "prompt": "榴莲冰淇淋会太腻吗?如何平衡?",
            "expected_output": "平衡方法:1杯榴莲肉+1杯椰奶+1汤匙柠檬汁,减少奶油用量以避免油腻。"
        },
        {
            "prompt": "薄荷巧克力碎片冰淇淋的巧克力如何添加?",
            "expected_output": "最后一步:在冰淇淋凝固前5分钟,加入1/2杯切碎的黑巧克力或巧克力豆。"
        },
        {
            "prompt": "无蛋冰淇淋如何增稠?",
            "expected_output": "替代方案:用1汤匙玉米淀粉或1/2杯奶粉代替蛋,加热至微稠后冷却。"
        },
        {
            "prompt": "朗姆酒葡萄干冰淇淋的酒渍步骤",
            "expected_output": "预处理:将1/2杯葡萄干浸泡在3汤匙朗姆酒中1小时,沥干后拌入冰淇淋基料。"
        },
        {
            "prompt": "如何制作彩虹层冰淇淋?",
            "expected_output": "分层法:分别调制不同颜色口味(如草莓/抹茶/蓝莓),每层冷冻1小时后再叠加下一层。"
        },
        {
            "prompt": "酸奶冰淇淋的酸味太重怎么办?",
            "expected_output": "调和:1杯希腊酸奶+1杯奶油+1/2杯蜂蜜,或加入1/4杯果酱降低酸度。"
        },
        {
            "prompt": "黑芝麻冰淇淋的芝麻如何处理?",
            "expected_output": "建议:将1/2杯黑芝麻炒香后磨粉,与1/4杯糖混合后再加入奶油中。"
        },
        {
            "prompt": "快速冰淇淋(30分钟)的方法",
            "expected_output": "速成法:将1杯奶油打发至软峰,拌入1罐炼乳和调味料,直接冷冻无需搅拌。"
        },
        {
            "prompt": "如何防止自制冰淇淋结冰渣?",
            "expected_output": "关键:1. 糖量不低于20%;2. 冷冻期间每30分钟搅拌一次;3. 添加1茶匙酒精(如伏特加)。"
        },
        {
            "prompt": "椰子冰淇淋需要椰肉吗?",
            "expected_output": "可选:使用1杯椰浆+1/2杯椰丝增加口感,或仅用椰奶简化。"
        },
        {
            "prompt": "红茶冰淇淋的茶叶用法",
            "expected_output": "建议:将2汤匙红茶茶叶浸泡在热奶油中10分钟,过滤后再混合其他材料。"
        },
        {
            "prompt": "儿童友好型冰淇淋如何减甜?",
            "expected_output": "调整:糖量减至1/4杯,增加1杯水果泥(如香蕉/芒果)天然甜味。"
        },
        {
            "prompt": "如何制作酱油焦糖冰淇淋?",
            "expected_output": "特色配方:在焦糖酱中加入1茶匙酱油提鲜,搭配2杯奶油和1/2茶匙姜粉。"
        },
        {
            "prompt": "无搅拌机版奥利奥冰淇淋",
            "expected_output": "懒人法:将1杯打碎的奥利奥饼干拌入2杯软化的香草冰淇淋,重新冷冻即可。"
        },
        {
            "prompt": "高蛋白冰淇淋配方",
            "expected_output": "健身版:2杯牛奶+1勺乳清蛋白粉+1根香蕉+1汤匙坚果酱,冰淇淋机搅拌。"
        },
        {
            "prompt": "蜂蜜代替糖的冰淇淋会太软吗?",
            "expected_output": "注意:蜂蜜含果糖易软化,建议替换不超过1/2糖量,或加1/4茶匙黄原胶稳定。"
        },
        {
            "prompt": "如何制作樱花风味冰淇淋?",
            "expected_output": "日式风味:1汤匙盐渍樱花(去盐)+1滴玫瑰水+粉色食用色素,基础奶油配方。"
        },
        {
            "prompt": "辣椒巧克力冰淇淋的辣度控制",
            "expected_output": "建议:1/8茶匙辣椒粉混合可可粉,或插入1根肉桂棒在奶油中加热后移除。"
        },
        {
            "prompt": "气泡感冰淇淋的秘诀",
            "expected_output": "方法:在冷冻前轻轻拌入1/2杯打发奶油或1/4杯苏打水(无味)。"
        },
        {
            "prompt": "如何用冷冻水果做冰淇淋?",
            "expected_output": "直接法:2杯冷冻混合莓果+1根香蕉+1/2杯酸奶,搅拌机打匀即食。"
        },
        {
            "prompt": "伯爵茶冰淇淋的茶香增强法",
            "expected_output": "技巧:将2个伯爵茶包剪开,茶叶直接加入奶油中加热后过滤。"
        },
        {
            "prompt": "无添加糖儿童冰淇淋",
            "expected_output": "天然甜味:2根熟香蕉+1杯冷冻芒果+1/2杯椰奶,依赖水果自身糖分。"
        },
        {
            "prompt": "如何制作大理石纹冰淇淋?",
            "expected_output": "艺术法:将巧克力酱或果酱螺旋状淋入半凝固的基料,用牙签轻划出纹路。"
        },
        {
            "prompt": "咖啡豆碎片冰淇淋的豆子处理",
            "expected_output": "建议:将1/4杯咖啡豆粗磨后烘烤,最后5分钟拌入冰淇淋中增加脆感。"
        },
        {
            "prompt": "百香果籽是否影响冰淇淋口感?",
            "expected_output": "可选:保留籽增加颗粒感,或过滤果汁后使用,搭配1/2杯椰子奶油平衡酸度。"
        },
        {
            "prompt": "如何制作低脂芒果冰淇淋?",
            "expected_output": "轻食版:2杯冷冻芒果+1杯脱脂酸奶+1汤匙蜂蜜,搅拌机打匀后冷冻。"
        },
        {
            "prompt": "白巧克力覆盆子冰淇淋的层次做法",
            "expected_output": "分层:白巧克力基料+覆盆子酱交替倒入容器,冷冻1小时后用叉子混出纹路。"
        },
        {
            "prompt": "如何用奶粉代替鲜奶?",
            "expected_output": "换算:1杯鲜奶≈1/4杯奶粉+1杯水,需增加1汤匙黄油弥补乳脂。"
        },
        {
            "prompt": "姜汁冰淇淋会太辛辣吗?",
            "expected_output": "调和:1汤匙新鲜姜汁+1/2茶匙肉桂粉+1杯焦糖酱,降低姜的刺激感。"
        },
        {
            "prompt": "无坚果版开心果冰淇淋",
            "expected_output": "替代:用1/2杯毛豆泥+1滴杏仁香精模拟风味,绿色用抹茶粉或菠菜汁。"
        },
        {
            "prompt": "如何制作啤酒风味冰淇淋?",
            "expected_output": "成人版:1杯黑啤煮沸浓缩至1/4杯,加2杯奶油和1/4杯红糖,酒精含量约1%。"
        },
        {
            "prompt": "薰衣草冰淇淋的香草平衡法",
            "expected_output": "注意:1茶匙干燥薰衣草需用纱布包裹热浸,避免过量产生肥皂味。"
        },
        {
            "prompt": "豆腐冰淇淋的凝固问题",
            "expected_output": "解决:1盒绢豆腐+2汤匙椰子油+1/4杯糖,需高速搅拌至完全顺滑。"
        },
        {
            "prompt": "如何制作黑森林蛋糕风味冰淇淋?",
            "expected_output": "复刻:巧克力基料+1/2杯酒渍樱桃+碎布朗尼块,顶部挤奶油装饰。"
        },
        {
            "prompt": "柠檬冰淇淋如何避免过酸?",
            "expected_output": "缓冲:1/4杯柠檬汁+1杯奶油+1/2杯炼乳,或加入1茶匙柠檬皮屑增香。"
        },
        {
            "prompt": "咸蛋黄冰淇淋的蛋黄处理",
            "expected_output": "关键:3颗蒸熟咸蛋黄碾碎过筛,与1/4杯融化的黄油先混合均匀。"
        },
        {
            "prompt": "如何制作跳跳糖冰淇淋?",
            "expected_output": "趣味版:香草冰淇淋最后1分钟搅拌时加入1包跳跳糖,立即食用保气泡感。"
        },
        {
            "prompt": "燕麦奶冰淇淋的粘稠度调整",
            "expected_output": "建议:1杯燕麦奶+1汤匙淀粉浆(玉米淀粉+水),加热至65℃增稠后冷却。"
        },
        {
            "prompt": "如何制作三色球冰淇淋?",
            "expected_output": "组合:分别制作巧克力/香草/草莓三种口味,用冰淇淋勺挖球并列装杯。"
        },
        {
            "prompt": "罗勒草莓冰淇淋的香草搭配",
            "expected_output": "创新:5片新鲜罗勒叶切碎+2杯草莓,搭配1杯奶油和1/2杯糖。"
        },
        {
            "prompt": "零下20℃冰箱的冰淇淋调整",
            "expected_output": "应对:糖量增加至1杯(防过度硬化),或每15分钟搅拌一次持续2小时。"
        }
    ]
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐