【自然语言处理与大模型】如何获取特定领域的微调数据集?

        在特定领域中,数据集通常由提出需求的一方提供。然而,在某些情况下,如果他们未能提供所需的数据,或者你正在独立开展一个项目,并且需要相应的数据来推进工作,这时你应该怎么办呢?本文提供一种思路,帮助你在仅拥有少量样本的情况下,扩展并构建特定领域的微调数据集。希望本文的内容能够成为大家前进道路上的铺路石。

一、思路介绍

        在少量原始对话样本的基础上,通过调用大模型 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 norm

def 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.40
    except:
        return False

def 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}]
            
            # 调用API
            response = client.chat.completions.create(
                model="glm-4-flash-250414",
                messages=current_msg,
                temperature=config["temperature"],
                max_tokens=100
            )
            # 获取回复内容
            reply = response.choices[0].message.content
            print("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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值