前言
C-Eval是目前权威的中文AI大模型评测数据集之一,用于考察大模型的知识和推理能力,本篇对C-Eval数据集做简要介绍,并演示如何使用C-Eval对大模型进行评测。
内容摘要
- C-Eval整体结构概述
- C-Eval数据预览
- C-Eval的Prompt范式
- Python脚本实现C-Eval评估ChatGLM2-6B
C-Eval整体结构概述
C-Eval数据集由13948道多选题组成,涉及4个学科大类,52个学科小类,分别对应四个难度等级,如下所示。
C-EVAL的题目构成
- STEM:科学、技术、工程和数学教育,包含计算机、电气工程、化学、数学、物理等多个学科
- Social Science:社会科学,包含政治、地理、教育学、经济学、工商管理等多个学科
- Humanity:人文科学,包含法律、艺术、逻辑学、语文、历史等多个学科
- Other:其他,其他学科的汇总,包含环境、消防、税务、体育、医学等多个学科
共有四个难度等级,在图示中使用颜色标记区分,分别是初中(蓝色)、高中(绿色)、大学(黄色)和专业(红色),每个学科对应一个难度等级。
C-Eval数据预览
C-Eval的数据形式为4个选项的单选题,包含问题、选项值、答案、解释,形式预览如下。
C-Eval试题举例
C-Eval包含三份数据分别是dev,val和test,其中dev数据有答案并且带有答案解释,目的是用来构建CoT思维链的few-shot提示语,val数据集有答案,而test数据集没有答案,一般的,利用dev的few-shot在val数据做离线测试获得C-Eval评分,而在test数据集上提交答案给C-Eval官网获得最终得分。
数据集 | 问题+选项 | 答案 | 解释说明 |
---|---|---|---|
dev | ✓ | ✓ | ✓ |
val | ✓ | ✓ | × |
test | ✓ | × | × |
具体的数据在HuggingFace官网中Datasets下搜索ceval-exam既可进行预览,选择Subset为college_programming,数据分割为dev,预览5条大学编程试题。
C-Eval的HuggingFace数据预览
C-Eval的Prompt范式
分别有两种Prompt提示语方式来引导模型给出答案,一种是answer-only,一种是chain-of-thought,answer-only指的是不是用思维链,直接输出答案,而chain-of-thought采用思维链的方式生成中间过程再输出答案。每一种又可以采用zero-shot和few-shot两种形式,对于Base模型,由于没有经过指令微调,因此需要结合few-shot给到范例进行提示,而chat模型采用zero-shot直接对话既可。
few-shot思维链的提示方式举例
Python脚本实现C-Eval评估ChatGLM2-6B
本节采用ChatGLM2-6B项目下的evaluate_ceval.py脚本进行演示,目标是评估ChatGLM2-6B在C-Eval的val数据集下,每个学科的答题正确率和总体平均正确率。
数据已经提前处理为JSON格式,数据预览如下
{
"id":0,
"inputs_pretokenized":"蓝印花布是一种传统的民间纺织印染工艺品。蓝印花布印制方法始于____。\nA. 汉代\nB. 魏晋时期\nC. 唐代\nD. 宋代",
"choices_pretokenized":[
" A",
" B",
" C",
" D"
],
"label":0,
"targets_pretokenized":[
"A"
]
}
evaluate_ceval.py对val文件夹下所有科目进行遍历,分别对每个科目进行回答,读取试题的代码如下
accuracy_dict, count_dict = {}, {}
with torch.no_grad():
for entry in glob.glob("./CEval/CEval/val/**/*.jsonl", recursive=True):
dataset = []
with open(entry, encoding='utf-8') as file:
for line in file:
# {"id": 9, "inputs_pretokenized": "用户冲击负荷引起的系统频率变动一般不得超过____。\nA. ±0.5Hz\nB. ±0.4Hz\nC. ±0.3Hz\nD. ±0.2Hz", "choices_pretokenized": [" A", " B", " C", " D"], "label": 3, "targets_pretokenized": ["D"]}
dataset.append(json.loads(line))
correct = 0
dataloader = torch.utils.data.DataLoader(dataset, batch_size=8)
每个科目下的试题以8个为一个batch进行推理,将试题文本改造为固定的chat模型的Prompt模板
# 模板
def build_prompt(text):
return "[Round {}]\n\n问:{}\n\n答:".format(1, text)
然后进行分词编码,调用模型的generate方法进行推理,本次推理结果为回答的中间结果,并不直接映射到选项A、B、C、D。
for batch in tqdm(dataloader):
texts = batch["inputs_pretokenized"]
queries = [build_prompt(query) for query in texts]
inputs = tokenizer(queries, padding=True, return_tensors="pt", truncation=True, max_length=2048).to('cuda')
# TODO transformers的generate 批量推理
outputs = model.generate(**inputs, do_sample=False, max_new_tokens=512)
intermediate_outputs = []
for idx in range(len(outputs)):
output = outputs.tolist()[idx][len(inputs["input_ids"][idx]):]
response = tokenizer.decode(output)
intermediate_outputs.append(response)
采用贪婪模式最大推理512个token作为中间结果存储在intermediate_outputs中,以一条数据为例,原始问题的Prompt和推理的中间结果如下
试题prompt
大模型输出的中间过程
输出的中间过程表明模型对于问题有思考过程,并且初步给到了答案选D。紧接着我们把中间过程拼接到原始试题后面,并且在末尾加入提示模板extraction_prompt,让大模型基于问题和中间过程,最终输出选项答案。本质上该脚本采用的Prompt方案是zero-shot的CoT思维链。
extraction_prompt = '综上所述,ABCD中正确的选项是:'
answer_texts = [text + intermediate + "\n" + extraction_prompt for text, intermediate in
zip(texts, intermediate_outputs)]
最终的Prompt格式
重新分词编码之后再次给大模型推理,本次推理只需要拿到下一个token即可,通过return_last_logit参数拿到每个token的在词表的得分分布,通过下标-1拿到最后一个token
input_tokens = [build_prompt(answer_text) for answer_text in answer_texts]
inputs = tokenizer(input_tokens, padding=True, return_tensors="pt", truncation=True, max_length=2048).to('cuda:2')
# TODO return_last_logit 控制了只取最后一个词
outputs = model(**inputs, return_last_logit=True)
# TODO [2, 1, 65024] 取最后一个token
logits = outputs.logits[:, -1]
然后定位到A、B、C、D四个字符的得分,以下一个token在四个字符的概率分布作为依据,取最大者来获得答案
choices = ["A", "B", "C", "D"]
choice_tokens = [tokenizer.encode(choice, add_special_tokens=False)[0] for choice in choices]
logits = logits[:, choice_tokens]
preds = logits.argmax(dim=-1)
例如在该题目中,A、B、C、D的得分分别是9.4844,10.5469, 7.2500, 11.9375,因此大模型回答为D
>>> logits
tensor([[ 9.4844, 10.5469, 7.2500, 11.9375]], device='cuda:2',
dtype=torch.float16, grad_fn=<IndexBackward0>)
本质上ChatGLM2-6B的官方测试代码采用条件概率CLP的方式,考察概率的范围仅限于备选项标号所对应的 token,取其中概率最高的token所对应的选项为模型的推理结果,示意图如下
接下来和样本数据集中的正确选型进行比对即可获得正确率
correct += (preds.cpu() == batch["label"]).sum().item()
accuracy = correct / len(dataset) # TODO 正确率
accuracy_dict[entry] = accuracy
count_dict[entry] = len(dataset)
在求得每个科目的正确率之后,再统计一次全局的正确率,代码实现如下
acc_total, count_total = 0.0, 0
for key in accuracy_dict:
acc_total += accuracy_dict[key] * count_dict[key]
count_total += count_dict[key]
# TODO 平均正确率
print(acc_total / count_total)
在笔者的环境下最红ChatGLM2-6B的全局平均正确率为0.536,运行日志如下
./CEval/CEval/val/Other/clinical_medicine.jsonl 0.6818181818181818
100%|██████████| 7/7 [02:11<00:00, 18.83s/it]
0%| | 0/3 [00:00<?, ?it/s]./CEval/CEval/val/Other/tax_accountant.jsonl 0.3877551020408163
100%|██████████| 3/3 [00:41<00:00, 13.95s/it]
0%| | 0/7 [00:00<?, ?it/s]./CEval/CEval/val/Other/sports_science.jsonl 0.47368421052631576
100%|██████████| 7/7 [02:11<00:00, 18.73s/it]
./CEval/CEval/val/Other/accountant.jsonl 0.46938775510204084
0.5364041604754829
如何系统的去学习大模型LLM ?
作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。
但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料
包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
四、AI大模型商业化落地方案
阶段1:AI大模型时代的基础理解
- 目标:了解AI大模型的基本概念、发展历程和核心原理。
- 内容:
- L1.1 人工智能简述与大模型起源
- L1.2 大模型与通用人工智能
- L1.3 GPT模型的发展历程
- L1.4 模型工程
- L1.4.1 知识大模型
- L1.4.2 生产大模型
- L1.4.3 模型工程方法论
- L1.4.4 模型工程实践
- L1.5 GPT应用案例
阶段2:AI大模型API应用开发工程
- 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
- 内容:
- L2.1 API接口
- L2.1.1 OpenAI API接口
- L2.1.2 Python接口接入
- L2.1.3 BOT工具类框架
- L2.1.4 代码示例
- L2.2 Prompt框架
- L2.2.1 什么是Prompt
- L2.2.2 Prompt框架应用现状
- L2.2.3 基于GPTAS的Prompt框架
- L2.2.4 Prompt框架与Thought
- L2.2.5 Prompt框架与提示词
- L2.3 流水线工程
- L2.3.1 流水线工程的概念
- L2.3.2 流水线工程的优点
- L2.3.3 流水线工程的应用
- L2.4 总结与展望
阶段3:AI大模型应用架构实践
- 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
- 内容:
- L3.1 Agent模型框架
- L3.1.1 Agent模型框架的设计理念
- L3.1.2 Agent模型框架的核心组件
- L3.1.3 Agent模型框架的实现细节
- L3.2 MetaGPT
- L3.2.1 MetaGPT的基本概念
- L3.2.2 MetaGPT的工作原理
- L3.2.3 MetaGPT的应用场景
- L3.3 ChatGLM
- L3.3.1 ChatGLM的特点
- L3.3.2 ChatGLM的开发环境
- L3.3.3 ChatGLM的使用示例
- L3.4 LLAMA
- L3.4.1 LLAMA的特点
- L3.4.2 LLAMA的开发环境
- L3.4.3 LLAMA的使用示例
- L3.5 其他大模型介绍
阶段4:AI大模型私有化部署
- 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
- 内容:
- L4.1 模型私有化部署概述
- L4.2 模型私有化部署的关键技术
- L4.3 模型私有化部署的实施步骤
- L4.4 模型私有化部署的应用场景
学习计划:
- 阶段1:1-2个月,建立AI大模型的基础知识体系。
- 阶段2:2-3个月,专注于API应用开发能力的提升。
- 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
- 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