大模型训练数据治理:从数据采集到质量评估的全链路

数据:大模型能力的源头 “Garbage in, garbage out"在LLM时代被放大了1000倍。一个7B模型用高质量数据训练可以超越用低质量数据训练的70B模型。数据治理是决定模型能力上限的第一道关卡。 数据采集 数据源分类 class DataSourceTaxonomy: sources = { "web_crawl": { "Common Crawl": "最大的网页爬虫数据集", "Reddit": "高质量讨论内容", "Wikipedia": "结构化知识" }, "code": { "GitHub": "开源代码", "Stack Overflow": "编程问答" }, "academic": { "arXiv": "学术论文", "PubMed": "生物医学" }, "books": { "Project Gutenberg": "公版书籍", "Licensed books": "授权书籍" }, "dialogue": { "Reddit threads": "对话数据", "Forum discussions": "论坛讨论" } } 采集策略 class WebCrawler: def __init__(self, quality_filter): self.filter = quality_filter def crawl(self, url): # 1. 抓取页面 html = self._fetch(url) # 2. 正文提取(去除导航、广告等) content = self._extract_main_content(html) # 3. 质量初筛 quality_score = self.filter.assess(content) if quality_score < 0.3: return None # 质量太低,跳过 # 4. 语言检测 lang = detect_language(content) # 5. 元数据标注 return { "content": content, "url": url, "lang": lang, "quality_score": quality_score, "crawl_time": datetime.now(), "content_type": classify_content(content) # article/forum/wiki等 } 数据清洗 规则过滤 class RuleBasedFilter: def filter(self, text): # 长度过滤 if len(text) < 50 or len(text) > 100000: return False # 重复行过滤 lines = text.split('\n') unique_ratio = len(set(lines)) / len(lines) if unique_ratio < 0.5: return False # 特殊字符比例 special_ratio = sum(1 for c in text if not c.isalnum() and c not in ' \n.,!?;:\'"-()') / len(text) if special_ratio > 0.1: return False # 语言模型困惑度(过滤乱码) ppl = compute_perplexity(text) if ppl > 1000: # 困惑度过高=不像自然语言 return False return True 去重 数据去重是提升数据质量最有效的手段。研究表明,去重可以将模型性能提升3-5个点。 ...

2026-07-16 · 4 min · 644 words · 硅基 AGI 探索者

大模型训练数据的质量评估框架:从数据到智能的基石

大模型训练数据的质量评估框架:从数据到智能的基石 垃圾进,垃圾出——这句计算机科学的古老格言在大模型时代有了更深刻的含义。GPT-4级别的模型需要万亿token的训练数据,而数据质量的微小差异在规模效应下会被放大到惊人的程度。本文将系统介绍我们团队在实践中总结的大模型训练数据质量评估框架。 评估维度总览 我们将数据质量评估分为六个核心维度,每个维度都有可量化的指标体系: 1. 准确性 准确性是最基础也最难以大规模验证的维度。对于事实性内容,我们使用知识图谱进行交叉验证——将训练数据中的实体关系三元组抽取后,与Wikidata等可信知识库比对。在我们的实验中,原始爬取数据中约12%的事实性陈述存在不同程度的错误或过时。 对于无法自动验证的内容,我们采用抽样人工审核,样本量根据数据来源的信任度分级确定。高信任源(如已发表论文)抽样率1%,低信任源(如UGC内容)抽样率5%。 2. 多样性 多样性评估使用两种方法:主题分布的均匀度和风格分布的覆盖度。我们使用预训练的文本分类器将数据分到500+主题类别中,计算Shannon熵作为多样性指标。同时使用风格分类器评估文本风格分布,确保技术文档、文学创作、日常对话等不同风格都有充分覆盖。 一个容易被忽视的问题是模板内容的过度集中。很多网页包含大量重复的导航、版权声明等模板文本。我们使用MinHash算法去重,在最近一次数据清洗中,模板内容占原始数据量的23%,去除后训练效率提升了约15%。 3. 时效性 知识有保鲜期。2026年的模型不应还在大量学习2020年的信息。我们按时间衰减加权,对最近3年的数据给予更高权重。同时,对于快速变化的领域(如AI技术、法律法规),时效性要求更加严格。 时效性得分 = Σ (doc_score × time_weight(doc_date)) time_weight = exp(-Δt / half_life) 不同领域的半衰期不同:技术类约6个月,人文类约5年,数学类几乎无衰减。 4. 安全性 安全性评估包括三个子维度:有害内容过滤、隐私信息脱敏、版权合规检测。我们使用多级过滤管道,包括基于规则的正则过滤、基于分类模型的内容审核、以及基于LLM的细粒度判断。 值得注意的是,安全过滤和保留有用信息之间存在张力。过度过滤会损失模型的应对能力——模型需要"见过"有害内容才能学会拒绝它。我们的策略是在预训练阶段进行适度过滤,在对齐阶段进行针对性训练。 5. 语言质量 语言质量评估包括语法正确性、表达连贯性、信息密度三个指标。我们使用预训练语言模型计算每段文本的困惑度,过滤掉高困惑度的低质量文本。信息密度使用文本压缩比来衡量——压缩比过低意味着冗余过多。 6. 知识密度 知识密度是我们的独创指标,衡量单位文本中包含的可结构化知识的丰富程度。具体方法是从文本中抽取实体和关系,计算每千token的知识三元组数量。学术论文的知识密度通常是社交媒体内容的10倍以上。 框架实现与工具链 我们将上述框架实现为一个可扩展的数据评估流水线: 采集层:支持Common Crawl、自有爬虫、API对接等多种数据源 清洗层:去重、格式归一化、模板去除、语言检测 评估层:六个维度并行评估,输出综合质量报告 决策层:基于评估结果自动决定数据是否进入训练集 整个流水线支持每日处理50TB原始数据,评估报告可视化展示各维度的分布和趋势。 质量与规模的权衡 在万亿token时代,质量与规模的权衡是核心决策。我们的实验表明,从5T token增加到10T token,如果新增数据质量低于已有数据,模型性能反而下降。但如果新增数据质量更高,即使总量减少20%,性能也能提升。 这给我们的启示是:数据规模是必要条件,但不是充分条件。在2026年,当大多数团队都能获取万亿token规模的数据时,数据质量将成为真正的竞争壁垒。 结语 训练数据质量评估不是一次性的工作,而是一个持续迭代的过程。随着模型能力的提升,对数据质量的要求也在不断提高。建立一套系统化、可量化、可扩展的数据评估框架,是大模型工程化不可或缺的基础设施。 本文同步发布于 硅基AGI论坛

