# Firefly(流萤): 中文对话式大语言模型
## 项目简介
项目地址:[Firefly(流萤):中文对话式大语言模型](https://github.com/yangjianxin1/Firefly)
![firefly_logo](firefly_logo.png)
**Firefly(流萤)** 是一个开源的中文对话式大语言模型,使用指令微调(Instruction Tuning)在中文数据集上进行调优。同时使用了词表裁剪、ZeRO、张量并行等技术,有效降低显存消耗和提高训练效率。
在训练中,我们使用了更小的模型参数量,以及更少的计算资源。
我们构造了许多与中华文化相关的数据,以提升模型这方面的表现,如对联、作诗、文言文翻译、散文、金庸小说等。
**流萤**(萤火虫的别称)是中华传统文化的一个符号,虽说腐草为萤,带有悲悯意味,但萤火虽小,也能凭借其淡淡荧光,照亮夜空。本项目的名称取自杜牧的《秋夕》:**银烛秋光冷画屏,轻罗小扇扑流萤**。
也希望本项目能够像流萤一般发出淡淡微光,为中文NLP开源社区尽绵薄之力,添砖加瓦。
```text
《咏萤火》
唐.李白
雨打灯难灭,
风吹色更明。
若飞天上去,
定作月边星。
```
主要工作如下:
- **数据集**:[firefly-train-1.1M](https://huggingface.co/datasets/YeungNLP/firefly-train-1.1M) , 一份高质量的包含1.1M中文多任务指令微调数据集,包含23种常见的中文NLP任务的指令数据。对于每个任务,由人工书写若干指令模板,保证数据的高质量与丰富度。
- **模型裁剪**:[LLMPruner:大语言模型裁剪工具](https://github.com/yangjianxin1/LLMPruner) ,使用词表裁剪技术对多语种大语言模型进行权重裁剪,保留预训练知识的前提下,有效减少模型参数量,提高训练效率,并分享裁剪后的多种参数规模的Bloom模型权重。
- **权重分享**:在[bloom-1b4-zh](https://huggingface.co/YeungNLP/bloom-1b4-zh) 和[bloom-2b6-zh](https://huggingface.co/YeungNLP/bloom-2b6-zh) 的基础上,进行指令微调,获得两种参数规模的中文模型:[firefly-1b4](https://huggingface.co/YeungNLP/firefly-1b4) 和[firefly-2b6(待训练结束后分享)](https://huggingface.co/YeungNLP/firefly-2b6)
- **训练代码**:开源训练代码,支持张量并行、ZeRO、Gemini异构内存空间管理等大模型训练策略。可实现仅使用一张显卡,训练1B-2B参数量的模型(待整理后开源)。
## 模型使用
```python
from transformers import BloomTokenizerFast, BloomForCausalLM
device = 'cuda'
path = 'YenugNLP/firefly-1b4'
tokenizer = BloomTokenizerFast.from_pretrained(path)
model = BloomForCausalLM.from_pretrained(path)
model.eval()
model = model.to(device)
text = input('User:')
while True:
text = '{}'.format(text)
input_ids = tokenizer(text, return_tensors="pt").input_ids
input_ids = input_ids.to(device)
outputs = model.generate(input_ids, max_new_tokens=200, do_sample=True, top_p=0.85, temperature=0.35,
repetition_penalty=1.2, eos_token_id=tokenizer.eos_token_id)
rets = tokenizer.batch_decode(outputs)
output = rets[0].strip().replace(text, "").replace('', "")
print("Firefly:{}".format(output))
text = input('User:')
```
## 模型裁剪
本项目首先使用[LLMPruner项目](https://github.com/yangjianxin1/LLMPruner) 对原始的Bloom模型进行词表裁剪,仅取出常用的中英文词表,大大降低了模型参数量,然后再对其进行指令微调。
Bloom是个多语言模型,由于需要兼容多语言,所以词表有25w之多,在中文领域中,大部分词表并不会被用到。
我们通过删减冗余的词表,从多语言模型中提取常用的中英文词表,最终词表从25w减少到46145,缩减为原来的18.39%,在保留预训练知识的同时,有效减少参数量,提高训练效率。
我们在
[bloom-1b4-zh](https://huggingface.co/YeungNLP/bloom-1b4-zh)
与
[bloom-2b6-zh](https://huggingface.co/YeungNLP/bloom-2b6-zh)
的基础上,进行指令微调,获得两种参数规模的中文模型:[firefly-1b4](https://huggingface.co/YeungNLP/firefly-1b4) 和[firefly-2b6(待训练结束后分享)](https://huggingface.co/YeungNLP/firefly-2b6)
## 数据集
我们收集了23个常见的中文数据集,对于每个任务,由人工书写若干种指令模板,保证数据的高质量与丰富度,数据量为115万,形成训练集[firefly-train-1.1M](https://huggingface.co/datasets/YeungNLP/firefly-train-1.1M) 。数据分布如下图所示:
![task_distribution](task_distribution.png)
在此基础上,我们添加了[Belle-train_0.5M_CN](https://huggingface.co/datasets/BelleGroup/train_0.5M_CN) ,最终得到165万的训练数据。每条数据的格式如下,包含任务类型、输入、目标输出:
```json
{
"kind": "ClassicalChinese",
"input": "将下面句子翻译成现代文:\n石中央又生一树,高百余尺,条干偃阴为五色,翠叶如盘,花径尺余,色深碧,蕊深红,异香成烟,著物霏霏。",
"target": "大石的中央长着一棵树,一百多尺高,枝干是彩色的,树叶有盘子那样大,花的直径有一尺宽,花瓣深蓝色,花中飘出奇异的香气笼罩着周围,如烟似雾。"
}
```
训练数据集的token长度分布如下图所示,绝大部分数据的长度都小于600:
![len_distribution](len_distribution.png)
## 训练细节
在训练时,对于每条样本,我们将input与target处理成如下格式,然后输出模型中。
```
inputtarget
```
我们将模型的最大输入设置为512,input部分不参与计算loss,只计算target部分的损失函数。训练的超参数设置如下表所示。
| 参数 | firefly-1b4 | firefly-2b6 |
|---------------|-------------|-------------|
| Batch size | 16 | 8 |
| Learning rate | 3e-5 | 3e-5 |
| Warmup step | 3000 | 3000 |
| Lr schedule | cosine | cosine |
| Max_seq_length | 512 | 512 |
| Training step | 90k | - |
## 局限性和使用限制
经过词表裁剪后,我们的模型参数量仅为1.4B和2.6B,参数量远远小于ChatGPT和LLaMA等上百亿上千亿的模型,甚至远远小于当前主流如Belle、ChatGLM等7B左右的模型。所以在效果上仍存在以下问题:
- 对于事实性知识,容易产生错误的回复。
- 由于未经过无害化微调,可能会产生歧视、危害、违背伦理道德的言论。
- 在代码、推理上的能力仍有欠缺。
基于以上模型的局限性,我们要求本项目的代码、数据、模型等仅用于学术研究,不得用于商业用途,且不得用于对社会造成危害的用途。
## 引用
若使用本项目的数据、代码或模型,请引用本项目。
```text
@misc{Firefly,
author = {Jianxin Yang},
title = {Firefly(流萤): 中文对话式大语言模型},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/yangjianxin1/Firefly}},
}
```
## 生成效果
下面展示的是firefly-1b4的部分生成效果。
| input | output |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 生成5条QQ音乐热评 | 1、这首歌是周杰伦写给张惠妹的,但是张惠妹唱出了自己的风格。😊2、我表白过,她婉拒了,但我还是厚着脸皮找她去KTV唱歌,后来我们成为了无话不谈的好朋友,她告诉我她找到真爱了,我祝福他们;她也跟我说生活费花光了,我告诉她我这里还有一千块钱,咱俩一人五百凑合着熬过去,我把自己仅有的五百元生活费汇给了她。我知道再也见不到面了,但我相信爱情,只要心中有爱,即使没有结局,我也愿意。 3、“你走以后 我才发现 原来我一直以为的幸福 都只是我以为”4、张惠妹的声音真的很好听啊,而且她的歌都很有味道,尤其是这首《我要快乐》,歌词也写的非常好,希望她能一直这样下去,加油!5、好喜欢这首歌,感觉很温暖,很喜欢这种歌曲,虽然我不是一个特别喜欢的人,但我觉得这首歌可以单曲循环很多遍,每次听到都会有种想哭的感觉,觉得很美好,希望大家也可以来听听,谢谢啦 |
|我想让你做一名记者。您将报道突发新闻,撰写专题报道和评论文章,开发用于验证信息和发现来源的研究技术,遵守新闻道德,并使用您自己独特的风格提供准确的报道。我的第一个建议请求是“我需要帮助写一篇关于世界主要城市空气污染的文章。”| 作为AI语言模型,我没有个人喜好或情感,因此无法为你提供具体的写作建议。但是,以下是一些一般性的建议:1. 确定主题:确定你要报道的话题,例如“全球气候变化的影响”或“环境问题”等。2. 研究相关问题:通过研究相关的科学研究和数据来了解该话题,以便更好地理解该话题。3. 收集信息:在搜集有关该话题的信息时,需要注意保护个人隐私和信息安全。4. 使用简洁明了的语言表达观点:尽量避免使用过于复杂的词汇和句子结构,而是要以简单易懂的方式传达你的观点。5. 提供证据支持观点:提供有说服力的证据以支持你的观点,如科学研究、政府报告等。6. 检查格式和排版:确保你的文本清晰明了,易于阅读和理解。7. 最后,记得保持客观和公正性:不要过度渲染自己的立场,而应该始终遵循新闻道德和法律规定,以确保报道的真实性和可信度。 |
|假设你是一个心理咨询师,你会如何帮助患者走出阴霾,重拾对生活的希望,请给出你的具体步骤和做法| 1. 了解患者的情感状态和问题背景。2. 根据患者的需求和症状制定个性化的治疗计划。3. 鼓励患者表达自己的想法和感受,并给予适当的反馈和支持。4. 引导患者进行积极的思考和行动,提高他们的自我意识和积极性。5. 在必要时,建议患者寻求专业心理医生的帮助。 |
|昨晚搬砖太晚,起不来,帮我胡诌一个请假条,让我好发给领导请假| 尊敬的领导:您好!我于 [日期] 晚上 [时间] 在公司加班,由于工作量大,无法按时完成。因此,我想申请请假一天。具体请假内容如下:[简要说明原因]。谢谢您理解和采纳。此致 敬礼! |
|作为一名职场新人,如何制定目标并顺利实现个人职业规划?请有条理的列出行动提纲出来| 1.明确目标:确定自己的职业目标和职业发展方向。2.了解行业:研究当前和未来的职业领域和发展趋势。3.学习新知识:通过参加培训、阅读书籍或参与实习等方式获取新的知识和技能。4.建立人际关系:与同业交流,加入相关组织或社团等,扩大社交圈。5.寻找机会:在公司内部或者外部寻找机会,如实习、兼职工作、志愿活动等。6.持续学习:不断提升自身能力和专业水平,保持竞争力。 |
|一名画家如何利用社交媒体扩大自身的行业影响力?| 1. 创建专业账号,如Instagram、Twitter等,以展示自己的作品和经验。2. 利用Facebook、Twitter等平台与同业人士建立联系,分享他们的经验和见解。3. 在社交媒体平台上发布有价值的内容,如图片、视频或文字,以提高自己的知名度。4. 参加各种活动,如展览、音乐会、艺术展等,以接触更多的人并扩展自己的影响范围。 |
|请为前往日本旅游的用户规划一份完整的行程安排。| 以下是一份可能的行程安排:1. 抵达东京,参观淺草寺和皇居。2. 在上野公园散步或骑自行车游览。3. 到大阪城欣赏美丽的自然风光。4. 在大阪市中心逛街或者品尝美食。5. 在箱根岛体验冲浪、潜水等水上活动。6. 最后一天在京都的清水寺观赏传统文化艺术表演。7. 返回家中并结束旅程。 |
| 把这句话翻译成中文:Knowledge can be acquired from many sources. These include books, teachers and practical experience, and each has its own advantages. The knowledge we gain from books and formal education enables us to learn about things that we have no opportunity to experience in daily life. | 知识可以从许多来源获得,包括书籍、教师和实践经验。每个来源都有自己的优点。从这些来源获得的知识使我们能够了解我们日常生活中所没有的机会所体验的。 |
| 翻译成英文:简言之,当我们努力追求目标时,永不放弃是很重要的。不管最后有没有成功,我们都会学到一些东西,而我们所学到的东西,将会使自己成为一个更好、更有自信的人。 | In short, we must never give up when we strive for our goals. Whether the ends are successful or not, what we learned will make us better and more confident in life. |
|请将以下新闻分类为体育、政治或科技:《年薪超4亿欧!曝利雅得新月正式报价梅西 球员首选留欧洲》| 体育 |
| 怎么让自己精力充沛,列5点建议 | 1. 保持充足的睡眠和休息时间。2. 多进行体育锻炼,如散步、慢跑或骑自行车等。3. 饮食均衡,摄入足够的蛋白质、碳水化合物和脂肪。4. 喝足够的水,每天至少八杯。5. 避免过度饮酒和吸烟。 |
| 明天就假期结束了,有点抗拒上班,应该怎么办? | 1. 制定一个详细的计划和目标,包括完成的任务、时间分配以及优先级。2. 将任务分为小部分,并逐步完成。不要过度承诺,以免压力过大。3. 给自己留出一些弹性时间,以应对突发情况或临时调整计划的情况。4. 与家人朋友交流沟通,分享自己的感受和想法,寻求支持和建议。5. 在工作期间保持积极心态,学会放松自己,享受生活。 |
| 我要去北京旅游,给我介绍一些旅游景点 | 1. 故宫:中国明清两代的皇宫,是中国最著名的古代建筑之一。2. 长城:世界上最长的防御性墙体,是中国的标志性景观。3. 天安门广场:世界闻名的广场和城门,也是中国历史文化的重要场所。4. 王府井大街:具有浓郁的中国风情的购物街,有各种美食、商店和文化活动。5. 颐和园:清代皇家园林,是世界级的文化遗产 |
下面是Firefly模型更具特色的一些例子,Firefly对于文言文、诗词、对联、武侠小说、散文、歌词、文案生成、情感分析等中文任务具有非常优秀的表现。
| input |