您已經聽說英國數學家克萊夫·亨比(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中文網其他相關文章!