ModernBERT field-event ranker (mixed-v2.1, seed member)
Fine-tune of answerdotai/ModernBERT-base for field-conditioned event
ranking. This checkpoint is one of 3 seed-averaged members in our
ensemble (seeds 17, 29, 42 — all trained on identical data + config,
only random seed differs).
Training
Same config as all v2.1 members:
- 1217 mixed-mode rows (autonomous + prompt→action + customer-support)
- perf-H4 stack: bf16 + gradient checkpointing + accum=8, lr 5.7e-5
- Loss: multi-positive grouped softmax (group_ce)
- 320 opt steps × accum=8 = 2560 forwards
- RTX 5090 (Blackwell SM 12.0)
This member
- Seed: check model_dir / training_metadata.json
- Single-model MRR: 0.617
- Single-model top-1: 0.414
Ensemble inference
To replicate our ensemble (MRR 0.624, top-1 0.423 — +0.015 over any single seed):
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch
members = [
"Avifenesh/episodic-ingestion-modernbert-ranker-seed17",
"Avifenesh/episodic-ingestion-modernbert-ranker-seed42",
"Avifenesh/episodic-ingestion-modernbert-field-event-ranker-mixed-v2-h4-320",
]
models = [AutoModelForSequenceClassification.from_pretrained(m).eval() for m in members]
tokenizer = AutoTokenizer.from_pretrained(members[0])
# For each candidate, average logits across members, then softmax within group
def ensemble_score(candidates):
all_logits = []
for m in models:
with torch.no_grad():
inputs = tokenizer([...], return_tensors="pt", padding=True)
logits = m(**inputs).logits.squeeze(-1)
all_logits.append(logits)
return torch.stack(all_logits).mean(dim=0) # average logits pre-softmax
Lineage
See docs/ranker-hypothesis-log-2026-05-08.md in the
episodic-ingestion-compiler repo for the full experimental ladder.