首页 >科技周边 >人工智能 >本地合成数据生成

本地合成数据生成

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌原创
2025-03-13 13:13:10348浏览

您已经听说英国数学家克莱夫·亨比(Clive Humby)著名的报价“数据是新石油”,这是最有影响力的报价,描述了21世纪数据的重要性,但是在大型语言模型的爆炸性开发之后,我们没有正确的数据是数据。因为LLM模型的开发速度和训练速度几乎超过了人类的数据生成速度。该解决方案是使数据更加精致,并且特定于任务或合成数据生成。前者是较大的域专家加载任务,但后者对当今问题的渴望更为突出。

高质量的培训数据仍然是关键的瓶颈。这篇博客文章探讨了一种使用Llama 3.2和Ollama生成合成数据的实用方法。它将展示我们如何以编程方式创建结构化的教育内容。

学习成果

  • 了解局部合成数据生成对增强机器学习模型培训的重要性和技术。
  • 了解如何实施本地合成数据生成以创建高质量数据集,同时保留隐私和安全性。
  • 在数据生成管道中实施强大的错误处理和重试机制方面获得实践知识。
  • 了解JSON验证,清洁技术及其在保持一致可靠的产出中的作用。
  • 开发设计和利用Pydantic模型来确保数据模式完整性的专业知识。

目录

  • 什么是合成数据?
  • 为什么我们今天需要合成数据?
  • 对LLM和小型LM性能的影响
  • 项目结构和环境设置
  • 项目实施
  • 强大的一代
  • 测试自动化
  • 结论
  • 常见问题

什么是合成数据?

综合数据是指人为生成的信息,这些信息模仿了现实世界数据的特征,同时保留基本模式和统计属性。它是使用算法,仿真或AI模型创建的,以解决受控方案中的隐私问题,增强有限数据或测试系统。与实际数据不同,合成数据可以根据特定要求量身定制,以确保多样性,平衡和可扩展性。它被广泛用于机器学习,医疗保健,金融和自治系统等领域,以训练模型,验证算法或模拟环境。合成数据弥合了数据稀缺和现实世界应用之间的差距,同时降低了道德和合规风险。

为什么我们今天需要合成数据?

由于几个因素,对合成数据的需求呈指数增长

本地合成数据生成

  • 数据隐私法规:使用GDPR和类似法规,合成数据为开发和测试提供了安全的选择
  • 成本效率:收集和注释真实数据是昂贵且耗时的。
  • 可及性:可以大量生成具有控制变化的合成数据
  • 边缘案例覆盖范围:我们可以生成可能难以自然收集的稀有情况的数据
  • 快速原型: ML模型上的快速迭代,而无需等待实际数据收集。
  • 不太偏见:从现实世界中收集的数据可能是错误的,并且充满了性别偏见,种族主义文本,并且对儿童的单词不安全,因此要与这种类型的数据制作模型,模型的行为也与这些偏见同在。借助合成数据,我们可以轻松控制这些行为。

对LLM和小型LM性能的影响

合成数据显示出有希望的结果,可以改善大型和小语言模型

本地合成数据生成

  • 微调效率:在高质量合成数据上进行微调的模型通常表现出与经过实际数据培训的型号相当的性能
  • 域的适应性:合成数据有助于桥接域间隙
  • 数据增强:合成和真实数据的结合通常可以单独使用任何一个单独产生更好的结果。

项目结构和环境设置

在下一节中,我们将分解项目布局,并指导您配置所需的环境。

项目/
├─-main.py
├ - ─txt
├├前
└ - ─英语_qa_new.json

现在,我们将使用Conda建立我们的项目环境。按下以下步骤

创建Conda环境

$ conda create -n合成data python = 3.11

#激活新创建的Env

$ conda激活合成数据

在Conda Env中安装库

PIP安装Pydantic Langchain Langchain-Community
PIP安装Langchain-Collama

现在我们都设置了以开始代码实现

项目实施

在本节中,我们将深入研究项目的实际实施,详细介绍每个步骤。

导入库

在启动项目之前,我们将在项目root中创建一个文件名main.py,并在该文件上导入所有库:

来自Pydantic Import Basemodel,field,validationError
来自langchain.prompts导入提示网板
从langchain_ollama进口ollamallm
从输入导入列表
进口JSON
导入uuid
导入
从pathlib导入路径
从时间进口睡眠

现在是时候继续在main.py文件上继续执行代码

首先,我们从实施数据架构开始。

