Реалізація AI-автоматичної розмітки даних
Auto-labeling — це використання існуючих моделей для автоматичної розмітки нових даних. Мета: скоротити обсяг ручної роботи на 60-80%, збережючи якість датасету вище порога, необхідного для навчання. Ключове питання — які приклади прийняти автоматично, а які відправити на ручну перевірку.
Стратегії авторозмітки за типом завдання
from anthropic import Anthropic
import numpy as np
import pandas as pd
from dataclasses import dataclass
from typing import Optional
@dataclass
class AutoLabelResult:
text: str
predicted_label: str
confidence: float
auto_accepted: bool
method: str # 'weak_model', 'llm', 'rules', 'ensemble'
class AutoLabelingPipeline:
def __init__(self, task_type: str, confidence_threshold: float = 0.85):
self.task_type = task_type
self.threshold = confidence_threshold
self.llm = Anthropic()
self.stats = {'auto_accepted': 0, 'sent_to_review': 0}
def label_batch(self, texts: list[str],
label_schema: list[str],
method: str = 'ensemble') -> list[AutoLabelResult]:
"""Авторозмітка батча текстів"""
if method == 'llm':
return self._llm_labeling(texts, label_schema)
elif method == 'weak_model':
return self._weak_model_labeling(texts, label_schema)
elif method == 'ensemble':
return self._ensemble_labeling(texts, label_schema)
else:
raise ValueError(f"Unknown method: {method}")
def _llm_labeling(self, texts: list[str],
label_schema: list[str]) -> list[AutoLabelResult]:
"""LLM-розмітка з оцінкою впевненості"""
results = []
batch_size = 10
for i in range(0, len(texts), batch_size):
batch = texts[i:i + batch_size]
texts_formatted = "\n".join([f"{j+1}. {t[:300]}" for j, t in enumerate(batch)])
labels_str = ", ".join(label_schema)
response = self.llm.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=400,
messages=[{
"role": "user",
"content": f"""Classify each text. Labels: {labels_str}
Texts:
{texts_formatted}
Return JSON array with label and confidence (0.0-1.0)."""
}]
)
try:
import json
preds = json.loads(response.content[0].text)
for text, pred in zip(batch, preds):
confidence = pred.get('confidence', 0.5)
results.append(AutoLabelResult(
text=text,
predicted_label=pred['label'],
confidence=confidence,
auto_accepted=confidence >= self.threshold,
method='llm'
))
except Exception:
for text in batch:
results.append(AutoLabelResult(
text=text,
predicted_label='unknown',
confidence=0.0,
auto_accepted=False,
method='llm_failed'
))
return results
Економія ресурсів при різних порогах
| Поріг confidence | Auto-Accept rate | Точність автопринятих | Ручна робота |
|---|---|---|---|
| 0.95 | 35% | 98.5% | 65% завдань |
| 0.90 | 52% | 97.2% | 48% завдань |
| 0.85 | 68% | 95.8% | 32% завдань |
| 0.80 | 78% | 93.1% | 22% завдань |
| 0.70 | 89% | 88.4% | 11% завдань |
Оптимальний поріг для більшості задач класифікації — 0.85-0.90: скорочення ручної роботи на 65-70% при точності автопринятих прикладів 95-97%. Фінальний датасет вимагає випадкової вибіркової перевірки 3-5% авторозмічених прикладів для валідації якості.







