SFT的数据集很难获取,因此23年有 self-instruct,evol-instruct的工作,一脉相承。
self-instruct的工作可以看https://blog.csdn.net/qq_43814415/article/details/141142750,包括细致格式化的提示工程,实例生成与任务池比对,后处理。
后者是对前者的扩展,包括做深(指令复杂化),做宽(增加主题多样性),后处理(判断生成是否成功:没有信息增量、指令难以回答、回答失败、单纯从指令复制内容)。
这些数据都是调用LLM内部的知识,所以常常会出现指令幻觉,无法控制qa的专业性。
论文:A New Pipeline For Generating Instruction Dataset via RAG and Self Fine-tuning
提出使用LLM+RAG的方式生成数据,使得可以用自己的文档生成相关的指令。
论文中采用的模型是Mistral-7B,使用langchain框架搭建RAG,自定义数据集是DSM-5。
最后就是提示工程,得到sft数据后进行微调模型,得到更优的模型。
应用场景是心理健康领域,特别是精神障碍。
至于dpo的合成数据,可以选一个很差的模型,再选一个更强的模型,生成坏的和好的回复。
参考:https://mp.weixin.qq.com/s/46_s72frC-hGlnRtOYfy3g
流程
可以看到是标准的朴素RAG做法:PDF解析为json, indexing后,作为上下文召回,再用LLM结合充分的上下文提示生成数据。
下面看具体实现
数据收集和预处理
使用了精神病学中的DSM-5文档,是一个444页的PDF。
使用了GROBID来提取pdf文档的文本并结构化,具体是以TEL格式提取原始文本为XML格式,然后再手动转为JSON。
LLM和RAG设置
LLM: Mistral-7B
RAG: langchian,采用Conversational Retrieval Chain function。
向量数据库采用FAISS。
嵌入模型采用nomic-embed-text
提示工程
采用基于目录的结构化方法。
具体,根据原文档的信息组织方法将提示分为若干类,为每个类别的精神障碍生成60-100个条目。
后处理是去重和去掉低质量条目。没有说怎么判断低质量的,应该是人工主观判断的。
提示词模版:
训练模型
通过上述过程,生成了2k条SFT数据。
使用LORA微调Mistral-7B,超参数设置
实验结果
SFT数据集描述
对于精神障碍的每个类别都有约80条数据,对于部分绝对数量较少的类别只生成40条。为了增强多样性,根据整个DSM-5的内容额外生成了300条。
训练loss
论文没有提到进行数据集切分,所以默认全部train。很好的拟合了数据。不排除过拟合
性能评估
采用对比模式,使用训练后的模型和gpt-3.5对战,用gpt-4充当打分模型。
测试集:根据DSM-5随机生成80个问题,两个模型都生成答案,由打分模型给出1-10分的分数。
结果当然是微调的好。
总结
本文提出了一个利用LLM和检索-增强生成相关框架的力量来生成特定领域指令数据集以进行微调的新颖管道。
可优化的点,或者说可能没写上去的trick:
1.合成数据的质量打分:可以先人工标注,微调一个7B的小模型,专门给条目赋分。
2.合成数据的多样性:首先是生成的时候要多样性,就是取一个个小主题概念去生成,引导大模型在局部思考(这个论文做得很好);然后是后处理,可以采用rougl-l分数排除掉太相似的条目;最后可以用t-sne或者umap的方法观察语义聚类情况,如果都在一起,分不开,那就没有多样性。
3.高级RAG: 既然都rag了,可以弄个cot方法、step方法,还有自我反思回退方法,在生成后让自己check行不行。
我的合成数据pipeline
1.确定合成流程,确定一级二级概念主题
2.写提示词,本来想针对每一个二级主题进行,但是一级的似乎更发散些,所以采用一级大主题的提示词,就一个固定的提示词
3.使用gpt4对每一张图片生成数据,在保存时计算与任务池中的数据的rouge-l分数,大于0.7的不要
4.bert+umap+k-means聚类分析语义多样性
5.distinct分析单条数据的多样性;self-bleu分析数据集的多样性。
6.筛选,每个类别的图片,精选出100条。
有很多不足,需要持续优化