大模型系列:C-Eval中文大模型评测数据集介绍和实践

2024-06-16 01:04

本文主要是介绍大模型系列:C-Eval中文大模型评测数据集介绍和实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

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 = 0dataloader = 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 inzip(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] 取最后一个tokenlogits = 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大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段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扫描下方二维码免费领取🆓

这篇关于大模型系列:C-Eval中文大模型评测数据集介绍和实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065084

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd