在构建大模型应用时,通常有两种方式来改进效果,一种是构建外部知识库,利用RAG来完成。但RAG并不是万能的,对于特定领域的LLM应用,以及无需示例,就能完成特定任务等场合就需要进行微调。然而,微调本身相较于RAG来讲,需要更多的算力资源和时间周期,但更大的瓶颈在于微调需要标记过的样本数据。这对于很多企业来讲,很难有这样高质量的数据积累,他们的数据通常是未经标记的,可能是一篇一篇的文章或者规章制度,并不是以问答对的方式而存在。
为了完成微调,传统做法就是通过人工的方式进行问答对构造,在此基础上斯坦福研究团队也提出了Alpaca使用GPT-4这样的强模型模仿种子样本生成标记数据集。
笔者介绍一个新的样本数据生成的项目Bonito(),一个用于条件任务生成的开源模型,它可以将未标注的文本转换为特定任务的训练数据集,用于指令微调。根据论文介绍,该模型本身是在 mistralai/Mistral-7B-v0.1 的基础上,利用包含 165 万个示例的数据集()进行微调,支持多种任务类型,包括多选题回答、是非题回答、自然语言推理、主题分类等。
Benito项目本身是一个数据生成的LLM应用,模型由vllm加速,使用方法比较简单。基本过程为将文档内容提取出来(datasets),比如PDF等,然后指定生成任务类型,并将其传给bonito.generate_task即可。
Bonito定义:
class Bonito(LLM, AbstractBonito):def generate_tasks(self,text_dataset:, **kwargs)return synthetic_dataset
基本使用:
from bonito import Bonitofrom vllm import SamplingParamsfrom,task_type="nli",sampling_params=sampling_params)
如果想要在显存较小的GPU上运行,如T4,可对模型进行量化。
from typing import Optional, List, Dictfrom)outputs = self._generate_text(processed_dataset["input"], sampling_params)examples = []for i, example in enumerate(text_dataset.to_list()):output = outputs[i]example["prediction"] = output.strip()examples.append(example)synthetic_dataset =).to_list()[0]return synthetic_dataset_dictdef _generate_text(self,dataset:)input_ids = input_ids.cuda()output = self.model.generate(input_ids,do_sample=True,**sampling_params)generated_text = self.tokenizer.decode(output[0][len(input_ids[0]):], skip_special_tokens=True)generated_texts.append(generated_text)return generated_texts
以tasktype为ynqa,即yes-or-no问题为例,其生成的结果如下:
sampling_params = {'max_new_tokens':256, 'top_p':0.95, 'temperature':0.7, 'num_return_sequences':1}synthetic_dataset = bonito.generate_task(unannotated_paragraph,task_type="ynqa",sampling_params=sampling_params)pprint("----Generated Instructions----")pprint(f'Input: {synthetic_dataset["input"]}')pprint(f'Output: {synthetic_dataset["output"]}')'----Generated Instructions----'('Input: Based on the following passage, is a written communication ' 'confidential? 1. “Confidential Information”, whenever used in this ' 'Agreement, shall mean any>
其中,tasktype支持的任务类型如下:
在性能上,相较于GPT-4的方案,bonito在三个数据集中两个上取得了超越GPT4的好成绩。
小结:
相较于使用GPT-4生成标记样本的方法,经过专门面向数据集生成微调的模型Bonito来讲,支持zero-shot级别的样本生成,并且可以使用开源的模型,这在开放性,成本、性能上都能具备较强的优势。
随着微调技术的不断普及,相信数据样本质量和生产成本将受到越来越多的重视,benito等这样的数据集生成模型也将迎来更大的发展。
本文转载自,作者: