Parselex
Previously known as Resume-TLM
High-fidelity resume parsing without the LLM tax. A modular MiniLM pipeline: hybrid heading detection → section classification → domain-specific boundary, segmentation, and field cascades — deployed as 3 INT8 ONNX bundles, plus a server-side Inference V2 runner with selectable FP32/INT8 precision. Zero API calls at inference.
“Why use 175B parameters to find a phone number when ~22M parameters and spatial fusion can hit ~98% section labels and ~91% experience field F1 — ~1.9× faster INT8 with ≤1 pp drift on Skills, Experience, and Projects?”
Efficiency as a feature.
The “LLM Tax”: the unnecessary cost, latency, and hallucination risk of routing a structured extraction task through a general-purpose language model.
| Metric | GPT-4o / Claude 3.5 | Parselex ✓ |
|---|---|---|
| Parameters | ∼175B+ (GPT-4o / Claude) | ~22M (MiniLM-L6-v2 per encoder) |
| Inference | 3–8s (API round-trip) | ~3.9 s INT8 · ~7.4 s FP32 (Inference V2, server, warm cache) |
| Model disk size | N/A (cloud) | ~157 MB INT8 (3 bundles) |
| Overall GT (INT8) | Unstructured JSON | 86.0% (sample resume; education head drives −3.5 pp vs FP32) |
| Section label accuracy | ~85–95% (hallucination risk) | 97.6% val chunk accuracy |
| Experience field F1 | Unstructured JSON | 90.9% val pooled macro F1 |
| Token-level confidence | No | Yes — per-token / per-block logits |
| Runs in browser | No (API-only) | Planned — on hold |
| Data privacy | Sent to external API | Local inference — no data leaves device |
High-quality parsing needs high-quality ground truth.
Instead of downloading a dataset, I built the machinery to create one — a custom Human-in-the-Loop Labeling Workbench.
LLM Pre-annotation
Gemma 4 generates "silver standard" labels for every token before a human sees the resume. Batch runs process 12 resumes per Ollama cooldown window with smart skip logic for already-labeled docs.
Visual Labeling UI
Custom Next.js app renders token bounding boxes, section clusters, and BIO tag assignments in a 3-stage interface (Live → Heuristic → AI) across Personal, Skills, Experience, Education, and Projects sections. Experience Phase 3 eval filters to 108 train / 18 val resumes with confirmed job blocks.
Data Integrity
The UI enforces 8D/24D spatial feature constraints during labeling. BIO violation audit scripts catch illegal tag transitions before training. Per-document loss scores surface high-loss outliers for re-review.
Architecture deep dive.
GLU Spatial Fusion
Resumes are spatial documents — a header's position is as informative as its text. A Gated Linear Unit selectively blends token semantics with layout features at inference time, without hardcoding layout rules:
Training Configuration
Modular Track Pipeline
Section P1 hybridHybrid rules + MiniLM line classifier (standalone line_minilm_int8.onnx). Detects B-HEADING / I-HEADING tokens on uncertain lines. Val FHA: 94.7% · recall: 95.9%. Not inside the 10-head graph — line-level prev/next context requires standalone ONNX.
Section P2 chunk classifierAutoregressive chunk classifier maps each block to EDUCATION · EXPERIENCE · PROJECTS · SKILLS · PERSONAL. Virtual PERSONAL chunk handles headless resumes. Val chunk accuracy: 97.6%.
Domain cascade (×3 sections)Combined 10-head MiniLM (combined_ten_head_int8.onnx). Per section: P2 entry boundaries → P1 phrase segmentation (B-SEG / I-SEG) → P3 block classification. Experience fields: ROLE · COMP · DATE · DESC. Exp val: 100% FBA · 97.5% seg · 90.9% F1. Edu: 69.4% FBA · 94.1% seg · 87.8% F1. Proj: 90.9% FBA · 90.2% F1.
Personal + Skills combinedpersonal_skills_combined_int8.onnx (~63 MB INT8). Personal: segment-level entities (NAME, EMAIL, PHONE, …) with 24D spatial GLU — B-NAME 99.4% · B-EMAIL 98.1% · B-PHONE 96.3% F1. Skills: per-token BIO. Val macro F1: 91.7% personal · 65.4% skills.
Measured. Not estimated.
Locked validation metrics from PyTorch eval reports, plus ONNX INT8 parity gates (combined/reports/comparison.md, 2026-07-01). Inference V2 (server-side PyTorch, July 2026): full pipeline INT8 ~3.9 s vs FP32 ~7.4 s on a gold-labeled sample resume — Skills, Experience, and Projects within 1 pp of FP32; Education shows known INT8 drift.
| Bundle | Metric | PyTorch | ONNX INT8 | Delta | Status |
|---|---|---|---|---|---|
| Section P1 | Val FHA | 94.68% | 94.09% | −0.59pp | PASS |
| Section P1 | Val recall | 95.87% | 95.28% | −0.59pp | PASS |
| Section P2 | Val accuracy | 97.55% | 97.55% | 0.00pp | PASS |
| Personal | Val macro F1 | 91.71% | 90.26% | −1.45pp | PASS |
| Skills | Val macro F1 | 65.38% | 65.46% | +0.08pp | PASS |
| Artifact | Role | Graph | Disk |
|---|---|---|---|
line_minilm_int8.onnx | Section P1 hybrid | Standalone | ~63 MB |
combined_ten_head_int8.onnxCore cascade | Section P2 + 9 domain heads | Combined graph | ~94 MB |
personal_skills_combined_int8.onnx | Personal segment + Skills BIO | Combined graph | ~63 MB |
Inference V2 timings are server-side PyTorch INT8 (warm cache), not browser ONNX. Legacy DistilRoBERTa 13-model benchmarks (2.96s / 40 MB / 280 MB) are from the pre-MiniLM architecture and are no longer representative of the current 3-bundle deployment.
Show, don't tell.
Illustrative structured output showing the JSON the model produces — with per-field confidence scores. Representative examples, not from a live run.
John Doe [email protected] | +1 555 010 2345 github.com/johndoe | Austin, TX EXPERIENCE Software Engineer — Acme Corp (2022–2024) Built microservices in Go, reduced p99 latency by 40% SKILLS Go, Python, Kubernetes, PostgreSQL, gRPC EDUCATION B.S. Computer Science — State University (2018–2022)
Full stack, production-ready.
Where it fails — and how it's being fixed.
Honesty as an engineering signal. Real edge cases, their root causes, and the current mitigation status.
Honest constraints.
Systemic limits of the current corpus, architecture, and deployment state — separate from specific edge-case bugs in the failure log above.
Limited training data
~203 resumes in the MongoDB corpus; ~134 train / 24 val for the section gate. Domain tracks (experience, education, project) filter further by section presence and confirmed entry heads — effective sample sizes are smaller per stage.
Education boundaries
69.4% val FBA — the weakest stage in the pipeline. Education INT8 quantization shows the largest GT regression on a sample resume (−19.7 pp); val FBA still the primary bottleneck. Active improvement work.
Skills extraction
65.4% val macro F1. Dense run-on skill strings (e.g. "Python OOPs Data Analysis ML Streamlit") are a labeling granularity issue, not section misclassification.
Layout coverage
Multi-column resumes are excluded from training. Reading-order errors in the PDF extraction layer propagate to spatial features and boundary detection.
Resume diversity
Corpus skews toward Indian and tech-heavy formats. Generalization to creative layouts, non-English resumes, or industry-specific templates is unproven.
Browser inference
ONNX bundles pass locked parity gates; browser runner is on hold. Server-side Inference V2 (selectable FP32/INT8) is available for benchmarking — ~3.9 s INT8 full pipeline on a sample resume.
Build log.
Built for production NLP —
not just a demo.
Three INT8 ONNX bundles, locked validation metrics, and Inference V2 server benchmarks (~3.9 s INT8 full pipeline). Happy to discuss architecture, quantization trade-offs (including where INT8 is not lossless), dataset design, or production NLP.