Can Small Language Models Judge as Well as Large Language Models?
🧑⚖️ 16 SLM Judges • 📊 10 Datasets • 🗳️ 3 Advanced Strategies • 🎭 6 Persona Prompts
💡 What is SLMJury?
SLMJury is a comprehensive framework that investigates whether Small Language Models (0.6B–14B parameters) can serve as reliable judges across both closed-ended (accuracy-based) and open-ended (correlation-based) evaluation paradigms. The project explores six evaluation modes: individual judging, persona-based evaluation, majority-vote ensembles, multi-agent debate, human agreement scoring (SummEval), and LLM agreement scoring (MT-Bench).
🌟 Key Highlights
⚡ Installation
🔧 From Source (Recommended)
git clone https://github.com/anishh15/SLMJury.git
cd SLMJury
pip install -e .
🚀 Quick Start
💻 CLI Scripts
# Step 1: Run student model inference
python scripts/run_student.py --model qwen2.5-32b --datasets gsm8k math
# Step 2: Run judge evaluations
python scripts/run_judge.py --judge qwen3-4b --max-tokens 10 8192
# Step 3: Evaluate all judgements and generate summaries
python scripts/run_evaluation.py
🐍 Python API
from slmjury.core.solver import StudentSolver
from slmjury.core.judge import JudgeModel
from slmjury.core.evaluator import JudgeEvaluator
# Step 1: Solve problems with a student model
solver = StudentSolver("qwen2.5-32b")
results = solver.solve_batch(problems, "gsm8k")
solver.save_results(results, "gsm8k")
solver.cleanup()
# Step 2: Judge the solutions
judge = JudgeModel("qwen3-4b")
judgements = judge.evaluate_batch(results, max_tokens=10)
judge.save_results(judgements, "qwen2.5-32b", "gsm8k", 10)
judge.cleanup()
# Step 3: Evaluate judge accuracy
evaluator = JudgeEvaluator("qwen3-4b", "qwen2.5-32b", "gsm8k", 10, judgements)
summary = evaluator.evaluate()
🧩 Advanced: Multi-Agent Strategies
# Majority voting ensemble
from slmjury.strategies.ensemble import run_majority_voting
run_majority_voting(
judge_keys=["qwen3-4b", "phi4mi-3.8b", "qwen2.5-3b"],
student_results=results,
max_tokens=10,
)
# Multi-agent debate (3 judges, RCR prompting)
from slmjury.strategies.debate import run_debate
run_debate(
combo_models=["qwen3-4b", "phi4mi-3.8b", "qwen2.5-3b"],
combo_temps=[0, 0, 0],
student_results=results,
dataset_name="gsm8k",
)
# Persona effects (6 system prompts × all judges)
from slmjury.strategies.persona import run_persona_evaluation
run_persona_evaluation("qwen3-4b", results, max_tokens=10)
🔬 Open-Ended Scoring (SummEval / MT-Bench)
# Score SummEval with a single judge
python scripts/run_scoring_judge.py \
--judge qwen3-4b --dataset summeval
# Score MT-Bench with a single judge
python scripts/run_scoring_judge.py \
--judge qwen3-4b --dataset mtbench \
--oracle-scores results/mtbench_oracle/
from slmjury.core.scoring_judge import ScoringJudge
judge = ScoringJudge("qwen3-4b", output_dir="results/scoring")
# Score SummEval (4-dimension scoring)
summeval_data = load_dataset("summeval")
results = judge.score_summeval(summeval_data, max_tokens=8192)
judge.save_results(results, "summeval")
judge.cleanup()
🤖 Supported Models
| Family | Models | Parameters | Thinking |
|---|---|---|---|
| Qwen 2.5 | 1.5B, 3B, 7B | 1.5B – 7B | — |
| Qwen 3 | 0.6B, 1.7B, 4B, 8B, 14B | 0.6B – 14B | ✅ |
| Llama 3.x | 3.2-1B, 3.2-3B, 3.1-8B | 1B – 8B | — |
| Phi-4 | 14B, Reasoning, R-Plus, Mini, Mini-Reasoning | 3.8B – 14B | ✅* |
*Phi-4 Reasoning/Plus/Mini-Reasoning always use thinking mode and skip quick verdict (t=10) evaluation.
📊 Datasets
Closed-ended (verdict: Correct/Incorrect):
| Dataset | Type | Domain | Size |
|---|---|---|---|
| GSM8K | Numeric | Math | 1,319 |
| GSM-Plus | Numeric | Math | 10,552 |
| MATH | LaTeX | Math | 5,000 |
| ARC-Easy | Multiple Choice | Science | 2,376 |
| ARC-Challenge | Multiple Choice | Science | 1,172 |
| HellaSwag | Multiple Choice | General | 10,042 |
| WinoGrande | Multiple Choice | General | 1,267 |
| TruthfulQA | Multiple Choice | General | 684 |
Open-ended (scoring: 1–5):
| Dataset | Type | Turns | Size | Oracle |
|---|---|---|---|---|
| SummEval | Summarization | — | 1,600 pairs | Human annotations |
| MT-Bench | Multi-turn chat | 2 | 80 questions | GPT-OSS-120B, Qwen3.5-397B (Together API) |
🏗️ Project Structure
SLMJury/
├── slmjury/ # Python package
│ ├── configs/ # Centralized YAML model configurations
│ ├── data/ # Dataset loaders (HuggingFace → local JSON)
│ ├── parsers/ # Answer extraction, normalization, verdict/score parsing
│ ├── core/ # Pipeline: solver → judge → evaluator + scoring
│ └── strategies/ # Ensemble voting, multi-agent debate, personas
├── scripts/ # CLI entry-points (student, judge, oracle, scoring)
├── bash/ # Bash wrappers for full experiment runs
├── tests/ # Unit & integration tests (pytest)
├── website/ # React leaderboard (Vite + Tailwind)
├── assets/ # SVG banner and logo
├── pyproject.toml # Package config (pip install -e .)
└── README.md
🏆 Leaderboard
Explore full results on the interactive leaderboard:
📖 Citation
If you use SLMJury in your research, please cite:
@misc{laddha2026slmjury,
title={SLMJury: Can Small Language Models Judge as Well as Large Language Models?},
author={Anish Laddha and Nitesh Pradhan and Gaurav Srivastava},
year={2026},
}
📄 License
Apache License 2.0 — see LICENSE for details.
Made with ❤️ by Anish Laddha, Nitesh Pradhan, and Gaurav Srivastava
Metadata
Release files for slmjury 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| slmjury-0.1.0.tar.gz | 51.9 kB | Without provenance | Details for slmjury-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| slmjury-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for slmjury-0.1.0-py3-none-any.whl |
Total release size: 116.8 kB
Release files / slmjury-0.1.0.tar.gz
| Download URL | slmjury-0.1.0.tar.gz |
|---|---|
| Size | 51.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
20b9711b73536d9391c08def2c763aa660c973127b62201a397072c47973be82
|
|
BLAKE2b-256 checksum How to use checksums |
90ca8d9eeb24d41758a4b3acc8427e47776d4cf3f7ca852b2d679720cfe34095
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.8
|
Release files / slmjury-0.1.0-py3-none-any.whl
| Download URL | slmjury-0.1.0-py3-none-any.whl |
|---|---|
| Size | 64.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b878a180785bbc724bb470edbaeb26732b1046d2338f3924806c865203ee3392
|
|
BLAKE2b-256 checksum How to use checksums |
f9cd7b049b8814dcb29815a388d7bc9e4f0231cb6795d6cb427d4b4f81ca069e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.8
|
Security for slmjury 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.