Downloads · 30 days
0
datamatters24/attuned-resonance-intake
attuned-resonance-intake is a text classification model from datamatters24. Use it when you need a label for a piece of text. It is set up for transformers. The card lists the license as cc-by-nc-4.0.
Six-head classifier/regressor built on roberta-base. Given a call transcript, emits a structured intake record used downstream by the outcome predictor and the PPO router.
Downloads · 30 days
0
Access
Public
Updated May 9, 2026
Repo size
1.5 GB
Likes
0
Public
Click a slice to open those files.
.pt497 MB · 100%
From the Hugging Face model README
Six-head classifier/regressor built on roberta-base. Given a call transcript, emits a structured intake record used downstream by the outcome predictor and the PPO router.
The GitHub repo slug is still "CEPM" during the gradual rename; the Hugging Face slugs were migrated to
attuned-resonance-*on 2026-05-09 (HF preserves the oldcepm-*URLs as redirects).
Research/educational use only. See disclaimer below.
| Head | Type | Output |
|---|---|---|
intent | Softmax (8 classes) | Caller domain (zip-source vocabulary) |
action | Softmax (7 classes) | Call type in the predictor's call_type vocabulary — bridges the cascade NLP→predictor |
sentiment | Regression (scalar, approx −1..1) | Overall emotional valence |
urgency | Softmax (3 classes, 1–3) | Time-sensitivity |
complexity | Softmax (5 classes, 1–5) | Required skill level |
jung | Softmax (12 classes) | Caller Jung archetype (speculative head, 0.5× loss) |
campbell | Softmax (10 classes) | Campbell hero-journey phase (speculative head, 0.5× loss) |
Backbone: RoBERTa encoder, last_hidden_state[:, 0] ([CLS]) shared across all heads. Pooler dropped (add_pooling_layer=False) since the heads consume CLS directly. Joint multi-task loss: intent_CE + action_CE + sentiment_MSE + urgency_CE + complexity_CE + 0.5·jung_CE + 0.5·campbell_CE.
Sourced from _ZIP_TO_INTENT in models/intake/dataset.py. Indices are sorted(set(...)) order so they're reproducible across runs:
auto_insurance_customer_service_inboundautomotive_and_healthcare_insurance_inboundautomotive_inboundcustomer_service_general_inboundhome_service_inboundinsurance_outboundmedical_equipment_outboundmedicare_inboundcall_type vocabulary)The action head exists to fix a silent cascade bug: the intent head emits zip-source labels (above), but the downstream predictor's _INTENT_MAP is keyed on the synthetic call_types it was trained against. Without the action head, every NLP intent was silently mapped to predictor class 0. The action head emits in the predictor's native vocabulary so the cascade carries a feature the predictor actually understands.
Indices match generator/config.py:call_types (do not re-sort):
billingtechnicalgeneralaccountcomplaintcancellationupgradeAction labels are silver-standard, generated by a deterministic keyword heuristic (_action_label_for in models/intake/dataset.py) with priority order: cancellation > upgrade > technical > billing > account > complaint > general. Distribution on the 90,093-record corpus:
| Class | Share | Notes |
|---|---|---|
| general | 56% | Corpus-driven (Medicare ≈ 68% of records, mostly coverage clarifications) |
| billing | 20% | |
| cancellation | 11% | |
| technical | 7% | |
| upgrade | 5% | "premium" keyword removed after 82% false-positive rate on insurance_outbound (matched "your premium will be …") |
| complaint | 1% | |
| account | 1% |
Imbalance is corrected at training time by a sqrt-tempered inverse-frequency class-weight vector applied to action_CE:
1/n would give account a ~100× weight vs general — too aggressive for silver labels.general 0.29 vs account 1.97), correcting the imbalance without overfitting to whichever heuristic mistakes happen to land in the rare classes.FacebookAI/roberta-base (125M params, pooler removed)max_length=512accelerate launch --num_processes=2RobertaTokenizerFast (Rust-backed, byte-identical to slow)prod-intake-b2| Metric | Value |
|---|---|
train_loss (sum of 7 head losses) | 5.5984 |
val_loss | 5.6088 |
Best val_loss | 5.6088 |
| Wall clock | ~25 min total (~22 min training, ~3 min upload) |
Train ≈ val throughout (gap < 0.01 at epoch 4) → no overfit signal at 4 epochs. Per-epoch deltas were shrinking (-0.07, -0.04, -0.03, -0.03), indicating the model was approaching convergence; further epochs at decayed LR would likely buy diminishing returns.
The combined loss adds the action head's weighted CE on top of the prior 5-head sum, so the absolute loss is ~1.5–2 units higher than the pre-B2 5-head run (3.99 val); the shape (monotone decrease, train≈val) is the like-for-like comparison.
Internet, TV, Mobile, Cancel, Retention, Billing, Other. The existing 7-class call_type vocab (billing/technical/general/account/complaint/cancellation/upgrade) is operationally accurate for the current insurance/medicare/automotive corpus but would feel awkward for telecom. Tracked in project_v21_plan.md.action, 7-class) bridging the cascade NLP→predictor. Architecture + silver-label heuristic in commit 4933d68; trainer + class weights in 5f517b4; pooler removal for DDP in 1605261.accelerate launch --num_processes=2. 4 epochs, max_length=512, effective batch 64. Best val_loss 5.6088.notebooks/research.ipynb Section 9b now feeds the predictor intake["action"] (call_type vocab) instead of intake["intent"] (zip-domain vocab); the latter silently fell back to class 0 inside the predictor..get(domain, 0) label fallback with a strict whitelist (_ZIP_TO_INTENT) and INTENT_LABELS = sorted(set(...)). Previously, three malformed/duplicate zips were silently mislabeled as class 0 (label bleed).home_ervice_inbound&telecom _outbound) and two (reupload) duplicates whose transcript counts matched the originals.from models.intake.inference import IntakePredictor
from pathlib import Path
predictor = IntakePredictor(
model_path=Path("trained_models/intake/model.pt"),
device="cpu", # or "cuda"
)
result = predictor.predict("Hi, I need help with my account...")
# {
# 'intent': 'medicare_inbound', # zip-domain vocab
# 'action': 'account', # predictor's call_type vocab — feed this to the cascade
# 'sentiment': 0.1, 'urgency': 2, 'complexity': 3,
# 'jung_type': '...', 'campbell_phase': '...',
# 'archetype_confidence': 0.13,
# }
Full pipeline code at tedrubin80/CEPM.
CC-BY-NC-4.0. Non-commercial use only. Attribution required.
@software{attuned_resonance_intake_2026,
author = {Rubin, Ted},
title = {Attuned Resonance Intake: Multi-Head RoBERTa for Call-Center Intake},
year = {2026},
url = {https://github.com/tedrubin80/CEPM}
}