🤔️ 你是不是也经常听到“大模型”、“LLM”这些高大上的词汇,感觉它们就像“别人家的孩子”,聪明又强大,但又离自己的生活很遥远?
别担心!今天这篇文章,就用大白话给你讲清楚,大模型到底跟你有什么关系,以及,如何像搭乐高积木一样,亲手搭建一个属于自己的大模型“评测实验室”!
1. 大模型:你的超级“外挂”! 🎮
想象一下,你是一位游戏玩家。
* 普通玩家:你辛辛苦苦打怪升级,一点点积累经验。
* 开了挂的玩家:直接拥有无限金币、顶级装备,一路畅通无阻!
大模型,就是你职场、学习上的“超级外挂”。它可以帮你:
* 写文案、写报告:再也不用绞尽脑汁,灵感源源不断!✍️
* 查资料、做分析:海量信息秒级处理,效率提升N倍!🚀
* 学外语、练编程:个性化辅导,进步神速!👨🏫
* 甚至...帮你出谋划策、排忧解难:简直是你的全能AI军师!🤩
总之,掌握大模型,就相当于掌握了未来职场的“通关秘籍”! 你还在等什么?
2. 为什么要“评测”大模型? 🏆
现在,市面上的大模型越来越多,就像手机一样,各种品牌、各种型号,看得人眼花缭乱。😵💫
那么问题来了:
* 哪个模型更适合我? 🤷
* 怎么知道它是不是真的好用? 🤔
* 万一它“胡说八道”怎么办? 😨
这时候,就需要“评测”登场了!
评测,就像一场“大模型奥运会”,让不同的模型在同样的“赛道”上比拼,看看谁更厉害。🏅️
通过评测,我们可以:
* 选出最适合自己的模型:就像挑选最适合自己的手机一样!
* 了解模型的优缺点:知己知彼,才能更好地使用它!
* 避免被模型“忽悠”:确保得到的信息准确可靠!
3. TinyEval:你的专属“大模型评测实验室”! 🔬
现在,你已经明白了学习和应用大模型的重要性。接下来,就让我们一起动手,搭建一个属于自己的大模型评测框架——TinyEval!
这个框架,就像一个“迷你实验室”,包含了评测大模型的核心功能。你可以用它来测试模型在各种任务上的表现,比如:
* 生成式任务:让模型写文章、写诗、写代码...
* 判别式任务:让模型判断对错、识别真假...
* 选择式任务:让模型做选择题...
TinyEval 的目标,就是让你轻松理解大模型评测的原理,并能够亲手实践!
4. 项目 Motivation:解决你的困惑! 💡
初学大模型,你是不是也有这些疑问:
* 😵💫 各种评测指标,看得我头晕!
* 🤔 除了 ROUGE、BLUE,还有别的评测方法吗?
* 😨 模型输出一大堆,怎么判断它选对了没?
* 😭 除了 HumanEval,还有什么方法可以评估我的个性化任务?
TinyEval,就是为了解决这些问题而生的!
5. Eval 流程:像搭积木一样简单! 🧱
大模型评测,其实并不神秘。它的基本流程,就像搭积木一样:
1. 选择合适的“积木块”(评测指标):不同的任务,需要不同的指标。
2. 设计“图纸”(引导 Prompt):告诉模型要做什么。
3. “拼装”模型输出:从模型的回答中提取关键信息。
4. “验收”成果:计算得分,评估模型表现。
TinyEval 仓库里的各个模块,就对应着这些步骤。
6. 支持的数据集和指标:丰富多样! 📚
TinyEval 目前支持以下数据集和指标:
| 数据集 | 任务类型 | 指标 |
| -------------- | -------- | -------- |
| multi\_news | 长文本问答 | ROUGE |
| multifieldqa\_zh | 短文本问答 | F1 |
| trec | 生成式选择 | accuracy |
未来,我们还会不断更新,支持更多的数据集和指标!
7. 评测过程详解:打破砂锅问到底! 🧐
* 生成式的 F1 值? 😮
* 别惊讶!F1 值不仅可以用于分类,还可以用于评估生成文本的质量。
* 我们会把模型的回答和标准答案都“切”成一个个词语,然后比较它们之间的重合度。
* 生成式也能算 accuracy? 😲
* 当然!如果模型能从多个选项中选出正确答案,我们就认为它“答对了”。
* 我们会统计模型答对的题目数量,然后计算 accuracy。
8. 代码实战:一步步教你搭建! 💻
import os
from datasets import load_dataset
from transformers import AutoTokenizer, LlamaTokenizer, LlamaForCausalLM, AutoModelForCausalLM
import torch
import json
from tqdm import tqdm
import numpy as np
import random
import argparse
from Eval.model.LLM import internlm2Chat, Qwen2Chat
def seed_everything(seed):
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
np.random.seed(seed)
random.seed(seed)
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True
torch.cuda.manual_seed_all(seed)
def parse_args(args=None):
parser = argparse.ArgumentParser()
parser.add_argument('--model', type=str, default='Qwen2')
return parser.parse_args(args)
if __name__ == '__main__':
seed_everything(42)
args = parse_args()
model2path = json.load(open("Eval/config/model2path.json", "r"))
model2maxlen = json.load(open("Eval/config/model2maxlen.json", "r"))
adapter2path = json.load(open("Eval/config/adapter2path.json", "r"))
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model_name = args.model
# define your model
max_length = model2maxlen[model_name]
# datasets = ["multi_news", "multifieldqa_zh", "trec"]
datasets = ['GAOKAO_math']
dataset2prompt = json.load(open("Eval/config/dataset2prompt.json", "r"))
dataset2maxlen = json.load(open("Eval/config/dataset2maxlen.json", "r"))
pred_model = Qwen2Chat(model2path[model_name], model_name, adapter2path[model_name])
# predict on each dataset
if not os.path.exists("pred"):
os.makedirs("pred")
for dataset in datasets:
data = load_dataset('json', data_files=f'Eval/dataset/{dataset}.jsonl',split='train')
if not os.path.exists(f"Eval/pred/{model_name}"):
os.makedirs(f"Eval/pred/{model_name}")
out_path = f"Eval/pred/{model_name}/{dataset}.jsonl"
if os.path.isfile(out_path):
os.remove(out_path)
prompt_format = dataset2prompt.get(dataset, dataset2prompt.get('custom_zh'))
max_gen = dataset2maxlen.get(dataset, dataset2maxlen.get('custom_zh'))
data_all = [data_sample for data_sample in data]
pred_model.get_pred(data, max_length, max_gen, prompt_format, device, out_path)
别怕代码!我们会手把手教你,如何使用 TinyEval 进行模型推理和结果评测。
核心代码解读:
* `BaseLLM` 类:
* 封装了模型的加载、推理等功能。
* 你可以根据自己的需要,修改或扩展这个类。
* `get_pred` 函数:
* 负责模型的推理过程。
* 关键点:截断策略!
* 为什么要截断?因为模型处理的文本长度有限!
* 怎么截断?保留Prompt的首尾部分,对中间进行截断,最大限度保留信息!
* `f1_score` 函数:
* 计算 F1 值的核心代码。
* 原理:比较模型输出和标准答案的“词语重合度”。
9. 思考:没有最好,只有更好! 🚀
TinyEval 提供的,只是一些基础的评测指标。
* 局限性:
* 现有指标可能无法完全反映模型的真实水平。
* 例如,如果模型只是“鹦鹉学舌”,或者“投机取巧”,现有指标可能无法发现。
* 未来方向:
* 学术界一直在努力研究更准确、更全面的评测方法。
* TinyEval 也会及时跟进,为大家提供更先进的评测工具!
10. 立即行动:运行 TinyEval! 🏃
1. 获取推理结果:
python inference.py
2. 获取评测结果:
python eval.py
支持的指标:
* F1 score
* ROUGE/BLUE 系列
* Accuracy
11. 支持自定义评测:打造你的专属标准! 🛠️
如果你有自己的数据集,也可以使用 TinyEval 进行评测!
只需按照指定格式准备数据,即可轻松实现自定义评测!
还在等什么?快来加入 TinyEval 的大家庭,一起探索大模型的奥秘吧! 🤝
(记得点赞、评论、分享哦!你的支持是我们前进的动力!) 👍💬↗️