使用轻量级库经济地生成高质量的合成数据集
大型语言模型 (LLMs) 是功能强大的通用工具,但它们通常缺乏特定于领域的知识,这些知识通常存储在企业存储库中。
使用您自己的数据微调自定义LLM可以弥合这一差距,而数据准备是此过程的第一步。这也是一个关键的步骤,可以显着影响微调模型的性能。
但是,手动创建数据集可能既昂贵又耗时。另一种方法是利用 来LLM生成合成数据集,通常使用 GPT-4 等高性能模型,这可能会非常昂贵。
在本文中,我旨在提请您注意一种经济高效的替代方案,用于自动从各种文档创建指令数据集。该解决方案涉及使用名为 Bonito 的轻量级开源库。
图像由作者使用由 DALL 提供支持的 Bing 聊天生成。E 3
开始使用 Bonito,开源解决方案
了解说明
在我们深入研究库鲣鱼及其工作原理之前,我们需要首先了解指令是什么。
指令是给 LLMLlama、GPT-4 等的文本或提示。它指示模型生成特定类型的答案。通过说明,人们可以引导讨论,确保模型的回复是相关的、有用的,并且符合用户的需求。创建清晰准确的说明对于实现预期结果非常重要。
介绍 Bonito,一种用于条件任务生成的开源模型
Bonito 是一个开源模型,专为条件任务生成而设计。它可用于创建合成指令调优数据集,使大型语言模型适应用户的专用私有数据。
Bonito 工作流程。来源:学习生成用于零样本任务适应的指令调整数据集
Bonito开发背后的研究论文说明了如何有效地使用它来使预训练和指令调整的模型适应各种任务,而无需任何文本注释。
该模型本身是使用 mistralai/Mistral-7B-v0.1
包含1.65M示例的新大规模数据集进行微调的。
Bonito 还支持多种任务类型,包括多项选择题解答、是-否问答、自然语言推理、主题分类等。
如何使用鲣鱼
使用 Bonito 模型的最简单方法是通过他们基于 和 vllm
库构建的 transformers
包。
在下一节中,我将向您展示如何轻松地使用 Bonito 包从 PDF 文档创建合成数据集。
生成数据集的分步指南
在本指南中,我将向您展示如何使用 Bonito 包从 PDF 文档生成问答数据集。
在这个例子中,我选择了卢森堡金融监管机构 CSSF 发布的第 12/552 号通知,该通知与银行治理和中央管理有关。这种选择背后的动机源于一种观察,即像 ChatGPT 这样的工具往往难以掌握特定领域的知识,尤其是特定行业和卢森堡等较小国家的监管要求。
我的目标是将此循环转换为适合微调的LLM教学数据集。这种量身定制LLM将使我能够理解潜在的监管要求,回应有关这些要求的询问,并最终将其效用扩展到更广泛的应用,例如风险管理、影响评估和持续监控。
先决条件:由于 Bonito 是 Mistral 7B 的微调模型,因此我个人使用 Google Colab A100 GPU 实例运行此演示。它还应该在具有足够 GPU 和 RAM 的计算机上本地工作。
你可以在这里找到我的 Colab 笔记本。
第 1 步 --- 安装 Bonito 软件包和其他依赖项
除了鲣鱼套餐,我们还需要:
- 数据集和 Hugging Face Hub 库,用于处理数据集并与 Hugging Face 存储库交互
- PyMuPDF 和 SpaCy:PyMuPDF 用于从 PDF 文件中读取和提取文本,而 SpaCy 用于自然语言处理任务。
!pip install -e git+https://github.com/BatsResearch/bonito#egg=bonito
!pip install datasets huggingface_hub
!pip install pymupdf spacy
第 2 步:处理 PDF 文档
首先,我们利用 PyMuPDF 库从文档中提取文本。
import fitz # PyMuPDF
def extract_text_from_pdf(pdf_path):
doc = fitz.open(pdf_path) # Open the PDF file
text = ""
for page in doc: # Iterate through each page
text += page.get_text() # Extract text and append it to the text variable
return text
pdf_path = 'cssf_12_552_governance.pdf' # Specify the path to your PDF document
text = extract_text_from_pdf(pdf_path) # Call the function with the path to your PDF
接下来,我们通过将提取的文本拆分为句子来处理它。此步骤使用 SpaCy,这是一个用于高级自然语言处理 (NLP) 的库。
import spacy
nlp = spacy.load("en_core_web_sm") # Load the English language model
def split_into_sentences(text):
doc = nlp(text) # Process the text with SpaCy
sentences = [sent.text.strip() for sent in doc.sents] # Extract sentences and strip whitespace
return sentences
sentences = split_into_sentences(text) # Split the extracted text into sentences
最后,我们将句子列表转换为模型 Bonito 可以使用的格式,特别是使用 datasets
库:
from datasets import Dataset
# Assuming sentences is a list of strings, where each string is a sentence
data = {"sentence": sentences}
dataset = Dataset.from_dict(data)
print(dataset)
步骤 3:生成合成数据集
现在是时候利用 Bonito 库来生成为问答量身定制的合成数据集了!
from bonito import Bonito, SamplingParams
from datasets import load_dataset
# Initialize the Bonito model
bonito = Bonito("BatsResearch/bonito-v1")
sampling_params = SamplingParams(max_tokens=256, top_p=0.95, temperature=0.5, n=1)
synthetic_dataset = bonito.generate_tasks(
dataset,
context_col="sentence",
task_type="qg",
sampling_params=sampling_params
)
在此示例中,我们使用 Bonito 进行"问题生成"(qg) 为数据集创建问题。但鲣鱼可以处理各种各样的任务。以下是 Bonito 可以管理的任务类型的简要概述:
- 抽取式问答 (exqa):根据给定的文本片段生成问题的答案,直接从文本中提取答案。
- 多项选择题解答 (mcqa):提供一组多项选择题的答案。
- 问题生成 (qg):根据所提供文本的内容创建问题。
- 无选择的问答 (qa):在不提供多项选择选项的情况下回答问题。
- 是-否问答 (ynqa):生成问题的"是"或"否"答案。
- 共指解析 (coref):标识文本中引用同一实体的提及。
- 释义生成(释义):用不同的措辞重写句子或短语,同时保留原始含义。
- 释义识别 (paraphrase_id):确定两个句子或短语是否传达相同的含义。
- 句子完成 (sent_comp):填补句子中缺失的部分。
- 情绪分析(情绪):标识文本中表达的情绪,例如正面、负面或中性。
- 摘要:将较长的文本压缩为较短的摘要,以捕捉要点。
- 文本生成 (text_gen):根据提示创建连贯且上下文相关的文本。
- 主题分类 (topic_class):将文本分类为预定义的主题。
- 词义消歧 (wsd):根据词的上下文确定词的含义。
- 文本蕴涵 (te):预测给定文本是否在逻辑上遵循另一个文本。
- 自然语言推理 (nli):确定两个文本之间的关系,例如矛盾、蕴涵或中立性。
步骤 4:保存生成的数据集
现在,我们可以将生成的数据集保存在本地或将其上传到 Hugging Face Hub。
要在 Hugging Face Hub 上上传和保存数据集,请登录 Hub。
from huggingface_hub import notebook_login
notebook_login()
然后,为数据集创建存储库并将其推送到中心。
from huggingface_hub import create_repo
from huggingface_hub import Repository
repo_name = "dataset_12_552" # Choose a name for your dataset repository
repo_url = create_repo(repo_name, repo_type="dataset")
print("Repository URL:", repo_url)
synthetic_dataset.push_to_hub(f"Ronal999/dataset_12_552")
这是我用我的文档创建的数据集,当然,在微调过程之前,它需要一些进一步的清理和改进,以确保其质量和性能。
我用 Bonito 生成的合成数据集
结束语
创建高质量的指令数据集是实现性能良好的模型的关键,但这可能是一个耗时的过程。
在本指南中,我们研究了如何使用 Bonito(一种经过特殊微调的开源模型)从任何文本创建数据集。与手工做事或使用 GPT-4 等付费模型相比,这种新方式提供了一个不错的选择,这可能会变得非常昂贵。
鲣鱼是一种相对较新的方法,上个月刚刚发布。由于大量知识存在于分散在各种文档中的非结构化数据中,因此我使用 Bonito 从多个文档自动生成数据集。然后,这些数据集用于训练本地LLM,使我能够自定义我的模型来理解和利用特定知识。