CoolFace
Modelpublic

Adityasharma4287/email-triage-grpo

sourceHugging Facellama3.1updated 5mo agoView on Hugging Face
0likes12downloads
Model Card

๐Ÿ“ง Email Triage Agent โ€” GRPO Fine-tuned (Llama-3.1-8B)

A LoRA adapter for meta-llama/Llama-3.1-8B-Instruct, trained using GRPO (Group Relative Policy Optimization) to autonomously triage emails โ€” assigning priority, category, and action with human-level accuracy.

GRPO is the same RL technique used in DeepSeek-R1. Instead of supervised labels, the model learns by receiving reward signals from an environment โ€” just like how humans learn from feedback.

๐Ÿง  What This Model Does

Given an email (subject + sender + body), the model outputs:

OutputValues
Priorityurgent / high / medium / low / spam
Categorybilling / technical / customer_support / sales / legal / hr / internal / spam / other
Actionreply / escalate / forward / archive / delete / snooze
TagsVIP / churn-risk / legal-review / follow-up
Reply textAuto-drafted reply (when action = reply)

๐Ÿ‹๏ธ Training Details

PropertyValue
Base modelmeta-llama/Llama-3.1-8B-Instruct
Training methodGRPO (Reinforcement Learning from Environment Reward)
PEFT methodLoRA
LoRA rankr=16, alpha=32
LoRA dropout0.05
Target modulesqproj, kproj, vproj, oproj
Task typeCausal LM
Score improvement0 โ†’ 1 (full reward range)
Training environmentEmail Triage OpenEnv v2.0

Reward Function

The model was trained on a reward signal (not supervised labels):

reward = priority_score ร— 0.35
       + category_score ร— 0.25  
       + action_score   ร— 0.30
       + sentiment_bonus         (up to +0.08)
       + tag_bonus               (up to +0.08)
       - sla_breach_penalty      (-0.15 if urgent email archived)
       - urgent_archive_penalty  (-0.35)

๐Ÿš€ Quick Start

python
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer

base_model = "meta-llama/Llama-3.1-8B-Instruct"
adapter    = "Adityasharma4287/email-triage-grpo"

tokenizer = AutoTokenizer.from_pretrained(adapter)
model = AutoModelForCausalLM.from_pretrained(base_model, device_map="auto")
model = PeftModel.from_pretrained(model, adapter)

email = """
Subject: URGENT - Server is DOWN
From: cto@bigclient.com
Body: Our entire application is down. 50,000 users affected. 
Need immediate response from engineering.
"""

messages = [
    {"role": "system", "content": "You are an expert email triage agent. Classify the email and decide the best action."},
    {"role": "user",   "content": f"Triage this email:\n{email}\n\nRespond with JSON: priority, category, action, notes"}
]

input_ids = tokenizer.apply_chat_template(messages, return_tensors="pt").to(model.device)
output = model.generate(input_ids, max_new_tokens=256, temperature=0.1)
print(tokenizer.decode(output[0][input_ids.shape[-1]:], skip_special_tokens=True))

Expected output:

json
{
  "priority": "urgent",
  "category": "technical", 
  "action": "escalate",
  "notes": "Production outage affecting 50k users. Immediate engineering response needed.",
  "custom_tags": ["VIP"]
}

๐Ÿ“Š Benchmark Results

TaskDifficultyScore
task_easy_spam๐ŸŸข Easy~0.85+
task_medium_triage๐ŸŸก Medium~0.70+
task_hard_ambiguous๐Ÿ”ด Hard~0.55+

Scores measured on Email Triage OpenEnv v2.0 with seed=42


๐ŸŒ Live Demo & Environment

LinkDescription
๐Ÿ“ง Live AppInteractive email triage UI
๐Ÿ”— Environment APIREST API for training agents
๐Ÿ“‚ Environment CodeOpenEnv-compliant source

๐Ÿ†• Advanced Features (v2.0 Environment)

The model was trained on an advanced environment with:

  • โ€”โฑ SLA Tracking โ€” urgent emails with โ‰ค2h deadlines trigger extra penalties
  • โ€”๐Ÿง  Sentiment Scoring โ€” angry customers (-0.95 score) get urgency boost
  • โ€”๐Ÿท๏ธ Custom Tags โ€” VIP, churn-risk, legal-review, follow-up
  • โ€”๐Ÿ’ค Snooze Action โ€” new action type for low-priority deferrals
  • โ€”๐ŸŒ Multilingual โ€” Spanish email test cases included
  • โ€”โš–๏ธ Legal/HR Categories โ€” GDPR requests, lawsuit threats, HR emails

๐Ÿ“ Repository Structure

email-triage-grpo/
โ”œโ”€โ”€ adapter_config.json       โ† LoRA config
โ”œโ”€โ”€ adapter_model.safetensors โ† Trained weights (27.3 MB)
โ”œโ”€โ”€ tokenizer.json            โ† Llama-3.1 tokenizer
โ”œโ”€โ”€ tokenizer_config.json     
โ”œโ”€โ”€ chat_template.jinja       โ† Chat prompt template
โ”œโ”€โ”€ env/                      โ† Training environment
โ”‚   โ””โ”€โ”€ email_triage_env.py  โ† OpenEnv environment
โ”œโ”€โ”€ smart_agent.py            โ† Agent inference script
โ””โ”€โ”€ inference.py              โ† Inference utilities

๐Ÿ” Training Your Own Agent

The full training environment is included. Run your own GRPO training:

bash
git clone https://huggingface.co/Adityasharma4287/email-triage-grpo
cd email-triage-grpo
pip install -r requirements.txt

# Set env vars
export API_KEY="your-openai-or-local-key"
export MODEL_NAME="gpt-4o-mini"  # or your local model
export ENV_BASE_URL="http://localhost:7860"

# Start the environment server
python app.py &

# Run the smart agent
python smart_agent.py

๐Ÿ“œ Citation

bibtex
@misc{email-triage-grpo-2026,
  title   = {Email Triage Agent: RL Fine-tuning with GRPO on Llama-3.1-8B},
  author  = {Adityasharma4287},
  year    = {2026},
  url     = {https://huggingface.co/Adityasharma4287/email-triage-grpo},
  note    = {LoRA adapter trained with Group Relative Policy Optimization}
}

โš ๏ธ Limitations

  • โ€”Trained on synthetic email templates โ€” real-world email diversity may differ
  • โ€”Best results with structured JSON output prompting
  • โ€”Base model (Llama-3.1-8B) requires ~16GB VRAM for full inference; use 4-bit quantization for smaller GPUs

Built with โค๏ธ using GRPO + LoRA + OpenEnv