在构建大模型应用时,通常有两种方式来改进效果,一种是构建外部知识库,利用RAG来完成。但RAG并不是万能的,对于特定领域的LLM应用,以及无需示例,就能完成特定任务等场合就需要进行微调。然而,微调本身相较于RAG来讲,需要更多的算力资源和时间周期,但更大的瓶颈在于微调需要标记过的样本数据。这对于很多企业来讲,很难有这样高质量的数据积累,他们的数据通常是未经标记的,可能是文章或者规章制度,并不是以问答对的方式而存在。
为了完成微调,传统做法就是通过人工的方式进行问答对构造,在此基础上斯坦福研究团队也提出了Alpaca使用GPT-4这样的强模型模仿种子样本生成标记数据集。
笔者介绍一个新的样本数据生成的项目Bonito(https://github.com/BatsResearch/bonito),一个用于条件任务生成的开源模型,它可以将未标注的文本转换为特定任务的训练数据集,用于指令微调。根据论文介绍,该模型本身是在 mistralai/Mistral-7B-v0.1 的基础上,利用包含 165 万个示例的数据集(https://huggingface.co/datasets/BatsResearch/ctga-v1)进行微调,支持多种任务类型,包括多选题回答、是非题回答、自然语言推理、主题分类等。
Benito项目本身是一个数据生成的LLM应用,模型由vllm加速,使用方法比较简单,将文档内容提取出来(datasets),比如PDF等,然后指定生成任务类型,并将其传给bonito.generate_task即可。Bonito定义:
class Bonito(LLM, AbstractBonito):
def generate_tasks(
self,
text_dataset: Dataset,
context_col: str,
task_type: str,
sampling_params: SamplingParams,
**kwargs,
):
"""
Generates tasks using the Bonito model.
This method takes a text dataset, a context column name,
a task type, and sampling parameters, and generates tasks
using the Bonito model. It processes the input dataset,
generates outputs, collects multiple generations into
one dataset object, and filters out the examples that
cannot be parsed.
Args:
text_dataset (Dataset): The dataset that provides the text