/ChatGLM-sanguo

This project is mainly to explore what effect can be achieved by fine-tuning LLM model (ChatGLM-6B)of about 6B in vertical field (Romance of The Three Kingdoms).

Primary LanguageShell

【Chatglm-6B垂直数据微调一】(三国演义数据集)微调实战

1. 介绍

Chatglm-6B是清华大学开源的LLM模型,得到业内同行的广泛好评。在斯坦福的alpaca项目之后,中小团队已有力量撬动LLM模型。但目前看到的几个开源项目基本都是通用型的。本项目主要是探索6B左右大小的LLM模型在垂直领域进行微调可以达到什么效果。 项目目标:

  1. 通过较少的资源(TESLA 16G V100),撬动LLM模型进行微调训练
  2. 构建一批高质量的数据集
  3. 减少对话过程中的事实型错误
  4. 具备一定程度的推理能力
  5. 能做角色扮演,可以扮演三国中的某个人物进行对话

《三国演义》是我国的四大名著之一,相关知识点众多,选择使用《三国演义》进行指令微调,也是希望探索在没有那么多硬件资源的情况下,LLM模型在中文垂直领域能否可以有进一步的提升,为第四次工业革命添砖加瓦,贡献自己的一份力量。

硬件需求

量化等级 最低 GPU 显存(推理) 最低 GPU 显存(高效参数微调)
FP16(无量化) 13GB 14GB
INT8 8GB 9GB
INT4 4GB 7GB

2. 构建数据集

  1. 下载百度文库的一批三国演义知识数据集(买了5块的会员,还是很多不能下载,数据就是金钱呀。。。)进行data_seed的构建。经过对数据的分析,知识主要分为几种类型:选择题,判断题,简答题。由于时间精力的问题,现仅仅抽取出类似问答对的数据集。
  2. 本来计划使用self-instruct的方法来扩充数据,经过几轮简单评估发现chatgpt在三国演义数据中有较多的事实性错误。 (现在也被封号了。。。)现阶段只通过人工手段进行收据集构建,只构建了300+数据,用来进行初版的跑通验证。

3. 环境搭建

    $ git clone https://github.com/THUDM/ChatGLM-6B.git
    $ cd ChatGLM-6B
    $ pip install -r requirements.txt
    $ pip install rouge_chinese nltk jieba datasets

4. 开始训练

讲训练集文件放到/you_path/ChatGLM-6B/ptuning/目录下 修改训练sh文件,如果你的显存不够16G,试着调小per_device_train_batch_size,per_device_eval_batch_size参数

PRE_SEQ_LEN=8
LR=1e-2
CUDA_VISIBLE_DEVICES=0 python3 main.py \
    --do_train \
    --train_file data_seed.csv \
    --validation_file data_seed.csv \
    --prompt_column question \
    --response_column answer \
    --overwrite_cache \
    --model_name_or_path THUDM/chatglm-6b \
    --output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR-dev \
    --overwrite_output_dir \
    --max_source_length 64 \
    --max_target_length 64 \
    --per_device_train_batch_size 32 \
    --per_device_eval_batch_size 32 \
    --gradient_accumulation_steps 1 \
    --predict_with_generate \
    --max_steps 3333 \
    --logging_steps 10 \
    --save_steps 1111 \
    --learning_rate $LR \
    --pre_seq_len $PRE_SEQ_LEN \
    --quantization_bit 4

5. 效果评估

问题1:出现复读机问题

问题2:问答型问题时,出现没有完整回答完问题的case,可能是收到填空型这种训练集的影响,答案都比较简短。

