Обучение LLM на EPUB файлах: выбор модели и пошаговая инструкция | AiManual
AiManual Logo Ai / Manual.
28 Дек 2025 Гайд

Тренируем LLM на своих EPUB: какой компактную модель выбрать и как это сделать

Полное руководство по выбору компактной LLM и её тонкой настройке на ваших EPUB книгах. От извлечения текста до обучения модели на домашнем ПК.

Проблема: Почему ChatGPT не знает мои книги?

Вы читаете много книг в формате EPUB — техническую литературу, художественные произведения, научные статьи. У вас формируется уникальная библиотека знаний. Но когда вы задаете вопрос ChatGPT или Claude о содержании ваших книг, модель отвечает общими фразами или вовсе молчит. Почему?

Крупные языковые модели обучаются на общедоступных данных из интернета. Ваши личные EPUB-файлы — это приватный, нишевый контент, недоступный для массового обучения. Решение — создать персонального ИИ-ассистента, который будет экспертом именно в вашей библиотеке.

Ключевое отличие: Тонкая настройка (fine-tuning) меняет саму модель, заставляя её «мыслить» в контексте ваших данных. Это не просто поиск по тексту, как в RAG-системах, а фундаментальное переобучение.

Решение: Компактные модели для домашнего обучения

Вам не нужна GPT-4 с 1.7 триллионами параметров. Для работы с персональными данными достаточно «легких» моделей на 3-13 миллиардов параметров, которые можно обучать на потребительском GPU или даже CPU с достаточным объемом RAM.

Критерии выбора модели

  • Размер: 3B-13B параметров (оптимальный баланс качества и требований)
  • Архитектура: Поддержка эффективного обучения (LoRA, QLoRA)
  • Лицензия: Разрешает коммерческое использование и модификацию
  • Качество: Хорошие результаты на стандартных бенчмарках
Модель Размер Плюсы Минусы Требования VRAM
Llama 3.2 3B 3B Отличное качество для размера, Apache 2.0 Требует квантования для 8GB VRAM ~6GB (FP16)
Mistral 7B 7B Высокая производительность, MIT лицензия Сложнее для начинающих ~14GB (FP16)
Phi-3 Mini 3.8B Оптимизирована для CPU, MIT Меньший контекст ~8GB (FP16)
Qwen2.5 7B 7B Мультиязычность, Apache 2.0 Больше весит на диске ~14GB (FP16)
💡
Рекомендация для большинства пользователей: Начните с Llama 3.2 3B. Она предлагает лучший баланс между качеством, требованиями к железу и простотой использования. Для обучения с QLoRA хватит GPU с 8GB VRAM или даже мощного CPU с 32GB RAM.

Пошаговый план: От EPUB до обученной модели

Весь процесс разбит на логические этапы. Каждый следующий шаг зависит от успешного завершения предыдущего.

1 Подготовка среды и установка зависимостей

Создаем виртуальное окружение и устанавливаем необходимые библиотеки. Это гарантирует изоляцию и воспроизводимость.

# Создаем виртуальное окружение
python -m venv llm-epub-env
source llm-epub-env/bin/activate  # На Windows: llm-epub-env\Scripts\activate

# Устанавливаем базовые зависимости
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118  # Для CUDA 11.8
pip install transformers datasets accelerate peft bitsandbytes
pip install ebooklib beautifulsoup4  # Для работы с EPUB
pip install sentencepiece protobuf  # Для токенизаторов

2 Извлечение и очистка текста из EPUB

EPUB — это по сути ZIP-архив с HTML-файлами. Нам нужно извлечь чистый текст, удалив разметку, оглавления, колонтитулы.

import ebooklib
from ebooklib import epub
from bs4 import BeautifulSoup
import re

