ruSpam_LLM / README.md
darkQibit's picture
Update README.md
0772703 verified
---
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)
Спасибо за поддержку ❤️