qutstion checkpoint-3333 THUDM/chatglm-6b true_answer 题目类型
赔人夫人又折兵的是谁? 周瑜。用化装成商人的小乔吸引曹操投资,引江上之战。后来由于吴质引见,曹正乃弃兵退江。周瑜等追至陆逊滩,曹兵饱食终日而oiroiroir击曹胸,伤中肠。吴军赔了 "赔人夫人又折兵"这句话通常用来形容在战场上取得胜利后的代价,指的是战争中的损失和伤亡人数超过了自己所能获得的收益。这个成语的来源可以追溯到**古代的军事历史,例如战国时期的赵国在廉颇的带领下与秦国的战争中,最终因为军队伤亡惨重而失去了整个北方边境地区。在现代英语中,这个成语常常用来形容在商业或政治交易中因为决策失误而导致大量损失的情况。例如,某个人在投资某项业务时盲目乐观,最终导致了公司的破产和大量的投资损失。 周瑜 填空型
“三英战吕布”的 “三英”指哪三个人? 刘备、关羽、张飞。 "三英战吕布"中的"三英"指的是三国时期蜀汉的关羽、张飞和刘备三人。在故事中,他们一起联手对抗吕布这位武艺高强的武将。 刘备、关羽、张飞。 填空型
宁教我负天下,休教天下人负我的是谁? 吕布。 这句诗出自唐代诗人李清照的《如梦令》:宁教我负天下人,休教天下人负我。这句诗的意思是,宁可让我天下人负我,也不要让我天下人负我。它表达了一种自我谴责的情感,意味着一个人可能会为了自己的利益而不惜伤害他人。这句诗也成为了李清照的代表作之一,被广泛传颂。 曹操 填空型
“东风不与周郎便,铜雀春深锁二乔”的句子写的是哪一场战役? 赤壁之战 “东风不与周郎便,铜雀春深锁二乔”是唐代诗人杜甫的《赤壁怀古》中的一句诗。这句诗描写了三国时期赤壁之战中的情况。赤壁之战发生于公元208年,是三国时期东吴和蜀汉之间的一次战役。当时东吴军队联合刘备军队在赤壁之战中击败了曹军。杜甫在诗中描绘了这场战争的精彩场面,其中“东风不与周郎便,铜雀春深锁二乔”描绘了战争的情况和东吴军队的壮大。这句诗也成为了**历史上著名的诗句之一。 赤壁之战 填空型
东风不与周郎便,铜雀春深锁二乔涉及到哪两个主要人物? 曹操、周瑜 这首诗涉及到两个主要人物:周瑜:这首诗中的“周郎”指的是三国时期东吴名将周瑜。这首诗是周瑜被孙权陷害后所作,表达了他的痛苦和无奈。孙权:这首诗是孙权所作,表达了他对周瑜的惋惜和对周瑜才华的赞赏。诗中“东风不与周郎便,铜雀春深锁二乔”一句,指的是周瑜曾与孙权计划用东风火烧曹操的赤壁之战船,但最终没有实现。 曹操、周瑜 填空型
“卧龙凤雏”分别是指? 诸葛亮和庞统是《三国演义》中的人物,与他们各自有关的情节是:诸葛亮舌战群儒,庞统巧施连环计。 “卧龙凤雏”是**古代三国时期著名的两位谋士。卧龙指的是诸葛亮,他是蜀汉开国皇帝刘备的谋士之一,被誉为“卧龙凤雏”,因其出色的才华和谋略而闻名于世。诸葛亮不仅是一位出色的政治家和军事家,还是一位博学多才的文化人,他在文学、历史、哲学等领域都有深厚的造诣和独特的见解。凤雏指的是庞统,他是三国时期蜀汉的谋士之一,也是诸葛亮的好友。庞统是一位聪明过人的谋士,曾经为蜀汉出谋划策,但最终被刘备杀害。他的死是三国时期的一大悲剧。除了诸葛亮和庞统,“卧龙凤雏”这个称号还指代了许多其他著名的谋士和政治家,如鲁肃、周瑜、曹操、司马懿等。 诸葛亮和庞统 填空型
诸葛亮临终时将自己的用兵秘法都告诉给了谁? 姜维 据历史记载,诸葛亮在临终时并没有将自己的用兵秘法告诉他的任何人。相反,他留下了一份遗书,详细说明了他对未来的规划和期望,以及对他的学生们的要求和期望。诸葛亮的遗书原文如下:吾故常云,知彼知己,百战不殆。今也,后事之师,密而不言,吾所以告汝者,以示汝等人,不可轻动。汝等当思,天下之事,未可轻举妄动。汉室虽衰,而天命未绝。吾所以能活者,以其有天命也。汝等当坚守土城,勿得轻入敌境。若敌人有奇谋异策,当以静制动,以逸待劳。吾之所教,不可忘也。谨记谨记!诸葛亮在遗书中强调了天命的重要性,并警告他的学生们不要轻率行动,应该坚守土城,以逸待劳。这表明他相信战争的胜利取决于战略和战术的选择,而不是单纯的军事技巧。因此,虽然他并没有告诉任何人具体的用兵秘法,但他的教诲和期望对后人具有重要的指导意义。 姜维 填空型
“太史慈酣斗小霸王”中的小霸王是? 孙策 "太史慈酣斗小霸王"是一句古代文学作品中的描写,其中提到的小霸王是指三国时期的曹操。根据这段描写,太史慈和曹操在一场决斗中交手,太史慈充分发挥了自己的武艺,最终击败了曹操。这场决斗被认为是三国时期著名的一场战斗,也是历史上著名的战役之一。 孙策 填空型
请简述曹操割发代首的故事 曹操征张绣途中,与文化杰荀彧交朋友。荀彧知道曹操心怀不善,常作警告。一日,曹军到西门关,被马超兵挡着,曹操想割发代首,荀彧提醒他“国以礼节为首,公以民心为首,欲 曹操割发代首的故事,出自《三国演义》小说的情节之一。故事的背景是曹操在赤壁之战后,被孙权的军队围困在麦城。曹操部下的关羽曾建议他突围而出,但曹操却认为关羽不够忠诚,不想让他离开自己。在这种情况下,曹操决定割发当衣,以表示忠诚。割发代首的行为在**古代历史上被认为是一种极其忠诚的表现,因为这意味着一个人愿意为自己的国家、君主或领袖而牺牲自己的尊严和形象。然而,曹操割发代首的行为也引发了一些争议,因为这种行为在现代社会被认为是一种不尊重个人尊严和人权的行为。在《三国演义》小说中,曹操割发代首的故事也被描述为一种极端的、自我牺牲的行为,可能反映了曹操在情感上的脆弱和无助。 曹操征张绣途中,恰逢稻麦成熟,为显示爱民之心,曹操下令要求众将士不准纵马毁麦。没想到禁令刚下,曹操的马受惊跑入麦田,踏毁麦田。此时,曹操假意叫来行军主簿,要求议罪。谋士郭嘉为其开脱, 曹操顺水推舟,割发代首以示众人。 问答型
请简述“夏侯惇拔矢啖睛”的故事 夏侯惇去攻许攸,时被许攸退走。夏侯惇再加入战斗,又被许攸打败。夏侯惇激怒了神医陆逊,发现自己的眼珠被箭穿透,于是拔箭啖睛,却发现啖不出任何东西。突然一将“夏侯惇拔矢啖睛”,引发了 “夏侯惇拔矢啖睛”是**历史上著名的典故,发生在三国时期的魏国。故事的主人公是夏侯惇,他是魏国的大将,曾经率领部队攻打秦国。在战争中,夏侯惇遭遇了一场激战,他的部队被秦军包围在了一个山谷中。当时,夏侯惇的眼睛被一支箭射中,流了很多血。他不想浪费箭矢,于是决定将箭矢全部拔出来,并吃掉。这个典故的意思是,夏侯惇在遭受苦难和挫折时,能够以坚韧和勇气面对,甚至在最困难的时刻,选择以自己的身体去克服困难。这个行为体现了他的勇气和决心,也为他后来的胜利奠定了基础。最终,夏侯惇成功地突围并打败了秦军,这个典故也成为了**文化中一个著名的故事,被广泛应用于文学、艺术和娱乐等方面。 夏侯惇与吕布手下高顺的军队相遇。高顺败下阵来,夏候惇绕着军阵追他。高顺阵上有个叫曹性的将领看见,暗地拈弓搭箭,一箭射中夏侯惇左目。夏候惇用手拔箭,不想连眼珠拔出,于是大呼曰:“父精母血,不可弃也!”于是便将眼珠纳于口内啖之,仍复挺枪纵马,直取曹性。曹性不及提防,早被一枪搠透面门,死于马下。 问答型
详细介绍一下关云长千里走单骑过五关斩六将的情节。 关羽得知刘备在袁绍处,于是带着甘糜二夫人去寻刘备。但因为没有曹操的公文,各关守将均不肯通信。于是关羽就决定过五关斩六将,以便找到刘备。第一关的守将是张飞,关羽硬凿出一个通道 关羽千里走单骑过五关斩六将的故事,是**古代著名的军事战役和神话传说之一。据传说,关羽年轻时就因其勇猛善战而得到了刘备的赏识,并成为了刘备的武将。后来,关羽跟随刘备征战天下,经历了许多胜利和失败。其中,关羽曾经单枪匹马地过了五关,斩了六将,最终来到曹操的面前,为刘备夺取了汉中。具体来说,关羽千里走单骑的故事可以分为以下几个阶段:过五关据《三国演义》的描述,关羽在刘备夺取汉中之后,为了表彰他的功绩,决定让他去五关斩六将,以显功绩。于是,关羽离开了刘备的部队,开始了他的旅程。据《三国演义》的描述,关羽在刘备夺取汉中之后,为了表彰他的功绩,决定让他去五关斩六将,以显功绩。于是,关羽离开了刘备的部队,开始了他的旅程。他在这五关上了五天,第六天,他来到了最后一关,这一关十分险峻,关羽面对着巨大的石门,必须要用马匹来撞门才能过。最终,关羽用力撞门,成功闯过了这一关。斩六将在五关上度过了五天之后,关羽来到了下一关,这一关的守将是一个叫做赵子龙的武将。赵子龙对关羽非常不满,认为他不应该轻易地闯过他的关卡。于是,赵子龙决定挑战关羽。在一场激烈的战斗中,关羽击败了赵子龙,并顺利地闯过了这一关。接下来,关羽来到了三关,分别是庞德、张郃和马良。这三关的守将都非常强,但关羽凭借着自己的勇猛和毅力,成功地闯了过去。来到曹操面前最终,关羽来到了曹操的面前,为刘备夺取了汉中。曹操曾经想要杀关羽,但最终被关羽的义薄云天所感动,放过了他。据传说,关羽千里走单骑的故事展现了他的英勇和毅力,也体现了**古代军事文化中“勇冠三军”的美德。 关羽得知刘备在袁绍处,于是带着甘糜二夫人去寻刘备。但因为没有曹操的公文,各关守将均不敢通行,于是关羽就保护二位嫂嫂,千里走单骑,勇闯东岭、洛阳等五座关口,斩了孔秀、韩福、秦琪等六员守将,夺下渡船,过了黄河,一路追寻刘备。 问答型
张飞大闹长坂桥的故事是怎样的? 曹操率大军南征刘备,把关张埋伏在背后。曹操败走长坂桥,见张飞立马桥上,大喜:“张飞是个豪杰!”先抛下书,言“刘备资未具,单凭张飞之武力,可撼动天下。”曹操大戏重演,战斧劈来 张翼德大闹长坂桥是**历史上著名的一个故事,发生在唐朝时期。以下是大致情节:唐朝时期,张翼德是一个著名的将领,他率领军队攻打一座城池,但被城池的将领所守。张翼德多次攻城无效,便向唐朝皇帝请求援军。皇帝派了宰相李昪率领大军前来增援。当李昪的大军到达长坂桥时,张翼德却拒绝开门投降,反而在城墙上布下重兵,准备坚守。李昪和他的军队多次攻城,但都被张翼德击退。最终,张翼德在一天晚上,突然放火烧了城墙,并率领军队进攻李昪的军队。李昪的军队混乱不堪,纷纷溃败。张翼德趁机占领了城池,成为当地的**者。张翼德因此成为了一个传奇人物,他的大闹长坂桥的故事也被广泛传颂。 (这是《三国演义》是最能体现张飞“勇猛”的片断。)文聘追赵云至长坂桥,见张飞立马桥上,疑桥东有伏兵,不敢近前。曹操大军赶到。张飞睁圆环眼,厉声大喝日,声如巨雷,曹军股栗。曹操想起关羽曾说张飞勇武无敌,便下令不可轻敌。言未已,张飞睁目又喝。曹操颇有退心。张飞见曹后军阵脚移动,挺矛再喝,夏侯杰惊得肝胆碎裂,倒撞于马下。操回马而走。 问答型
许诸裸衣斗马超讲了什么故事? 曹操挟天子以令诸侯,马超向刘备求救,刘备派关羽抗敌。关羽与马超单打许诸,关羽硬抗马超,双方都裸衣交锋。许诸、马超二人都颇识地形,关羽先败后胜,并最终裸衣斩杀马超。 许诸裸衣斗马超的情节,是**历史上著名的故事之一。这个故事发生在东汉末年,许诸和马超是两个地方的军阀,在争斗中发生了一场激烈的战斗。故事讲述了许诸在一次战斗中,穿着裸衣,手持长枪,奋勇杀敌。马超则是穿着轻便的衣服,手持铁锤,与许诸展开战斗。虽然马超战斗力极强,但许诸凭借自己的勇气和技巧,最终战胜了马超。这场战斗被广泛传颂,成为了**文化中的一段佳话。它也反映了东汉末年社会矛盾的激化和军阀割据的局面。 马超到曹军营寨前求战,许诸约马超来日决战。次日,两军出营布阵。许诸与马超斗了两个一百多回合,不分胜负。许诸性起,卸甲赤体提刀,来与马超厮杀,直到两人弃刀断枪,在马上乱战。后来两军混杀,操兵大乱,许诸臂中两箭。 问答型

TODO

  1. 扩充数据集,现在的数据集只有300多条语料,太少了。希望有对志同道合的朋友可以加入,共同构建一个靠谱的数据集。
  2. 数据集没有按alpaca的方式进行seed划分,一股脑的导入进去进行训练效果不理想
  3. 训练过程可能有些问题,会出现复读机,回答不完整的CASE。
  4. ptuning, lora这些冻住大部分层数的训练方式虽然可以用较少的资源撬动大模型,但和全部参数放开进行训练不知道效果是否有差异。

参考

【ChatGLM-6B入门-二】清华大学开源中文版ChatGLM-6B模型微调实战 【github】 : ChatGLM-6B 【github】 : alpaca-lora 【github】 : Luotuo-Chinese-LLM 【github】 : BELLE