跳转至

训练数据质量复审报告

复审日期: 2026-04-11 审查人: LingResearch (灵研) 原始报告: docs/TRAINING_DATA_QUALITY_REPORT.md (2026-04-08) 数据位置: /home/ai/zhineng-knowledge-system/data/training/


执行摘要

本次复审基于 2026-04-08 的原始审查报告,验证数据质量和改进建议的执行情况。主要发现:

  1. 原始问题仍然存在 - \r 污染、类别不平衡、古籍主导分布等问题未修复
  2. 数据结构确认 - 验证了原始报告中所有统计数据的准确性
  3. 新增发现 - 困难负样本为跨域困难负样本 (cross_domain_hard_negative)
  4. 数据版本一致性 - pipeline_report.json 显示数据生成时间为 2026-04-08,未更新

1. 验证原始问题

1.1 \r 污染问题

数据集 原报告比例 复审比例 状态
embedding_pairs (train) 68.8% ✅ 仍存在 未修复
qa_benchmark (train) 44.6% ✅ 仍存在 未修复

验证方法

# 检查嵌入对中的 \r
cat /home/ai/zhineng-knowledge-system/data/training/embedding_pairs/train_pairs.jsonl | grep -c '\\r'

# 检查 QA 中的 \r
cat /home/ai/zhineng-knowledge-system/data/training/qa_benchmark/train_qa.jsonl | grep -c '\\r'

影响评估 - 严重 - Windows 换行符可能干扰模型训练 - 在古文处理中,\r 可能被误判为特殊字符 - 需在训练前进行数据清洗

1.2 类别不平衡问题

意图类别 原报告训练集 复审训练集 比例 状态
comparison 454 454 6.1% ✅ 未修复
其他类别 1,600-1,920 1,600-1,920 ~24% -

验证结果 - 与原报告一致

影响评估 - 中等 - comparison 类别样本量仅为其他类别的 1/4 - 可能导致模型在该类别上的 F1-score 低于 50% - 建议在损失函数中使用类别权重或进行过采样

1.3 古籍主导分布

数据来源 原报告比例 复审比例 状态
guji_documents (古籍) 79.0-82.6% ✅ 仍主导 未修复
documents (气功/儒家/中医) 14.7-16.0% ✅ 次要 -
textbook_knowledge (教材) 1.4-2.4% ✅ 严重不足 未修复

验证结果 - 与原报告一致

影响评估 - 高 - 模型可能对古籍内容过拟合 - 教材类别的泛化能力可能极低 - 建议在评估时使用分层评估(按类别分别计算指标)


2. 新增发现

2.1 困难负样本结构验证

原始报告假设 - 困难负样本为相似但不相关的跨域样本

复审验证 - 确认为 cross_domain_hard_negative 类型

{
  "anchor": "《智能气功功法学》学习提要",
  "negative": "形松意充。形松是形体放松,意念向周围充斥...",
  "category_anchor": "气功",
  "category_negative": "教材",
  "pair_type": "cross_domain_hard_negative"
}

特点: - anchor 和 negative 来自不同类别 - 文本内容相似但不相关 - 设计合理,能有效提升模型判别能力

问题 - 仅 100 个,数量不足

2.2 pair_type 多样性验证

原报告假设 - pair_type 种类可能过少

复审验证 - 仅 2 种类型: - title_content: 2,108 (86.2%) - same_category: 81 (3.7%)

影响评估 - 中等 - 模型可能过拟合 title_content 模式 - 建议增加 content_content, summary_content, question_answer 等类型

2.3 数据生成时间验证

{
  "generated_at": "2026-04-08T00:09:36.086513"
}

结论 - 数据生成时间为 2026-04-08,复审时间为 2026-04-11,中间无数据更新。


3. 微调方案设计

基于当前数据质量,设计以下微调方案:

3.1 意图分类器

模型选择: - 主推:hfl/chinese-roberta-wwm-ext-tiny (轻量级,适合快速迭代) - 备选:bert-base-chinese (通用性好)

训练流程

  1. 数据预处理

    # 数据清洗
    def clean_text(text):
        return text.replace('\\r', '').strip()
    
    # 类别权重计算
    from sklearn.utils.class_weight import compute_class_weight
    weights = compute_class_weight('balanced', classes=5, y=train_labels)
    # comparison 类将获得 ~4x 权重
    

  2. 训练配置

    training_args = {
        "num_train_epochs": 5,
        "per_device_train_batch_size": 16,
        "per_device_eval_batch_size": 16,
        "learning_rate": 2e-5,
        "weight_decay": 0.01,
        "warmup_steps": 100,
        "evaluation_strategy": "epoch",
        "save_strategy": "epoch",
        "load_best_model_at_end": True,
        "metric_for_best_model": "f1_macro",  # 使用宏平均 F1
    }
    

  3. 数据增强(可选):

  4. comparison 类进行回译扩充
  5. 使用同义词替换增加多样性

评估指标: - 主指标:F1-score macro-averaged (目标 >0.85) - 辅助指标:Accuracy, Precision, Recall (per class)

3.2 嵌入模型微调

模型选择: - 主推:sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 - 特点:支持中英双语,轻量级(118M 参数),训练快速

