ruSpam_LLM / README.md
darkQibit's picture
Update README.md
0772703 verified
metadata
language:
  - ru
library_name: peft
tags:
  - lora
  - peft
  - gemma
  - spam-detection
  - text-classification
base_model: google/gemma-2-2b-it
datasets:
  - darkQibit/russian-spam-detection
license: other
pipeline_tag: text-generation

ruSpam_LLM

LoRA-адаптер для классификации сообщений на spam / ham
на базе google/gemma-2-2b-it.

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


📌 Описание

Это LoRA-адаптер, а не полная модель.
Он подключается поверх базовой Gemma и позволяет классифицировать сообщения, генерируя одно слово: spam или ham.

Задача решается через instruction tuning.


🧠 Базовая модель

  • Base model: google/gemma-2-2b-it
  • Архитектура: Causal LM
  • Способ обучения: LoRA (PEFT)

📊 Данные для обучения

Модель обучена на ~9 000 примеров из датасета:

👉 darkQibit/russian-spam-detection


🚀 Использование

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

BASE_MODEL = "google/gemma-2-2b-it"
LORA_REPO = "ruSpamModels/ruSpam_LLM"

HF_TOKEN = "hf_xxxxxxxxxxxxxxxxxxxxx"

tokenizer = AutoTokenizer.from_pretrained(
    BASE_MODEL,
    token=HF_TOKEN
)

base_model = AutoModelForCausalLM.from_pretrained(
    BASE_MODEL,
    device_map="auto",
    torch_dtype=torch.float16,
    token=HF_TOKEN
)


model = PeftModel.from_pretrained(base_model, LORA_REPO)
model.eval()

Пример классификации:

def classify(msg: str):
    prompt = (
        "<start_of_turn>user\n"
        "You are a spam classifier. Determine whether the message is spam or not.\n"
        "Answer with only one word: spam or ham.\n\n"
        f"Message:\n{msg}\n"
        "<end_of_turn>\n"
        "<start_of_turn>model\n"
    )

    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

    with torch.no_grad():
        output = model.generate(
            **inputs,
            max_new_tokens=2,
            do_sample=False,
            pad_token_id=tokenizer.eos_token_id,
            eos_token_id=tokenizer.eos_token_id,
        )

    gen = output[0][inputs["input_ids"].shape[-1]:]
    return tokenizer.decode(gen, skip_special_tokens=True).strip().lower()

⚠️ Ограничения

  • Это генеративная классификация, не SequenceClassification
  • Возможны ошибки на пограничных сообщениях
  • Для high-load рекомендуется logits-классификация

📄 Лицензия

Лицензия соответствует лицензии базовой модели Gemma и лицензии датасета обучения.


💖 Поддержка проекта

Если проект оказался полезен, вы можете поддержать его развитие:

  • TON:
    UQAvc2APxFcmNg0-K8TJ8ykdkl2GjwveuVfFd8-NOwHGEeqv

  • Рубли (Telegram):
    Перейдите по старт-ссылке бота
    👉 @ModProtectorBot

Спасибо за поддержку ❤️