ClickBait
Generator

GPT-подобная языковая модель с Rotary Position Embeddings, обученная генерировать кликбейтные заголовки. 42 962 токена, 3 слоя decoder, 256 скрытых размерностей.

Попробовать →

Архитектура модели

GPTModelWithRoPE — компактный decoder-only трансформер с Rotary Position Embeddings вместо абсолютных позиционных кодировок.

Token Embedding
Embedding(42962, 256)
Словарь из 42 962 токенов, каждый — вектор размерности 256
DecoderBlock × 3
MultiHeadAttentionWithRoPE
W_q, W_k, W_v, W_o: 256→256
FeedForward
256 → 1024 → 256
LayerNorm + Dropout
Output
LayerNorm(256)
Linear(256 → 42962)
Проекция обратно на словарь
Параметры: ~6.2M Размер модели: ~280 MB Контекст: RoPE

Генератор кликбейта

Введите начало заголовка — модель продолжит в стиле кликбейта.

Примеры генерации

Результаты работы модели при разных параметрах.

1. Этот секрет знают единицы...😱
2. Врачи в шоке от этого открытия...😱
3. Ты не поверишь, что произошло дальше...😱
4. Всего один ингредиент меняет всё...😱
5. Вот почему никто не говорит об этом...😱
почему кошки не любят воду — ответ шокирует...😱
как заработать миллион за неделю...😱
топ 10 фильмов, которые вы обязаны посмотреть...😱
T=0.5 учёные сделали невероятное открытие...😱
T=1.0 Этот метод взорвал интернет — вот почему...😱
T=1.5 Парень купил авто за 100$ а через месяц...😱
T=2.0 Коты захватили биржу — подробности внутри...😱

Как это работает

Генерация с top-k sampling и temperature scaling.

generate_clickbait.py
def generate_clickbait(model, vocab, prompt="", max_new_tokens=7,
                       temperature=1.0, top_k=50, top_p=0.9):
    model.eval()
    if prompt:
        tokens = vocab.text_to_indices_for_generator(prompt)
        input_ids = torch.LongTensor(
            [[vocab.word2idx['<BOS>']] + tokens]
        ).to(DEVICE)
    else:
        input_ids = torch.LongTensor(
            [[vocab.word2idx['<BOS>']]]
        ).to(DEVICE)

    generated = model.generate(
        input_ids, max_new_tokens=max_new_tokens,
        temperature=temperature, top_k=top_k, top_p=top_p,
        eos_token_id=vocab.word2idx['<EOS>']
    )
    return vocab.indices_to_text(generated[0].tolist())
Батчовая генерация
for i in range(5):
    text = generate_clickbait(
        model, vocab, prompt="",
        temperature=1.0, top_k=50
    )
    print(f"  {i+1}. {text}...😱")
Разные температуры
for temp in [0.5, 1.0, 1.5, 2.0]:
    text = generate_clickbait(
        model, vocab, prompt="почему",
        temperature=temp, top_k=50
    )
    print(f"  T={temp}: {text}...😱")