mcpField
D
data-labeling

data-labeling

github.com/seb1n数据与数据库232141 次安装11 周前更新
代码仓库

关于 data-labeling

供 AI Agent 设计并执行机器学习数据标注工作流,涵盖标签规范、标注指南、质量检查和导出,并支持人工、模型辅助、主动学习与弱监督方式。

主要功能

  1. 01设计标签规范与标注指南
  2. 02人工及模型辅助标注
  3. 03主动学习筛选样本
  4. 04通过标注函数实现弱监督
  5. 05一致性评估与质量控制
  6. 06导出机器学习就绪数据

适用场景

  1. 01准备文本、图像或对话数据集
  2. 02优先标注不确定样本
  3. 03衡量多位标注者的一致性
  4. 04将验证后的标签导出为训练格式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/seb1n/awesome-ai-agent-skills --skill data-labeling

安装后在 Claude Code 中输入/data-labeling确认已加载。

详细介绍

数据标注

此技能可帮助 AI Agent 为机器学习项目设计并执行数据标注工作流。它涵盖使用 Label Studio 等工具进行人工标注、使用模型辅助预标注进行半自动标注、优先选择信息量最大的样本的主动学习循环,以及使用标注函数进行程序化弱监督。Agent 负责设计标签模式、编写标注员指南、通过标注员间一致性进行质量控制,并将数据导出为适用于机器学习的格式。

工作流

  1. 定义标注模式和指南: 设计标签分类体系——分类任务的类别、NER 的实体类型、目标检测的边界框类别,或语义分割的片段标签。为每个标签编写清晰的标注员指南,并提供正例和反例,涵盖边界情况和模糊场景。

  2. 设置标注环境: 使用标注工具(Label Studio、Labelbox 或 Prodigy)配置标签模式,导入原始数据,并设置具有相应权限的用户帐户。定义与任务类型相匹配的标注界面模板——文本分类、跨度标注、图像边界框或多轮对话标注。

  3. 使用模型预测进行预标注: 使用现有模型或启发式规则为数据集生成初步标签。标注员随后审核并修正这些预测,而不是从头开始标注,这样可将标注时间缩短 40-60%。对于已有不错基线模型的任务,这尤其有价值。

  4. 执行带质量控制的标注: 为标注员分配标注任务,并内置冗余机制——安排 2-3 名标注员标注相同项目,以衡量标注员间一致性(Cohen's kappa 或 Fleiss' kappa)。将一致性较低的项目标记出来,交由高级标注员审核。根据嵌入任务队列的金标准数据集跟踪标注员的准确率。

  5. 开展主动学习迭代: 创建初始标注集后,训练模型并使用不确定性采样或委员会查询,选择信息量最大的未标注样本,以供下一轮标注。这样可以最大限度地提高每个已标注样本带来的模型改进,在标注预算有限时至关重要。

  6. 导出并验证: 按照训练流水线要求的格式(JSONL、COCO、CoNLL、CSV)导出已标注数据。运行验证检查,确保标签一致、没有遗漏标注,并确认类别分布符合要求。记录标注流程和数据集统计信息,以确保可复现性。

支持的技术

  • 标注工具: Label Studio、Labelbox、Prodigy(spaCy)、Amazon SageMaker Ground Truth、CVAT
  • 弱监督: Snorkel、Flyingsquid、Skweak
  • 主动学习: modAL、ALiPy、Prodigy 主动学习配方
  • 一致性指标: Cohen's kappa、Fleiss' kappa、Krippendorff's alpha
  • 导出格式: COCO JSON、Pascal VOC XML、CoNLL、JSONL、Hugging Face Datasets

用法

向 Agent 提供原始数据集、任务类型(分类、NER、目标检测等)和标签类别。还可选择指定偏好的标注工具和质量要求(最低标注员间一致性)。Agent 将配置标注环境、设置质量控制并管理标注工作流。

示例

示例 1:用于文本分类的 Label Studio 流水线

Label Studio 标注界面配置(config.xml):

<View>
  <Header value="Classify the customer review sentiment:" />
  <Text name="text" value="$text" />
  <Choices name="sentiment" toName="text" choice="single-column" showInline="true">
    <Choice value="positive" />
    <Choice value="negative" />
    <Choice value="neutral" />
  </Choices>
  <Textarea name="notes" toName="text" placeholder="Optional: explain ambiguous cases"
            maxSubmissions="1" editable="true" />
</View>

用于设置项目并导入数据的 Python 脚本:

from label_studio_sdk import Client

ls = Client(url="http://localhost:8080", api_key="your-api-key")

project = ls.start_project(
    title="Customer Review Sentiment",
    label_config=open("config.xml").read(),
    description="Label customer reviews as positive, negative, or neutral.",
)

# Import tasks from a CSV file
import csv
tasks = []
with open("reviews.csv") as f:
    for row in csv.DictReader(f):
        tasks.append({"data": {"text": row["review_text"]}, "meta": {"source_id": row["id"]}})

project.import_tasks(tasks)

# Configure inter-annotator overlap: each task gets 2 annotators
project.set_params(maximum_annotations=2, overlap_cohort_percentage=100)
print(f"Created project with {len(tasks)} tasks, 2 annotators per task")

