LLM / Python - json 使用详解

news2024/11/15 19:29:19

目录

一.引言

二.json 方法

1.json.dumps

2.json.dump

3.json.loads 

4.json.load

三.json 参数

1.ensure_ascii

2.allow_nan

3.indent

4.sortKeys

5.Other

四.LLM 数据构建

1.json 数据构建

2.Train.py

五.总结


一.引言

上文中我们介绍了 LLama2-Chinese 的简单调用与数据样本形式,在构造 LLama2 对应的数据样本过程中,发现对 json 的使用不熟练,这里整理下 json 的常用方法和常用参数,并在最后给出训练 json 生成的方法。

二.json 方法

1.json.dumps

json.dumps 用于将 python 数据结构 转换为 json 字符串,一般数据结构为 Python Dict。

    train = {"instruction": "", "id": "1",
             "conversations": [{"from": "human", "value": "Find the product of the numbers: 5 and 8"},
                               {"from": "gpt", "value": "The product of 5 and 8 is 40."}]}
    print(json.dumps(train, ensure_ascii=False, indent=4))

2.json.dump

json.dump 用于将  json 字符串 存储至 文件

◆ 存储单条数据到 test.json 文件下

    train = {"instruction": "", "id": "1",
             "conversations": [{"from": "human", "value": "Find the product of the numbers: 5 and 8"},
                               {"from": "gpt", "value": "The product of 5 and 8 is 40."}]}
    with open("./test.json", "w", encoding='utf8') as f:
        json.dump(train, f, ensure_ascii=False, indent=4)

