PaddleNLP 评测指南:C-Eval 中文大模型评测脚本的完整使用与源码解析
人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载本文围绕 PaddleNLP 仓库中 slm/examples/benchmark/ceval/README.md 提供的 C-Eval 评测脚本展开覆盖从数据下载、目录组织到运行预测脚本的全部操作步骤并深入 eval.py、model_evaluator.py 的源码讲解约束解码、正则答案抽取、few-shot/CoT 提示构造等底层机制帮助读者独立完成中文大模型在 C-Eval 上的标准评测并正确解读输出结果。一、评测数据集准备C-Eval 是一个面向中文的学科能力评测基准涵盖 52 个学科subject按 subject_mapping.json 划分为 STEM理科、Social Science社科、Humanities人文学与 Other其他四大类。评测脚本修改自 ymcui/Chinese-LLaMA-Alpaca 项目文件头部注释见 eval.py评测口径与该社区实践保持一致。首先需要从 C-Eval 官方指定路径下载评测数据集并解压至data文件夹wget https://modelscope.oss-cn-beijing.aliyuncs.com/open_data/c-eval/ceval-exam.zip unzip ceval-exam.zip -d data下载完成后需要将data文件夹放置到评测脚本所在目录下仓库中为 slm/examples/benchmark/ceval/README 中称为scripts/ceval目录。从 eval.py 的主循环可以看到脚本按如下相对路径读取数据subject_mapping.json与脚本同目录脚本启动时会断言其存在data/val/{subject}_val.csv默认评测的验证集data/test/{subject}_test.csv--do_test True时评测的测试集data/dev/{subject}_dev.csv--few_shot True时用于构造 few-shot 示例。subject_list直接由data/val目录下的*_val.csv文件列表动态生成因此data目录中缺少哪个学科的 CSV评测范围就会相应缩小。二、运行预测脚本与参数说明进入脚本目录后运行cd scripts/ceval python eval.py \ --model_name_or_path /path/to/your/model \ --cot False \ --few_shot False \ --with_prompt True \ --constrained_decoding True \ --temperature 0.2 \ --n_times 1 \ --ntrain 5 \ --do_save_csv False \ --do_test False \ --output_dir ${output_path} \结合 eval.py 中argparse的定义含各参数默认值完整参数说明如下参数类型/取值默认值说明--model_name_or_pathstr必填待评测模型所在目录合并 LoRA 后的 HF 格式模型--cotFalse/TrueFalse是否使用 chain-of-thought思维链示例格式--few_shotFalse/TrueTrue是否使用 few-shotFalse时ntrain不起作用--ntrain别名-kint5few-shot 实例数量5-shot 即ntrain5--with_promptFalse/TrueFalse模型输入是否包含针对 Alpaca 模型的指令模板--constrained_decodingFalse/TrueTrue答案抽取方案True走 logits 约束解码False走正则表达式抽取详见第四节--temperaturefloat0.2模型解码时的温度透传给ModelEvaluator并写入生成配置--n_timesint1评测重复次数在output_dir下生成take0~take{n_times-1}子目录--do_save_csvFalse/TrueFalse是否将模型生成结果、提取的答案等内容保存为 csv 文件--output_dirstr必填评测结果的输出路径--do_testFalse/TrueFalseFalse时在 val 集上测试本地可对照标准答案计算准确率True时在 test 集上测试盲测答案记为NA用于按官方提交规范产出submission.json两个值得注意的实现细节约束解码强制单轮当--constrained_decoding True时eval.py 中执行args.n_times max(args.n_times, 1)即按 logits 取最大值的约束解码是确定性过程重复多次没有意义代码会自动把次数钳制为 1。模型加载方式model_evaluator.py 中ModelEvaluator通过paddlenlp.transformers的AutoTokenizer与AutoModelForCausalLM以float16精度加载模型并额外编码出A/B/C/D四个 token 的 idA_id~D_id为约束解码方案做准备。因此要求模型路径必须是 PaddleNLP 可加载的 HF 格式权重目录。三、评测主流程eval.py 的实现eval.py 中main()的执行流程如下读取subject_mapping.json遍历data/val目录动态构建subject_list根据--do_test决定读取data/val/{subject}_val.csv还是data/test/{subject}_test.csv作为评测集开启 few-shot 时同时读取对应的dev集对每个学科调用evaluator.eval_subject(...)传入few_shot、cot、with_prompt、constrained_decoding等开关返回该学科的准确率correct_ratio与逐题答案answers将全部学科答案写入submission.json并按subject_mapping.json中每个学科的第三项类别归属聚合出 STEM / Social Science / Humanities / Other 四个大类的num与correct计算总体平均后把每个学科的score/num/correct、四大类结果和All汇总字段一并写入summary.json。n_times次评测由 eval.py 最外层的for i in range(args.n_times)驱动每次调用main(..., takei)结果分别落在take{i}子目录中便于对比多次解码采样解码开启时的波动。四、两种答案抽取方案C-Eval 的标准答案是A/B/C/D选项。--constrained_decoding参数控制两种不同的答案抽取策略对应 model_evaluator.py 中eval_subject的分支逻辑方案一constrained_decodingTruelogits 约束解码不进行自回归生成而是只前向一次取最后一个位置的 logits直接比较A、B、C、D四个 token 的得分并取 argmaxwith paddle.no_grad(): logits self.model(**inputs)[0][0, -1, :] choices_logits logits[[self.A_id, self.B_id, self.C_id, self.D_id]].numpy() assert not (np.any(np.isinf(choices_logits)) or np.any(np.isnan(choices_logits))) ans {0: A, 1: B, 2: C, 3: D}[np.argmax(choices_logits)]这种方式结果确定、速度快是官方推荐的评测模式其中的 NaN/Inf 断言用于尽早暴露权重或输入异常。方案二constrained_decodingFalse正则表达式抽取此时调用self.model.generate(...)进行完整自回归生成再由 extract_answer 按以下优先级从生成文本中抽取答案先匹配思维链结尾所以答案是(.?)。仅当匹配结果本身是 A~D 之一时生效依次尝试 8 个中文答案模板正则如答案是([ABCD])、选项([ABCD])正确、([ABCD])是正确的、选择([ABCD])等若都未命中取生成文本中第一个出现的[ABCD]字符再退化为在生成文本中查找四个选项内容文本re.escape后按|组合命中哪个选项内容即判为该选项全部失败时随机返回一个A~D。可以推断非约束解码模式适合评估模型自然输出是否可被解析其分数通常不高于约束解码模式因为正则抽取存在漏匹配风险。五、提示构造few-shot 与 Chain-of-Thought问题格式化format_example 负责把一行 CSV 数据拼成标准文本基础结构为题干 每个选项一行{题干} A. {选项A内容} B. {选项B内容} C. {选项C内容} D. {选项D内容} 答案在此基础上按开关变化cotTrue且作为 few-shot 示例时include_answerTrue答案部分扩展为答案让我们一步一步思考\n{explanation}\n所以答案是{answer}。利用 C-Eval 数据集中的explanation列构造思维链示例with_promptFalse默认时待评测题结尾为答案CoT 模式下为答案让我们一步一步思考\n1.即假设模型已被指令微调过、可直接接答案继续作答with_promptTrue时待评测题结尾改为答案是什么CoT 模式下为答案是什么让我们一步一步思考\n1.即针对 Alpaca 类模型的指令模板风格。few-shot 提示组装generate_few_shot_prompt 以固定引言开头以下是中国关于{subject}考试的单项选择题请选出其中的正确答案。随后从data/dev集取前k条k即--ntrain传-1时取 dev 集全部带答案的示例依次拼接最终输入为history question。基类 Evaluator 还定义了normalize_answer/exact_match等标准答案比对工具用于答案归一化去标点、统一空白、转小写后精确匹配。六、生成参数源码级补充非约束解码路径使用的生成配置在 model_evaluator.py 中是硬编码的命令行仅能调整其中temperatureself.generation_config dict( temperaturetemperature, # 由 --temperature 传入默认 0.2 top_k40, top_p0.9, do_sampleTrue, num_beams1, repetition_penalty1.1, max_new_tokens20, )即采样开启do_sampleTrue、top-k40、top-p0.9、重复惩罚 1.1、最多新生成 20 个 token。这也解释了为什么constrained_decodingFalse时才有必要用n_times重复评测——采样解码每次结果可能不同。七、评测输出解读评测完成后在output_dir下生成take*目录*为0至n_times-1的整数每个目录对应一次完整解码的结果内含submission.json按官方提交规范组织的答案文件结构为学科名 - 题号 - 选项例如{ computer_network: { 0: A, 1: B, ... }, marxism: { 0: B, 1: A, ... }, ... }当--do_test True时由于 test 集无标准答案model_evaluator.py 中answers被置为全NA该文件即为可提交到官方评测的盲测答案summary.json包含 52 个学科、4 个大类STEM / Social Science / Humanities / Other与总体平均的评测结果。每个条目的字段含义为score准确率、num测试样本条数、correct正确数量。文件末尾的All字段显示总体平均效果例如All: { score: 0.36701337295690933, num: 1346, correct: 494.0 }csv 文件可选当--do_save_csv True时每个学科额外输出一个保存模型生成结果model_output列与逐题正误correctness列的 csv 文件model_evaluator.py52 个学科共 52 个 csv便于人工抽查模型输出质量。八、实践建议与注意事项本脚本评测的是静态权重model_name_or_path指向的应为合并 LoRA 后的 HF 格式模型目录不能是未合并的 adapter 目录默认在 val 集上评测--do_test False本地即可对照标准答案得到分数需要产出官方口径的 test 集提交文件时才开--do_test True此时summary.json中的准确率仅作参考答案均为 NA正确数恒为 0约束解码--constrained_decoding True依赖模型词表中A~D为独立单 tokenModelEvaluator构造时用tokenizer.encode(A, add_special_tokensFalse)提取 id若使用非常规分词器需自行确认该假设成立脚本以相对路径读取data/与subject_mapping.json因此必须在 slm/examples/benchmark/ceval/ 目录内执行eval.py模型以float16加载显存需求随模型规模上升大模型评测建议评估单卡显存是否充足。配套文件索引README.md、eval.py、model_evaluator.py、evaluator.py、subject_mapping.json。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐如何使用C-Eval全面测评中文基础模型的终极指南如何使用C Eval全面测评中文基础模型的终极指南 C Eval是一个面向基础模型的中文评估套件旨在全面检验模型在跨学科领域的理解能力。该项目总计包含139大模型人工智能模型评测数据集C-Eval中文AI模型评估套件使用指南C Eval中文AI模型评估套件使用指南 C Eval是一个面向基础模型的中文评估套件旨在全面检验模型在跨学科领域的理解能力。该项目总计包含13948道多选题大模型人工智能模型评测数据集终极指南如何使用C-Eval评估大语言模型的中文能力终极指南如何使用C Eval评估大语言模型的中文能力 C Eval是一个全面的中文评估套件专为基础模型设计涵盖52个学科和四个难度级别共13948道选择大模型人工智能模型评测数据集上一篇Meltano性能优化终极清单提升ELT管道效率下一篇htmlq 安全合规GDPR 数据处理的最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考