|
|
--- |
|
|
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](https://huggingface.co/datasets/darkQibit/russian-spam-detection) |
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
## 🚀 Использование |
|
|
|
|
|
```python |
|
|
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() |
|
|
```` |
|
|
|
|
|
Пример классификации: |
|
|
|
|
|
```python |
|
|
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](https://t.me/ModProtectorBot?start=donate) |
|
|
|
|
|
Спасибо за поддержку ❤️ |
|
|
|