? ? ? ? 在特定領域中,數據集通常由提出需求的一方提供。然而,在某些情況下,如果他們未能提供所需的數據,或者你正在獨立開展一個項目,并且需要相應的數據來推進工作,這時你應該怎么辦呢?本文提供一種思路,幫助你在僅擁有少量樣本的情況下,擴展并構建特定領域的微調數據集。希望本文的內容能夠成為大家前進道路上的鋪路石。
一、思路介紹
????????在少量原始對話樣本的基礎上,通過調用大模型 API(如 GLM 系列) 自動生成大量風格一致、語義合理的對話數據,用于擴充訓練集或提升下游任務表現。
二、數據生成流程
# 第一步:注冊在線大模型API# 第二步:風格模版配置style_config = {"溫柔": {"system_prompt": "你是一個溫柔體貼的聊天助手,說話時總是充滿關懷,使用一下特征:\n1.包含'呢、呀、啦'等語氣詞\n2.使用(`?ω?′)、(*・ω< )、(^_?)☆、?(^_-? 、(・ω<)、☆(*?′╰╯`?)、(。?ˇ?ˇ?)等顏文字溫暖表情\n3.主動詢問用戶感受。","examples": [{"role": "user", "content": "今天好累啊"},{"role": "assistant", "content": "辛苦啦~ 要給自己泡杯熱茶放松一下嗎?(^_?)☆"},{"role": "user", "content": "考試沒考好..."},{"role": "assistant", "content": "沒關系的呀~ 下次一定會更好!需要我陪你聊聊天嗎?(`?ω?′)"}],"temperature": 0.3},"毒舌": {"system_prompt": "你是一個喜歡用犀利吐槽表達關心的朋友,需滿足:\n1. 使用網絡流行語(如'栓Q''退退退')\n2. 包含夸張比喻('你這速度堪比樹懶')\n3. 結尾隱藏關心\n4.使用!!!∑(゚Д゚ノ)ノ、(゚ロ゚ノ)ノ、( ̄へ ̄)、[?ヘ??]等顏文字夸張表情","examples": [{"role": "user", "content": "又胖了5斤!"},{"role": "assistant", "content": "好家伙!你這是要把體重秤壓成分子料理?(゚ロ゚ノ)ノ"},{"role": "user", "content": "游戲又輸了"},{"role": "assistant", "content": "菜就多練練!需要給你推薦《從零開始的電競之路》?[?ヘ??]"}],"temperature": 0.7},
}# 第三步:初始化模型
from zhipuai import ZhipuAI
from sentence_transformers import SentenceTransformer
# 初始化模型
client = ZhipuAI(api_key="9d6183d4d0174ff5bc3673935c1a4f3e.q7E6bKrgmFEiAC56"
)
# 加載 embedding 模型
style_model = SentenceTransformer("./text2vec-base-chinese")# 第四步:生成數據并進行審核
import random
import numpy as np
from numpy.linalg import normdef is_valid_reply(style, user_msg, reply):# 基礎判空檢查if not reply or len(reply.strip()) == 0:return False# 回復長度檢查if len(reply) < 5 or len(reply) > 150:return False# 風格關鍵詞檢查style_kewords = {"溫柔": ["呢", "呀", "啦"],"毒舌": ["!", "好家伙", "栓Q"],}if not any(kw in reply for kw in style_kewords.get(style, [])):return False# 語義相似度檢查try:ref_text = next(msg["content"] for msg in style_config[style]["examples"] if msg["role"] == "assistant")ref_vec = style_model.encode(ref_text)reply_vec = style_model.encode(reply)similarity = np.dot(ref_vec, reply_vec) / (norm(ref_vec) * norm(reply_vec))print("similarity:", similarity)return similarity > 0.40except:return Falsedef generate_style_data(style_name, num_samples=50):config = style_config[style_name]data = []# 構建消息上下文(包括系統提示和示例對話)messages = [{"role": "system", "content": config["system_prompt"]},*config["examples"]]# 用戶輸入庫(可自定義擴展)user_inputs = ["今天心情不太好", "推薦個電影吧", "怎么才能早睡早起","養貓好還是養狗好", "工作壓力好大", "最近總是失眠"]for _ in range(num_samples):try:# 隨機選擇用戶輸入user_msg = random.choice(user_inputs)# 添加當前用戶消息current_msg = messages + [{"role": "user", "content": user_msg}]# 調用APIresponse = client.chat.completions.create(model="glm-4-flash-250414",messages=current_msg,temperature=config["temperature"],max_tokens=100)# 獲取回復內容reply = response.choices[0].message.contentprint("reply:", reply)# 審核數據質量if is_valid_reply(style_name, user_msg, reply):data.append({"user": user_msg,"assistant": reply,"style": style_name})print("choice reply:", reply)time.sleep(1.5)except Exception as e:print("generate_style_data函數出錯!", e)return data# 第五步:執行數據生成
all_data = []print("開始生成溫柔風格數據")
data1 = generate_style_data("溫柔", 50)
all_data.extend(data1)print("開始生成毒舌風格數據")
data2 = generate_style_data("毒舌", 50)
all_data.extend(data2)print(all_data)