# After annotation, export results
annotations = project.export_tasks(export_type="JSON")
# Compute agreement
from sklearn.metrics import cohen_kappa_score
labels_a1 = [a["annotations"][0]["result"][0]["value"]["choices"][0] for a in annotations if len(a["annotations"]) >= 2]
labels_a2 = [a["annotations"][1]["result"][0]["value"]["choices"][0] for a in annotations if len(a["annotations"]) >= 2]
print(f"Cohen's kappa: {cohen_kappa_score(labels_a1, labels_a2):.3f}")
示例 2:使用 Snorkel 标注函数进行弱监督
import pandas as pd
import numpy as np
from snorkel.labeling import labeling_function, PandasLFApplier, LFAnalysis
from snorkel.labeling.model import LabelModel

SPAM = 1
HAM = 0
ABSTAIN = -1

df = pd.DataFrame({
    "text": [
        "Congratulations! You've won a free iPhone!", "Meeting at 3pm tomorrow",
        "URGENT: claim your prize now!!!", "Can you review the Q3 report?",
        "Buy cheap meds online fast", "Lunch plans for Thursday?",
        "Click here for a free vacation", "Project deadline is next Friday",
    ]
})

@labeling_function()
def lf_contains_free(x):
    return SPAM if "free" in x.text.lower() else ABSTAIN

@labeling_function()
def lf_contains_urgent(x):
    return SPAM if "urgent" in x.text.lower() else ABSTAIN

@labeling_function()
def lf_contains_click(x):
    return SPAM if "click" in x.text.lower() else ABSTAIN

@labeling_function()
def lf_excessive_punctuation(x):
    return SPAM if x.text.count("!") >= 3 else ABSTAIN

@labeling_function()
def lf_contains_meeting(x):
    return HAM if any(w in x.text.lower() for w in ["meeting", "project", "report", "deadline"]) else ABSTAIN

@labeling_function()
def lf_short_and_casual(x):
    return HAM if len(x.text.split()) < 8 and "?" in x.text else ABSTAIN

lfs = [lf_contains_free, lf_contains_urgent, lf_contains_click,
       lf_excessive_punctuation, lf_contains_meeting, lf_short_and_casual]

applier = PandasLFApplier(lfs=lfs)
L_train = applier.apply(df=df)

print(LFAnalysis(L=L_train, lfs=lfs).lf_summary())

# Train the label model to combine noisy labeling functions
label_model = LabelModel(cardinality=2, verbose=True)
label_model.fit(L_train=L_train, n_epochs=500, log_freq=100, seed=42)

# Get probabilistic labels
probs = label_model.predict_proba(L=L_train)
df["label"] = label_model.predict(L=L_train)
df["confidence"] = np.max(probs, axis=1)

# Filter out low-confidence samples for manual review
confident = df[df["confidence"] > 0.8]
needs_review = df[df["confidence"] <= 0.8]
print(f"Confidently labeled: {len(confident)}, needs manual review: {len(needs_review)}")

最佳实践

  • 编写详细的标注指南,为每个标签至少提供 3 个正例和 3 个负例,并涵盖边界情况。标注过程中出现模糊情况时,及时更新指南。
  • 在标注队列中嵌入金标准条目(占任务的 5-10%),并附上已知的正确标签,以持续监控标注人员的质量,及时发现疲劳或困惑。
  • 使用 Cohen's kappa(2 名标注人员)或 Fleiss' kappa(3 名及以上)衡量标注人员间的一致性。若 kappa 低于 0.6,则在继续之前需要修订指南或标签体系。
  • 标注预算有限时使用主动学习——通过将标注精力集中在最不确定或最有信息量的样本上,以减少 30-50% 的已标注样本量,同时达到相同的模型性能。
  • 对已标注数据集进行版本管理,并记录清晰的元数据(标注人员 ID、时间戳、指南版本),以便追溯标签对应的具体标注活动并复现结果。
  • 先开展一轮试点,标注 50-100 个样本,再扩大规模。利用试点校准指南、估算标注速度,并尽早发现标签体系的问题。

边界情况

  • 标注人员分歧较大: 当 kappa 低于 0.4 时,任务定义可能存在歧义。可将有问题的标签拆分为更具体的子标签、在指南中补充更多示例,或组织标注人员开展校准会议,以统一理解。
  • 原始数据中的类别严重不平衡: 如果目标类别占比很低(< 5%),随机抽样将只能得到少量正例。可使用关键词筛选、基于模型的预选或分层抽样,为标注队列补充可能的正例。
  • 弱监督中的标注函数冲突: 多个标注函数对同一样本给出不同结果时,标签模型可能会生成置信度较低的预测。可编写更多更具体的标注函数以提高覆盖率,或将冲突样本转交人工标注。
  • 大批次标注导致标注人员疲劳: 连续标注 2-3 小时后,质量会下降。可将工作拆分为每批 100-200 个条目的多个时段,随机排列任务顺序,并根据金标准跟踪每个时段的准确率,以发现质量下滑。
  • 项目进行中演变标签体系: 如果标注开始后新增标签类别,就必须重新审核所有已标注数据,以纳入新类别。应使用带版本的标签体系和重新标注队列,而不是追溯修改现有标注。

评论

支持 Markdown