首頁 > 科技週邊 > 人工智慧 > 本地合成數據生成

本地合成數據生成

尊渡假赌尊渡假赌尊渡假赌
發布: 2025-03-13 13:13:10
原創
346 人瀏覽過

您已經聽說英國數學家克萊夫·亨比(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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板