Llama3垂直领域微调-医疗问答
数据准备
要开展微调工作,首要任务是准备相应的微调数据。倘若拥有大量高质量的中文数据以及充足的计算资源,那么先基于中文数据进行中文微调,随后再开展场景适配微调,这种做法是切实可行的。不过,鉴于算力资源的限制,本文仅基于少量数据开展场景适配微调。
我们设定的应用场景为医疗服务场景。为此,将构建 1000 条医疗对话数据。此外,结合社区在微调开源模型方面的经验,通常需要融入通用语料来进行微调。考虑到用于训练 Llama3 的中文语料相对较少,所以额外增加 500 条通用语料。最终,将共计 1500 条数据用于微调。
尽管本次仅针对少量数据开展场景微调,以本文为例,仅使用 1500 余条数据用于微调任务。然而,若完全依赖人工手动将数据整理为问答对的训练格式,无疑是一项极为耗时费力的工作。因此,我们借鉴了 Stanford Alpaca 在生成 instruction - following 数据方面的工作经验,而 Stanford Alpaca 的数据生成流程又参考了华盛顿大学的 SELF - INSTRUCT 。具体而言,我们通过构建种子数据,并借助大语言模型(LLM),引导其生成适用于场景适配微调的指令微调数据,以此实现高效且低成本的微调数据自动化生成。
为了方便展示,本文的数据生成流程省去了分类任务和数据过滤,LLM使用百度文心一言的ERNIE-4.0-8K模型API。基于我们设定定微调的场景为医疗场景,主要包括四类指令:(1)疾病问诊咨询;(2)挂号预约;(3)用户导诊;(4)健康管理。第一类数据比较常见,我们直接使用开源数据[3],下载huatuo-GPT-226k.jsonl文件作为初始数据,随机抽出350条作为微调数据。第二,三,四类数据我们使用LLM生成,下面我们来看一下具体流程。
构建数据的代码可以看我的github
构建种子数据
对照Stanford Alpaca的工作,一条典型的数据格式包括五个字段。id、name、instruction、instances,is_classification(本案例不使用)。其中instances包括input和output。这里主要注意区分instruction和input,instruction表达的是执行任务的对应指令,input是额外信息的补充,而且input可能是空的。
数据格式如下:
input不为空
{
"id": "seed_task_2",
"name": "guiding_consultation",
"instruction"<