2026-07-13 · 1 min · 54 words · 硅基 AGI 探索者

大模型微调的数据工程全流程

大模型微调的数据工程全流程 在大模型微调中,数据质量的重要性远超算法选择。同样的微调方法,高质量数据可以带来20-30%的效果提升,而低质量数据不仅无益,还可能损害模型的通用能力。本文系统梳理微调数据工程的全流程。 数据采集 来源规划 微调数据应该来自多个渠道,避免单一来源的偏见: 真实交互数据:从生产环境中收集用户与模型的交互数据,筛选高质量的对话。这是最有价值的数据来源,因为它反映了真实的使用模式。需要注意的是用户隐私保护和数据脱敏。 合成数据:使用更强大的模型生成训练数据。合成数据的优势是可以针对特定能力定向生成,劣势是可能继承教师模型的偏见。我们建议合成数据不超过总数据量的40%。 人工标注:领域专家编写的高质量样本。成本最高但质量最好,适用于关键能力的数据补充。 公开数据集:学术数据集和开源数据。需要注意许可协议和数据质量参差不齐的问题。 采样策略 数据采样的目标是确保训练集覆盖目标能力的各个方面。我们采用"能力矩阵"方法——定义需要微调的能力维度和难度等级,确保每个格子有足够的数据样本。 数据清洗 去重 数据去重看似简单,实则有不少坑。精确去重(完全相同的样本)只能去除最明显的冗余,大量近似重复的样本仍会浪费训练资源并导致过拟合。 我们采用了MinHash+LSH进行模糊去重,将Jaccard相似度超过0.7的样本对标记为近似重复,保留质量更高的那条。在一个10万条数据集上,模糊去重额外移除了约8%的样本。 质量过滤 低质量数据是微调效果的杀手。我们建立了多级质量过滤管道: 规则过滤:移除包含乱码、编码错误、过短或过长、重复模式严重的样本。这一步快速且成本低,可以过滤约10-15%的明显低质量数据。 模型过滤:使用一个训练好的质量评分模型对每条数据打分,低于阈值的被过滤。评分模型可以是一个在人类标注的质量数据上训练的小型分类器,也可以使用LLM-as-Judge。 人工抽检:随机抽取5-10%的样本进行人工检查,评估自动过滤的准确性,并校准过滤阈值。 格式规范化 微调数据的格式必须与模型的训练格式一致。常见问题包括:特殊token的不一致、对话角色的混淆、多轮对话中上下文的截断方式不一致等。 我们定义了严格的格式schema,使用JSON Schema验证每条数据的结构完整性。不符合schema的样本被标记并修复或丢弃。 数据增强 指令改写 同一条指令可以有多种表达方式。“帮我总结这篇文章"和"请概括以下内容的要点"在语义上等价但表达不同。通过指令改写增加表达多样性,可以提高模型的泛化能力。 我们使用LLM自动改写指令,每条原始指令生成3-5个改写版本。关键是要保持语义不变——我们用一个语义相似度模型过滤掉语义偏移过大的改写。 难度分层 同一任务的不同难度级别对模型学习很重要。如果数据全是简单任务,模型无法处理复杂场景;如果全是困难任务,模型难以学到基本模式。 我们为每个任务类型准备了三个难度级别的数据:简单(单步推理)、中等(2-3步推理)、困难(多步推理+边缘情况)。比例约为4:4:2。 数据混合策略 微调数据不仅要覆盖目标任务,还需要包含一定比例的通用数据,以防止灾难性遗忘——模型在学会新能力的同时忘记原有能力。 我们的数据混合方案: 60% 目标任务数据 25% 通用对话数据(从预训练数据中采样) 10% 安全对齐数据 5% 代码和推理数据 这个比例不是固定的,需要根据具体任务和模型表现进行调整。关键是监控模型在通用benchmark上的表现,确保微调没有显著损害通用能力。 质量评估 自动评估 在微调前,我们使用以下指标评估数据质量: 多样性指标:计算数据集的语义多样性分布,确保覆盖面足够 难度分布:统计不同难度级别的样本比例 毒性检测:使用分类器检测并移除有毒内容 偏见检测:检查数据是否存在性别、种族等方面的系统性偏见 消融实验 最终的数据质量需要通过微调实验来验证。我们采用消融实验——分别用完整数据集和去除某一部分后的数据集进行微调,比较效果差异。这帮助我们理解哪些数据对模型能力贡献最大。 结语 数据工程是微调中最耗时但也最值得投入的环节。在我们的实践中,数据工程占整个微调项目时间的60-70%,但也是回报最高的投入。好的数据可以让简单的微调方法超越复杂方法在差数据上的表现。数据为王,在微调领域依然是真理。 本文同步发布于 硅基AGI论坛

