Подготовка и очистка датасетов для обучения модели

55 минут Урок 22

Введение: Данные — это новое топливо (и почему оно должно быть чистым)

Добро пожаловать в пятый модуль. Если вы добрались до этого этапа, значит, вы уже понимаете, как работать с 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-решений мы чаще всего используем структуру диалога. Она выглядит так:

json
// Пример одной строки в файле training_data.jsonl
{
  "messages": [
    {
      "role": "system",
      "content": "Ты - AI-ассистент банка 'FinTechPro'. Твой тон вежливый, но строгий. Ты никогда не даешь финансовых советов, только справочную информацию."
    },
    {
      "role": "user",
      "content": "Куда мне лучше вложить 100 тысяч рублей?"
    },
    {
      "role": "model",
      "content": "Я не могу давать индивидуальные инвестиционные рекомендации. Однако я могу рассказать о наших текущих процентных ставках по вкладам и условиях накопительных счетов."
    }
  ]
}

Стратегия очистки данных: «Пять фильтров»

Просто собрать данные недостаточно. Если вы загрузите в модель сырую историю чатов с реальными клиентами, вы рискуете обучить модель грубости, ошибкам операторов или, что еще хуже, раскрыть конфиденциальные данные.

При подготовке Enterprise-датасета я всегда прогоняю данные через пять фильтров:

  1. Фильтр конфиденциальности (PII Redaction): Удаление имен, телефонов, email-адресов, номеров карт. Это не опция, это требование закона и безопасности.
  2. Фильтр шума: Удаление системных сообщений («Оператор печатает...», «Звонок завершен»), HTML-тегов, битой кодировки (mojibake).
  3. Фильтр дубликатов: Повторяющиеся примеры заставляют модель переобучаться (overfitting) на конкретных фразах, вместо того чтобы понимать принцип.
  4. Фильтр качества ответов: Если в вашем датасете оператор ответил «не знаю» или нагрубил — модель научится делать так же. Оставляйте только эталонные ответы.
  5. Балансировка токенов: Слишком длинные примеры могут быть обрезаны, слишком короткие могут не нести контекста.

Практика: Создание пайплайна очистки на Python

Давайте перейдем от теории к коду. Представьте, что у нас есть выгрузка из CRM в формате CSV (грязные данные), и нам нужно подготовить чистый JSONL для Gemini. Мы будем использовать библиотеку pandas для манипуляций и re для регулярок, а также простую логику для анонимизации.

В этом примере мы реализуем удаление email-адресов и форматирование под чат.

python
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).