您已经听说英国数学家克莱夫·亨比(Clive Humby)著名的报价“数据是新石油”,这是最有影响力的报价,描述了21世纪数据的重要性,但是在大型语言模型的爆炸性开发之后,我们没有正确的数据是数据。因为LLM模型的开发速度和训练速度几乎超过了人类的数据生成速度。该解决方案是使数据更加精致,并且特定于任务或合成数据生成。前者是较大的域专家加载任务,但后者对当今问题的渴望更为突出。
高质量的培训数据仍然是关键的瓶颈。这篇博客文章探讨了一种使用Llama 3.2和Ollama生成合成数据的实用方法。它将展示我们如何以编程方式创建结构化的教育内容。
综合数据是指人为生成的信息,这些信息模仿了现实世界数据的特征,同时保留基本模式和统计属性。它是使用算法,仿真或AI模型创建的,以解决受控方案中的隐私问题,增强有限数据或测试系统。与实际数据不同,合成数据可以根据特定要求量身定制,以确保多样性,平衡和可扩展性。它被广泛用于机器学习,医疗保健,金融和自治系统等领域,以训练模型,验证算法或模拟环境。合成数据弥合了数据稀缺和现实世界应用之间的差距,同时降低了道德和合规风险。
由于几个因素,对合成数据的需求呈指数增长
合成数据显示出有希望的结果,可以改善大型和小语言模型
在下一节中,我们将分解项目布局,并指导您配置所需的环境。
项目/ ├─-main.py ├ - ─txt ├├前 └ - ─英语_qa_new.json
现在,我们将使用Conda建立我们的项目环境。按下以下步骤
$ conda create -n合成data python = 3.11 #激活新创建的Env $ conda激活合成数据
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)
在生成过程中,我们将从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这样的强大框架,我们可以创建满足特定需求的结构化,可扩展性和无偏见的数据集。这种方法不仅降低了对昂贵和耗时的现实数据收集的依赖,而且还可以确保隐私和道德合规性。随着我们完善这些方法,合成数据将继续在推动创新,改善模型性能并解锁不同领域的新可能性方面发挥关键作用。
A. Ollama提供本地部署功能,降低成本和延迟,同时对生成过程提供更多控制。
问2。我们如何确保产生的问题的质量?答:为了保持质量,该实施使用了Pydantic验证,重试机制和JSON清洁。可以实施其他指标和维护验证。
问3。这种方法有什么局限性?答:与较大的模型相比,本地LLMS可能具有较低的质量输出,并且可以通过本地计算资源限制生成速度。
Q4。合成数据是否安全和道德使用?答:是的,综合数据通过删除可识别信息并通过解决数据偏差并降低对现实世界敏感数据的依赖性来确保隐私。
Q5。使用合成数据的主要挑战是什么?A.挑战包括确保数据现实主义,维持域相关性以及将合成数据特征与现实世界用例相结合,以进行有效的模型培训。
以上是本地合成数据生成的详细内容。更多信息请关注PHP中文网其他相关文章!