2026-07-12 · 1 min · 56 words · 硅基 AGI 探索者

大模型微调的数据工程全流程

大模型微调的数据工程全流程 在大模型微调中,数据质量的重要性远超算法选择。同样的微调方法,高质量数据可以带来20-30%的效果提升,而低质量数据不仅无益,还可能损害模型的通用能力。本文系统梳理微调数据工程的全流程。 数据采集 来源规划 微调数据应该来自多个渠道,避免单一来源的偏见: 真实交互数据:从生产环境中收集用户与模型的交互数据,筛选高质量的对话。这是最有价值的数据来源,因为它反映了真实的使用模式。需要注意的是用户隐私保护和数据脱敏。 合成数据:使用更强大的模型生成训练数据。合成数据的优势是可以针对特定能力定向生成,劣势是可能继承教师模型的偏见。我们建议合成数据不超过总数据量的40%。 人工标注:领域专家编写的高质量样本。成本最高但质量最好,适用于关键能力的数据补充。 公开数据集:学术数据集和开源数据。需要注意许可协议和数据质量参差不齐的问题。 采样策略 数据采样的目标是确保训练集覆盖目标能力的各个方面。我们采用"能力矩阵"方法——定义需要微调的能力维度和难度等级,确保每个格子有足够的数据样本。 数据清洗 去重 数据去重看似简单,实则有不少坑。精确去重(完全相同的样本)只能去除最明显的冗余,大量近似重复的样本仍会浪费训练资源并导致过拟合。 我们采用了MinHash+LSH进行模糊去重,将Jaccard相似度超过0.7的样本对标记为近似重复,保留质量更高的那条。在一个10万条数据集上,模糊去重额外移除了约8%的样本。 质量过滤 低质量数据是微调效果的杀手。我们建立了多级质量过滤管道: 规则过滤:移除包含乱码、编码错误、过短或过长、重复模式严重的样本。这一步快速且成本低,可以过滤约10-15%的明显低质量数据。 模型过滤:使用一个训练好的质量评分模型对每条数据打分,低于阈值的被过滤。评分模型可以是一个在人类标注的质量数据上训练的小型分类器,也可以使用LLM-as-Judge。 人工抽检:随机抽取5-10%的样本进行人工检查,评估自动过滤的准确性,并校准过滤阈值。 格式规范化 微调数据的格式必须与模型的训练格式一致。常见问题包括:特殊token的不一致、对话角色的混淆、多轮对话中上下文的截断方式不一致等。 我们定义了严格的格式schema,使用JSON Schema验证每条数据的结构完整性。不符合schema的样本被标记并修复或丢弃。 数据增强 指令改写 同一条指令可以有多种表达方式。“帮我总结这篇文章"和"请概括以下内容的要点"在语义上等价但表达不同。通过指令改写增加表达多样性,可以提高模型的泛化能力。 我们使用LLM自动改写指令,每条原始指令生成3-5个改写版本。关键是要保持语义不变——我们用一个语义相似度模型过滤掉语义偏移过大的改写。 难度分层 同一任务的不同难度级别对模型学习很重要。如果数据全是简单任务,模型无法处理复杂场景;如果全是困难任务,模型难以学到基本模式。 我们为每个任务类型准备了三个难度级别的数据:简单(单步推理)、中等(2-3步推理)、困难(多步推理+边缘情况)。比例约为4:4:2。 数据混合策略 微调数据不仅要覆盖目标任务,还需要包含一定比例的通用数据,以防止灾难性遗忘——模型在学会新能力的同时忘记原有能力。 我们的数据混合方案: 60% 目标任务数据 25% 通用对话数据(从预训练数据中采样) 10% 安全对齐数据 5% 代码和推理数据 这个比例不是固定的,需要根据具体任务和模型表现进行调整。关键是监控模型在通用benchmark上的表现,确保微调没有显著损害通用能力。 质量评估 自动评估 在微调前,我们使用以下指标评估数据质量: 多样性指标:计算数据集的语义多样性分布,确保覆盖面足够 难度分布:统计不同难度级别的样本比例 毒性检测:使用分类器检测并移除有毒内容 偏见检测:检查数据是否存在性别、种族等方面的系统性偏见 消融实验 最终的数据质量需要通过微调实验来验证。我们采用消融实验——分别用完整数据集和去除某一部分后的数据集进行微调,比较效果差异。这帮助我们理解哪些数据对模型能力贡献最大。 结语 数据工程是微调中最耗时但也最值得投入的环节。在我们的实践中,数据工程占整个微调项目时间的60-70%,但也是回报最高的投入。好的数据可以让简单的微调方法超越复杂方法在差数据上的表现。数据为王,在微调领域依然是真理。 本文同步发布于 硅基AGI论坛

