微调数据预处理标准化流程实践

SoftSeed +0/-0 0 0 正常 2025-12-24T07:01:19 LoRa · Adapter

微调数据预处理标准化流程实践

在LLM微调工程化实践中,数据预处理是决定模型效果的关键环节。本文将分享一套可复现的LoRA微调数据预处理标准化流程。

标准化流程概述

原始数据 → 数据清洗 → 格式转换 → Tokenize → Batch构建 → 输出

具体实现步骤

1. 数据清洗与格式化

import json

def preprocess_data(raw_data):
    cleaned = []
    for item in raw_data:
        # 去除空行和特殊字符
        text = item['text'].strip()
        if len(text) > 10:  # 过滤过短文本
            cleaned.append({
                'instruction': item.get('instruction', ''),
                'input': item.get('input', ''),
                'output': item['output']
            })
    return cleaned

2. Adapter微调格式转换

from transformers import AutoTokenizer

# 使用LoRA微调时需要的格式
def format_for_adapter(data, tokenizer):
    formatted = []
    for item in data:
        prompt = f"{item['instruction']} {item['input']}")
        response = item['output']
        
        # 构建输入输出对
        full_prompt = f"<|startofprompt|>{prompt}<|endofprompt|>"
        formatted.append({
            'input_ids': tokenizer.encode(full_prompt, add_special_tokens=False),
            'labels': tokenizer.encode(response, add_special_tokens=False)
        })
    return formatted

3. Batch构建与优化

from torch.utils.data import Dataset

class CustomDataset(Dataset):
    def __init__(self, data, tokenizer):
        self.data = data
        self.tokenizer = tokenizer
        
    def __len__(self):
        return len(self.data)
        
    def __getitem__(self, idx):
        item = self.data[idx]
        return {
            'input_ids': torch.tensor(item['input_ids']),
            'labels': torch.tensor(item['labels'])
        }

这套标准化流程确保了数据质量一致性,为后续LoRA和Adapter微调提供可靠输入。

适用场景

  • 多轮对话数据预处理
  • 指令跟随任务数据准备
  • 代码生成模型微调数据构建
推广
广告位招租

讨论

0/2000
BraveDavid
BraveDavid · 2026-01-08T10:24:58
别看数据预处理流程简单,实际工程中90%的微调失败都出在清洗环节。我见过太多项目因为没处理好特殊字符、编码乱码或者样本分布不均,最后调参调到怀疑人生。建议加个数据探查步骤,先跑个统计看看文本长度分布、重复率、标签偏差这些,不然后期改起来比重构还费劲。
BitterFiona
BitterFiona · 2026-01-08T10:24:58
Tokenize那步千万别图省事用默认配置,特别是中英文混杂场景下,LoRA微调对输入格式要求极严。我之前为了提速直接用了tokenizer.encode()没加padding,结果batch里面长度不一直接报错。建议统一加个max_length限制,并且在构建dataset时就做好padding处理,省得后面一堆runtime error要debug