Розмітка даних для fine-tuning LLM
Розмітка даних для fine-tuning LLM принципово відрізняється від класичної розмітки для ML: тут не просто присвоюється мітка, а створюється ідеальна відповідь моделі. Якість анотацій безпосередньо визначає якість навченої моделі.
Типи анотації
Direct annotation — аннотатор створює пару (інструкція, ідеальна відповідь) з нуля. Найвища якість, найвищі витрати.
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 — для великих обсягів з професійними аннотаторами. Істотно дорожче, але контроль якості включено.
Узгодженість між аннотаторами
Для контролю якості важливо перекриття: 10-20% завдань позначаються двома аннотаторами незалежно:
from sklearn.metrics import cohen_kappa_score
def compute_iaa(annotations_a: list, annotations_b: list) -> float:
"""Cohen's Kappa для узгодженості аннотаторів"""
# Для завдань ранжування (1-5 рейтинг)
kappa = cohen_kappa_score(annotations_a, annotations_b)
print(f"Cohen's Kappa: {kappa:.3f}")
# < 0.4: низька узгодженість, перегляд керівництва
# 0.6-0.8: хороша узгодженість
# > 0.8: відмінна узгодженість
return kappa
Сесія калібрування
Перед стартом повноцінної анотації: спільна розмітка 20-50 прикладів усією командою, обговорення розбіжностей, уточнення керівництва. Це критично зменшує дисперсію між аннотаторами. Без калібрування навіть досвідчені аннотатори дають kappa < 0.5 на складних завданнях.







