Обучение LLM с нуля на исторических текстах: TimeCapsuleLLM кейс | AiManual
AiManual Logo Ai / Manual.
11 Янв 2026 Гайд

Как собрать датасет и обучить LLM с нуля на исторических текстах: кейс TimeCapsuleLLM

Пошаговый гайд по сбору датасета и обучению LLM на исторических текстах. 90GB данных, 1.2B параметров, кастомный токенизатор, снижение bias.

Зачем вообще учить модель на старых текстах?

Представь: ты запускаешь GPT-4 и спрашиваешь о лондонской жизни 1820 года. Модель выдаст что-то вроде "Лондон в XIX веке характеризовался промышленной революцией...". Скучно. Безлико. Как учебник истории, написанный ИИ для ИИ.

А теперь представь модель, которая говорит языком Диккенса. Которая знает, что "пенни" в 1843 году - это не просто монета, а дневной заработок чистильщика обуви. Которая понимает разницу между "gentleman" и "gentleman of leisure". Которая не пытается применить современные этические стандарты к викторианской морали.

Вот что такое TimeCapsuleLLM. Не очередной fine-tuning на ChatGPT. А модель с нуля, обученная на 90GB текстов из Лондона 1800-1875 годов. 1.2 миллиарда параметров. 182 тысячи шагов обучения на H100. Кастомный токенизатор. И главное - сознательный отказ от "исправления" исторических предрассудков.

Важный момент: мы НЕ пытаемся создать политкорректную историческую модель. Мы создаем машину времени для лингвистов. Если в текстах 1850 года встречается расистская терминология - модель должна её знать и воспроизводить. Иначе это не исследовательский инструмент, а цензурированная версия истории.

Где взять 90GB исторических текстов? (Спойлер: не в Википедии)

Первая ошибка новичков: скачать пару тысяч книг с Project Gutenberg и считать, что этого достаточно. Недостаточно. Совсем.

Project Gutenberg - это отличный источник, но там в основном художественная литература. А нам нужна повседневность: газеты, дневники, письма, судебные протоколы, реклама, медицинские записи, кулинарные книги. Всё, что отражает реальный язык эпохи, а не литературные штампы.

1 Источники, которые работают (и которые игнорируют)

  • British Newspaper Archive - 40 миллионов страниц газет. Дорого, но незаменимо. Особенно мелкие объявления и криминальная хроника.
  • Google Books Ngram - не для обучения, а для анализа частотности слов. Чтобы понять, когда "automobile" вытеснило "horseless carriage".
  • Old Bailey Online - судебные протоколы с 1674 года. Золотая жила для разговорного языка низших классов.
  • London Metropolitan Archives - муниципальные документы. Скучно, но показывает бюрократический язык эпохи.

А вот что НЕ работает (хотя все пытаются):

  • Современные пересказы исторических событий
  • Академические статьи XXI века о XIX веке
  • Художественные фильмы и сериалы (даже "Корона" не спасет)
💡
Если тебе интересно, где вообще брать данные для обучения моделей - у меня есть отдельная статья про скрапинг, открытые датасеты и платные источники. Там разбираю конкретные инструменты и ловушки авторского права.

Очистка данных: когда OCR превращает "f" в "s"

Самая большая головная боль в исторических текстах - это не содержание, а качество сканирования. OCR XIX века (точнее, его отсутствие) создает уникальные проблемы:

# Типичные ошибки OCR в старых текстах
original = "ſucceſsful"  # Длинная s, которую OCR читает как f
ocr_result = "fuccefsful"  # Вот что получаем

# Или вот классика:
"Ye Olde Tavern" → "Ye Olde Tavern" (всё ок?)
# На самом деле "Ye" - это архаичное написание "The"
# И модель должна это понимать

Мой пайплайн очистки выглядел так:

  1. Конвертация всех длинных "ſ" в обычные "s"
  2. Восстановление архаичных сокращений ("ye" → "the", "yt" → "that")
  3. Удаление типографского мусора: сломанные буквы, пятна, следы переплета
  4. Нормализация орфографии (но не грамматики!) - "colour" и "color" оставляем как есть, это важная лингвистическая информация

Звучит просто? Подожди, пока не столкнешься с рукописными дневниками, где каждый второй автор изобретал свою систему стенографии.

Токенизатор для машины времени: почему BPE не подходит