EnglishQuestion Data Schema是一个Pydantic模型,可确保我们的生成数据遵循具有所需字段和自动ID生成的一致结构。

代码实现

班级英语Question(basemodel):
    id:str = field(
        default_factory = lambda:str(uuid.uid4()),
        描述=“问题的唯一标识符”,
    )
    类别:str =字段(...,描述=“问题类型”)
    问题:str =字段(...,description =“英语问题”)
    答案:str = field(...,description =“问题的正确答案”)
    think_process:str = field(
        ...,description =“解释得出答案的推理过程”
    )

现在,我们创建了英语问题数据类。

其次,我们将开始实现QuestionGenerator类。该课程是项目实施的核心。

问题加生子类结构

班级询问器:
    def __init __(self,model_name:str,output_file:path):
        经过

    def clean_json_string(self,text:str) - > str:
        经过

    def parse_response(self,result:str) - >英语标语:
        经过


    def generate_with_retries(自我,类别:str,reteries:int = 3) - >英语标语:
        经过

    def generate_questions(
        自我,类别:列表[str],迭代:int
    ) - >列表[英语标语]:
        经过

    def save_to_json(self,问题:英语提议):
        经过

    def load_existing_data(self) - > list [dict]:
        经过

让我们逐步实现关键方法

初始化

使用语言模型,提示模板和输出文件初始化类。这样,我们将使用model_name创建一个Ollamallm的实例,并设置一个以严格的JSON格式生成质量检查的提示网格。

代码实施:

 def __init __(self,model_name:str,output_file:path):
        self.llm = ollamallm(model = model_name)
        self.prompt_template = strightemplate(
            input_variables = [“类别”],
            模板=“”“”
            产生一个英语问题,以测试理解和用法。
            专注于{category}。问题将就像填写空白一样,一个衬里,一个不是MCQ类型。以这种严格的JSON格式编写输出:

            {{
                “问题”:“ ”,
                “答案”:“ ”,
                “ think_process”:“ ”
            }}}

            请勿在JSON对象之外包含任何文本。
            ”“”,
        )
        self.output_file = output_file
        self.output_file.touch(equent_ok = true)

JSON清洁

在生成过程中,我们将从LLM中获得的响应将具有许多不必要的额外字符,这些字符可能会使生成的数据有序,因此您必须通过清洁过程传递这些数据。

在这里,我们将使用REGEX在JSON键/值中修复常见的格式问题,替换有问题的字符,例如Newline和特殊字符。