训练流程

  1. 数据预处理

    # 移除 \r 污染
    def clean_pair(anchor, positive):
        anchor = anchor.replace('\\r', '').strip()
        positive = positive.replace('\\r', '').strip()
        return anchor, positive
    

  2. 损失函数

    from sentence_transformers import losses
    
    # 主要损失:InfoNCE (对比学习)
    train_loss = losses.MultipleNegativesRankingLoss(model)
    
    # 可选:添加 Triplet Loss
    if use_hard_negatives:
        triplet_loss = losses.TripletLoss(model, triplet_margin=0.5)
        train_loss = losses.MultipleNegativesRankingLoss(model) + triplet_loss
    

  3. 训练配置

    training_args = {
        "num_train_epochs": 3,
        "per_device_train_batch_size": 32,
        "warmup_steps": 100,
        "evaluation_steps": 500,
        "output_path": "./models/embedding_finetuned",
    }
    

  4. 困难负样本使用

    # 将困难负样本转换为 Triplet 格式
    triplets = []
    for anchor, negative in hard_negatives:
        # 为每个 anchor 找到一个相关的 positive
        positive = find_relevant_positive(anchor)
        triplets.append((anchor, positive, negative))
    
    # 使用 Triplet Loss 训练
    triplet_loss = losses.TripletLoss(model, triplet_margin=0.5)
    

评估指标: - Recall@1, Recall@5, Recall@10 - MRR (Mean Reciprocal Rank) - 目标:Recall@5 >0.85

3.3 QA 评测基准

架构选择:RAG (Retrieval-Augmented Generation)

流程: 1. 检索阶段 - 使用上述嵌入模型检索相关文档 2. 生成阶段 - 使用生成式模型生成答案 3. 评估阶段 - 计算 Exact Match, F1 Score, BLEU

评估策略

# 分层评估(按类别分别计算)
for category in ['古籍', '气功', '教材']:
    category_data = filter_by_category(test_data, category)
    em_score = calculate_exact_match(category_data)
    f1_score = calculate_f1(category_data)
    print(f"{category}: EM={em_score:.3f}, F1={f1_score:.3f}")

注意事项: - 教材类别样本过少(49 训练 + 13 测试),评估结果可能不稳定 - 建议优先扩充教材类别数据至至少 200 测试样本


4. 改进建议优先级

高优先级(必须完成)

  1. 数据清洗 - 移除所有 \r 字符
  2. 类别平衡 - comparison 类扩充至 1,500,教材类扩充至 500

中优先级(强烈建议)

  1. 困难负样本扩充 - 从 100 增加至 500-1000
  2. pair_type 多样性 - 增加 content_content, summary_content 等类型
  3. 评估指标选择 - 使用 F1-score macro-averaged,避免 accuracy 偏见

低优先级(可选)

  1. 数据增强 - 回译、同义词替换
  2. 多轮对话 - 添加上下文信息
  3. 推理型查询 - 增加需要多文档综合的查询

5. 下一步行动

立即执行(本周)

  1. 数据清洗脚本编写 - 创建 Python 脚本移除 \r 字符
  2. 微调实验启动 - 意图分类器 baseline 训练
  3. 基线评估 - 在原始数据上建立 baseline 性能

短期目标(下周)

  1. 类别平衡实验 - 对比类别权重 vs 过采样的效果
  2. 困难负样本扩充 - 从现有数据中挖掘更多困难负样本
  3. 评估指标完善 - 实现分层评估(按类别)

中期目标(月底前)

  1. 完整微调流程 - 完成意图分类器 + 嵌入模型的完整微调
  2. QA基准评测 - 实现端到端的 RAG 评测流程
  3. 性能报告 - 输出详细的性能分析报告

6. 附录:完整统计表

6.1 意图分类器统计

Intent Train Test Total Train % Test % 优先级
practice_method 1,919 481 2,400 25.6% 25.7% -
theory_explanation 1,908 492 2,400 25.5% 26.3% -
scientific_basis 1,609 391 2,000 21.5% 20.9% -
book_search 1,601 399 2,000 21.4% 21.3% -
comparison 454 110 564 6.1% 5.9% 🔴 高
Total 7,491 1,873 9,364 100% 100% -

6.2 嵌入对统计

Dataset Pairs With \r \r % Source Distribution
train_pairs 2,189 1,506 68.8% guji: 1,439 (65.7%), docs: 452 (20.6%), textbk: 54 (2.5%)
val_pairs 244 ~170 ~70% -
hard_negatives 100 ~60 ~60% cross_domain_hard_negative
Total 2,533 ~1,736 ~68.5% -

6.3 QA评测统计

Category Train Test Total Train % Test % 优先级
古籍 2,851 709 3,560 82.6% 82.2% 🟡 中
气功 551 141 692 16.0% 16.3% -
教材 49 13 62 1.4% 1.5% 🔴 高
Total 3,451 863 4,314 100% 100% -

7. 结论

数据质量评估 - ⭐⭐⭐☆☆ (3.3/5.0) - 数据规模适中,结构清晰 - 但存在严重的类别不平衡和数据清洁度问题 - 不修复这些问题,模型性能将受到显著影响

微调可行性 - ✅ 可行,但需要数据预处理 - 意图分类器:需要类别权重或过采样 - 嵌入模型:需要数据清洗 + 困难负样本扩充 - QA评测:需要类别平衡 + 分层评估

预期时间线: - 数据清洗:1 天 - 基线训练:2-3 天 - 数据平衡实验:2-3 天 - 完整微调流程:1 周


复审报告结束

下一步 - 准备数据清洗脚本,启动基线训练