💡 本文会带给你
- 如何构建自己的训练数据集
- 构建文本对话的步骤
实现情绪对话机器人需要结合情感计算(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,