2026-07-12 · 1 min · 56 words · 硅基 AGI 探索者
微调数据准备

微调数据准备最佳实践

数据决定微调效果上限 微调数据的质量直接决定模型的能力上限。再好的训练算法也无法从低质量数据中学到高质量的模式。2026年的微调数据准备已经形成了一套系统化的最佳实践。 数据采集 多源数据融合 class DataCollector: def __init__(self): self.sources = { "human_annotated": [], # 人工标注数据(质量最高) "model_generated": [], # 模型生成+人工筛选 "real_interactions": [], # 真实用户交互(脱敏) "synthetic": [], # 合成数据 } async def collect(self): dataset = [] # 1. 人工标注数据 for item in self.sources["human_annotated"]: dataset.append({ **item, "source": "human", "quality": "high" }) # 2. 模型生成数据(需要筛选) for item in self.sources["model_generated"]: if await self.quality_check(item): dataset.append({ **item, "source": "model_generated", "quality": "medium" }) # 3. 真实交互数据(脱敏处理) for item in self.sources["real_interactions"]: cleaned = self.desensitize(item) if cleaned: dataset.append({ **cleaned, "source": "real", "quality": "high" }) return dataset 数据格式标准化 class DataFormatter: """统一数据格式为对话格式""" def format_instruction(self, instruction, input_text=None, output=None): return { "messages": [ {"role": "system", "content": "你是一个专业助手。"}, {"role": "user", "content": instruction + (f"\n\n{input_text}" if input_text else "")}, {"role": "assistant", "content": output} if output else None, ], "metadata": { "task_type": "instruction", "language": "zh", } } def format_conversation(self, turns): """格式化多轮对话""" return { "messages": turns, "metadata": {"task_type": "conversation", "n_turns": len(turns) // 2} } def format_tool_use(self, user_message, tool_calls, tool_results, final_response): """格式化工具调用数据""" messages = [{"role": "user", "content": user_message}] for call, result in zip(tool_calls, tool_results): messages.append({"role": "assistant", "tool_calls": [call]}) messages.append({"role": "tool", "content": json.dumps(result)}) messages.append({"role": "assistant", "content": final_response}) return {"messages": messages, "metadata": {"task_type": "tool_use"}} 数据质量检查 class DataQualityChecker: def __init__(self): self.checks = [ self.check_length, self.check_encoding, self.check_repetition, self.check_toxicity, self.check_consistency, ] async def check(self, sample): """运行所有质量检查""" for check in self.checks: result = await check(sample) if not result["passed"]: return False, result["reason"] return True, "All checks passed" async def check_length(self, sample): text = self.extract_text(sample) if len(text) < 10: return {"passed": False, "reason": "Too short"} if len(text) > 32000: return {"passed": False, "reason": "Too long"} return {"passed": True} async def check_repetition(self, sample): text = self.extract_text(sample) # 检查n-gram重复 words = text.split() if len(words) > 10: bigrams = [' '.join(words[i:i+2]) for i in range(len(words)-1)] repeat_ratio = len(set(bigrams)) / len(bigrams) if repeat_ratio < 0.5: return {"passed": False, "reason": "High repetition"} return {"passed": True} async def check_toxicity(self, sample): text = self.extract_text(sample) toxic_words = ["暴力", "色情", "毒品"] # 简化示例 if any(word in text for word in toxic_words): return {"passed": False, "reason": "Toxic content"} return {"passed": True} 数据去重 class DataDeduplicator: def __init__(self, similarity_threshold=0.9): self.threshold = similarity_threshold self.embeddings = [] self.model = SentenceTransformer('BAAI/bge-small-zh-v1.5') def deduplicate(self, dataset): """基于语义相似度去重""" texts = [self.extract_text(d) for d in dataset] embeddings = self.model.encode(texts, normalize_embeddings=True) unique_indices = [] for i in range(len(dataset)): is_duplicate = False for j in unique_indices: similarity = embeddings[i] @ embeddings[j] if similarity > self.threshold: is_duplicate = True break if not is_duplicate: unique_indices.append(i) return [dataset[i] for i in unique_indices] 数据增强 class DataAugmentor: def __init__(self, llm): self.llm = llm async def augment(self, sample, n_variants=3): """生成数据的变体""" variants = [sample] # 1. 改写用户问题 rewritten = await self.rewrite_query(sample) variants.append(rewritten) # 2. 添加噪声(错别字等) noisy = self.add_typo_noise(sample) variants.append(noisy) # 3. 改变语气/风格 restyled = await self.restyle(sample) variants.append(restyled) return variants async def rewrite_query(self, sample): """改写用户查询""" original_query = sample["messages"][1]["content"] prompt = f"将以下问题改写为不同表述,保持语义不变:\n{original_query}" rewritten = await self.llm.generate(prompt) new_sample = copy.deepcopy(sample) new_sample["messages"][1]["content"] = rewritten new_sample["metadata"]["augmented"] = "rewritten" return new_sample 数据集划分 def split_dataset(dataset, train_ratio=0.9, val_ratio=0.05, test_ratio=0.05): """按任务类型分层划分""" from sklearn.model_selection import train_test_split # 按任务类型分组 by_task = defaultdict(list) for item in dataset: by_task[item["metadata"]["task_type"]].append(item) train, val, test = [], [], [] for task_type, items in by_task.items(): n = len(items) n_train = int(n * train_ratio) n_val = int(n * val_ratio) # 随机打乱 random.shuffle(items) train.extend(items[:n_train]) val.extend(items[n_train:n_train+n_val]) test.extend(items[n_train+n_val:]) return train, val, test 数据统计与可视化 class DatasetAnalyzer: def analyze(self, dataset): stats = { "total_samples": len(dataset), "task_distribution": Counter(d["metadata"]["task_type"] for d in dataset), "avg_turns": np.mean([len(d["messages"]) // 2 for d in dataset]), "avg_length": np.mean([len(self.extract_text(d)) for d in dataset]), "length_distribution": self.length_distribution(dataset), "language_distribution": Counter(d["metadata"].get("language", "unknown") for d in dataset), } return stats def report(self, stats): print(f"总样本数:{stats['total_samples']}") print(f"任务分布:{dict(stats['task_distribution'])}") print(f"平均轮次:{stats['avg_turns']:.1f}") print(f"平均长度:{stats['avg_length']:.0f}字符") 最佳实践总结 质量>数量:1万条高质量数据 > 10万条低质量数据 多样性:覆盖不同任务类型、长度、难度 去重:避免相似样本重复,防止模型过拟合 脱敏:严格移除用户PII信息 版本管理:数据集版本与模型版本对应 持续迭代:从生产中收集bad case,持续补充数据 结语 微调数据准备是一个系统性工程,涉及采集、格式化、质量检查、去重、增强和划分。高质量的数据是微调成功的基础——在数据上投入的时间,会在模型性能上得到回报。 加入讨论 这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。 ...

2026-07-02 · 3 min · 594 words · 硅基 AGI 探索者
LLM数据增强技术

LLM数据增强技术:用AI训练更好的AI

引言 高质量的训练数据是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"——用强模型生成高质量数据来训练弱模型,实现知识蒸馏。 ...

2026-07-02 · 3 min · 435 words · 硅基 AGI 探索者
指令微调配方详解

指令微调配方详解:打造高质量监督微调数据集

引言 指令微调(Instruction Tuning / SFT)是将基础模型变成对话助手的关键步骤。2026年的经验表明:微调效果90%取决于数据质量,10%取决于训练方法。 一、数据格式 { "messages": [ {"role": "system", "content": "你是一个专业的编程助手。"}, {"role": "user", "content": "解释什么是递归"}, {"role": "assistant", "content": "递归是一种编程技术..."} ] } 二、数据构建策略 2.1 种子数据+扩展 class InstructionDataBuilder: async def build_from_seeds(self, seed_instructions, expansion_rate=10): """从种子指令扩展""" expanded = [] for seed in seed_instructions: # 1. 改写指令 rewrites = await self.rewrite_instruction(seed, n=expansion_rate//2) # 2. 生成变体 variants = await self.generate_variants(seed, n=expansion_rate//2) expanded.extend(rewrites + variants) return expanded async def rewrite_instruction(self, instruction, n=5): """改写指令""" prompt = f""" 将以下指令改写为{n}个不同表述,保持意思相同: 原始: {instruction} """ result = await self.llm.call(prompt) return result["rewrites"] 2.2 Self-Instruct class SelfInstruct: async def generate(self, seed_tasks, num_tasks=1000): """Self-Instruct生成""" tasks = list(seed_tasks) while len(tasks) < num_tasks: # 1. 随机选择种子任务作为示例 examples = random.sample(tasks, min(3, len(tasks))) # 2. 生成新指令 new_instruction = await self.llm.generate( f"基于以下示例生成一个新的指令:\n{examples}" ) # 3. 过滤低质量 if self.is_quality(new_instruction): # 4. 生成回答 response = await self.llm.generate(new_instruction) tasks.append({ "instruction": new_instruction, "response": response }) return tasks 2.3 Evol-Instruct class EvolInstruct: """逐步进化指令复杂度""" async def evolve(self, instruction): """进化指令""" strategies = [ "增加约束条件", "增加推理步骤", "增加领域深度", "增加多步骤要求", "增加边界条件处理" ] strategy = random.choice(strategies) prompt = f""" 指令: {instruction} 请通过以下方式增加这个指令的复杂度: {strategy} """ return await self.llm.call(prompt) 三、数据质量 3.1 质量过滤 class QualityFilter: def filter(self, dataset): filtered = [] for sample in dataset: # 1. 长度检查 if len(sample["response"]) < 10: continue # 2. 重复检查 if self.is_duplicate(sample, filtered): continue # 3. 格式检查 if not self.validate_format(sample): continue # 4. 内容质量 if not self.check_content_quality(sample): continue filtered.append(sample) return filtered def check_content_quality(self, sample): """内容质量检查""" response = sample["response"] # 不应该是"我不知道"之类的无效回答 if response.strip() in ["我不知道", "无法回答", "I don't know"]: return False # 不应该是重复内容 if len(set(response.split())) / len(response.split()) < 0.3: return False return True 3.2 去重 class Deduplicator: def deduplicate(self, dataset): """多级去重""" # 1. 精确去重 seen = set() deduped = [] for sample in dataset: key = hash(sample["instruction"]) if key not in seen: seen.add(key) deduped.append(sample) # 2. 模糊去重(MinHash) from datasketch import MinHash minhashes = [] for sample in deduped: mh = MinHash(num_perm=128) for word in sample["instruction"].split(): mh.update(word.encode()) minhashes.append(mh) # 移除相似度>0.8的 final = [] for i, sample in enumerate(deduped): is_dup = False for j in range(len(final)): if minhashes[i].jaccard(minhashes[final[j]["index"]]) > 0.8: is_dup = True break if not is_dup: final.append({"index": i, "sample": sample}) return [f["sample"] for f in final] 四、数据配比 class DataMixer: def create_mix(self, datasets): """创建数据混合""" # 2026年经验配比 mix = { "general_qa": 0.30, # 通用问答 "coding": 0.20, # 编程 "reasoning": 0.15, # 推理 "math": 0.10, # 数学 "creative_writing": 0.10, # 创意写作 "safety": 0.05, # 安全 "multi_turn": 0.05, # 多轮对话 "tool_use": 0.05, # 工具使用 } total = sum(v for v in mix.values()) assert abs(total - 1.0) < 0.01 mixed = [] for category, ratio in mix.items(): n = int(total_samples * ratio) sampled = self.sample_from(datasets[category], n) mixed.extend(sampled) random.shuffle(mixed) return mixed 五、训练 from trl import SFTTrainer, SFTConfig config = SFTConfig( output_dir="./sft-output", num_train_epochs=3, per_device_train_batch_size=8, gradient_accumulation_steps=4, learning_rate=2e-5, warmup_ratio=0.03, lr_scheduler_type="cosine", max_seq_length=2048, bf16=True, gradient_checkpointing=True, save_strategy="epoch", evaluation_strategy="epoch", ) trainer = SFTTrainer( model=base_model, args=config, train_dataset=train_data, eval_dataset=eval_data, tokenizer=tokenizer, ) trainer.train() 六、评估 async def evaluate_sft(model, eval_set): """评估SFT模型""" metrics = {} # 1. 自动评估 metrics["loss"] = model.evaluate(eval_set) # 2. 基准测试 benchmarks = ["MMLU", "HumanEval", "GSM8K", "MT-Bench"] for bench in benchmarks: metrics[bench] = await run_benchmark(model, bench) # 3. 人工评估 samples = generate_samples(model, n=100) metrics["human_score"] = await human_eval(samples) return metrics 七、常见陷阱 数据太多但质量低:10万高质量样本 > 100万低质量样本 格式不一致:确保所有数据使用统一的对话格式 过拟合:3轮通常足够,超过5轮容易过拟合 灾难性遗忘:混入通用数据防止遗忘基础能力 结语 指令微调是"数据为王"的领域。2026年的经验反复证明:花80%的时间在数据构建和质量控制上,20%在训练调参上,才能得到最好的效果。 ...

2026-07-02 · 3 min · 521 words · 硅基 AGI 探索者

AI 数据工程 2026:从数据清洗到合成数据的全链路

引言 大模型时代,数据质量决定模型上限。2026年,AI数据工程从"手工清洗"走向"自动化流水线",合成数据技术更是引发了数据获取方式的范式转变。 数据工程全链路 原始数据 → 数据清洗 → 质量评估 → 去重 → 安全过滤 → 标注/增强 → 合成数据补充 → 训练集 第一阶段:数据收集 来源: 网页爬取(Common Crawl、Wikipedia) 开源代码库(GitHub) 学术论文(arXiv、PubMed) 书籍和文档 用户对话数据 合成数据 2026年趋势: 高质量数据源日益稀缺,合成数据占比从2024年的<5%增长到2026年的约30%。 第二阶段:数据清洗 核心技术: 垃圾内容过滤 基于规则的过滤(广告、导航栏、脚注) 基于ML的分类器(垃圾/优质) Perplexity 过滤(低困惑度通常为优质文本) 语言检测 fastText 语言识别 多语言混合内容分离 语言质量评分 格式标准化 HTML/XML 解析提取正文 PDF 文本提取(OCR + 结构化) 代码格式标准化 第三阶段:去重 为什么去重? 重复数据降低模型泛化能力 可能导致模型过拟合和记忆训练数据 浪费计算资源 去重方案: 方案 原理 速度 效果 MinHash + LSH 局部敏感哈希 快 好 SimHash 感知哈希 快 中 Exact Match 精确匹配 慢 最好 Semantic Dedup 语义去重 慢 最好 第四阶段:安全过滤 过滤内容: ...

2026-06-30 · 2 min · 245 words · 硅基 AGI 探索者
AI Agent 在数据治理与质量管控中的实践

AI Agent 在数据治理与质量管控中的实践

数据治理:从成本中心到价值引擎 在企业数字化转型深化的2026年,数据已成为核心生产要素。然而,大多数企业面临严峻的数据治理挑战:数据孤岛遍布、数据质量参差不齐、数据血缘不清、合规风险高企。Gartner调研显示,企业数据质量问题的平均成本占年收入的15%-25%。 传统数据治理依赖人工制定规则、人工检查执行,面临"规则跟不上变化、检查跟不上数据增长"的困境。AI Agent的介入正在将数据治理从"被动检查"升级为"主动治理"——Agent能持续监控数据质量、自动发现问题、智能推荐修复方案,甚至自动执行修复。 AI Agent数据治理能力框架 1. 数据资产自动盘点 元数据自动发现与管理: Agent自动扫描企业所有数据源(数据库、数据湖、API、文件系统),构建完整的元数据目录: 技术元数据:表结构、字段类型、数据分布、存储位置 业务元数据:业务含义、数据所有者、使用场景、业务规则 操作元数据:数据更新频率、访问模式、数据量增长趋势 Agent通过分析SQL查询日志、API调用记录和数据使用模式,自动推断数据的业务含义和重要程度。例如,发现某张表被多个核心业务系统频繁查询,Agent会自动将其标记为"高重要性"数据资产。 数据血缘自动映射: Agent追踪数据从源头到消费端的完整流动路径: 数据血缘追踪示例: 源系统(CRM)→ ETL抽取 → 数据仓库(ODS层)→ 数据加工(DWD层)→ 聚合(DWS层)→ 数据服务(API)→ 消费端(BI报表/业务系统) 当源系统字段发生变化时(如重命名、类型变更),Agent能自动评估影响范围,通知所有受影响的下游系统。 2. 数据质量自动监控 六维度质量评估: Agent按照标准数据质量维度进行持续监控: 维度 含义 Agent检测方式 完整性 数据是否缺失 空值检测、必填字段检查、记录数波动 准确性 数据是否正确 规则验证、跨源对比、业务逻辑校验 一致性 多源数据是否一致 跨系统数据对比、冗余数据同步检查 时效性 数据是否最新 更新频率监控、数据延迟检测 唯一性 数据是否重复 主键重复检测、实体匹配 合规性 数据是否符合规范 格式检查、值域检查、敏感数据识别 智能数据质量规则推荐: 传统做法需要数据管理员手动编写质量检查规则。Agent能自动分析数据特征,推荐合适的质量规则: 通过统计分析自动识别异常值范围(如年龄字段出现200的记录) 通过模式发现推荐正则规则(如手机号格式、邮箱格式) 通过关联分析发现跨字段逻辑(如订单金额=单价×数量) 通过历史数据学习正常波动范围 3. 数据质量问题智能修复 自动修复能力: 对于检测到的质量问题,Agent按修复难度分级处理: L1-自动修复(无需人工介入): 缺失值填充(基于统计模型或关联字段推断) 格式标准化(日期格式、电话号码格式统一) 去重合并(基于实体匹配识别重复记录) 编码统一(如性别字段"男/M/1"统一为标准编码) L2-建议修复(Agent提供方案,人工确认): 异常值修正(基于业务规则和历史数据给出建议值) 跨系统数据不一致(提供权威数据源建议) 数据血缘断裂修复(建议替代数据源) L3-人工处理(Agent仅报告问题): ...

2026-06-30 · 2 min · 236 words · 硅基 AGI 探索者
training data cleaning pipeline

大模型训练数据清洗:从 Common Crawl 到高质量语料

训练数据:大模型能力的真正来源 “Garbage in, garbage out”——这句话在大模型领域体现得淋漓尽致。2026 年的研究表明,数据质量对模型性能的影响超过了参数量和计算量。本文系统解析从原始网页数据到高质量训练语料的完整清洗流程。 一、原始数据来源 1.1 数据源概览 数据源 规模 质量 获取方式 Common Crawl 250B+ 网页 低-中 公开免费 GitHub 100TB+ 代码 中-高 API + 镜像 arXiv 4M+ 论文 高 公开 API Wikipedia 60M+ 文章 高 公开数据集 PubMed 35M+ 摘要 高 公开 API Stack Overflow 50M+ 问答 中-高 数据转储 LibreText 200K+ 教材 高 公开 领域特定 变化 高 授权/采集 1.2 Common Crawl 的挑战 Common Crawl 是最大的公开网页数据,但质量参差不齐: 原始 Common Crawl 内容分布: ┌──────────────────────────────────────────┐ │ 垃圾/广告内容 35% │█████████████ │ │ 低质量文本 25% │█████████ │ │ 重复内容 15% │█████ │ │ 非目标语言 8% │██ │ │ 有害内容 5% │█ │ │ ────────────────────── │ │ 高质量文本 12% │████ │ │ ────────────────────── │ │ 保留率: ~12% │ └──────────────────────────────────────────┘ 从 250B 网页中清洗后,通常只保留约 5-15% 的高质量内容。 ...

2026-06-28 · 5 min · 974 words · 硅基 AGI 探索者
鲁ICP备2026018361号