def extract_text_from_epub(epub_path):
    book = epub.read_epub(epub_path)
    texts = []
    
    for item in book.get_items():
        if item.get_type() == ebooklib.ITEM_DOCUMENT:
            soup = BeautifulSoup(item.get_content(), 'html.parser')
            # Удаляем скрипты, стили, навигацию
            for element in soup(['script', 'style', 'nav', 'header', 'footer']):
                element.decompose()
            
            text = soup.get_text()
            # Очищаем лишние пробелы и переносы
            text = re.sub(r'\s+', ' ', text).strip()
            if text and len(text) > 100:  # Игнорируем очень короткие фрагменты
                texts.append(text)
    
    return ' '.join(texts)

# Пример использования
book_text = extract_text_from_epub('my_book.epub')
print(f"Извлечено символов: {len(book_text)}")

Внимание: Некоторые EPUB содержат DRM защиту. Обучение на защищенных книгах может нарушать лицензионное соглашение. Используйте только легально приобретенные книги без DRM или собственные произведения.

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

Текст нужно разбить на фрагменты подходящего размера и преобразовать в формат, понятный модели (парные примеры «вопрос-ответ» или продолжение текста).

from datasets import Dataset
import json

def create_chunks(text, chunk_size=512):
    """Разбиваем текст на перекрывающиеся чанки"""
    words = text.split()
    chunks = []
    
    for i in range(0, len(words), chunk_size // 2):  # 50% перекрытие
        chunk = ' '.join(words[i:i + chunk_size])
        if len(chunk.split()) > 50:  # Минимальный размер чанка
            chunks.append({"text": chunk})
    
    return chunks

# Создаем датасет
chunks = create_chunks(book_text, chunk_size=512)
dataset = Dataset.from_list(chunks)

# Сохраняем для последующего использования
dataset.save_to_disk("./epub_dataset")
print(f"Создано {len(chunks)} чанков для обучения")

4 Загрузка модели и применение QLoRA

QLoRA (Quantized Low-Rank Adaptation) позволяет обучать большие модели на малом VRAM, квантуя веса до 4-bit и обучая только небольшие адаптеры.

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
import torch

# Конфигурация 4-bit квантования
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True
)

# Загружаем модель с квантованием
model_name = "meta-llama/Llama-3.2-3B-Instruct"
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True
)

tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token  # Устанавливаем pad токен

# Подготавливаем модель для k-bit обучения
model = prepare_model_for_kbit_training(model)

# Конфигурация LoRA
lora_config = LoraConfig(
    r=16,  # Rank
    lora_alpha=32,
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

# Применяем LoRA к модели
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()  # Покажет ~1% обучаемых параметров

5 Обучение модели на ваших данных

Настраиваем параметры обучения и запускаем процесс. Для небольшой библиотеки (5-10 книг) обычно достаточно 3-5 эпох.

from transformers import TrainingArguments, Trainer

# Токенизация датасета
def tokenize_function(examples):
    return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=512)

tokenized_dataset = dataset.map(tokenize_function, batched=True)

# Параметры обучения
training_args = TrainingArguments(
    output_dir="./llama-epub-trained",
    num_train_epochs=3,
    per_device_train_batch_size=2,  # Уменьшайте если не хватает памяти
    gradient_accumulation_steps=4,
    warmup_steps=100,
    logging_steps=10,
    save_steps=200,
    evaluation_strategy="no",
    learning_rate=2e-4,
    fp16=True,  # Используем половинную точность
    optim="paged_adamw_8bit",
    save_total_limit=2,
    report_to="none"  # Отключаем отчеты
)

# Создаем тренер
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_dataset,
    tokenizer=tokenizer,
)

# Запускаем обучение
trainer.train()

# Сохраняем обученную модель
model.save_pretrained("./my_epub_llm")
tokenizer.save_pretrained("./my_epub_llm")

6 Тестирование и использование модели

После обучения проверяем, насколько хорошо модель усвоила материал ваших книг.

from peft import PeftModel

# Загружаем базовую модель и адаптеры
base_model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.2-3B-Instruct",
    device_map="auto",
    torch_dtype=torch.float16
)

trained_model = PeftModel.from_pretrained(base_model, "./my_epub_llm")