代码实施:

 def clean_json_string(self,text:str) - > str:
        “”“改进的版本来处理错误或不完整的JSON。”“”
        start = text.find(“ {”)
        end = text.rfind(“}”)

        如果开始== -1或end == -1:
            提高ValueError(f“未找到json对象。响应是:{text}”)

        json_str = text [start:end 1]

        #删除任何可能打破JSON解析的特殊字符
        json_str = json_str.replace(“ \ n”,“”).replace(“ \ r”,“”)
        json_str = re.sub(r“ [^\ x20- \ x7e]”,“”,json_str)

        #解决常见的JSON格式问题
        json_str = re.sub(
            r'(?<h3>反应解析</h3><p>解析方法将使用上述清洁过程清除LLM的响应,验证响应以保持一致性,将清洁的JSON转换为Python词典,然后将字典映射到英语标语对象。</p><p><strong>代码实施:</strong></p><pre class="brush:php;toolbar:false"> def parse_response(self,result:str) - >英语标语:
        “”“解析LLM响应并对模式进行验证。
        cleaned_json = self.clean_json_string(结果)
        parsed_result = json.loads(cleaned_json)
        返回英语标题(** parsed_result)

数据持久性

对于持续的数据生成,尽管我们可以使用一些NOSQL数据库(MongoDB等)为此,但在这里我们使用一个简单的JSON文件来存储生成的数据。

代码实施:

 def load_existing_data(self) - > list [dict]:
        “”“加载JSON文件中的现有问题。”“”
        尝试:
            用fling(self.output_file,“ r”)作为f:
                返回JSON.LOAD(F)
        除(Filenotfounderror,json.jsondecodeerror):
            返回 []

强大的一代

在这个数据生成阶段,我们有两种最重要的方法:

  • 生成重试机制
  • 问题生成方法

重试机制的目的是强迫自动化在失败时产生响应。它尝试多次生成一个问题(默认值为3次),并将记录错误并在重试之间添加延迟。如果所有尝试失败,它也会引起例外。

代码实施:

 def generate_with_retries(自我,类别:str,reteries:int = 3) - >英语标语:
        尝试进行范围(检索):
            尝试:
                结果= self.prompt_template | self.llm
                响应= result.invoke(input = {“ category”:category})
                返回self.parse_response(响应)
            除例外为E:
                打印(
                    f“尝试{尝试1}/{retry}因类别'{category}':{e}
                )
                睡眠(2)#重试之前的小延迟
        提高价值Error(
            f“未能处理{retry}尝试后处理类别'{category}'。”
        )

问题生成方法将为类别列表生成多个问题,并将其保存在存储中(这里JSON文件)。它将在类别上迭代并调用每个类别的呼叫generating_with_retries方法。最后,它将使用save_to_json方法保存每个成功生成的问题。

 def generate_questions(
        自我,类别:列表[str],迭代:int
    ) - >列表[英语标语]:
        “”“为类别列表生成多个问题。“”
        all_questions = []
        对于_范围(迭代):
            类别类别:
                尝试:
                    问题= self.generate_with_retries(类别)
                    self.save_to_json(问题)
                    all_questions.append(问题)
                    print(f“成功生成类别的问题:{类别}”)
                除了(验证Error,valueerror)为e:
                    print(f“错误处理类别'{类别}':{e}”)
        返回all_questions

在终端上显示结果

为了了解LLM产生的响应是一个简单的打印功能。

 def display_questions(问题:列表[英语标语]):
    打印(“ \ ngenerated英语问题:”)
    对于问题中的问题:
        打印(“ \ n ---”)
        打印(f“ id:{Question.id}”)
        打印(f“问题:{Question.Question}”)
        打印(f“答案:{Question.answer}”)
        打印(f“思考过程:{Question.thought_process}”)

测试自动化

在运行项目之前,请在项目根上创建English_QA_NEW.JSON文件。

如果__name__ ==“ __ -main __”:
    output_file =路径(“英语_qa_new.json”)
    Generator = QuestionGenerator(model_name =“ llama3.2”,output_file = output_file)

    类别= [
        “用法”,
        “短语”,
        “词汇”,
        “成语”,
    这是给出的
    迭代= 2

    generated_questions = generator.generate_questions(类别,迭代)
    display_questions(生成_questions)

现在,转到终端并输入:

 python main.py

输出:

本地合成数据生成

这些问题将保存在您的项目根源中。保存的问题看起来像:

本地合成数据生成

该项目中使用的所有代码都在这里。

结论

在AI和LLMS快速发展的时代,合成数据生成已成为解决对高质量培训数据集不断增长的需求的强大解决方案。通过利用诸如Llama 3.2和Ollama之类的工具,以及像Pydantic这样的强大框架,我们可以创建满足特定需求的结构化,可扩展性和无偏见的数据集。这种方法不仅降低了对昂贵和耗时的现实数据收集的依赖,而且还可以确保隐私和道德合规性。随着我们完善这些方法,合成数据将继续在推动创新,改善模型性能并解锁不同领域的新可能性方面发挥关键作用。

关键要点

  • 本地合成数据生成可以创建各种数据集,这些数据集可以提高模型准确性而不会损害隐私。
  • 实施本地合成数据生成可以通过最大程度地依赖对现实世界敏感数据的依赖来显着提高数据安全性。
  • 合成数据可确保隐私,减少偏见并降低数据收集成本。
  • 量身定制的数据集改善了各种AI和LLM应用程序的适应性。
  • 合成数据为道德,高效和创新的AI发展铺平了道路。

常见问题

Q 1。为什么要使用Ollama代替基于API的模型?

A. Ollama提供本地部署功能,降低成本和延迟,同时对生成过程提供更多控制。

2。我们如何确保产生的问题的质量?

答:为了保持质量,该实施使用了Pydantic验证,重试机制和JSON清洁。可以实施其他指标和维护验证。

3。这种方法有什么局限性?

答:与较大的模型相比,本地LLMS可能具有较低的质量输出,并且可以通过本地计算资源限制生成速度。

Q4。合成数据是否安全和道德使用?

答:是的,综合数据通过删除可识别信息并通过解决数据偏差并降低对现实世界敏感数据的依赖性来确保隐私。

Q5。使用合成数据的主要挑战是什么?

A.挑战包括确保数据现实主义,维持域相关性以及将合成数据特征与现实世界用例相结合,以进行有效的模型培训。

以上是本地合成数据生成的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn