How to use from the
Use from the
Transformers library
# Use a pipeline as a high-level helper
from transformers import pipeline

pipe = pipeline("text-generation", model="QCRI/ProBel-MTL")
messages = [
    {"role": "user", "content": "Who are you?"},
]
pipe(messages)
# Load model directly
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("QCRI/ProBel-MTL")
model = AutoModelForCausalLM.from_pretrained("QCRI/ProBel-MTL", device_map="auto")
messages = [
    {"role": "user", "content": "Who are you?"},
]
inputs = tokenizer.apply_chat_template(
	messages,
	add_generation_prompt=True,
	tokenize=True,
	return_dict=True,
	return_tensors="pt",
).to(model.device)

outputs = model.generate(**inputs, max_new_tokens=40)
print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:]))
Quick Links

ProBel-MTL

The bilingual multi-task model from the ProBel paper (Mt-SFT): a single Qwen2.5-7B-Instruct fine-tune that handles all five ProBel tasks in both Arabic and English — binary propaganda detection, coarse-category and fine-grained technique classification (with explanations), and technique-labeled span extraction in two output formats.

Trained with LoRA (r=16, alpha=32) on the Arabic and English training splits of QCRI/ProBel across all five task formats jointly; the checkpoint was selected on validation loss and merged into the base model, so it loads as a regular causal LM. The LoRA adapter alone is in lora_adapter/.

Companion resources: dataset · code · paper: ProBel: Propaganda Detection with Techniques, Spans, and Explanations (arXiv preprint; the link will be added here once the listing is live).

Test scores

Binary Coarse Technique Span-tag Span-occ
Arabic 0.763 0.682 0.575 0.411 0.362
English 0.735 0.410 0.272 0.189 0.241

Binary is macro-F1; coarse/technique are micro-F1; spans use the overlap-adjusted micro-F1 of Da San Martino et al. (2020). These match the paper's Mt-SFT rows and were produced with greedy decoding.

Prompt templates

The model expects the exact task prompts it was trained on. prompts/templates.json ships all ten of them — {arabic, english} x {binary, coarse, multilabel, span_tag, span_match_occ} — each a {"system": ..., "user": ...} pair where the user message contains a {TEXT} placeholder for the input sentence.

Task Model output
binary Label: true or Label: false, then Explanation: ...
coarse / multilabel Labels: <names or none>, then Explanation: ...
span_tag the input sentence with inline <span type="Technique">...</span> tags
span_match_occ a JSON list of {"text", "label", "occurrence"} objects

Arabic templates carry the same task instructions with an Arabic-specialized system prompt; the model answers Arabic inputs in Arabic.

Usage

pip install "transformers>=4.51" accelerate

Binary detection with an explanation:

import json
from huggingface_hub import hf_hub_download
from transformers import AutoModelForCausalLM, AutoTokenizer

templates = json.load(open(hf_hub_download("QCRI/ProBel-MTL", "prompts/templates.json")))
model = AutoModelForCausalLM.from_pretrained("QCRI/ProBel-MTL",
                                             dtype="bfloat16", device_map="auto")
tok = AutoTokenizer.from_pretrained("QCRI/ProBel-MTL")

def run(task, lang, text, max_new_tokens=512):
    t = templates[lang][task]
    msgs = [{"role": "system", "content": t["system"]},
            {"role": "user", "content": t["user"].replace("{TEXT}", text)}]
    ids = tok.apply_chat_template(msgs, add_generation_prompt=True,
                                  return_tensors="pt").to(model.device)
    out = model.generate(ids, max_new_tokens=max_new_tokens, do_sample=False)
    return tok.decode(out[0][ids.shape[1]:], skip_special_tokens=True)

print(run("binary", "english",
          "The corrupt elites are destroying everything we hold dear."))
# Label: true
# Explanation: The paragraph relies on a sweeping, emotive accusation that
# unnamed "elites" are ruining "everything we hold dear" ...

Technique-labeled span extraction (same helper):

print(run("span_tag", "english",
          "The corrupt elites are destroying everything we hold dear."))
# <span type="Appeal_to_Fear-Prejudice">The corrupt elites are destroying
# everything we hold dear.</span>

print(run("multilabel", "arabic",
          "الإعلام الكاذب يواصل نشر أكاذيبه المسمومة لتضليل الشعب."))
# Labels: Loaded_Language, Questioning_the_Reputation
# Explanation: يستخدم النص لغة محملة بالعواطف مثل "الكاذب" و"أكاذيبه المسمومة" ...

The model also serves directly with vLLM:

vllm serve QCRI/ProBel-MTL

The parsers that turn the span outputs back into character offsets, and the full evaluation pipeline, are in the code repository.

Intended use and limitations

Built for research on propaganda and persuasion-technique analysis in news and social-media text. Predictions are imperfect, technique performance follows the long-tailed label distribution (rare techniques are often missed), and outputs should support trained human reviewers rather than replace them, particularly in moderation or policy settings.

Citation

@misc{kmainasi2026probelpropagandadetectiontechniques,
      title={ProBel: Propaganda Detection with Techniques, Spans, and Explanations}, 
      author={Mohamed Bayan Kmainasi and Ali Ezzat Shahroor and Elisa Sartori and Giovanni Da San Martino and Firoj Alam},
      year={2026},
      eprint={2608.22388},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2608.22388}, 
}
Downloads last month
325
Safetensors
Model size
8B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for QCRI/ProBel-MTL

Base model

Qwen/Qwen2.5-7B
Adapter
(2657)
this model

Dataset used to train QCRI/ProBel-MTL

Paper for QCRI/ProBel-MTL