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

news2024/11/24 9:50:26

前言

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大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1826892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第九十一周周报

学习目标&#xff1a; 论文 学习时间&#xff1a; 2024.6.8-2024.6.14 学习产出&#xff1a; 一、Consistency Models 扩散模型依赖于迭代采样过程导致生成缓慢&#xff0c;由此提出一致性模型&#xff0c;其可以直接将噪声映射至数据从而生成高质量样别。 根据给定的OD…

Kotlin编程实践-【Java如何调用Kotlin中带默认值参数的函数】

问题 如果你有一个带有默认参数值的 Kotlin 函数&#xff0c;如何从 Java 调用它而无须为每个参数显式指定值&#xff1f; 方案 为函数添加注解JvmOverloads。 也就是为Java添加重载方法&#xff0c;这样Java调用Kotlin的方法时就不用传递全部的参数了。 示例 在 Kotlin …

【数学】什么是傅里叶级数与傅里叶变换?

傅里叶级数与傅里叶变换 背景 傅里叶级数和傅里叶变换是数学和工程领域中的重要工具&#xff0c;特别是在信号处理、图像处理和物理学中。傅里叶级数用于将周期函数表示为正弦和余弦函数的和&#xff0c;而傅里叶变换用于将任意函数表示为频率的函数。 公式 傅里叶级数&…

本地GPT-window平台 搭建ChatGLM3-6B

一 ChatGLM-6B 介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;新一代开源模型 ChatGLM3-6B 已发布&#xff0c;拥有10B以下最强的基础模型&#xff0c;支持工具调用&#xff08;Function Call&#xff09;、代码执行&#xff08;Code Interpreter&…

Linux Centos 环境下搭建RocketMq集群(双主双从)

1、下载rocketmq的包 下载 | RocketMQ 2、配置环境变量 1、编辑环境变量文件&#xff1a;vim /etc/profile2、加入如下配置&#xff1a; #rocketmq 4.9.8 ROCKETMQ_HOME/home/rocketmq/rocketmq-4.9.8 export PATH${ROCKETMQ_HOME}/bin:${PATH}3、刷新配置&#xff1a;source…

Apollo9.0 PNC源码学习之Control模块(三)—— 基于双环PID的纵向控制

本文将对Apollo的纵向控制器进行讲解&#xff0c;看完本文&#xff0c;你将会对百度Apollo的纵向控制有更深的理解 前面文章&#xff1a; Apollo9.0 PNC源码学习之Control模块&#xff08;一&#xff09; Apollo9.0 PNC源码学习之Control模块&#xff08;二&#xff09; 1 纵向…

SSM母婴用品交流系统-计算机毕业设计源码05772

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 母婴用品交流系统&#xff0c;主要的模块包括查看首页、轮播图管理、通知公告管理、资源管理&#xff08;母婴资讯、资讯分类&#xff09;、交…

Spring 系统架构图

Spring 系统架构图 Spring Framework是Spring生态圈中最基础的项目&#xff0c;是其他项目的根基。 Spring Framework的发展也经历了很多版本的变更&#xff0c;每个版本都有相应的调整 Spring Framework的5版本目前没有最新的架构图&#xff0c;而最新的是4版本&#xff0c;…

Unity2D计算两个物体的距离

1.首先新建一个场景并添加2个物体 2.创建一个脚本并编写代码 using UnityEngine;public class text2: MonoBehaviour {public GameObject gameObject1; // 第一个物体public GameObject gameObject2; // 第二个物体void Update(){// 计算两个物体之间的距离float distance Vec…

构建旧物回收系统的决策支持系统

内容概要&#xff1a; 在旧物回收系统中&#xff0c;构建一个有效的决策支持系统对于提高管理效率、优化资源配置具有重要意义。本文将探讨如何构建旧物回收系统的决策支持系统&#xff0c;并分析其如何辅助管理者做出更科学的决策。 一、决策支持系统的定义与功能 决策支持…

浔川身份证号码查询——浔川python科技社

Python获取身份证信息 公民身份号码是每个公民唯一的、终身不变的身份代码&#xff0c;由公安机关按照公民身份号码国家标准编制。每一个居民只能拥有一个唯一的身份证&#xff0c;它是用于证明持有人身份的一种法定证件。 身份证包含了个人的一些重要信息&#xff0c;比如&am…

Sky Master ULTIMATE Volumetric Skies Clouds Weather

该系统包含行业级优化的体积云、海洋系统、GI 代理,以及用于全局光照的优化 SEGI 和基于物理的天空渲染系统,且带有大气散射。 Sky Manager 可提供自动或按需的日/夜循环以及平滑的天气过渡。 Skybox 模式提供了与 Unity 及其功能(IBLGI、GI、Skybox)的完整集成。 先进的粒…

失眠焦虑?这些维生素或许能帮你找回好眠!

&#x1f4a4; 失眠、焦虑&#xff0c;是现代生活中不少人都可能遇到的问题。长期的失眠与焦虑&#xff0c;不仅影响身体健康&#xff0c;更会对精神状态造成不小的冲击。其实&#xff0c;除了调整作息和放松心情&#xff0c;适当的维生素补充也可能有助于改善这些症状。 &…

业务动态校验框架应用实现

目录 一、业务背景 二、配置内容展示 三、商品动态配置内容展示 &#xff08;一&#xff09;商品spu校验信息数据 &#xff08;二&#xff09;商品sku校验信息数据 &#xff08;三&#xff09;组包商品校验信息数据 &#xff08;四&#xff09;商品数据校验数据持有者 &…

OpenWrt配置单臂路由模式

正文共&#xff1a;888 字 24 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面&#xff0c;我们成功将OpenWrt部署到了x86的ESXi服务器中&#xff08;将OpenWrt部署在x86服务器上&#xff09;&#xff0c;但是我们没有设置root密码&#xff0c;非常不安全。赶紧在“system”…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 特惠寿司(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 特惠寿司(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

Maven 项目的创建(导入依赖、仓库、maven的配置、配置国内源、以及可能遇到的问题)

一、创建Maven项目 使用的编译软件&#xff1a;idea 软件版本&#xff1a; 社区版 2021.1 - 2022.4&#xff08;为什么选择这个版本&#xff0c;因为只有这个版本里有一些插件是可以安装的&#xff09; 专业版不限制&#xff08;专业版功能是最全的&#xff0c;但是收费&am…

随机森林算法进行预测(+调参+变量重要性)--血友病计数数据

1.读取数据 所使用的数据是血友病数据&#xff0c;如有需要&#xff0c;可在主页资源处获取&#xff0c;数据信息如下&#xff1a; import pandas as pd import numpy as np hemophilia pd.read_csv(D:/my_files/data.csv) #读取数据 2.数据预处理 在使用机器学习方法时&…

模型量化 剪枝bevfusion

量化 剪枝 shared mem 只在block内共享&#xff0c;device glob mem能够所有线程共享

ChatGPT真实的上下文长度是多少?不是128K!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之…