【LLM】手搓一个LLM Eval

news2024/10/2 5:32:31

文章目录

  • 手搓一个LLM Eval
    • 项目的动机
    • 评测流程概述
    • 支持的数据集与评测指标
    • 详细的评测过程
      • 1. 生成式任务的F1评分
        • 1.1 模型推理
        • 1.2 结果评测
      • 2. 思考
    • 🚀 如何运行
      • 1. 运行模型推理
      • 2. 运行评测
    • 支持的评测指标
    • 支持自定义评测
    • 学习总结

手搓一个LLM Eval

TinyEval:简单的LLM评测框架
github项目地址:https://github.com/datawhalechina/tiny-universe/blob/main/content/TinyEval/readme.md

项目的动机

刚进入LLM领域时,你可能会遇到一些困惑:

  1. 各种评测指标五花八门,让人眼花缭乱。
  2. 除了rougebleu外,不知道该如何选择其他评测指标。
  3. 想让LLM做选择题,结果模型输出了一堆内容,如何评估它的选择能力?
  4. 各种模型和领域任务千差万别,除了human_eval,如何为个性化任务提供有说服力的定量性能指标?

本项目就是为了解决这些问题的!

评测流程概述

评测任务的基础流程如下图所示:

在这里插入图片描述

  1. 根据数据集任务类型,确定合适的评测指标。
  2. 根据数据形式,编写模型引导prompt
  3. 根据模型初步预测结果,设计合理的抽取方式。
  4. 对预测结果与标准答案进行评分。

上述步骤覆盖了TinyEval仓库的所有模块。

支持的数据集与评测指标

相关数据集可以在./Eval/dataset/找到,目前已有的数据集及类型如下:

数据集名称类型评测指标
multi_news长文本问答Rouge
multifieldqa_zh短文本问答F1
trec生成式选择题Accuracy

你可以根据任务需求探索这些数据集,接下来我会为大家详细讲解评测步骤!

详细的评测过程

可能你会有这样的疑问:

  • 为什么F1能用于生成式任务?
  • accuracy不是用来评估分类任务的吗?怎么用在生成式任务里?

下面我们一起来解答这些问题。如果你已经熟悉基础知识,可以先行探索相关代码./Eval/metrics.py。

1. 生成式任务的F1评分

1.1 模型推理

对于评测数据集,首先需要构造引导性prompt,用于引导LLM生成我们期望的答案。大多数已有的数据集都提供了相应的prompt,但在自定义数据集时,可以自行设计。以multifieldqa_zh为例,它的prompt如下:

阅读以下文字并用中文简短回答:\n\n{context}\n\n现在请基于上面的文章回答下面的问题,只告诉我答案,不要输出任何其他字词。\n\n问题:{input}\n回答:

接下来,设置模型的输入长度。通常可以设置为模型的最大长度,通常在模型的config.json文件中查询。例如,此处我们将其设为2048用于演示。

然后创建模型类,灵活支持不同模型的组装:

class BaseLLM:
    def __init__(self, path: str, model_name: str) -> None:
        self.path = path
        self.model_name = model_name

    def build_chat(self, tokenizer: str, prompt: str, model_name: str):
        pass

    def load_model_and_tokenizer(self, path: str, model_name: str, device):
        pass

    def post_process(self, response: str, model_name: str):
        pass

    def get_pred(self, data: list, max_length: int, max_gen: int, prompt_format: str, device, out_path: str):
        pass

其中重点是get_pred函数,它处理推理过程,截断策略尤为重要,确保保留输入两端的关键信息:

def get_pred(self, data, max_length, max_gen, prompt_format, device, out_path):
    model, tokenizer = self.load_model_and_tokenizer(self.path, device)
    for json_obj in tqdm(data):
        prompt = prompt_format.format(**json_obj)
        tokenized_prompt = tokenizer(prompt, truncation=False, return_tensors="pt").input_ids[0]
        if len(tokenized_prompt) > max_length:
            half = int(max_length/2)
            prompt = tokenizer.decode(tokenized_prompt[:half], skip_special_tokens=True)+tokenizer.decode(tokenized_prompt[-half:], skip_special_tokens=True)

        prompt = self.build_chat(prompt)

        input = tokenizer(prompt, truncation=False, return_tensors="pt").to(device)
        output = model.generate(
            **input,
            max_new_tokens=max_gen,
            do_sample=False,
            temperature=1.0,
            eos_token_id=[tokenizer.eos_token_id],
        )[0]
        
        pred = tokenizer.decode(output[context_length:], skip_special_tokens=True)
        pred = self.post_process(pred)
        
        with open(out_path, "a", encoding="utf-8") as f:
            json.dump({"pred": pred, "answers": json_obj["answers"], "all_classes": json_obj["all_classes"], "length": json_obj["length"]}, f, ensure_ascii=False)
            f.write('\n')
