前言
??上篇文章記錄了具體的微調語言大模型步驟,以及在微調過程中可能遇見的各種報錯,美中不足的是只是基于開源數據集的微調,今天來記錄一下怎么基于自己的數據集去微調大語言模型,訓練自己的智能機器人!!!!
1.微調數據集介紹
??了解數據集的種類及其標注格式對于模型的微調至關重要。不同的數據集有不同的訓練目標和標注方式,這些差異決定了模型學習的重點
和微調策略
的選擇。通過深入理解數據集的結構和目標,能夠幫助我們更精準地制定微調計劃,優化模型的表現,并提升其在實際應用中的效果。
1.1 Alpaca 格式
[{"instruction": "輸入三支籃球隊的名稱并生成一個適當的口號。","input": "輸入:俄克拉荷馬城雷霆隊,芝加哥公牛隊,布魯克林網隊。","output": "輸出: \"雷霆,公牛和網隊:各顯神通,角逐群雄!\""},...
]
這種格式很好理解,一共就三部分instruction、input和output。
instruction: 任務的指令,告訴模型需要完成什么操作。
input: 任務所需的輸入。如果任務是開放式的或者不需要明確的輸入,這一字段可以為空字符串。
output: 任務的期望輸出,也就是模型在給定指令和輸入情況下需要生成的內容。
側重提升模型各種自然語言處理任務,適合來微調大模型做文本生成、翻譯、總結等任務
1.2 DPO 格式
[{"conversations": [{"from": "human","value": "為印度國家投資促進與便利機構的銀行、金融服務、保險(BFSI)和金融科技團隊的面試候選人創建一個案例研究任務。該團隊的使命是支持外國投資進入印度的BFSI領域,并就該領域的產業參與者的政策建議和問題進行工作。"}],"chosen": {"from": "gpt","value": "標題:支持外國投資在BFSI領域:印度國家投資促進和便利機構的案例研究\n\n目標:\n要求候選人創建一個全面的案例研究..."},"rejected": {"from": "gpt","value": "讓我們了解為BFSI團隊面試候選人創建案例研究作業的要求。"}},...
]
from: 字段指示消息的來源,可以是 “human” 或 “gpt”,表示輸入是由人類或模型提供。
value: 字段包含消息的具體內容,可能是輸入文本、模型選擇的輸出或被拒絕的輸出。
chosen: 中的內容是模型最終認為最合適的回應。
rejected: 中的內容是模型認為不合適的候選回應。
DPO可以通過調整回答的偏好來生成更符合用戶需求的回復,適合微調大模型來做用戶偏好回答。
1.3 ShareGPT 格式
[{"conversations": [{"role": "user","content": "What is the capital of France?"},{"role": "assistant","content": "The capital of France is Paris."},{"role": "user","content": "Can you tell me more about Paris?"},{"role": "assistant","content": "Paris is the largest city and the capital of France. It is known for its art, culture, and history..."}]}...
]
role: 表示對話的角色,通常為“user”表示用戶,“assistant”表示AI助手。
content: 具體的對話內容
ShareGPT 適合對話場景,更貼近人類與 AI 交互的方式,適用于構建和微調對話模型。
Q1.為什么這么多格式的數據集,統一數據集豈不是更方便?
??我的理解是,不同類型格式的數據集對模型性能的提升不同
,比如說DPO 側重于根據用戶偏好調整模型的輸出,使其更符合個性化需求,而Alpaca 側重于通過少量高質量的訓練數據提升模型的指令跟隨能力和高效訓練。
2.制作微調數據集
我這里基于gpt,根據Alpaca 格式去生成json數據集:
from docx import Document
from chat_test import get_response
import json
from tqdm import tqdmdef extract_json_from_string(input_str):# 使用正則表達式提取[]里的內容,包括大括號head_pos = input_str.find("[")tail_pos = input_str.find("]")if head_pos != -1 and tail_pos != -1:return json.loads(input_str[head_pos:tail_pos + 1]) # 包括']',所以尾部索引需要+1else:return None # 如果沒有找到[],返回Nonepath = 'F:/Desktop/docs/xxx.docx'
doc = Document(path)
text = ""
data_json = []
file = open("alpaca_zh_mydata1.json", "w", encoding="utf-8")
for para in tqdm(doc.paragraphs):if para.text == "":# print("=============None")continue# print(para.text)text = text + para.text + "\n"# print(len(text))if len(text) >= 2000:text = text + " 根據上述信息,將其制作成alpaca數據集。包括instruction、input和output"res = get_response(text)# print(res)json_str = Nonetry:json_str = extract_json_from_string(res)except:print("extract_json_from_string run error")if json_str is None:text = ""continuedata_json = data_json + json_strjson.dump(data_json, file, ensure_ascii=False, indent=2)
file.close()
其中get_response函數為chatgpt的api接口,可以根據自己的需求去封裝。
如圖所示,生成的數據集是這樣的:
3.開始微調數據集
3.1 將生成json文件放到LLaMA-Factory/data/
3.2 修改LLaMA-Factory/data/dataset_info.json文件
3.3 修改LLaMA-Factory/data/dataset_info.json文件
開始微調大模型:
conda activate lora-llama
cd LLaMA-Factory
llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml
參考文章
大模型微調——訓練數據集的格式Alpaca 和 ShareGPT