【自动化】LLM大模型自动化评测方法(草稿版本,点赞收藏多的话再出个结合实际项目的简化版本)
·
一、简介
我所了解模型评测的大概有以下两种方法
- 分数导向: 准备一个庞大全面的测试集,模型答题后按准确率**,**F1分数等各类指标打分。
- 能力导向: 特定应用场景下针对模型的各项能力来设计测试集,模型答题后按测试集的权重占比计算评分。
二、使用Python搭建LLM模型自评自动化测试环境:
评测指标一:精确匹配指标(EM)
-
计算方法:
模型输出结果 == 模型预期结果 输出 1;
模型输出结果 != 模型预期结果 输出 0; -
基本代码实现
# 使用前需要先用正则获取预期结果与模型输出结果中的量词; # 例如 2杯奶油,一杯牛奶这些参数,评测生成的结果是否合理,假设生成的是5杯奶油,按我这规格是直接打0分。 # 正常项目中这些参数是单独分开的不需要抓取 def exact_match_score(pred, true): """计算精确匹配得分 pred: 模型输出结果 true: 模型预期结果 """ return 1 if pred.strip().lower() == true.strip().lower() else 0
评测指标二: BERTScore: 计算模型输出结果与模型预期结果文本之间的相似性 。
- 基本代码实现
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小时。"
}
]
更多推荐


所有评论(0)