1.2 结果评测

让我们以一个例子为例:

"pred": "57081.86元", "answers": "人民币57081.86元。"

经过数据清洗后,预测结果和答案会被分词,然后通过F1评分函数进行评估:

def f1_score(prediction, ground_truth, **kwargs):
    common = Counter(prediction) & Counter(ground_truth)
    num_same = sum(common.values())
    if num_same == 0:
        return 0
    precision = 1.0 * num_same / len(prediction)
    recall = 1.0 * num_same / len(ground_truth)
    f1 = (2 * precision * recall) / (precision + recall)
    return f1

最终计算F1得分,并取平均值作为任务的总得分。

2. 思考

当前的评分指标存在局限性,例如如果答案是"厦门大学",而预测是"厦大"或"不是厦门大学",F1分数无法精确反映模型的表现。

提高评测指标的准确性是学术界的持续目标,本项目也会随着更先进的评测策略不断更新,欢迎贡献PR!

🚀 如何运行

1. 运行模型推理

python inference.py

2. 运行评测

python eval.py

支持的评测指标

  1. F1 Score
  2. Rouge系列/Blue系列
  3. Accuracy

支持自定义评测

该项目支持自定义数据集的评测。如果你有自定义的SFT数据,命名为custom_zh(中文)或custom_en(英文),数据格式如下:

{
    "instruction": "假设你是皇帝身边的女人--甄嬛",
    "input": "你是谁?",
    "output": "臣妾是甄嬛,家父是大理寺少卿。"
}

这样就可以支持自定义数据集的评测了!

学习总结

TinyEval 是一个简单的语言模型(LLM)评测框架,旨在帮助用户评估生成式、判别式、选择式等多种任务中的LLM表现。它通过以下几个关键步骤进行评测:

  1. 确定评测指标:根据任务类型选择合适的评测标准,如F1RougeAccuracy等。
  2. 模型推理:根据数据集任务构建prompt,进行模型推理,生成预测结果。
  3. 结果处理与评分:对模型生成的结果与标准答案进行对比,通过指标如F1得分进行评估。

框架支持多种评测任务和自定义数据集,并提供了易于使用的接口来运行模型推理和评测。

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

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

相关文章

B. Brightness Begins Codeforces Round 976 (Div. 2)

原题 B. Brightness Begins 解析 Hint 1 第 i 个灯泡最终状态与 n 的大小无关 Hint 2 第 i 个灯泡最终状态与 i 的约数数量的奇偶性相关 Solution 对任意灯泡 i , 它的最终状态由其约数数量的奇偶性相关, 如果 i 有偶数个约数, 那么会是亮的, 否则会是暗的. 换句话说, 如…

第四届高性能计算与通信工程国际学术会议(HPCCE 2024)

目录 大会简介 主办单位,承办单位 征稿主题 会议议程 参会方式 大会官网:www.hpcce.net 大会简介 第四届高性能计算与通信工程国际学术会议(HPCCE 2024)将于2024年11月22-24日在苏州召开。HPCCE 2024将围绕“高性能计算与通信工…

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SABO-SVR减法平均算法优化…

CSP-J Day 1 模拟赛补题报告

姓名:王胤皓,校区:和谐校区,考试时间:2024年10月1日9:00:00~12:30:00,学号:S07738 CSP-J Day 1 模拟赛补题报告 前言 考了我们班 Rank 1 1 1。 本人在发烧状态下进行写作,勿喷。…

MySQL 问题小结

mysqld --initialize 初始化 data 文件夹 初始化的密码在这个 err 文件夹中

力扣题解 983

大家好,欢迎来到无限大的判断,祝大家国庆假期愉快 题目描述(中等) 最低票价 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出…

AI学习记录 -transformer 中对于torch和numpy常用函数的使用方式

在transformer源码中,使用了很多矩阵变换的方法,这些方法太多了,了解底层也没啥意义,也不是啥特别复杂的算法。 所以争取一句话描述这些方法,对照着看transformer的时候,可以衔接自己的思维链。 torch.un…

