浅谈情绪对话机器人系列(一)构建微调数据集

💡 本文会带给你

  1. 如何构建自己的训练数据集
  2. 构建文本对话的步骤

        实现情绪对话机器人需要结合情感计算(Affective Computing)、心理学模型和大语言模型技术,下面我们主要为文本对话方式浅谈下技术方案和实施步骤,首先探讨数据集构建步骤。

一. 核心架构设计

1. 核心架构

2. 程序目录

In [ ]:

emotion/
├── app/                      # 主应用目录
├── core/                     # 核心算法模块
├── data/                     # 数据管理
├── configs/                  # 配置文件
├── tests/                    # 单元测试
├── docs/                     # 文档
├── scripts/                  # 运维脚本
└── requirements.txt          # Python依赖

二. 实现步骤

2.1. 数据准备阶段

数据集来源,可以由用户提供、网上爬虫、自己生成标注或借助AI模型批量生成等方式。
本项目数据基于现有开源数据集,借助AI模型快速实现情绪化数据集制作。AI尽可能选择效果好的在线API接口,数据质量好,不建议使用本地的模型性处理。本例使用智谱清言API接口实现数据制作。
开源数据集选大型清洁汉语会话语料库(LCCC),该语料库包含:LCCC-base 和 LCCC-large。

数据集成生成流程

1.1 下载LCCC

从魔塔社区下载 modelscope download --dataset OmniData/LCCC --local_dir LCCC

下载后我们从LCCC-base_valid.json文件,抽取1000条数据,作为基础提问数据,然乎对每条数据调用AI模型API接口生成“温”柔和“毒舌”两种风格的回答语。

In [ ]:

#抽取1000条数据 script.py
import json
import random
import argparse
from pathlib import Path


def conversations(input_file: str, output_file: str, sample_size: int = 1000):
    """
    从JSON文件中随机抽取指定数量的不重复对话数据

    :param input_file: 输入JSON文件路径
    :param output_file: 输出JSON文件路径
    :param sample_size: 要抽取的对话数量
    """
    # 验证输入文件
    input_path = Path(input_file)
    if not input_path.exists():
        raise FileNotFoundError(f"输入文件 {input_file} 不存在")
    if input_path.suffix.lower() != '.json':
        raise ValueError("输入文件必须是JSON格式")

    # 读取原始数据
    try:
        with open(input_file, 'r', encoding='utf-8') as f:
            data = json.load(f)
    except json.JSONDecodeError:
        raise ValueError("输入文件不是有效的JSON格式")

    # 验证数据格式
    if not isinstance(data, list):
        raise ValueError("JSON数据应该是列表格式")
    if not all(isinstance(item, list) for item in data):
        raise ValueError("每个对话条目应该是列表格式")

    # 检查数据量是否足够
    unique_data = [tuple(conv) for conv in data]  # 转换为元组以便检查唯一性
    if len(set(unique_data)) < sample_size:
        raise ValueError(f"唯一数据只有 {len(set(unique_data))} 条,不足以抽取 {sample_size} 条不重复数据")

    # 随机抽样(确保不重复)
    sampled_data = random.sample(list(set(unique_data)), sample_size)
    # 转换回原始格式(列表的列表)
    sampled_data = [list(conv) for conv in sampled_data]

    # 保存抽样结果
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(sampled_data, f, ensure_ascii=False, indent=2)
    except IOError:
        raise IOError(f"无法写入输出文件 {output_file}")

    print(f"成功从 {len(data)} 条数据中抽取 {sample_size} 条不重复数据")
    print(f"原始数据唯一条目数: {len(set(unique_data))}")
    print(f"结果已保存到: {output_file}")


if __name__ == "__main__":
    # 设置命令行参数
    parser = argparse.ArgumentParser(description='从JSON对话数据中随机抽样')
    parser.add_argument('-i', '--input', required=True, help='输入JSON文件路径')
    parser.add_argument('-o', '--output', required=True, help='输出JSON文件路径')
    parser.add_argument('-n', '--number', type=int, default=1000, help='抽样数量(默认1000)')

    args = parser.parse_args()

    # 运行抽样
    try:
        conversations(
            input_file=args.input,
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值