暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何从任何文档生成用于 LLM 微调的指令数据集(含代码)

二师兄talks 2024-03-13
1135

大型语言模型 (LLM) 是功能强大的通用工具,但它们通常缺乏特定领域的知识,而这些知识通常存储在企业存储库中。

使用您自己的数据微调自定义 LLM 可以弥补这一差距,而数据准备是此过程的第一步。这也是一个关键步骤,可以显着影响微调模型的性能。

然而,手动创建数据集可能既昂贵又耗时。另一种方法是利用 LLM 生成合成数据集,通常使用 GPT-4 等高性能模型,但成本可能非常高。

在本文中,我的目的是提请您注意一种经济高效的替代方案,用于自动从各种文档创建指令数据集。该解决方案涉及利用名为 Bonito 的轻量级开源库。


开源解决方案 Bonito 入门

了解说明

在我们深入了解 bonito 库及其工作原理之前,我们需要首先了解指令是什么。

指令是给 LLM 的文本或提示,例如 Llama、GPT-4 等。它指示模型产生特定类型的答案。通过指令,人们可以引导讨论,确保模型的回复相关、有帮助并且符合用户的需求。制定清晰准确的指示对于实现预期结果非常重要。

Bonito 简介,一种用于条件任务生成的开源模型

Bonito 是一个专为条件任务生成而设计的开源模型。它可用于创建合成指令调整数据集,以使大型语言模型适应用户的专业私有数据。


Bonito 开发的研究论文阐述了如何有效地利用它来使预训练和指令调整的模型适应各种任务,而无需任何文本注释。

mistralai/Mistral-7B-v0.1该模型本身是根据包含 165 万个示例的新大型数据集进行微调的。

Bonito还支持多种任务类型,包括多项选择题、是非题、自然语言推理、主题分类等。

Bonito的使用方法

使用 Bonito 模型的最简单方法是通过基于和库构建的

在下一节中,我将向您展示如何轻松使用 Bonito 包从 PDF 文档创建合成数据集。

生成数据集的分步指南

在本指南中,我将向您展示如何使用 Bonito 包从 PDF 文档生成问答数据集。

在本例中,我选择了卢森堡金融监管机构 CSSF 发布的第 12/552 号通知,该通知涉及银行治理和中央管理。这一选择背后的动机源于这样的观察:像 ChatGPT 这样的工具通常很难掌握特定领域的知识,特别是特定行业内和卢森堡等较小国家的监管要求。

我的目标是将这份通告转化为适合微调法学硕士的教学数据集。这个量身定制的法学硕士将使我能够理解基本的监管要求,回应有关这些要求的询问,并最终将其实用性扩展到更广泛的应用,例如风险管理、影响评估和持续监控。

先决条件:由于 Bonito 是 Mistral 7B 的微调模型,因此我个人使用 Google Colab A100 GPU 实例运行此演示。它还应该在具有足够 GPU 和 RAM 的计算机上本地运行。

第 1 步 — 安装 Bonito 包和其他依赖项

除了 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 可以处理多种任务。以下是 Bonito 可以管理的任务类型的简要概述:

            • 提取式问答 (exqa):根据给定的文本片段生成问题的答案,直接从文本中提取答案。

            • 多项选择题问答 (mcqa):提供一组多项选择中问题的答案。

            • 问题生成 (qg):根据提供的文本内容创建问题。

            • 无选择问答 (qa):回答问题而不提供多项选择选项。

            • 是-否问答 (ynqa):生成问题的是或否答案。

            • 共指解析 (coref):识别文本中引用同一实体的提及。

            • 释义生成(paraphrase):用不同的措辞重写句子或短语,同时保留原始含义。

            • 释义识别(paraphrase_id):确定两个句子或短语是否传达相同的含义。

            • 句子完成 (sent_comp):填写句子中缺失的部分。

            • 情绪分析(情绪):识别文本中表达的情绪,例如积极、消极或中性。

            • 摘要:将较长的文本压缩为较短的摘要,抓住要点。

            • 文本生成 (text_gen):根据提示创建连贯且上下文相关的文本。

            • 主题分类 (topic_class):将文本分类为预定义的主题。

            • 词义消歧 (wsd):根据上下文确定单词的含义。

            • 文本蕴涵 (te):预测给定文本是否在逻辑上源自另一文本。

            • 自然语言推理 (nli):确定两段文本之间的关系,例如矛盾、蕴含或中立。

            第四步:保存生成的数据集

            现在我们可以将生成的数据集保存在本地或将其上传到 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(一种经过专门微调的开源模型)从任何文本创建数据集。与手动操作或使用 GPT-4 等付费模型相比,这种新方法提供了一个很好的选择,后者可能非常昂贵。

                Bonito 是一种相对较新的方法,于上个月刚刚发布。由于大量知识存在于分散在各种文档中的非结构化数据中,因此我使用 Bonito 自动从多个文档生成数据集。然后,这些数据集用于训练本地法学硕士,使我能够定制我的模型以理解和利用特定知识。

                现在您已准备好合成数据集,准备好启动微调过程了!请务必查看以下文章,以开始对您的法学硕士进行有效的微调。


                参考

                1. 学习生成零样本任务适应的指令调优数据集:https://arxiv.org/abs/2402.18334

                2. Colab 笔记本:https://colab.research.google.com/drive/1QEpYZQ0fK22EdB05zFcCUSHO3eRVgQCs?usp=sharing





                你也可以关注公众号以获取更多故事,并在 公众号 上阅读我的短篇技术文章。


                文章转载自二师兄talks,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论