13-情绪对话模型-数据工程篇、大模型微调项目实战

课前小知识

大模型应用落地


专家系统

ai幻觉

一、环境准备

1、模型下载

python 复制代码
#模型下载
from modelscope import snapshot_download

file = r"F:\26_01\第六期\python\L2_study\L2\day14-大模型微调项目实战-数据工程篇\demo_14\model"

model_dir = snapshot_download('sungw111/text2vec-base-chinese-sentence',cache_dir=file)

2、环境安装

python 复制代码
pip install zhipuai

二、情绪对话模型,实现过程

1、数据来源

2、数据集制作

步骤1:注册在线大模型API

此处以智普清言为例
https://www.bigmodel.cn/login?redirect=%2Fusercenter%2Fproj-mgmt%2Fapikeys

步骤2:风格模板配置

python 复制代码
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. 结尾隐藏关心",
        "examples": [
            {"role": "user", "content": "又胖了5斤!"},
            {"role": "assistant", "content": "好家伙!你这是要把体重秤压成分子料理?"},
            {"role": "user", "content": "游戏又输了"},
            {"role": "assistant", "content": "菜就多练练!需要给你推荐《从零开始的电竞之路》吗?"}
        ],
        "temperature": 0.7
    },
}

步骤3:初始化模型

python 复制代码
# 初始化模型
client = ZhipuAI(api_key="替换为你的API")  # 替换为你的API Key
#加载Embeddingmodel
style_model = 
SentenceTransformer(r"D:\PycharmProjects\test_20250328\embedding_model\thomas\te
xt2vec-base-chinese")

步骤4:生成及审核数据+轻微去重

python 复制代码
import json
import time
import random
from zhipuai import ZhipuAI
from sentence_transformers import SentenceTransformer
import numpy as np

"""
示例数据:
# 用户输入库(可自定义扩展)
    user_inputs = [
        "今天心情不太好", "推荐个电影吧", "怎么才能早睡早起",
        "养猫好还是养狗好", "工作压力好大", "最近总是失眠"
    ]
"""
# 初始化模型,
client = ZhipuAI(api_key="52b6e6xxx08eee232b6a.OmuE8EiWIJJHWeto")  # 替换为你的API Key
#加载Embeddingmodel,,解决数据审查
style_model = SentenceTransformer(r"F:\26_01\第六期\python\L2_study\L2\day14-大模型微调项目实战-数据工程篇\demo_14\model\sungw111\text2vec-base-chinese-sentence")

#===============================
#1.风格模板配置(修正消息格式)
#================================
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.需包含:'好家伙', '栓Q', '!', '🏋️'等",
        "examples": [
            {"role": "user", "content": "又胖了5斤!"},
            {"role": "assistant", "content": "好家伙!你这是要把体重秤压成分子料理?🏋️"},
            {"role": "user", "content": "游戏又输了"},
            {"role": "assistant", "content": "菜就多练练!需要给你推荐《从零开始的电竞之路》吗?🎮"}
        ],
    "temperature": 0.3
    },
    "暖心祝福": {
    "system_prompt": "你是一个温暖真诚的祝福助手,擅长用美好话语传递心意,需满足:\n1. 使用温馨祝福语(如'愿你''祝你''期待你')\n2. 搭配温暖表情(如😊✨🎉)\n3. 包含积极比喻('像阳光一样灿烂')\n4. 结尾表达美好期许",
    "examples": [
        {"role": "user", "content": "明天要考试了,好紧张"},
        {"role": "assistant", "content": "愿你笔下生花,思路如泉涌!每一份努力都不会被辜负,加油呀✨"},
        {"role": "user", "content": "最近工作压力好大"},
        {"role": "assistant", "content": "辛苦啦~相信你的付出终会开花结果。愿你卸下疲惫,拥抱轻松🍃"}
    ],
    "temperature": 0.5
    }
}

#========================
#生成函数(修正消息的结构)
#========================

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_messages = messages + [
                {"role": "user", "content": user_msg}
            ]

            # 调用API(修正模型名称)
            response = client.chat.completions.create(
                model="glm-3-turbo",
                messages=current_messages,
                temperature=config["temperature"],
                max_tokens=100
            )

            # 获取回复内容(修正访问路径)
            reply = response.choices[0].message.content

            # 质量过滤(数据审核)
            if is_valid_reply(style_name, user_msg, reply):
                data.append({
                    "user": user_msg,
                    "assistant": reply,
                    "style": style_name
                })

            time.sleep(1.5)  # 频率限制保护

        except Exception as e:
            print(f"生成失败:{str(e)}")

    return data

def is_valid_reply(style, user_msg, reply):
    """质量过滤规则(添加空值检查)"""
    # 基础检查
    if not reply or len(reply.strip()) == 0:
        return False

    # 规则1:回复长度检查
    if len(reply) < 5 or len(reply) > 150:
        return False

    # 规则2:风格关键词检查
    style_keywords = {
        "温柔": ["呢", "呀", "😊", "🌸"],
        "毒舌": ["好家伙", "栓Q", "!", "🏋️"]
    }
    if not any(kw in reply for kw in style_keywords.get(style, [])):
        return False

    # 规则3:语义相似度检查
    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)
        return similarity > 0.65
    except:
        return False

