ruT5 Customer Support Response Generator
Модель для автоматической генерации ответов на отзывы клиентов, основанная на ruT5-base.
📋 Описание
Эта модель fine-tuned на основе ai-forever/ruT5-base для задачи генерации ответов на отзывы покупателей интернет-магазинов. Модель обучена на датасете из ~2.5 миллионов пар "отзыв-ответ" и способна генерировать релевантные, вежливые и профессиональные ответы на русском языке.
🎯 Возможности
- ✅ Генерация персонализированных ответов на отзывы
- ✅ Поддержка различных типов отзывов (позитивные, негативные, нейтральные)
- ✅ Адаптация тона под контекст отзыва
- ✅ Работа с отзывами длиной до 500 символов
📊 Данные для обучения
- Размер датасета: ~2,500,000 пар отзыв-ответ
- Источник: отфильтрованные отзывы с маркетплейса
- Препроцессинг:
- Минимальная длина текста: 10 символов
- Максимальная длина отзыва: 500 символов
- Удалены пустые и некорректные записи
🏗️ Архитектура и обучение
Базовая модель
- Модель:
ai-forever/ruT5-base - Параметры: ~222M
Гиперпараметры обучения
Learning Rate: 1e-3
Optimizer: Adafactor
LR Scheduler: Cosine with warmup (10%)
Epochs: 3
Batch Size: 12
Gradient Accumulation: 2 steps
Label Smoothing: 0.1
Weight Decay: 0.01
Max Gradient Norm: 1.0
Оптимизации
- ✅ Gradient Checkpointing
- ✅ FP16 Mixed Precision Training
- ✅ TF32 acceleration
- ✅ Batch processing (150K samples per batch)
- ✅ Early stopping (patience=3)
Конфигурация токенизации
- Max input length: 128 tokens
- Max target length: 128 tokens
- Префикс входа: "Отзыв: "
🚀 Использование
Установка зависимостей
pip install transformers torch pandas
Базовый пример
from transformers import T5Tokenizer, T5ForConditionalGeneration
# Загрузка модели
model_path = "path/to/your/model"
tokenizer = T5Tokenizer.from_pretrained(model_path)
model = T5ForConditionalGeneration.from_pretrained(model_path)
# Генерация ответа
review = "Товар пришёл быстро, но упаковка была повреждена"
input_text = f"Отзыв: {review}"
input_ids = tokenizer(
input_text,
max_length=128,
truncation=True,
return_tensors="pt"
).input_ids
outputs = model.generate(
input_ids,
max_length=128,
num_beams=5,
early_stopping=True,
temperature=0.7,
top_p=0.9,
no_repeat_ngram_size=3
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(f"Ответ: {response}")
Продвинутый пример с параметрами генерации
def generate_response(review, temperature=0.7, top_p=0.9, num_beams=5):
"""
Генерация ответа на отзыв
Args:
review: текст отзыва
temperature: контроль креативности (0.1-1.0)
top_p: nucleus sampling параметр
num_beams: количество лучей для beam search
"""
input_text = f"Отзыв: {review}"
input_ids = tokenizer(
input_text,
max_length=128,
truncation=True,
padding=True,
return_tensors="pt"
).input_ids.to(model.device)
outputs = model.generate(
input_ids,
max_length=128,
min_length=10,
num_beams=num_beams,
temperature=temperature,
top_p=top_p,
repetition_penalty=1.2,
length_penalty=1.0,
early_stopping=True,
no_repeat_ngram_size=3,
do_sample=True if temperature > 0 else False
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
return response
# Примеры использования
positive_review = "Отличный товар, очень доволен покупкой!"
print(generate_response(positive_review))
negative_review = "Товар не соответствует описанию, разочарован"
print(generate_response(negative_review, temperature=0.5))
📈 Метрики
Модель обучалась с использованием:
- Метрика оптимизации: Evaluation Loss
- Стратегия валидации: 5% данных
- Частота оценки: каждые 2000 шагов
- Best model selection: по минимальному eval_loss
💾 Требования к ресурсам
Обучение
- GPU: 16GB+ VRAM (рекомендуется)
- RAM: 32GB+
- Время обучения: ~8-12 часов на полном датасете (на V100/A100)
Инференс
- GPU: 4GB+ VRAM
- CPU: Возможен, но медленнее (~2-5 сек на отзыв)
- RAM: 8GB+
🔧 Обучение собственной модели
Используйте прилагаемый скрипт train.py:
python train.py
Настройка параметров
Основные параметры можно изменить в секции main():
# Данные
DATA_FILE = "your_dataset.parquet"
BATCH_SIZE = 150000 # Размер батча для обучения
# Гиперпараметры
LR = 1e-3
EPOCHS = 3
BATCH_TRAIN = 12
GRAD_ACCUM = 2
# Оптимизации
USE_GRADIENT_CHECKPOINTING = True
USE_FP16 = True
📝 Формат данных
Датасет должен быть в формате Parquet с колонками:
text_cleaned- текст отзываanswer_cleaned- текст ответа
import pandas as pd
df = pd.DataFrame({
'text_cleaned': ['Отличный товар!', 'Не пришла посылка'],
'answer_cleaned': ['Спасибо за отзыв!', 'Приносим извинения...']
})
df.to_parquet('dataset.parquet')
⚠️ Ограничения
- Модель обучена на данных маркетплейса и может работать хуже на специфичных доменах
- Максимальная длина входа/выхода: 128 токенов
- Требуется постобработка для контроля качества в продакшене
- Может генерировать слишком общие ответы для сложных кейсов
🔄 Версионирование
- v1.0 - Базовая версия на ruT5-base
- Обучена на 2.5M примеров
- 3 эпохи с cosine scheduler
- Early stopping включен
📄 Лицензия
Модель основана на ruT5-base (Apache 2.0 License). Использование модели подразумевает соблюдение лицензии базовой модели.
🤝 Благодарности
- ai-forever за модель ruT5-base
- Hugging Face за библиотеку transformers
📧 Контакты
Для вопросов и предложений по улучшению модели создайте issue в репозитории.
Важно: Рекомендуется тестировать ответы модели перед использованием в продакшене и настроить модерацию для обработки edge cases.
Model tree for baldic/otzovik
Base model
ai-forever/ruT5-base