引言

高质量的训练数据是LLM能力的上限。但高质量数据的获取成本高昂、数量有限。数据增强——通过变换、生成、筛选等方式扩充数据——是突破数据瓶颈的关键手段。

一、数据增强方法

1.1 文本变换

class TextAugmentor:
    def synonym_replace(self, text, replace_rate=0.1):
        """同义词替换"""
        words = text.split()
        n_replace = int(len(words) * replace_rate)
        
        for _ in range(n_replace):
            idx = random.randint(0, len(words)-1)
            synonyms = self.get_synonyms(words[idx])
            if synonyms:
                words[idx] = random.choice(synonyms)
        
        return " ".join(words)
    
    def back_translation(self, text):
        """回译增强"""
        # 中文→英文→中文
        en = await self.translate(text, "zh", "en")
        zh = await self.translate(en, "en", "zh")
        return zh
    
    def random_deletion(self, text, delete_rate=0.1):
        """随机删除"""
        words = text.split()
        kept = [w for w in words if random.random() > delete_rate]
        return " ".join(kept) if kept else words[0]

1.2 AI生成增强

class AIGenerationAugmentor:
    async def generate_variations(self, instruction, n=5):
        """生成指令变体"""
        prompt = f"""
        为以下指令生成{n}个不同的表述方式:
        {instruction}
        
        要求:
        1. 保持语义相同
        2. 改变表述方式(正式/口语/简洁/详细)
        3. 适合不同教育水平的用户
        """
        return await self.llm.call(prompt)
    
    async def generate_edge_cases(self, instruction):
        """生成边界情况"""
        prompt = f"""
        对于以下指令,生成边界情况的变体:
        {instruction}
        
        考虑:
        1. 极端简短的输入
        2. 包含错误的输入
        3. 多语言混合输入
        4. 模糊/有歧义的输入
        """
        return await self.llm.call(prompt)

1.3 Self-Instruct生成

class SelfInstructGenerator:
    async def generate_dataset(self, seed_tasks, target_size=10000):
        """Self-Instruct生成大规模数据"""
        dataset = list(seed_tasks)
        
        while len(dataset) < target_size:
            # 1. 采样种子
            seeds = random.sample(dataset, min(3, len(dataset)))
            
            # 2. 生成新指令
            new_instruction = await self.llm.generate(
                f"基于以下示例生成一个新的不同的指令:\n{seeds}"
            )
            
            # 3. 质量过滤
            if self.passes_quality_check(new_instruction):
                # 4. 生成回答
                response = await self.llm.generate(new_instruction)
                
                # 5. 质量验证
                if self.verify_quality(new_instruction, response):
                    dataset.append({
                        "instruction": new_instruction,
                        "response": response
                    })
        
        return dataset

二、合成数据质量

2.1 质量过滤

class SyntheticDataFilter:
    def filter(self, dataset):
        filtered = []
        
        for sample in dataset:
            # 1. 多样性检查
            if self.too_similar(sample, filtered):
                continue
            
            # 2. 复杂度检查
            if self.too_simple(sample):
                continue
            
            # 3. 事实准确性
            if not self.factually_correct(sample):
                continue
            
            # 4. 格式规范
            if not self.well_formatted(sample):
                continue
            
            filtered.append(sample)
        
        return filtered

2.2 去偏

class SyntheticDataDebiaser:
    async def debias(self, dataset):
        """去除合成数据中的偏见"""
        # 1. 分析分布
        distributions = self.analyze_distributions(dataset)
        
        # 2. 识别偏差
        biases = self.identify_biases(distributions)
        
        # 3. 补充不足
        for bias in biases:
            additional = await self.generate_compensating_data(bias)
            dataset.extend(additional)
        
        # 4. 重新平衡
        dataset = self.rebalance(dataset)
        
        return dataset

三、特定任务增强

3.1 代码数据增强

class CodeAugmentor:
    async def augment_code(self, code_snippet):
        """代码数据增强"""
        augmentations = []
        
        # 1. 变量重命名
        augmentations.append(await self.rename_variables(code_snippet))
        
        # 2. 注释添加/修改
        augmentations.append(await self.add_comments(code_snippet))
        
        # 3. 等价重构
        augmentations.append(await self.refactor(code_snippet))
        
        # 4. 语言转换
        augmentations.append(await self.translate_language(code_snippet, "Python", "JavaScript"))
        
        return augmentations

3.2 推理数据增强

class ReasoningAugmentor:
    async def generate_reasoning_chains(self, question, answer):
        """生成多种推理路径"""
        prompt = f"""
        问题: {question}
        答案: {answer}
        
        请生成3种不同的推理路径来到达这个答案:
        1. 直接推理路径
        2. 反证法路径
        3. 类比推理路径
        """
        return await self.llm.call(prompt)

四、数据配比

class AugmentedDataMixer:
    def mix(self, real_data, synthetic_data, ratio=0.3):
        """混合真实和合成数据"""
        # 合成数据占比不应过高
        n_synthetic = int(len(real_data) * ratio / (1 - ratio))
        synthetic_sample = random.sample(synthetic_data, min(n_synthetic, len(synthetic_data)))
        
        mixed = real_data + synthetic_sample
        random.shuffle(mixed)
        return mixed

五、评估合成数据质量

class SyntheticDataEvaluator:
    async def evaluate(self, real_data, synthetic_data):
        metrics = {
            "diversity": self.compute_diversity(synthetic_data),
            "fidelity": await self.compute_fidelity(real_data, synthetic_data),
            "novelty": self.compute_novelty(real_data, synthetic_data),
            "utility": await self.compute_utility(real_data, synthetic_data)
        }
        
        # 效用测试:用合成数据训练,在真实数据上测试
        model = train(synthetic_data)
        metrics["downstream_performance"] = evaluate(model, real_data)
        
        return metrics

结语

数据增强是突破数据瓶颈的有效手段。2026年的趋势是"AI生成数据训练AI"——用强模型生成高质量数据来训练弱模型,实现知识蒸馏。

但合成数据有其风险:模型可能"在自己的回声"中退化(model collapse)。关键是在合成数据中保持足够的多样性和新颖性。

最佳实践:合成数据作为补充而非替代。真实数据始终是黄金标准,合成数据用于扩充覆盖面和增加多样性。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。