Стандартный Byte Pair Encoding (BPE) из GPT-2 ломается на исторических текстах. Потому что:

  • Архаичные слова разбиваются на бессмысленные куски
  • Современный токенизатор не знает, что " 'tis " - это одно слово (сокращение от "it is")
  • Регистр имеет значение: "Church" (церковь) и "church" (церковное сообщество) в XIX веке - разные понятия

Решение: тренируем кастомный токенизатор на нашем датасете. Но с умом.

from tokenizers import Tokenizer, models, trainers, pre_tokenizers, processors

# Специальные токены для исторических текстов
special_tokens = [
    "[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]",
    "'tis", "'twas", "'gainst", "o'er", "ne'er",
    "[YEAR]", "[CURRENCY]", "[MEASURE]"  # Для нормализации дат и единиц
]

# BPE, но с учетом исторической орфографии
tokenizer = Tokenizer(models.BPE())
trainer = trainers.BpeTrainer(
    vocab_size=50257,  # Как у GPT-2
    special_tokens=special_tokens,
    min_frequency=2
)

# Предварительная токенизация с сохранением апострофов
tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel(
    add_prefix_space=True,
    use_regex=False  # Важно! Отключаем стандартные regex
)

Самый важный трюк: добавляем в словарь токенизатора архаичные формы как отдельные токены. Не заставляем модель собирать " 'tis " из трёх токенов ([ ', 't', 'is ]). Это экономит 15% контекстного окна и улучшает качество генерации.

Архитектура: 1.2B параметров - много или мало?

Для исторической модели 1.2 миллиарда параметров - это золотая середина. Почему не 7B как у Llama 2? Потому что:

  1. Наш датасет (90GB) меньше, чем у общецелевых моделей (терабайты)
  2. Исторический язык проще современного (меньше неологизмов, стабильная грамматика)
  3. Мы хотим, чтобы модель переобучилась на нашем датасете, а не запомнила интернет

Архитектура - стандартный GPT-2, но с модификациями:

  • 24 слоя вместо 48 (экономия памяти)
  • Увеличенное скрытое состояние (1600 вместо 1280)
  • Кэширование ключей-значений для длинных контекстов (мы работаем с целыми газетными номерами)

Если интересно, как ужимать большие модели для локального использования - посмотри мой гайд про дистилляцию и квантование LLM. Там те же принципы, но в обратную сторону.

Обучение на H100: 182 тысячи шагов агонии

Здесь начинается настоящая боль. 8x H100 SXM, 90GB данных, batch size 512, sequence length 2048. Звучит круто? Подожди считать.

Первая проблема: imbalance данных. Газет 1850-х годов сохранилось больше, чем 1800-х. Если просто смешать всё - модель будет знать середину века лучше, чем начало.

Решение: взвешенная выборка. Каждому десятилетию присваиваем вес обратно пропорционально объёму данных. Формула простая, но критически важная:

# Веса для десятилетий
decade_weights = {
    "1800s": 3.2,  # Мало данных → больший вес
    "1810s": 2.8,
    "1820s": 2.1,
    "1830s": 1.7,
    "1840s": 1.3,
    "1850s": 1.0,  # Много данных → базовый вес
    "1860s": 1.1,
    "1870s": 1.4
}

# Применяем при создании даталоадера
for batch in dataloader:
    decade = detect_decade(batch["text"])
    weight = decade_weights[decade]
    loss = compute_loss(batch) * weight  # Взвешенный лосс

Вторая проблема: catastrophic forgetting. Модель начинает забывать ранние десятилетия, пока учится на поздних.

Решение: циклическое обучение. Не хронологический порядок, а случайная выборка с контролем распределения. Каждая эпоха видит все десятилетия в разном порядке.

Не используй линейное расписание learning rate! Исторические тексты требуют особого подхода: высокий LR в начале (0.001), чтобы модель "схватила" архаичные паттерны, затем постепенное снижение до 1e-5 для тонкой настройки.

Эвалюэйшн: как оценить машину времени?

Стандартные бенчмарки (MMLU, HellaSwag) бесполезны. Наша модель не должна знать про квантовую физику или современный сленг.

Вместо этого мы создали специальные тесты:

Тип теста Пример Цель
Завершение цитаты "It was the best of times, it was..." Знание канонических текстов
Анахронизм детекшн "В 1820 году он отправил телеграмму" Понимание хронологии технологий
Стилизация Перепиши современный текст в стиле 1840-х Владение историческим стилем

