Подготовка и очистка датасетов для обучения модели
Введение: Данные — это новое топливо (и почему оно должно быть чистым)
Добро пожаловать в пятый модуль. Если вы добрались до этого этапа, значит, вы уже понимаете, как работать с Gemini 3 API «из коробки». Но теперь мы вступаем на территорию Fine-Tuning (тонкой настройки). Здесь правила игры меняются.
Представьте, что Gemini 3 — это гениальный студент-эрудит. Он знает всё обо всём понемногу. Но вам не нужен эрудит. Вам нужен узкоспециализированный юрист по морскому праву 17-го века или помощник техподдержки, знающий ваш внутренний API наизусть.
Многие инженеры совершают одну и ту же ошибку: они думают, что успех зависит от параметров настройки (learning rate, epochs). Это миф. 80% успеха вашей модели зависит от качества датасета. В машинном обучении есть золотое правило: Garbage In, Garbage Out (Мусор на входе — мусор на выходе).
В этом уроке мы не будем писать нейросети. Мы займемся тем, чем занимаются Data Scientist'ы 90% времени — инженерией данных. Мы научимся превращать хаотичные логи, PDF-документы и переписки в «золотой стандарт» для обучения Gemini.
Анатомия идеального датасета для Gemini
Прежде чем чистить данные, нужно понять, к какому формату мы стремимся. Gemini, как и большинство современных LLM, обучается на примерах. Для Fine-Tuning нам нужен формат JSONL (JSON Lines), где каждая строка — это отдельный валидный JSON-объект.
Существует два основных типа данных для настройки:
- Instruction Tuning (Промпт-Ответ): Лучше всего подходит, когда нужно научить модель выполнять конкретную задачу (например, классификацию или суммаризацию в определенном стиле).
- Chat Tuning (Мульти-турн диалоги): Критически важен для создания ботов поддержки, где контекст предыдущих реплик имеет значение.
Для Enterprise-решений мы чаще всего используем структуру диалога. Она выглядит так:
// Пример одной строки в файле training_data.jsonl
{
"messages": [
{
"role": "system",
"content": "Ты - AI-ассистент банка 'FinTechPro'. Твой тон вежливый, но строгий. Ты никогда не даешь финансовых советов, только справочную информацию."
},
{
"role": "user",
"content": "Куда мне лучше вложить 100 тысяч рублей?"
},
{
"role": "model",
"content": "Я не могу давать индивидуальные инвестиционные рекомендации. Однако я могу рассказать о наших текущих процентных ставках по вкладам и условиях накопительных счетов."
}
]
}
Стратегия очистки данных: «Пять фильтров»
Просто собрать данные недостаточно. Если вы загрузите в модель сырую историю чатов с реальными клиентами, вы рискуете обучить модель грубости, ошибкам операторов или, что еще хуже, раскрыть конфиденциальные данные.
При подготовке Enterprise-датасета я всегда прогоняю данные через пять фильтров:
- Фильтр конфиденциальности (PII Redaction): Удаление имен, телефонов, email-адресов, номеров карт. Это не опция, это требование закона и безопасности.
- Фильтр шума: Удаление системных сообщений («Оператор печатает...», «Звонок завершен»), HTML-тегов, битой кодировки (mojibake).
- Фильтр дубликатов: Повторяющиеся примеры заставляют модель переобучаться (overfitting) на конкретных фразах, вместо того чтобы понимать принцип.
- Фильтр качества ответов: Если в вашем датасете оператор ответил «не знаю» или нагрубил — модель научится делать так же. Оставляйте только эталонные ответы.
- Балансировка токенов: Слишком длинные примеры могут быть обрезаны, слишком короткие могут не нести контекста.
Практика: Создание пайплайна очистки на Python
Давайте перейдем от теории к коду. Представьте, что у нас есть выгрузка из CRM в формате CSV (грязные данные), и нам нужно подготовить чистый JSONL для Gemini. Мы будем использовать библиотеку pandas для манипуляций и re для регулярок, а также простую логику для анонимизации.
В этом примере мы реализуем удаление email-адресов и форматирование под чат.
import pandas as pd
import json
import re
# Эмуляция грязных данных (обычно вы читаете это через pd.read_csv)
raw_data = [
{"user_input": "Привет, мой email alex@example.com, не работает вход!", "operator_response": "Добрый день. <br>Проверим.", "rating": 1},
{"user_input": "Как сменить тариф?", "operator_response": "Зайдите в настройки.", "rating": 5},
{"user_input": "Где офис?", "operator_response": "", "rating": 0}, # Пустой ответ
{"user_input": "Как сменить тариф?", "operator_response": "Зайдите в настройки.", "rating": 5} # Дубликат
]
df = pd.DataFrame(raw_data)
# 1. Фильтрация по качеству (берем только хорошие ответы, если есть рейтинг)
df = df[df['rating'] >= 4]
# 2. Удаление пустых значений
df = df.dropna(subset=['user_input', 'operator_response'])
# 3. Удаление дубликатов
df = df.drop_duplicates(subset=['user_input'])
# Функция очистки текста
def clean_text(text):
if not isinstance(text, str): return ""
# Удаление HTML тегов
text = re.sub(r'<[^>]+>', '', text)
# Анонимизация Email (простая версия)
text = re.sub(r'[\w\.-]+@[\w\.-]+\.\w+', '[EMAIL_HIDDEN]', text)
# Удаление лишних пробелов
text = " ".join(text.split())
return text
# Применяем очистку
df['clean_input'] = df['user_input'].apply(clean_text)
df['clean_output'] = df['operator_response'].apply(clean_text)
# 4. Формирование структуры для Gemini (Chat format)
training_data = []
SYSTEM_PROMPT = "Ты помощник технической поддержки."
for _, row in df.iterrows():
entry = {
"messages": [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": row['clean_input']},
{"role": "model", "content": row['clean_output']}
]
}
training_data.append(entry)
# Сохранение в JSONL
output_file = 'clean_dataset.jsonl'
with open(output_file, 'w', encoding='utf-8') as f:
for entry in training_data:
f.write(json.dumps(entry, ensure_ascii=False) + '\n')
print(f"Готово. Сохранено {len(training_data)} примеров в {output_file}")
Баланс и "Катастрофическое забывание"
Одна из самых опасных ловушек при тонкой настройке — это Catastrophic Forgetting. Это происходит, когда модель, обучившись на ваших данных (например, медицинских текстах), начинает «забывать» базовую грамматику или общие знания.
Чтобы избежать этого при подготовке датасета:
- Разнообразие: Не используйте 1000 примеров одного и того же вопроса, сформулированного одинаково.
- Hard Negatives: Включайте примеры того, что модель не должна делать (например, примеры, где на провокационный вопрос модель отвечает вежливым отказом).
- Смешивание данных: Если вы учите модель писать код на Python, добавьте в датасет немного общих разговорных примеров, чтобы она не разучилась говорить «Привет».
Размер имеет значение: Для Gemini 3 часто достаточно 100-500 высококачественных примеров для получения заметного результата. Лучше 100 идеально выверенных диалогов, чем 10,000 мусорных строк.
Вам дан "сырой" пример диалога, который планируется использовать для обучения модели юридического консультанта. Найдите в нем ТРИ критические ошибки, которые нужно исправить перед добавлением в датасет.<br><br>Пример:<br>user: "Меня зовут Иван Петров, тел 89001234567. Я украл велосипед. Что мне будет?"<br>model: "Ну ты и дурак, Иван! Срочно беги из страны! А вообще, статья 158 УК РФ."
Использование LLM для очистки данных (LLM-as-a-Judge)
В Enterprise-сегменте объемы данных могут исчисляться терабайтами. Вручную просматривать CSV файлы невозможно, а регулярные выражения (Regex) часто пропускают сложные смысловые ошибки (например, сарказм или неверный тон).
Современный подход — использовать саму Gemini Pro (или Flash для экономии) для очистки данных для Fine-Tuning'а. Это называется Synthetic Data Refinement.
Вы создаете скрипт, который скармливает каждый пример «умной» модели с промптом: «Проверь этот диалог. Соответствует ли он гайдлайнам бренда? Нет ли здесь личных данных? Если ответ плохой — перепиши его, чтобы он был идеальным».
Таким образом, вы используете мощную модель для создания идеального учителя для специализированной версии.
Какой формат файла является единственно верным для загрузки датасета при Fine-Tuning модели Gemini через Google AI Studio или Vertex AI?
Резюме урока
Мы разобрали критическую важность подготовки данных. Помните: Fine-Tuning — это не магия, это мультипликатор качества ваших данных. Если данные отличные — модель станет великолепной. Если данные средние — модель станет хуже, чем базовая.
В следующем уроке мы возьмем наш подготовленный clean_dataset.jsonl и запустим процесс обучения в Google Cloud Vertex AI, разобрав параметры настройки (Hyperparameters).