File size: 5,375 Bytes
9ddd4fc 132f030 9ddd4fc 132f030 9ddd4fc 132f030 9ddd4fc 132f030 9ddd4fc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | ---
license: other
license_name: joa-model-license
license_link: LICENSE.md
base_model: ibm-granite/granite-4.2-3b
base_model_relation: adapter
pipeline_tag: text-generation
tags:
- information-extraction
- job-postings
- lora
---
# JOA Small: job-posting extraction model
*Disclosure: Job Opportunities API (JOA, jobopportunitiesapi.org) is an independent data business that sells API access to job-posting data. AI helped run the experiments, check the numbers and draft this text; Loukas (Luca) Tzekos is editorially responsible. Contact: hello@jobopportunitiesapi.org.*
**Status (24 October 2026): weights released.** The model was trained and evaluated, and the evaluation below is unchanged from 6 October 2026. The weights are in this repository under the JOA Model License (LICENSE.md): any use, including commercial, with visible credit and a link.
## What it does
JOA Small reads the text of one job posting and returns 11 structured fields as JSON: title, company, location, salary currency, minimum, maximum and period, seniority, remote type, posted date, and whether the poster is a staffing agency. It leaves a field empty when the posting does not state it. It answers directly, without a long reasoning trace.
## How it was made
- **Base model:** [ibm-granite/granite-4.2-3b](https://huggingface.co/ibm-granite/granite-4.2-3b) by IBM, licensed Apache 2.0.
- **Method:** LoRA adapter (rank 16), one epoch, 80,000 training examples.
- **Training data:** fields extracted by Qwen/Qwen3.5-27B (Apache 2.0) from job postings collected by Job Opportunities API (JOA), kept only when grounded in the posting text (for example, a title or salary that actually appears in it). The 250 arena listings and the 250 verification listings were excluded.
- **Compute:** This work used the EuroHPC supercomputer Discoverer+ in Bulgaria, made available by the EuroHPC Joint Undertaking through an AI Factories Playground access allocation (project EHPC-AIF-2026PG01-1124).
## Results
**Extraction arena** (250 real job listings, 11 fields, two judge models, paired bootstrap; graded 2 October 2026). Dataset: https://huggingface.co/datasets/JobOpportunitiesAPI/joa-extraction-arena
| Model | Score (rule A) | 95% range | Rank of 84 | Median output tokens |
|---|---|---|---|---|
| **JOA Small** | **93.3** | 92.2–94.4 | **1** | 117 |
| Stock granite-4.2-3b | 64.5 | 59.7–69.0 | 71 | 4,411 |
| Trainer Qwen/Qwen3.5-27B | 89.2 | 86.9–91.4 | 4 | 2,946 |
Per field (rule A): title 99, company 96, location 89, salary currency 93, salary min 94, salary max 93, salary period 96, seniority 86, remote type 92, posted date 89, agency 96.
**Verified listings** (a second set of 250 recent listings, each verified twice by Claude Opus against the live page and the application flow; exact match on the open listings that all three models answered; scored 2 October 2026): stock granite-4.2-3b 72.3%, **JOA Small 84.9%**, trainer 86.3% (n = 213).
**Consumer graphics card** (4–5 October 2026, 100 different JOA listings, richer input with the page and structured data, graded against Claude Opus references): F1 0.888 (95% range 0.85–0.92), about 7 seconds per listing on an NVIDIA GTX 1070.
## Known limits
- **It reads JOA's stored text, not the live page.** That text is usually the description body; the page header, where the title, location and posted date often sit, can be missing. A field that is not in the input cannot be extracted.
- **It cannot tell that a job has closed.** On the verification set it called a few dead listings open; the stored text carries no sign of closure. JOA checks liveness separately.
- **It cannot drive a tool-using agent.** Given tools instead of a prepared input, it scored F1 0.520 on the same 100 listings, and only 54 of 100 answers could be parsed. Give it the input; do not ask it to fetch it.
- **The reference answers come from a model, and the judges are models.** Two judges, a checked reference and confidence ranges reduce that risk; they do not remove it.
- **One task.** This is an extraction model for job postings, not a general assistant.
## What is next
Train and test on a richer input (the rendered page, structured data and the recruiting system's own data), re-run both tests, then decide on releasing the weights.
## Licence
The weights are licensed under the **JOA Model License** (LICENSE.md in this repository):
- You may use, modify, fine-tune, redistribute and sell JOA Small, including in commercial and hosted products.
- If you distribute it, or make a product or service that uses it available to others, show "Built with JOA Small by Job Opportunities API" with a link to https://jobopportunitiesapi.org in your documentation, about page or user interface, and in the model card of any derivative.
- Keep the base model's Apache 2.0 licence and notices.
- Do not imply endorsement.
## Attribution
JOA Small is a fine-tune of ibm-granite/granite-4.2-3b by IBM, used under the Apache License 2.0. It is not made, endorsed or supported by IBM. Built by Job Opportunities API (JOA), https://jobopportunitiesapi.org.
## Contact
- General: hello@jobopportunitiesapi.org
- Legal matters: luca@tzekos.eu
- Phone: +30 2311 113 603
- Job Opportunities API (JOA) is a sole proprietorship of Loukas Tzekos, Didaskalisis Papathanasiou Vas. 79, 54629 Thessaloniki, Greece. VAT EL117613696.
|