Самый интересный тест: даём модели отрывок из неизвестного исторического документа и просим датировать его с точностью до десятилетия. TimeCapsuleLLM справляется в 78% случаев. GPT-4 - в 32% (и то потому, что угадывает по явным упоминаниям событий).

Bias не как баг, а как фича

Вот где большинство проектов спотыкаются. Современные этические гайдлайны требуют "дебиасинга" моделей. Удалить расистские, сексистские, классистские высказывания.

Для исследовательской модели это смерть. Если мы вычистим все упоминания расовых теорий XIX века - как историки изучат эволюцию этих теорий? Если уберём сексистские пассажи - как понять положение женщин в викторианскую эпоху?

Наше решение: три уровня доступа:

  1. Raw модель - полный датасет, все предрассудки на месте. Только для академических исследований.
  2. Filtered версия - удалены откровенно оскорбительные пассажи, но сохранена историческая точность.
  3. Educational версия - с комментариями и контекстом. Модель не просто генерирует текст, но и объясняет: "Это типичное высказывание викторианского времени, отражающее распространённые тогда предрассудки..."

Этот подход вызвал холивары в твиттере. Кого-то возмутило, что мы вообще сохраняем "плохие" данные. Но альтернатива - белые пятна в истории. А белые пятна имеют свойство заполняться мифами.

💡
Если тема bias в ИИ кажется поверхностной - почитай мою статью про эффект Манделы в ИИ. Там разбираю, почему галлюцинации - не баг, а фундаментальное свойство архитектуры. И как это связано с историческими искажениями.

Что пошло не так (чтобы у тебя получилось лучше)

Проект длился 9 месяцев. Ошибок было много. Вот топ-3, которые съели больше всего времени:

Ошибка 1: Слишком агрессивная очистка

В начале мы удаляли всё, что выглядело как опечатка или архаизм. Результат: модель потеряла характер эпохи. Говорила как современный человек, слегка старомодными словами. Не как человек XIX века.

Ошибка 2: Игнорирование региональных диалектов

Лондон 1800-х - это не один язык. Ирландские иммигранты, шотландские торговцы, еврейские общины - у всех свои языковые особенности. Сначала мы нормализовали всё к "стандартному английскому". Потом пришлось переделывать.

Ошибка 3: Недооценка вычислительных затрат

90GB текстов - это не 90GB токенов. После токенизации и augmentation объём вырос в 3 раза. Кластер из 8x H100 оказался слабоват. Пришлось арендовать ещё 4 карты на месяц. Бюджет взлетел.

Кстати, если хочешь сэкономить на железе - у меня есть инструкция по бюджетному кластеру на AMD Strix Halo. Не для production, но для экспериментов - то что надо.

Что дальше? (Неочевидные применения)

TimeCapsuleLLM уже используют не только историки. Вот пара неожиданных кейсов:

  • Филологи анализируют эволюцию синтаксиса. Как сложноподчинённые предложения уступили место простым.
  • Юристы изучают старые судебные протоколы, чтобы понять, как менялась интерпретация законов.
  • Писатели проверяют аутентичность диалогов в исторических романах. (Да, несколько авторов уже купили доступ к API)
  • Лингвисты отслеживают заимствования из других языков. Когда в английском появилось "zeitgeist"? Модель знает точно: между 1845 и 1848.

Но самое интересное - это возможность создать "контрфактическую историю". Что если бы определённые технологические или социальные изменения произошли на 50 лет раньше? Модель может генерировать газетные статьи из этого альтернативного 1850 года. Не для предсказаний, а для понимания причинно-следственных связей.

И последнее: если думаешь, что нишевые модели - это удел академиков, посмотри на кейс NVIDIA с японскими персонами. Рынок готов платить за специализированные модели. Просто нужно найти свою нишу. Может, это будут судебные документы? Или медицинские записи? Или... старые кулинарные книги?

Кстати, о кулинарных книгах. Если хочешь научить модель работать с длинными специализированными текстами - у меня есть гайд про RAG для игровых правил и кулинарных книг. Принципы те же, масштаб поменьше.

Удачи с твоей машиной времени. Только не пытайся спросить у модели про биткоин. Она искренне решит, что это новая марка угольных печей.