文章目录
大语言模型中常见小模型LLM垂直领域应用微调数据集
目前,有很多团队以LLama、ChatGLM等开源预处理模型为基础进行专业领域的微调。而在微调之前,大家都知道要准备数据集。从某个角度看,专业数据集比预训练模型本身重要。
注意:
- 之所以叫大语言模型,肯定不是一两个数据集、一两个人、一两台机器就能搞定的,至于微调所耗资源也不容忽视。
- 微调只是一种技术,微调后的小模型好不好用,值得商榷。
网友对于微调的看法
-
生成式模型应用到这种真实性要求比较高的场景 短期内必然是没法落地的哈 可以考虑向量检索或者基于知识图谱之类的后端引擎调用方式 llm就老老实实做好nlu跟coordinator就好了嘛
-
不看好llm直接finetuning做涉及医疗类的精准问答机器人,llm本身说谎的能力很难解决。还是应该用llm+知识图谱的方式借用大语言对自然语言强大的理解能力去精准映射到问题域给出答案后再通过大语言对答案进行一定层度的润色来提升问答机器人的表现能力
-
看了楼上几个评论,个人认为不准有不准的用法,llm在数学领域也有一些应用,陶哲轩也提到他使用gpt帮忙研究数学,首先是可以提出一些方向性的东西。 如果这个东西5秒内,或者10秒内都没啥问题,可以先告诉医生大概可能什么问题,减轻医生的脑力负担。另外是一些辅助功能,写报告,写几个关键词自动生成病历,医生只需要简单修改即可。 极大降低医生的工作负担。写病历这件事情可能是医生很讨厌的工作之一了。
-
生成式模型应用到这种真实性要求比较高的场景 短期内必然是没法落地的哈 可以考虑向量检索或者基于知识图谱之类的后端引擎调用方式 llm就老老实实做好nlu跟coordinator就好了嘛
本文内容参考、汇总了以下开源LLM
预训练模型:ChatGLM3-6B
医学LLM:DoctorGLM
金融LLM:
法律LLM:
AdvertiseGen广告LLM数据
数据集结构
网上下载的AdvertiseGen数据集可以直接进行微调。对于新手上手了解微调的过程特别方便。
-
json格式:dev.json、train.json
-
内容结构:{"content":"v", "summary":"v"}{"content":"v", "summary":"v"}{"content":"v", "summary":"v"}
-
举例:
{"content": "类型#上衣颜色#红色 风格#青春衣样式#外套衣长#短款*衣款式#口袋", "summary": "这款外套对于个子矮小的妹纸来说就是福音了,短款穿在身上搭配起起来,立马就能变成大长腿,把整体身长比例拉长,呈现出黄金比例效果。鲜艳活泼的红色,穿在身上,视觉上给人呈现出青春的活力,元气满满的少女,还能衬托出肌肤的白皙,拥有一整天的好气色。大大的口袋,既可以作为装饰,出门携带东西也是非常的方便,还能增加整体的层次感。"}
{"content": "类型#上衣材质#牛仔布 颜色#浅蓝色颜色#深蓝色 风格#休闲风格#潮 衣样式#外套衣款式#拼接衣款式#口袋*衣款式#纽扣", "summary": "BRAND牛仔外套,浅蓝色的衣身和深蓝色形成拼接的设计,充满了潮流的时尚感,翻折的领口造型,衬托在颈部肌肤,能修饰脸型。领口下有单排金属的纽扣门襟,开合很方便,很实用可以保暖。两侧有翻盖的口袋和斜插的口袋,在视觉上很有层次感。看起来很休闲。"}
{"content": "类型#裙版型#显瘦 材质#蕾丝图案#蝴蝶结 图案#蕾丝裙下摆#花边 裙下摆#压褶裙长#半身裙 裙袖长#长袖裙领型#立领裙款式#拼接*裙款式#钉珠", "summary": "成熟韵味和优雅气质并存的时尚两件套。上衣立领系蝴蝶结造型,俏皮优雅。喇叭长袖拼接压褶蕾丝花边,气质减龄。高腰包臀半身裙,修身效果特别好,收腹展示曼妙的身材曲线。两侧手工钉珠装饰,时髦立体,视觉拉长腿型,整体上身彰显成熟女人魅力。显瘦百搭。"}
{"content": "类型#裙材质#蕾丝 图案#刺绣图案#蕾丝 裙衣门襟#拉链裙款式#拉链裙款式#吊带*裙款式#收腰", "summary": "蕾丝吊带显露出精致的锁骨,让颈部显得更加修长。腰部采用款腰围收腰的方式,小蛮腰更诱人。裙摆上大朵刺绣花朵,非常逼真,仿佛真正的花朵撒在裙子上摇曳生姿。背后贴心的珍珠扣,美观的同时又避免了生活中忘记拉拉链的尴尬情况,精致不失优雅。"}
{"content": "类型#裙版型#显瘦 图案#线条裙下摆#花边裙腰型#松紧腰*裙长#连衣裙", "summary": "连衣裙采用了松紧腰的设计,凸显出腰部纤细的线条,再加上过膝的长度,可以遮掩掉大腿上的小肉肉,更加显瘦,走路飘逸十足。采用了圆形领口的设计,修饰颈部线条,衣身上加了层次感分明的荷叶花边作为装饰,颇显甜美气质。"}
{"content": "类型#上衣图案#字母 图案#文字图案#印花 衣样式#外套衣领型#圆领衣长#中长款*衣袖长#长袖", "summary": "圆领款式设计的这一件长袖中长款的外套最大的设计亮点在于衣身上面的印花字母的设计哦,印花字母这样的款式的设计使得整一件外套看起来的感觉是很不错的呐,既显得个性又是很时髦的哟。"}
{"content": "类型#上衣版型#宽松 风格#街头风格#休闲 风格#青春图案#印花衣样式#卫衣*衣款式#连帽", "summary": "赋予活力标签的连帽连帽卫衣,是穿的出的舒适感,看得见的休闲风。这款卫衣在版式延续了经典的宽松廓形,让身体无拘无束的同时,更显放肆的青春减龄感。前中的人头印花点缀,个性而鲜明,轻松打造活跃于街头的潮酷风采,倍显时尚洒脱范儿。"}
{"content": "类型#裙颜色#黑白 图案#条纹图案#线条 裙下摆#荷叶边裙下摆#压褶 裙长#连衣裙裙领型#一字领 裙衣门襟#拉链裙款式#口袋 裙款式#拉链裙款式#吊带裙款式#抽褶", "summary": "集甜美的少女感和简洁风格为一体的连衣裙,胸前延伸一圈的压褶荷叶边设计,增加了立体层次感,让黑白条纹呈现出水波般荡漾。明线外缝,凸出褶皱的线条,形成对比收边。两侧斜插口袋方便,背后拉链拉和顺滑,吊带一字肩型设计,贴合肩部的织带,可根据身形伸缩长短,非常具有实穿性。"}
{"content": "类型#裤颜色#黑色风格#简约*图案#条纹", "summary": "传承动感简约气质的条纹衣身,结合包边圆领和半开襟设计,造型显得活力有范,又不失男孩子的时尚帅气。胸前单侧小口袋点缀,让男宝宝帅气加倍。搭配纯黑色的底裤,整体显得层次十足,视觉也十分有美感,男宝宝穿起来独特魅力尽显。"}
ChatGLM3-6B对于微调数据结构的定义
以AdvertiseGen数据集为基础。格式上,提供了多轮对话微调样例和输入输出格式微调样例。
- 多轮对话格式
多轮对话微调示例采用 ChatGLM3 对话格式约定,对不同角色添加不同 loss_mask
从而在一遍计算中为多轮回复计算 loss
。
对于数据文件,样例采用如下格式
如果您仅希望微调模型的对话能力,而非工具能力,您应该按照以下格式整理数据。
json
[
{
"conversations": [
{
"role": "system",
"content": "<system prompt text>"
},
{
"role": "user",
"content": "<user prompt text>"
},
{
"role": "assistant",
"content": "<assistant response text>"
},
// ... Muti Turn
{
"role": "user",
"content": "<user prompt text>"
},
{
"role": "assistant",
"content": "<assistant response text>"
}
]
}
// ...
]
请注意,这种方法在微调的step较多的情况下会影响到模型的工具调用功能
如果您希望微调模型的对话和工具能力,您应该按照以下格式整理数据。
json
[
{
"tools": [
// available tools, format is not restricted
],
"conversations": [
{
"role": "system",
"content": "<system prompt text>"
},
{
"role": "user",
"content": "<user prompt text>"
},
{
"role": "assistant",
"content": "<assistant thought to text>"
},
{
"role": "tool",
"name": "<name of the tool to be called",
"parameters": {
"<parameter_name>": "<parameter_value>"
},
"observation": "<observation>"
// don't have to be string
},
{
"role": "assistant",
"content": "<assistant response to observation>"
},
// ... Muti Turn
{
"role": "user",
"content": "<user prompt text>"
},
{
"role": "assistant",
"content": "<assistant response text>"
}
]
}
// ...
]
-
关于工具描述的 system prompt 无需手动插入,预处理时会将
tools
字段使用json.dumps(..., ensure_ascii=False)
格式化后插入为首条 system prompt。
-
每种角色可以附带一个
bool
类型的loss
字段,表示该字段所预测的内容是否参与loss
计算。若没有该字段,样例实现中默认对
system
,user
不计算loss
,其余角色则计算loss
。 -
tool
并不是 ChatGLM3 中的原生角色,这里的tool
在预处理阶段将被自动转化为一个具有工具调用metadata
的assistant
角色(默认计算
loss
)和一个表示工具返回值的observation
角色(不计算loss
)。 -
目前暂未实现
Code interpreter
的微调任务。 -
system
角色为可选角色,但若存在system
角色,其必须出现在user
角色之前,且一个完整的对话数据(无论单轮或者多轮对话)只能出现一次
system
角色。
原始数据预处理代码
import json
from typing import Union
from pathlib import Path
def _resolve_path(path: Union[str, Path]) -> Path:
return Path(path).expanduser().resolve()
def _mkdir(dir_name: Union[str, Path]):
dir_name = _resolve_path(dir_name)
if not dir_name.is_dir():
dir_name.mkdir(parents=True, exist_ok=False)
def convert_adgen(data_dir: Union[str, Path], save_dir: Union[str, Path]):
def _convert(in_file: Path, out_file: Path):
_mkdir(out_file.parent)
with open(in_file, encoding='utf-8') as fin:
with open(out_file, 'wt', encoding='utf-8') as fout:
for line in fin:
dct = json.loads(line)
sample = {'conversations': [{'role': 'user', 'content': dct['content']},
{'role': 'assistant', 'content': dct['summary']}]}
fout.write(json.dumps(sample, ensure_ascii=False) + '\n')
data_dir = _resolve_path(data_dir)
save_dir = _resolve_path(save_dir)
train_file = data_dir / 'train.json'
if train_file.is_file():
out_file = save_dir / train_file.relative_to(data_dir)
_convert(train_file, out_file)
dev_file = data_dir / 'dev.json'
if dev_file.is_file():
out_file = save_dir / dev_file.relative_to(data_dir)
_convert(dev_file, out_file)
convert_adgen('data/AdvertiseGen', 'data/AdvertiseGen_fix')
通用医学LLM数据集
在医学领域,对大型语言模型(LLM)进行微调时使用的数据集往往是高度专业化和结构化的,涵盖各类医学文献、临床病例报告、电子病历、医学指南、药物说明书、医学论坛对话以及科研论文摘要等内容。以下是一些可能用于医学LLM微调的数据集举例:
-
MIMIC-III(Medical Information Mart for Intensive Care III):包含大量ICU患者信息,如生命体征、诊断记录、治疗方案等,可被转化为适合NLP任务的文本格式。
-
PubMed:公开的生物医学文献数据库,可以从中抽取文章标题、摘要、关键词等信息作为微调数据。
-
MedlinePlus:美国国立医学图书馆提供的消费者健康信息,包括疾病和病症概述、治疗方法等。
-
CORD-19:COVID-19开放研究数据集,包含大量关于新冠病毒的研究论文全文和元数据。
-
ClinicalTrials.gov 数据:全球临床试验注册信息,可用于训练模型理解临床试验的设计和结果。
-
SNOMED CT 和 ICD编码系统:标准化的医学术语和诊断编码,可以帮助模型学习医学词汇和概念。
对于数据结构:
原始数据集可能包括非结构化文本、表格、XML/JSON格式的结构化数据等。在预处理阶段,这些数据通常需要转化为模型可以接受的格式:
-
文本数据:清理标点符号、数字转换、大小写统一、去除停用词、词干提取、词形还原等预处理步骤后,会被分词并转化为Token序列,每个Token对应一个索引,最终形成模型输入所需的张量形式。
-
结构化数据:如表格数据,可能需要按照列进行分类处理,比如疾病诊断列、用药记录列等,分别进行文本预处理,然后组合成模型可以处理的上下文。
-
对于问答任务或生成任务,还需要构造对应的标签数据,例如问题与答案对、摘要与原文对等。
预处理后的数据结构通常会符合机器学习模型训练的要求,即每条样本可能是一个包含(input_ids, attention_mask, token_type_ids, labels)
这样的结构,其中:
input_ids
是经过模型特定tokenizer编码后的Token序列ID;attention_mask
标识哪些Token应当被模型关注;token_type_ids
在多段文本输入的情况下表示不同段落或句子的标识;labels
是与输入对应的标签数据,例如回答问题的答案或情感分析的结果等。对于无监督或自回归任务,可能不需要labels
字段。
Chinese-medical-dialogue-data原始数据集
-
csv格式
-
分科室,如男科、内科、妇产科、肿瘤科、儿科、外科
-
男科数据集结构举例
department | title | ask | answer |
---|---|---|---|
龟头炎 | 看着挺老,像皱纹一样,是龟头炎吗 | 偶而痒,无明显异味,3天左右,以前重来没得过,看上去挺渗人的,您好这是病吗,如果是需要有什么治疗 | 你好,根据你描述的情况来看:龟头炎是龟头局部发炎的表现出,多是局部红肿、疼痛分,泌物不断增多,多由于不注意卫生或不洁性生活所致!你只是偶尔发疼,并没有什么异味儿,再加上龟头有皱纹,应考虑与最近阴茎勃起有关系,并不是什么炎症传染问题,你只要适当温水擦洗就可以了! |
前列腺增生 | 前列腺增生如何预防及治疗 | 今年已经开始,我的龟头总有一种灼热感,穿裤子也觉着磨的慌,很不舒服,连腹股沟也觉着不舒服,连次数并不多的同房腹股沟也不舒服!小便黄,有时有的刺痛!在乎怎样的帮助:前列腺增生如何预防工作及治疗 | 如果说是前列腺炎的话,主要是看你如何有尿频尿急,阴囊不适等症状,因为只要男性的阴茎在勃起,前列腺就会冲血,这样就有无菌性的炎症了,所以,每个男性都是有前列腺炎的,只不过轻重不一样而已。治疗的话主要就是针对症状治疗,如果你没症状,那么只要平时留意多吃肉食,多活动,规律生活就可以了。 |
前列腺痛 | 前列腺痛是种什么病呀 | 生活压力大,经常的吸毒,有尿道疼痛的感觉,不舒服,除了肛门疼痛,带给的痛苦是很大的,一直没去医院看大夫,也不好意思说。在乎怎样的帮助:前列腺痛是种什么病呀 | 前列腺痛患者一般叙述阴囊疼痛,附睾疼痛尿频、尿急、尿疼的症状,好象是尿路感染了,实际上尿里并没有致病菌,仔细检查也没大量的白细胞,它具有前列腺炎的各种症状,比如说尿无力、尿分叉、尿线细、尿不尽、尿肠梗阻、尿截断现象。以上是对这个问题的建议,期望对您有帮助,祝您健康! |
男性不育 | 男性不育症能治疗好吗 | 男性不育症能治疗好吗?我都没有想到是我的原因,现在是我媳妇做过仔细检查了,说是正常的,所以我想着是不是我的原因才绝不会怀上,想知道下应当怎么办呢,男性不育是怎么引来的?可有方法能治疗的啊?在乎怎样的帮助:男性不育症能治疗好吗 | 男性的不孕不育是可以治疗的,首先就是去医院专心实施仔细检查,男性是哪方面的不孕不育的原因,如是少精,无精还是精子运动能力弱等情况。不同的情况决定的治疗方法也是不同的,有的男性会再次出现输精管栓塞的情况,寻到原因实施治疗。祝患者身体早日恢复健康! |
- 内科数据集举例
department | title | ask | answer |
---|---|---|---|
心血管科 | 高血压患者能吃党参吗? | 我有高血压这两天女婿来的时候给我拿了些党参泡水喝,您好高血压可以吃党参吗? | 高血压病人可以口服党参的。党参有降血脂,降血压的作用,可以彻底消除血液中的垃圾,从而对冠心病以及心血管疾病的患者都有一定的稳定预防工作作用,因此平时口服党参能远离三高的危害。另外党参除了益气养血,降低中枢神经作用,调整消化系统功能,健脾补肺的功能。感谢您的进行咨询,期望我的解释对你有所帮助。 |
内分泌科 | 糖尿病一般需要怎么治疗? | 我妈定期检查仔细检查的时候,仔细检查出患糖尿病,糖尿病需要有怎么治疗?我大概知晓是需要有控制糖量,但是不清楚其他除了什么需要有注意的,同时治疗的时候有什么吗? | 糖尿病患者首先通过饮食控制和锻练运动,肥胖患者把体重降下来等方式调整一下看一看,如果血糖仍然偏高的话,要考虑决定合适的降糖药治疗,通常可以先决定口服降糖药,并且注意监测数据好血糖;还要防止含糖量高的食物,原则上甜食要尽量避免,还要防止暴饮暴食,适当锻练运动,控制体重。 |
消化科 | 哪家医院能治胃反流 | 烧心,打隔,咳嗽低烧,以有4年多 | 建议你用奥美拉唑同时,加用吗丁啉或莫沙必利或援生力维,另外还可以加用达喜片 |
微调数据格式
-
json格式
-
python列表
-
形如:[{"instruction":"v", "input":"v", "output":"v"},{"instruction":"v", "input":"v", "output":"v"}]
-
例子
[
{
"instruction": "如果您是医生,请根据患者的描述回答医学问题。",
"input": "医生,我一直在经历突然和频繁的惊恐发作。我不知道该怎么办。",
"output": "根据你告诉我的情况,听起来你可能患有惊恐发作。最好的方法是开始心理治疗和心理健康咨询。此外,我们应该进行心电图检查,以确保没有引起惊恐发作的物理问题。我们还需要进行抑郁症检查和毒理学检查,以排除任何其他潜在的原因。最后,我建议进行全面的心理和精神评估与治疗,以帮助控制症状。"
},
{
"instruction": "如果您是医生,请根据患者的描述回答医学问题。",
"input": "医生,我已经经历了几周的低声治疗,尽管服用药物,但情况没有好转。有什么可能是问题吗?",
"output": "你可能有声带栓塞。为了确认这一点,我们需要进行气管镜和喉咙镜活检。我们可能需要进行职业治疗评估,如言语治疗、其他诊断程序,如面谈或咨询、物理治疗练习以及在你的鼻子、口腔和阴道上的诊断程序,以排除任何其他潜在的疾病。此外,我们可能需要评估你的眼睛和耳朵是否有任何相关的情况,如眼科和口腔病诊断和治疗。"
},
{
"instruction": "如果您是医生,请根据患者的描述回答医学问题。",
"input": "医生,我一直在经历一种被称为隐秘症的情况。我的睾丸没有正确排入囊肿。我需要进行哪些医学检查?",
"output": "你需要进行全面的皮肤检查,以检查未排出睾丸的范围。然后,我们需要进行超声波检查(超声波检查)以确定睾丸的确切位置。之后,将进行盆腔检查和直肠检查以确定睾丸是否排入盆腔区域。如果没有,则可能需要进行其他与男性生殖器或神经系统程序有关的手术治疗程序。我们还将进行职业治疗评估以评估你的言语治疗。"
},
{
"instruction": "如果您是医生,请根据患者的描述回答医学问题。",
"input": "医生,我认为我被下了毒。我误喝了一些乙烯甘醇。",
"output": "很抱歉听到这个消息。我们需要进行一些检查以确定中毒的程度。我们需要给你静脉注射液以帮助排出毒素。我们还需要进行血解检查、毒理检查和完整的血液计数以评估损伤。此外,我们需要进行心电图检查,测量你的葡萄糖水平并检查你的血液酒精水平。"
},
{
"instruction": "如果您是医生,请根据患者的描述回答医学问题。",
"input": "医生,我阴道已经有一段时间不适和干燥了。我在性行为期间也感到疼痛。问题是什么?我需要什么样的测试?",
"output": "根据你的症状,听起来你可能患有营养性输卵管炎。为了确认这一点,我们需要进行盆腔检查、乳头抹片检查和尿液分析。此外,为了排除任何潜在的疾病,确保全面的预防护理,我建议进行乳房X线检查、乳房检查、直肠检查和完整的身体皮肤检查。"
},
{
"instruction": "如果您是医生,请根据患者的描述回答医学问题。",
"input": "你好医生,我认为我在打篮球时折断了手。它很疼,移动不正确。",
"output": "很抱歉听到这个消息。根据你的症状,我建议我们进行X线成像检查,特别是平面X线检查,以确定骨折的程度和位置。我们可能需要使用螺旋骨切除术来支撑和固定骨骼在愈合时。此外,我们可以考虑牵引、其他伤口护理和物理治疗练习以促进愈合和改善运动能力。"
}
]
原始数据预处理
数据预处理主要目的是从原始数据集筛选符合微调要求的数据,并进行适当的文本处理。最简单的就是筛选字段:
asklist = []
answerlist = []
with open('内科5000-33000.csv') as f:
for i in range(0,5000):
lin = f.readline()[0:-1].split(',')
if i==0:
continue
#print(lin)
if len(lin) == 4:
if len(lin[1]+','+lin[2])<200 and len(lin[3])<200:
asklist.append(lin[1]+','+lin[2])
answerlist.append(lin[3])
with open('内科.txt','w') as f:
for i in range(len(asklist)):
f.write(asklist[i]+'\n'+answerlist[i]+'\n\n\n')
其他数据集(仅列出名字)
中文数据集
- 全国第二届"军事智能机器阅读"挑战赛
- 百度的中文问答数据集WebQA
- 第二届"讯飞杯"中文机器阅读理解评测CMRC 2018公开数据集
- chinese_roberta_L-12_H-768