python访问SQL数据库

Step 1 创建一个数据库 Step 2 安装mysql-connector-python pip install mysql-connector-pythonStep 3 访问mysql,并查询表 import mysql.connectordef connect_and_query():try:# 连接到MySQL数据库connection mysql.connector.connect(hostlocalhost, # 数据库主机…

闯关训练一:Linux基础

闯关任务:完成SSH连接与端口映射并运行hello_world.py 1.创建开发机 2.SSH连接 3. VS-Code 连接 选择 Linux 平台 ,输入密码 ,选择进入文件夹 4.端口映射 按照下文安装Docs pip install gradio 运行server.py import gradio as grdef …

Python核心知识:pip使用方法大全

什么是 pip? pip 是 Python 的包管理工具,允许用户安装、升级和管理 Python 的第三方库和依赖。它极大地简化了开发过程,使开发者可以轻松地获取并安装所需的软件包。pip 已成为 Python 项目中最常见的包管理工具,并且自 Python …

【Linux】几种常见配置文件介绍

配置文件目录 linux 系统中有很多配置文件目录/etc/systemd/system、/lib/systemd/system 以及/usr/lib/systemd/system 等,这三者有什么样的关系呢? 以下是网络上找的资料汇总,并加了一些操作验证。方便后期使用 介绍 目录/lib/systemd/s…

虚拟机窗口顶部和底部出现白边(鸿蒙开发)

预览窗口顶部和底部出现白边 问题描述:预览窗口顶部和底部都有白边,导致无法全屏显示 解决方法: 官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-previewer-operating-6-V5 这里官方文档给了两种…

【有啥问啥】AI中的数据融合(Data Fusion):让数据“1+1>2”

AI中的数据融合(Data Fusion):让数据“11>2” 引言 在人工智能(AI)的浪潮中,数据作为驱动创新的核心要素,其重要性不言而喻。随着物联网(IoT)、传感器技术和云计算的…

基于单片机远程家电控制系统设计

本设计基于单片机的远程家电控制系统,以STC89C52单片机为核心,通过液晶LCD1602实时显示并控制,利用ESP8266WiFi模块实现本地与云平台的连接,最终实现远程对于灯光,热水器等家电的开关控制。同时,系统设有防…

pdf怎么编辑修改内容?详细介绍6款pdf编辑器功能

■ pdf怎么编辑修改内容? PDF(Portable Document Format)作为一种广泛使用的文件格式,具有特点包括兼容性强、易于传输、文件安全性高、跨平台性、可读性强、完整性、可搜索性、安全性、可压缩性。 PDF文件本身是不可以直接进行编…

认知杂谈73《成年人的修炼:勇敢前行,积极向上》

内容摘要: 成长是成年人的必修课,它要求我们不断学习、面对挑战、做出选择、调整行动。成长的必要性在于适应社会、实现自我价值。实现成长的策略包括自我掌舵、自救、为结果负责、保持积极心态。 追求艺术或商业目标、自己解决问题、承担责任、换个角度…

OpenAI o1:使用限额提高,o1 模型解析

OpenAI 最新公告 OpenAI 近日宣布对 o1-mini 和 o1-preview 的消息使用限额进行了提升,让 Plus 和 Team 用户可以更频繁地体验 o1 系统。具体来说,o1-mini 的限额从每周 50 条增加到了每天 50 条,而 o1-preview 的限额则从每周 30 条提升到了…

【算法】链表:21.合并两个有序链表(easy)

系列专栏 《分治》 《模拟》 《Linux》 目录 1、题目链接 2、题目介绍 3、解法(双指针) 4、代码 1、题目链接 21. 合并两个有序链表 - 力扣(LeetCode) 2、题目介绍 3、解法(双指针) 推荐一篇题解…

Arduino UNO R3自学笔记13 之 Arduino使用LM35如何测量温度?

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:学习使用传感器测温。 1.LM35介绍 一般来讲当知道需求,就可以 通过既定要求的条件来筛选需要的器件,多方面的因素最终选定了器件…

c语言实例

大家好,欢迎来到无限大的频道 今天给大家带来的是c语言 题目描述 创建一个双链表,并将链表中的数据输出到控制台,输入要查找的数据,将查找到的数据删除,并且显示删除后的链表 下面是一个用C语言实现的双链表&#…