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.