从标注到训练数据构建高质量问答数据集的全流程指南在人工智能领域数据质量往往决定了模型性能的上限。许多团队投入大量资源进行模型架构优化却忽视了最基础的数据准备工作。本文将带您深入探索从原始文本标注到最终训练数据准备的全流程特别针对希望用自建数据微调开源大模型的开发者。1. 数据标注平台的选择与部署文本标注是构建高质量数据集的起点。当前主流标注工具中基于Web的开源平台因其灵活性和协作功能备受青睐。这类工具通常支持多种标注任务类型包括但不限于序列标注适用于命名实体识别(NER)等任务文本分类适用于情感分析等场景序列到序列特别适合问答对生成部署这类工具最便捷的方式是通过容器化技术。以下是一个典型的部署命令示例docker run -d --name doccano \ -p 8000:8000 \ -v doccano-data:/data \ -e ADMIN_USERNAMEadmin \ -e ADMIN_PASSWORDsecurepassword123 \ doccano/doccano提示生产环境中建议配置SSL证书并启用身份验证确保数据安全部署完成后管理员需要配置项目基本参数。关键设置包括配置项推荐值说明项目类型Sequence2Sequence适合问答对生成共享标注启用便于团队协作数据随机化启用避免标注偏差2. 高效标注工作流设计多人协作标注需要精心设计工作流程以避免混乱。一个典型的标注团队可能包含以下角色项目管理员负责整体协调和最终数据导出标注员负责原始数据标注质检员负责审核标注质量2.1 数据准备与导入原始数据通常需要转换为结构化格式。以下Python脚本展示了如何将文本文件转换为标注工具可接受的JSON格式import json from pathlib import Path def txt_to_json(input_dir, output_file): documents [] for txt_file in Path(input_dir).glob(*.txt): with open(txt_file, r, encodingutf-8) as f: content f.read().replace(\n\n, \n) documents.append({ text: content, meta: {source: txt_file.name} }) with open(output_file, w, encodingutf-8) as f: json.dump(documents, f, ensure_asciiFalse, indent2) # 使用示例 txt_to_json(./raw_documents, ./prepared_data.json)2.2 标注规范制定清晰的标注规范对保证数据一致性至关重要。问答对标注应明确问题应针对文本中的明确信息答案必须可直接从文本中推导复杂问题应分解为多个简单问答对标注示例格式问题####答案3. 从原始标注到训练数据标注完成后导出的数据需要进一步处理才能用于模型训练。典型处理流程包括数据清洗去除无效或低质量标注格式转换转换为模型特定格式数据分割划分训练/验证/测试集3.1 数据清洗与转换以下代码展示了如何将标注工具导出的JSON转换为Alpaca格式import json def convert_to_alpaca(input_file, output_file): with open(input_file, r, encodingutf-8) as f: raw_data json.load(f) processed [] for item in raw_data: if label in item and isinstance(item[label], list): for qa in item[label]: if #### in qa: question, answer qa.split(####, 1) processed.append({ instruction: question.strip(), input: item[text], output: answer.strip() }) with open(output_file, w, encodingutf-8) as f: json.dump(processed, f, ensure_asciiFalse, indent2)3.2 数据质量评估在投入训练前应对数据集进行基本统计分析平均问答对长度分布问题类型分布答案在原文中的覆盖率可以使用以下pandas代码快速分析import pandas as pd def analyze_dataset(file_path): df pd.read_json(file_path) df[instruction_length] df[instruction].apply(len) df[output_length] df[output].apply(len) print(f总样本数: {len(df)}) print(f平均问题长度: {df[instruction_length].mean():.1f}字符) print(f平均答案长度: {df[output_length].mean():.1f}字符)4. 模型微调实战准备好数据后就可以开始模型微调了。以ChatGLM为例微调流程主要包括环境准备安装必要的库和依赖数据加载将处理好的数据转换为模型输入格式训练配置设置超参数和训练策略模型评估验证微调效果4.1 训练脚本示例以下是使用Hugging Face Transformers微调的基本代码框架from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer # 加载预训练模型和分词器 model_name THUDM/chatglm-6b tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(model_name, trust_remote_codeTrue) # 准备训练数据 def preprocess_function(examples): inputs [f问{q}\n上下文{c}\n答 for q, c in zip(examples[instruction], examples[input])] model_inputs tokenizer(inputs, truncationTrue, max_length512) labels tokenizer(examples[output], truncationTrue, max_length128).input_ids model_inputs[labels] labels return model_inputs # 配置训练参数 training_args TrainingArguments( output_dir./results, per_device_train_batch_size4, num_train_epochs3, save_steps500, logging_steps100, learning_rate5e-5, fp16True, ) # 创建Trainer并开始训练 trainer Trainer( modelmodel, argstraining_args, train_datasetprocessed_dataset, tokenizertokenizer, ) trainer.train()4.2 微调策略优化针对不同规模的数据集可采用不同的微调策略数据规模推荐策略注意事项小(1k)LoRA微调防止过拟合中(1k-10k)全参数微调适当降低学习率大(10k)多阶段微调先通用领域后特定领域对于资源有限的情况可以考虑以下优化手段梯度检查点减少显存占用混合精度训练加速训练过程参数高效微调如Adapter或Prefix-tuning在实际项目中数据标注往往只占整个流程20%的时间而数据清洗和格式转换却可能消耗80%的精力。一个常见的误区是过于关注标注速度而忽视了标注规范的严谨性这往往会导致后期数据处理成本呈指数级增长。
从标注到训练数据:手把手教你用Doccano标注的问答对,喂给你的本地大模型(比如ChatGLM)
从标注到训练数据构建高质量问答数据集的全流程指南在人工智能领域数据质量往往决定了模型性能的上限。许多团队投入大量资源进行模型架构优化却忽视了最基础的数据准备工作。本文将带您深入探索从原始文本标注到最终训练数据准备的全流程特别针对希望用自建数据微调开源大模型的开发者。1. 数据标注平台的选择与部署文本标注是构建高质量数据集的起点。当前主流标注工具中基于Web的开源平台因其灵活性和协作功能备受青睐。这类工具通常支持多种标注任务类型包括但不限于序列标注适用于命名实体识别(NER)等任务文本分类适用于情感分析等场景序列到序列特别适合问答对生成部署这类工具最便捷的方式是通过容器化技术。以下是一个典型的部署命令示例docker run -d --name doccano \ -p 8000:8000 \ -v doccano-data:/data \ -e ADMIN_USERNAMEadmin \ -e ADMIN_PASSWORDsecurepassword123 \ doccano/doccano提示生产环境中建议配置SSL证书并启用身份验证确保数据安全部署完成后管理员需要配置项目基本参数。关键设置包括配置项推荐值说明项目类型Sequence2Sequence适合问答对生成共享标注启用便于团队协作数据随机化启用避免标注偏差2. 高效标注工作流设计多人协作标注需要精心设计工作流程以避免混乱。一个典型的标注团队可能包含以下角色项目管理员负责整体协调和最终数据导出标注员负责原始数据标注质检员负责审核标注质量2.1 数据准备与导入原始数据通常需要转换为结构化格式。以下Python脚本展示了如何将文本文件转换为标注工具可接受的JSON格式import json from pathlib import Path def txt_to_json(input_dir, output_file): documents [] for txt_file in Path(input_dir).glob(*.txt): with open(txt_file, r, encodingutf-8) as f: content f.read().replace(\n\n, \n) documents.append({ text: content, meta: {source: txt_file.name} }) with open(output_file, w, encodingutf-8) as f: json.dump(documents, f, ensure_asciiFalse, indent2) # 使用示例 txt_to_json(./raw_documents, ./prepared_data.json)2.2 标注规范制定清晰的标注规范对保证数据一致性至关重要。问答对标注应明确问题应针对文本中的明确信息答案必须可直接从文本中推导复杂问题应分解为多个简单问答对标注示例格式问题####答案3. 从原始标注到训练数据标注完成后导出的数据需要进一步处理才能用于模型训练。典型处理流程包括数据清洗去除无效或低质量标注格式转换转换为模型特定格式数据分割划分训练/验证/测试集3.1 数据清洗与转换以下代码展示了如何将标注工具导出的JSON转换为Alpaca格式import json def convert_to_alpaca(input_file, output_file): with open(input_file, r, encodingutf-8) as f: raw_data json.load(f) processed [] for item in raw_data: if label in item and isinstance(item[label], list): for qa in item[label]: if #### in qa: question, answer qa.split(####, 1) processed.append({ instruction: question.strip(), input: item[text], output: answer.strip() }) with open(output_file, w, encodingutf-8) as f: json.dump(processed, f, ensure_asciiFalse, indent2)3.2 数据质量评估在投入训练前应对数据集进行基本统计分析平均问答对长度分布问题类型分布答案在原文中的覆盖率可以使用以下pandas代码快速分析import pandas as pd def analyze_dataset(file_path): df pd.read_json(file_path) df[instruction_length] df[instruction].apply(len) df[output_length] df[output].apply(len) print(f总样本数: {len(df)}) print(f平均问题长度: {df[instruction_length].mean():.1f}字符) print(f平均答案长度: {df[output_length].mean():.1f}字符)4. 模型微调实战准备好数据后就可以开始模型微调了。以ChatGLM为例微调流程主要包括环境准备安装必要的库和依赖数据加载将处理好的数据转换为模型输入格式训练配置设置超参数和训练策略模型评估验证微调效果4.1 训练脚本示例以下是使用Hugging Face Transformers微调的基本代码框架from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer # 加载预训练模型和分词器 model_name THUDM/chatglm-6b tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(model_name, trust_remote_codeTrue) # 准备训练数据 def preprocess_function(examples): inputs [f问{q}\n上下文{c}\n答 for q, c in zip(examples[instruction], examples[input])] model_inputs tokenizer(inputs, truncationTrue, max_length512) labels tokenizer(examples[output], truncationTrue, max_length128).input_ids model_inputs[labels] labels return model_inputs # 配置训练参数 training_args TrainingArguments( output_dir./results, per_device_train_batch_size4, num_train_epochs3, save_steps500, logging_steps100, learning_rate5e-5, fp16True, ) # 创建Trainer并开始训练 trainer Trainer( modelmodel, argstraining_args, train_datasetprocessed_dataset, tokenizertokenizer, ) trainer.train()4.2 微调策略优化针对不同规模的数据集可采用不同的微调策略数据规模推荐策略注意事项小(1k)LoRA微调防止过拟合中(1k-10k)全参数微调适当降低学习率大(10k)多阶段微调先通用领域后特定领域对于资源有限的情况可以考虑以下优化手段梯度检查点减少显存占用混合精度训练加速训练过程参数高效微调如Adapter或Prefix-tuning在实际项目中数据标注往往只占整个流程20%的时间而数据清洗和格式转换却可能消耗80%的精力。一个常见的误区是过于关注标注速度而忽视了标注规范的严谨性这往往会导致后期数据处理成本呈指数级增长。