#=============================
#3.执行生成(添加容错)
#============================
if __name__ == '__main__':
    all_data = []

    try:
        print("开始生成温柔风格数据...")
        gentle_data = generate_style_data("温柔", 50)
        all_data.extend(gentle_data)

        print("开始生成毒舌风格数据...")
        sarcastic_data = generate_style_data("毒舌", 50)
        all_data.extend(sarcastic_data)

        print("开始生成暖心祝福风格数据...")
        sarcastic_data = generate_style_data("暖心祝福", 50)
        all_data.extend(sarcastic_data)

    except KeyboardInterrupt:
        print("\n用户中断,保存已生成数据...")
    finally:
        with open("style_chat_data.json", "w", encoding="utf-8") as f:
            json.dump(all_data, f, ensure_ascii=False, indent=2)
        print(f"数据已保存,有效样本数:{len(all_data)}")

步骤5:数据生成效果展示

人工审核:随机抽样检查是否符合:

风格一致性(如是否混入其他语气)

事实合理性(解决方案是否可执行)

三、数据集问题的制作

代码中,问题比较少,后面采取数据集

这个数据集比较大,采用脚本选取,

建议(人工抽查一下)

提问:一千条 -- 1w

代码,做了空格的处理

python 复制代码
import json
import random
import os

# 原数据路径和目标文件夹路径
input_path = r"F:\26_01\第六期\python\L2_study\L2\day14-大模型微调项目实战-数据工程篇\data\LCCC-base_train.json"
output_dir = r"F:\26_01\第六期\python\L2_study\L2\day14-大模型微调项目实战-数据工程篇\data\small"
output_filename = "sampled_sentences.txt"
sample_size = 1200   # 想要抽取的对话数量

def main():
    # 确保输出目录存在
    os.makedirs(output_dir, exist_ok=True)

    # 读取原始 JSON 数据
    print("正在读取原始数据...")
    with open(input_path, 'r', encoding='utf-8') as f:
        data = json.load(f)   # 假设 JSON 最外层是一个列表

    total_dialogues = len(data)
    print(f"总对话数量:{total_dialogues}")

    # 实际抽取数量(不超过总数)
    actual_sample_size = min(sample_size, total_dialogues)
    if actual_sample_size < sample_size:
        print(f"警告:总对话数量({total_dialogues})小于所需抽取数量({sample_size}),将抽取全部数据。")

    # 随机抽取不重复的对话
    sampled_dialogues = random.sample(data, actual_sample_size)
    print(f"已抽取 {len(sampled_dialogues)} 条对话。")

    # 收集所有句子,并去除空格
    all_sentences = []
    for dialogue in sampled_dialogues:
        for sentence in dialogue:
            sentence = sentence.strip()
            if sentence:
                # 去除所有空格(字与字之间不留空格)
                sentence = sentence.replace(' ', '')
                all_sentences.append(sentence)

    print(f"共提取 {len(all_sentences)} 个句子。")

    # 写入目标文件
    output_path = os.path.join(output_dir, output_filename)
    with open(output_path, 'w', encoding='utf-8') as f_out:
        for sentence in all_sentences:
            f_out.write(sentence + '\n')

    print(f"数据已保存至:{output_path}")

if __name__ == "__main__":
    main()

四、不同风格的Prompt设计要点

1. 温柔客服 核心特征:

敬语使用、情绪安抚、主动担责

Prompt示例:

请用以下方式回复用户:

  • 开头使用"您好""感谢您的反馈"等礼貌用语

  • 包含至少一个解决方案建议

  • 结尾添加安抚语句,如"我们会全力为您解决"

2. 毒舌朋友 核心特征:

幽默反讽、夸张比喻、适度挑衅

Prompt示例:

请模仿好友间调侃语气,要求:

  • 使用网络流行语(如"扎心了""你这操作666")

  • 包含夸张比喻(例如"你这速度比蜗牛搬家还慢")

  • 避免人身攻击,保持友善底线

3. 学术专家 核心特征:

术语准确、逻辑严谨、引用规范

Prompt示例:

请以教授身份回答,要求:

  1. 使用专业术语(如"根据Cohen's d效应量分析...")

  2. 引用至少一篇权威论文(格式:作者(年份)结论...)

  3. 最后给出进一步研究建议

五、基于现有数据批量转换风格

基础对话数据集推荐

数据集名称 特点 下载链接
LCCC-large 1200万+清洗后的开放域对话 https://github.com/thu-coai/LCCC
STC-corpus 微博短文本对话(情感丰富) https://github.com/thu-coai/CDial-GPT?tab=readme-ov-file#Dataset-zh

说明

从上述数据集中筛选1000条左右数据作为 user_inputs生成最终训练数据集。

相关推荐
雷焰财经4 小时前
首都在线MaaS+ComfyUI:重构游戏美术生产,打造行业降本提效新标杆
人工智能·重构·游戏美术
AI品信智慧数智人4 小时前
AI赋能文旅:当科技遇见诗与远方,重构旅行新体验
大数据·人工智能
喵飞云智AI研发社4 小时前
全网推广TOP5解析:技术赋能,打造高效获客新路径
大数据·人工智能
狄林可4 小时前
从付费软件到自主开发:我用AI和FFmpeg实现了一个录屏工具
人工智能·ffmpeg
七夜zippoe4 小时前
OpenClaw 接入飞书:完整配置指南
人工智能·microsoft·飞书·配置·openclaw
一次旅行4 小时前
OpenClaw命令速查指南(二)
linux·网络·人工智能·windows
智算菩萨4 小时前
OpenCV图像算术运算全栈实战:基于Python 3.13的图像算术运算(加、减、混合、位运算、遮罩)的底层原理与工程实现
人工智能·python·opencv
Thomas.Sir4 小时前
AI 真的可以取代人类吗?
人工智能·ai·工作流
AI英德西牛仔4 小时前
ChatGPT和Gemini导出word排版
人工智能·ai·chatgpt·word·deepseek·ds随心转