◆ 存储多条数据到 test.json 文件下

    train_1 = {"instruction": "", "id": "1"}
    train_2 = {"instruction": "", "id": "2"}

    candidate = []
    candidate.append(train_1)
    candidate.append(train_2)
    with open("./test.json", "w", encoding='utf8') as f:
        json.dump(candidate, f, ensure_ascii=False, indent=4

◆ Tips

这里每一条 json 并未按一行一行存储,是因为采用了 indent 缩进参数,采用缩进参数的 json 文件更加美观易读,如果想要一行一行展示,可以去掉该参数:

    with open("./test.json", "w", encoding='utf8') as f:
        json.dump(candidate, f, ensure_ascii=False)

3.json.loads 

json.loads 用于将 字符串 转换为 Json 对象

    json_string = """[ { "from": "human", "value": "Find the product of the numbers: 5 and 8" },
    { "from": "gpt", "value": "The product of 5 and 8 is 40." } ]"""
    json_info = json.loads(json_string)
    print(json_info)
    print(json_info[0]["from"])
[{'from': 'human', 'value': 'Find the product of the numbers: 5 and 8'}, {'from': 'gpt', 'value': 'The product of 5 and 8 is 40.'}]
human

4.json.load

json.load 用于打开 文件 并解析为 Json 对象

 下面读取上面生成的 test.json 文件:

    test_json = json.load(open("./test.json", "r"))
    for js in test_json:
        print(js)
{'instruction': '', 'id': '1'}
{'instruction': '', 'id': '2'}

三.json 参数

LLM 样本构造时博主主要先用 dumps 方法将 Dict 转换为 Json String,然后调用 dump 方法将批量的 Json String 存入文件用于后续 LLM 模型训练,这里生成的样式与开头提到的 LLAMA-2 是一致的,也可用于 LLAMA-2 的 tokenizer 代码。

dump 和 dumps 参数整体一致,下面介绍几个常用参数含义。

1.ensure_ascii

布尔值。如果为 True,则以 ASCII 编码输出。如果为 False,则输出 UTF-8 格式,默认为 True。

    train = {"instruction": "", "id": "1",
             "conversations": [{"from": "人类", "value": "Find the product of the numbers: 5 and 8"},
                               {"from": "机器", "value": "The product of 5 and 8 is 40."}]}
    print(json.dumps(train, ensure_ascii=True, indent=4))

这里主要影响中文字符,例如构建中文对话样本且需要本地查看时,需要注意该参数。 

2.allow_nan

布尔值。如果为 True,则允许序列化 NaN,Infinity 和 -Infinity。如果为 False,则在遇到这些值时会引发 ValueError。默认为 True。

    train = {"instruction": "", "id": NaN,
             "conversations": [{"from": "人类", "value": "Find the product of the numbers: 5 and 8"},
                               {"from": "机器", "value": "The product of 5 and 8 is 40."}]}
    print(json.dumps(train, ensure_ascii=True, indent=4, allow_nan=False))

json 包含 NaN 且 allow_nan=False 时,dumps 报错: 

3.indent

非负整形,如果不设置该参数 json 会显示为一行,否则会以更优雅的缩进方式展示。

    train = {"instruction": "", "id": NaN,
             "conversations": [{"from": "人类", "value": "Find the product of the numbers: 5 and 8"},
                               {"from": "机器", "value": "The product of 5 and 8 is 40."}]}
    print(json.dumps(train, ensure_ascii=True, indent=4, allow_nan=True))
    print(json.dumps(train, ensure_ascii=True, allow_nan=True))

4.sortKeys

根据 json 的 key 进行排序,根据 key 的类型不同,排序方式也不同。

◆ Key 为文本

    print(json.dumps({"A": 5, "F": 8, "D": 7, "C": 9}, sort_keys=True, indent=4))  # Key = Text && sort_keys = True
    print(json.dumps({"A": 5, "F": 8, "D": 7, "C": 9}, sort_keys=False, indent=4))  # Key = Text && sort_keys = False

key 为文本,sort_keys = True 按顺序排列。 

◆ Key 为数字

    print(json.dumps({1: 5, 3: 8, 2: 7, 4: 9}, sort_keys=True, indent=4))  # Key = Num && sort_keys = True
    print(json.dumps({1: 5, 3: 8, 2: 7, 4: 9}, sort_keys=False, indent=4))  # Key = Num && sort_keys = False

key 为数字, sort_keys = True 按顺序排列。 

5.Other

◆ check_circular

布尔值。如果为 True,则检查循环引用。如果为 False,则不检查。默认为 True。

◆ separators

分隔符,是一个元祖默认 (',', ':'),代表 keys 之间用 ',' 隔开,Key-Value 用 ':' 隔开。正常情况下只要是默认 json 形式就无需修改。

◆ cls

可选的类。如果提供了这个参数,则使用这个类的实例来序列化对象。该类必须实现一个 default() 方法,接受一个要序列化的对象作为参数,返回一个可以被 JSON 库解析的 Python 对

四.LLM 数据构建

1.json 数据构建

基于上面的 json 用法,在结合我们的对话即可构造 LLM 所需要的不同格式数据,以 LLama-2 为例。这里 train_json 为我们的原始数据,我们通过 load 加载原始 json,并把 input、output 分别添加到 human_json 与 gpt_json 中,最后调用 dump 方法批量存储至新的 json 文件中。

    train_json = json.load(open(inputPath, "r"))

    candidate = []
    id = 0

    for dialogue in train_json:
        human = dialogue["input"]
        gpt = dialogue["output"]
        train = {"instruction": "", "id": str(id)}
        human_json = {"from": "human", "value": human}
        gpt_json = {"from": "gpt", "value": gpt}

        train["conversations"] = [human_json, gpt_json]
        candidate.append(train)

        id += 1

    with open("./train.json", "w", encoding='utf8') as f:
        json.dump(candidate, f, ensure_ascii=False, indent=4

官方使用的数据集,human 和 gpt 是多轮对话,上面示例为单轮,如果为多轮只需在 conversations 列表里持续添加多轮对话再 dump json 文件即可。 

 运行后我们会得到类似的样本格式:

2.Train.py

LLama-2-7B Chinese 的加载 json 和处理 dataset 逻辑:Train.py ,有兴趣的同学可以回看下。

五.总结

最后是用 C-知道 追问的 json 常用方法,也算是上面的总结啦。

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

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

相关文章

ipad手写笔有必要买原装吗?质量好苹果平板平替笔推荐

因为iPad平板的强大,使得很多人群都用上了iPad,而且还在不断的普及。不管是用于绘画或者学习记笔记,都非常好用,但要是用来看电视剧玩游戏就没那么有价值了。如果你不打算购买昂贵的苹果电容笔,或者只是为了记录&#…

“数字中华 点亮未来”中华线上客户节 盛大开幕

2023年是中华保险数字化转型落地之年,峥嵘37载,中华保险在数字化转型上已经涌现了一批彰显辨识度、具有影响力的应用成果。7月15日,中华保险围绕数字化转型之路开展以“数字中华 点亮未来”为主题的37周年线上客户节活动,倾力打造…

直播平台源码开发提高直播质量的关键:视频编码和解码技术

在互联网日益发展的今天,直播平台成为人们互联网生活的主力军,直播平台功能的多样化与智能化使我们的生活有了极大地改变,比如短视频功能,它让我们既可以随时随地去发布自己所拍摄到的东西让世界各地的用户看到,也能让…

融合正余弦和折射反向学习的北方苍鹰优化算法,与金鹰/蜣螂/白鲸/霜冰算法对比...

今天的主角是:融合正余弦和折射反向学习的北方苍鹰优化算法(SCNGO),算法由作者自行改进,目前应该没有文献这样做。 改进策略参照的上一期改进的麻雀优化算法,改进点如下: ①采用折射反向学习策略初始化北方苍鹰算法个体…

【字节跳动青训营】后端笔记整理-3 | Go语言工程实践之测试

**本文由博主本人整理自第六届字节跳动青训营(后端组),首发于稀土掘金:🔗Go语言工程实践之测试 | 青训营 目录 一、概述 1、回归测试 2、集成测试 3、单元测试 二、单元测试 1、流程 2、规则 3、单元测试的例…

AQS抽象同步队列核心原理

CLH自旋锁 JUC中显式锁基于AQS抽象队列同步器,而AQS是CLH锁的一个变种。队列头结点可以获得锁,其他节点排队等候。 在争夺锁激烈的情况下,为了减少CAS空自旋(CAS需要CPU进行内部通信保证缓存一致性造成流量过大引起总线风暴&…

【代码随想录day21】二叉搜索树中的众数

题目 给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返回。 假定 BST 满足如下定义&am…

Git移除commit过的大文件

前言:在提交推送本地更改至仓库时,误将大文件给提交了,导致push时报错文件过大,因此需要将已经commit的大文件移除后再push 若已知要删除的文件或文件夹路径,则可以从第4步开始 1.对仓库进行gc操作 $ git gc 2.查询…

ThinkPHP 一对多关联

用一对多关联的前提 多的一方的数据库表有一的一方数据库表的外键。 举例,用户获取自己的所有文章 数据表结构如下 // 用户表 useruser_id - integer // 用户主键name - varchar // 用户名称// 文章表 articlearticle_id - integer // 文章主键title - varchar …

WSL2安装google chrome浏览器

一. 环境: Windows 11 Ubuntu-22.04 二. 安装google-chrome步骤(官方文档): 1. 创建文件夹:mkdir chrome 2. 进入目录:cd chrome/ 3. 下载chrome压缩包:sudo wget https://dl.google.com/linux/direct/go…

学习 NestJs 的第一步

安装 NestJS 的先决条件和安装 NestJS NodeJS 的版本需要大于等于 16。 安装 NestJS 的命令是&#xff1a;npm i -g nestjs/cli。 使用命令创建项目 使用 nest new <项目名称> 来创建项目&#xff0c;假如要开启 TS 的严格语法功能的话&#xff0c;可以把--strict 标…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块15

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

OSPF的拓展配置

OSPF的拓展配置 1.手工认证 --- 在OSPF数据包交互中&#xff0c;邻居之间的数据报中将携带认证口令&#xff0c;两边认证口令相同&#xff0c;则意味着身份合法 OSPF的手工认证总共分为三种&#xff1a; 1.接口认证 [r5-GigabitEthernet0/0/0]ospf authenticati…

GB/T 25000.51解读——软件产品的性能效率怎么测?

GB/T 25000.51-2016《软件产品质量要求和测试细则》是申请软件检测CNAS认可一定会用到的一部国家标准。在前面的文章中&#xff0c;我们为大家整体介绍了GB/T 25000.51-2016《软件产品质量要求和测试细则》国家标准的结构和所涵盖的内容以及对软件产品的八大质量特性中的功能性…

fastposter v2.16.0 让海报开发更简单

fastposter v2.16.0 让海报开发更简单 &#x1f525;&#x1f525;&#x1f525; fastposter海报生成器是一款快速开发海报的工具。只需上传一张背景图&#xff0c;在对应的位置放上组件&#xff08;文字、图片、二维&#x1f434;、头像&#xff09; 点击代码直接生成各种语言…

个人信息的编写以及头像的联动

下面这个是导航栏通过on触发的事件 与图片联动 <template><div><ul><li>{{obj.account}}</li><li>{{obj.ctime|dataFormat}}</li><li>{{obj.id}}</li><li>{{obj.userGroup}}</li><div><!-- acti…

VIOOVI精益管理:实现高效运营和持续改进的关键

关于什么是精益化管理这个问题&#xff0c;从字面上理解&#xff0c;“精”为“精良”&#xff0c;“益”为“利益”&#xff0c;意在产品更加精良&#xff0c;利益更加丰厚。而从丰田精益生产中我们可以看出精益化管理绝不是以偏概全的管理&#xff0c;而是全面的结合内部、外…

Linux操作系统~必考面试题⑧

1、pwd 命令 pwd 命令用于查看当前工作目录路径。 实例&#xff1a; 查看当前路径 pwd 查看软链接的实际路径 pwd -P 2、rmdir 命令 从一个目录中删除一个或多个子目录项&#xff0c;删除某目录时也必须具有对其父目录的写权限。 注意&#xff1a;不能删除非空目录实例&…

Java面试笔记

JAVA基础知识 语法结构 1.类 2.属性 3.方法 4.静态代码块 构造器 构造函数&#xff0c;构造类的对象&#xff0c;默认隐式&#xff0c;创建对象&#xff0c;先执行父类构造函数&#xff0c;再执行子类构造函数 父类的super必须在第一行 代码块 优先级最高&#xff0c;只…

pyspark笔记:读取 处理csv文件

pyspark cmd上的命令 1 读取文件 1.1 基本读取方式 注意读取出来的格式是Pyspark DataFrame&#xff0c;不是DataFrame&#xff0c;所以一些操作上是有区别的 1.1.1 format DataFrame spark.read.format("csv").option(name,value).load(path) format表示读取…