数据标注与增强
High Contrast
Dark Mode
Light Mode
Sepia
Forest
1 min read189 words

数据标注与增强

好的标注让模型学到精髓,数据增强让小规模数据发挥大价值。

标注流程设计

graph TB A[制定标注指南] --> B[培训标注员] B --> C[试标注 50 条] C --> D{一致性 > 90%?} D -->|否| A D -->|是| E[正式标注] E --> F[交叉审核] F --> G{质检通过?} G -->|否| H[标记问题返工] H --> E G -->|是| I[合格数据入库] style A fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style I fill:#c8e6c9,stroke:#388e3c,stroke-width:2px

标注指南模板

"""
标注指南设计与质量控制
"""
class AnnotationGuide:
"""标注指南"""
TEMPLATE = {
"任务定义": "为用户问题编写高质量的AI助手回答",
"输出要求": [
"回答必须准确、完整",
"语气友好专业",
"代码示例必须可运行",
"长度 100-500 字",
],
"正面示例": {
"instruction": "如何在 Python 中读取 CSV 文件?",
"output": (
"使用 pandas 库读取 CSV 文件:\n\n"
"```python\n"
"import pandas as pd\n"
"df = pd.read_csv('data.csv')\n"
"print(df.head())\n"
"```\n\n"
"常用参数:\n"
"- `encoding='utf-8'`:指定编码\n"
"- `sep=','`:指定分隔符\n"
"- `header=0`:第一行作为列名"
),
"评分": "✅ 优秀:有代码、有解释、有扩展",
},
"反面示例": {
"instruction": "如何在 Python 中读取 CSV 文件?",
"output": "用 pandas 就可以了",
"评分": "❌ 差:太简略、没有代码、没有实用价值",
},
}
# 质量评分维度
QUALITY_DIMENSIONS = {
"准确性": {"权重": 0.3, "说明": "信息是否正确无误"},
"完整性": {"权重": 0.25, "说明": "是否回答了问题的所有方面"},
"实用性": {"权重": 0.25, "说明": "回答是否可直接使用"},
"格式": {"权重": 0.1, "说明": "排版是否清晰"},
"语气": {"权重": 0.1, "说明": "是否符合品牌风格"},
}
guide = AnnotationGuide()
print("=== 标注质量评分维度 ===")
for dim, info in guide.QUALITY_DIMENSIONS.items():
print(f"  {dim} (权重 {info['权重']}): {info['说明']}")

LLM 辅助数据生成

"""
用 GPT-4 生成高质量训练数据
"""
class LLMDataGenerator:
"""LLM 辅助数据生成"""
SEED_PROMPT = """你是一个数据生成专家。请为"{task}"任务生成 {count} 条高质量训练数据。
要求:
1. 每条数据包含 instruction、input(可选)、output
2. 场景多样化,覆盖不同难度
3. output 质量要达到专家水平
4. 避免重复和同质化
输出 JSON 数组格式:
[
{{
"instruction": "...",
"input": "...",
"output": "..."
}}
]"""
# 多样化策略
DIVERSITY_STRATEGIES = {
"主题多样": "覆盖不同子话题和场景",
"难度梯度": "简单、中等、困难各占比",
"长度变化": "短回答、中等回答、长回答",
"格式混合": "文本、列表、表格、代码",
"角色视角": "用户提问方式多样化",
}
# 自我训练方法 (Self-Instruct)
SELF_INSTRUCT = """
Self-Instruct 流程:
1. 准备 175 条种子任务 (人工)
2. GPT-4 基于种子生成新任务
3. GPT-4 为新任务生成输入
4. GPT-4 为输入生成输出
5. 过滤低质量数据
6. 加入种子池,循环扩展
"""
@staticmethod
def build_prompt(task: str, count: int = 10) -> str:
"""构建数据生成 Prompt"""
return LLMDataGenerator.SEED_PROMPT.format(
task=task, count=count
)
gen = LLMDataGenerator()
print("=== 多样化策略 ===")
for strategy, desc in gen.DIVERSITY_STRATEGIES.items():
print(f"  {strategy}: {desc}")
print(f"\n生成 Prompt 示例:")
print(gen.build_prompt("Python 编程问答", 5)[:200] + "...")

数据增强技术

"""
数据增强:用少量数据创造更多训练样本
"""
class DataAugmentation:
"""数据增强方法"""
METHODS = {
"同义词替换": {
"方法": "将关键词替换为同义词",
"示例": "如何 → 怎样, 删除 → 移除",
"效果": "⭐⭐",
"注意": "保持语义不变",
},
"回译增强": {
"方法": "中→英→中 翻译循环",
"示例": "原文 → Google Translate → 回译",
"效果": "⭐⭐⭐",
"注意": "可能引入翻译错误",
},
"LLM 改写": {
"方法": "用 LLM 改写同一问题的不同表述",
"示例": "GPT-4: '请用3种不同方式表达这个问题'",
"效果": "⭐⭐⭐⭐",
"注意": "最推荐的方法",
},
"上下文扩展": {
"方法": "为现有数据添加更多上下文",
"示例": "添加背景信息、限定条件",
"效果": "⭐⭐⭐",
"注意": "增加场景覆盖度",
},
"难度调整": {
"方法": "基于同一问题生成不同难度版本",
"示例": "入门版 → 进阶版 → 专家版",
"效果": "⭐⭐⭐⭐",
"注意": "帮助模型学习梯度",
},
}
@staticmethod
def augment_with_llm(original: dict, variations: int = 3) -> str:
"""LLM 改写 Prompt"""
return f"""请将以下训练数据改写为 {variations} 个不同版本。
保持语义相同,但改变表述方式。
原始数据:
instruction: {original['instruction']}
output: {original['output']}
请输出 {variations} 个改写版本,JSON 数组格式。"""
aug = DataAugmentation()
print("=== 数据增强方法 ===")
for name, info in aug.METHODS.items():
print(f"\n{name} (效果: {info['效果']}):")
print(f"  方法: {info['方法']}")
print(f"  注意: {info['注意']}")

数据质量检查清单

"""
数据质量最终检查
"""
QUALITY_CHECKLIST = {
"格式检查": [
"✓ 所有条目格式一致(JSONL)",
"✓ 必要字段完整(instruction, output)",
"✓ 编码统一(UTF-8)",
"✓ 无 JSON 解析错误",
],
"内容检查": [
"✓ 无重复条目(去重)",
"✓ 无敏感个人信息(PII)",
"✓ output 长度合理(不太短也不太长)",
"✓ 无明显错误或幻觉内容",
],
"分布检查": [
"✓ 任务类型分布均衡",
"✓ 长度分布合理",
"✓ 难度梯度覆盖",
"✓ 无严重类别不平衡",
],
"一致性检查": [
"✓ 类似问题回答风格一致",
"✓ 术语使用统一",
"✓ 格式规范一致",
],
}
print("=== 数据质量检查清单 ===")
for category, items in QUALITY_CHECKLIST.items():
print(f"\n{category}:")
for item in items:
print(f"  {item}")

本章小结

环节 推荐方法 注意事项
标注指南 正反例 + 评分维度 先试标注再正式标注
数据生成 GPT-4 + 人工审核 保证多样性
数据增强 LLM 改写最有效 检查语义不失真
质量控制 四维检查清单 格式/内容/分布/一致性

下一章:训练环境搭建与实战配置。