trained_model.eval()

# Тестовый запрос
prompt = "В книге, которую я тебе дал, рассказывается о..."
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")

with torch.no_grad():
    outputs = trained_model.generate(
        **inputs,
        max_new_tokens=200,
        temperature=0.7,
        do_sample=True
    )

response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)

Нюансы и возможные ошибки

Оптимизация для разных конфигураций железа

  • GPU с 8GB VRAM: Используйте QLoRA с 4-bit квантованием, batch size = 1, gradient accumulation = 8
  • Только CPU (32GB+ RAM): Рассмотрите Phi-3 Mini, используйте 8-bit квантование, уменьшите длину контекста до 512
  • GPU с 24GB VRAM: Можно обучать 7B модели без квантования или использовать полный fine-tuning

Типичные ошибки и их решения

Ошибка Причина Решение
CUDA out of memory Слишком большой batch size или модель Уменьшите batch size, используйте gradient accumulation, примените QLoRA
Плохое качество ответов Недостаточно данных или эпох Добавьте больше книг, увеличьте эпохи до 5-7, проверьте качество очистки текста
Модель «забывает» базовые знания Слишком высокий learning rate Уменьшите LR до 1e-5, используйте cosine расписание
Очень медленное обучение Обучение на CPU или слабом GPU Используйте Google Colab Pro (A100), уменьшите размер модели

Альтернативы и когда их использовать

Fine-tuning — не единственный способ работы с персональными данными. Выбор зависит от ваших целей:

Метод Лучше всего подходит для Недостатки
Fine-tuning (эта статья) Создание эксперта по вашей библиотеке, изменение стиля ответов Требует вычислительных ресурсов, сложнее обновлять
RAG (Retrieval Augmented Generation) Быстрый старт, работа с постоянно обновляемыми документами Модель не «знает» контент, только извлекает его
Промпт-инжиниринг с контекстом Разовые запросы к большим моделям (GPT-4) Дорого, ограниченный контекст, данные уходят третьим лицам
🚀
Профессиональный совет: Для production-систем рассмотрите гибридный подход: RAG для точного извлечения фактов + fine-tuned модель для понимания контекста и стиля. Именно такие системы мы обсуждаем в статье про production-ready AI-агентов.

FAQ: Частые вопросы

Сколько книг нужно для качественного обучения?

Минимум — 3-5 полноценных книг (общим объемом 500+ страниц). Оптимально — 10-20 книг одной тематики. Качество важнее количества: лучше 5 хорошо очищенных книг, чем 20 с шумом.

Можно ли обучать на книгах на русском языке?

Да, но выбирайте мультиязычные модели (Qwen2.5, некоторые версии Llama) или русскоязычные (Saiga, Rugpt). Англоязычные модели будут работать хуже с кириллицей.

Сколько времени займет обучение?

На RTX 4070 (12GB) обучение Llama 3.2 3B на 10 книгах (~500k токенов):
- Подготовка данных: 10-30 минут
- Обучение (3 эпохи): 2-4 часа
- Тестирование и настройка: 1-2 часа

Как интегрировать обученную модель в приложение?

Используйте FastAPI для создания REST API или напрямую интегрируйте в Python-приложение. Для веб-интерфейса подойдет Gradio или Streamlit. Подробнее о продакшн-интеграции читайте в нашем гайде по интеграции ML моделей.

Заключение

Создание персонального ИИ, который действительно знает ваши книги, перестало быть фантастикой. Благодаря компактным моделям и эффективным методам обучения вроде QLoRA, это можно сделать на домашнем компьютере.

Начните с малого: возьмите 2-3 любимые книги, выберите Llama 3.2 3B, и следуйте пошаговому плану. Первые результаты вы увидите уже через несколько часов работы.

Помните: это не просто техническое упражнение. Вы создаете цифрового двойника своей библиотеки, эксперта, который поможет вам в исследованиях, написании текстов или просто в поиске нужной цитаты. Это следующий шаг в персонализации искусственного интеллекта.