Разметка данных для дообучения LLM
Разметка данных для fine-tuning LLM принципиально отличается от классической разметки для ML: здесь не просто присваивается метка, а создаётся идеальный ответ модели. Качество аннотаций напрямую определяет качество обученной модели.
Типы аннотации
Direct annotation — разметчик создаёт пару (инструкция, идеальный ответ) с нуля. Самое высокое качество, самый высокий cost.
Edit-based annotation — разметчик улучшает ответ базовой модели. В 2-3x быстрее, чем с нуля. Риск: разметчик принимает плохой ответ с минорными правками.
Ranking/Preference annotation — разметчик ранжирует несколько ответов модели (используется для RLHF и DPO). Проще, чем создание с нуля, но требует понимания критериев качества.
AI-assisted annotation — сильная модель (GPT-4) генерирует ответы, люди проверяют и корректируют. Оптимальный баланс качества и скорости для большинства задач.
Руководство по аннотации (Annotation Guidelines)
Ключевой документ, без которого аннотаторы будут давать несогласованные результаты:
## Руководство по аннотации: Customer Support Assistant
### Критерии качества хорошего ответа:
1. **Точность:** Ответ соответствует политикам компании и фактически верен
2. **Полнота:** Решает проблему пользователя, не оставляя открытых вопросов
3. **Тон:** Профессиональный, эмпатичный, без извинений за несуществующие проблемы
4. **Длина:** Достаточная, но не избыточная (100-300 слов оптимально)
5. **Структура:** Абзацы, без списков для простых ответов
### Что НЕ должно быть в ответе:
- "Я просто языковая модель..."
- "Я не могу..."
- Повторение вопроса пользователя
- Неуместные извинения
- Устаревшая информация о продукте
### Примеры ХОРОШЕГО ответа: [примеры]
### Примеры ПЛОХОГО ответа: [примеры с объяснением]
Платформы для аннотации
Label Studio (open-source):
from label_studio_sdk import Client
ls = Client(url='http://localhost:8080', api_key='...')
# Создание проекта для LLM аннотации
project = ls.start_project(
title='Customer Support Fine-tuning',
label_config='''
<View>
<Text name="instruction" value="$instruction"/>
<TextArea name="response" toName="instruction"
placeholder="Write ideal response..."
rows="10" maxSubmissions="1"/>
<Rating name="quality" toName="instruction"
maxRating="5" icon="star" size="medium"/>
</View>
'''
)
# Загрузка задач
tasks = [{"instruction": ex.instruction, "input": ex.input}
for ex in unannotated_examples]
project.import_tasks(tasks)
Scale AI / Appen — для больших объёмов с профессиональными аннотаторами. Существенно дороже, но Quality Control включён.
Inter-annotator Agreement
Для контроля качества важно перекрытие: 10-20% задач размечаются двумя аннотаторами независимо:
from sklearn.metrics import cohen_kappa_score
def compute_iaa(annotations_a: list, annotations_b: list) -> float:
"""Cohen's Kappa для согласованности аннотаторов"""
# Для ranking задач (1-5 rating)
kappa = cohen_kappa_score(annotations_a, annotations_b)
print(f"Cohen's Kappa: {kappa:.3f}")
# < 0.4: низкое согласие, пересмотр guidelines
# 0.6-0.8: хорошее согласие
# > 0.8: отличное согласие
return kappa
Calibration сессии
Перед стартом полноценной аннотации: совместная разметка 20-50 примеров всей командой, обсуждение расхождений, уточнение guidelines. Это критически снижает варианс между аннотаторами. Без калибровки даже опытные аннотаторы дают kappa < 0.5 на сложных задачах.







