Upload 8 files
Browse files- LICENSE.md +36 -0
- README.md +57 -0
- adapter_config.json +51 -0
- adapter_model.safetensors +3 -0
- chat_template.jinja +62 -0
- tokenizer.json +0 -0
- tokenizer_config.json +16 -0
- training_args.bin +3 -0
LICENSE.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# JOA Model License, version 1.0
|
| 2 |
+
|
| 3 |
+
**Status: in effect from 24 October 2026.** This licence governs the model weights published in this repository.
|
| 4 |
+
|
| 5 |
+
Licensor: Loukas Tzekos, trading as Job Opportunities API (JOA), sole proprietorship, Didaskalisis Papathanasiou Vas. 79, 54629 Thessaloniki, Greece, VAT EL117613696. Legal matters: luca@tzekos.eu.
|
| 6 |
+
|
| 7 |
+
"The Model" means the weights and adapters of JOA Small (and of JOA Small, JOA Advance and JOA Deep generally) as released by the Licensor, and any files released with them. "Derivative" means any model or adapter made from the Model, for example by fine-tuning, merging, quantising or distillation.
|
| 8 |
+
|
| 9 |
+
## 1. What you may do
|
| 10 |
+
|
| 11 |
+
You may use, copy, modify, fine-tune, merge, quantise, distribute and sell the Model and Derivatives, and use them in any product or service, including commercial and hosted services. The licence is free of charge, worldwide, non-exclusive and lasts as long as the rights it covers.
|
| 12 |
+
|
| 13 |
+
## 2. Conditions
|
| 14 |
+
|
| 15 |
+
These conditions apply when you distribute the Model or a Derivative, or make a product or service that uses them available to anyone outside your own organisation (including through an app, website or hosted API). Purely internal use has no conditions beyond sections 2.4 and 3.
|
| 16 |
+
|
| 17 |
+
1. **Keep the base model's licence.** The Model is built on a base model licensed under the Apache License, Version 2.0. Include that licence and any copyright and NOTICE text of the base model, and state that the weights were modified. Nothing in this licence limits the rights you have in the base model itself, obtained from its publisher, under its own licence.
|
| 18 |
+
2. **Give visible credit.** Display the line "Built with JOA Small by Job Opportunities API" with a link to https://jobopportunitiesapi.org, where users of your product or service can see it: in its documentation, its about page or its user interface. If you publish a Derivative, put the same line and link in its model card or README.
|
| 19 |
+
3. **Pass this licence on.** Include a copy of this licence with every copy of the Model or a Derivative you distribute. You may license your own changes on your own terms, but these conditions continue to apply to the parts that come from the Model.
|
| 20 |
+
4. **No implied endorsement.** You may say that your work is based on JOA Small. Do not name or present it in a way that suggests Job Opportunities API, IBM, Alibaba Cloud or the Qwen team made, endorse or support it. This licence grants no trademark rights.
|
| 21 |
+
|
| 22 |
+
## 3. Outputs
|
| 23 |
+
|
| 24 |
+
What you generate with the Model is yours. This licence puts no conditions on outputs.
|
| 25 |
+
|
| 26 |
+
## 4. Ending and restoring the licence
|
| 27 |
+
|
| 28 |
+
If you break a condition, your rights under this licence end automatically. They come back if you fix the breach within 30 days of becoming aware of it.
|
| 29 |
+
|
| 30 |
+
## 5. No warranty
|
| 31 |
+
|
| 32 |
+
The Model is provided "as is", without warranty of any kind. To the extent permitted by law, the Licensor is not liable for any damage arising from its use.
|
| 33 |
+
|
| 34 |
+
## 6. Law
|
| 35 |
+
|
| 36 |
+
This licence is governed by Greek law. This does not remove any rights consumers have under the law of their own country.
|
README.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: other
|
| 3 |
+
license_name: joa-model-license
|
| 4 |
+
license_link: LICENSE.md
|
| 5 |
+
base_model: ibm-granite/granite-3.3-8b-instruct
|
| 6 |
+
base_model_relation: adapter
|
| 7 |
+
pipeline_tag: text-generation
|
| 8 |
+
tags:
|
| 9 |
+
- information-extraction
|
| 10 |
+
- job-postings
|
| 11 |
+
- lora
|
| 12 |
+
---
|
| 13 |
+
|
| 14 |
+
# JOA Advance v2: job-posting extraction model
|
| 15 |
+
|
| 16 |
+
*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.*
|
| 17 |
+
|
| 18 |
+
**Status (24 October 2026): weights released.** This is a second-pass retrain of JOA Advance, trained 10 to 18 October 2026 on the same recipe as the first release. 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.
|
| 19 |
+
|
| 20 |
+
## What it does
|
| 21 |
+
|
| 22 |
+
JOA Advance 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.
|
| 23 |
+
|
| 24 |
+
## How it was made
|
| 25 |
+
|
| 26 |
+
- **Base model:** [ibm-granite/granite-3.3-8b-instruct](https://huggingface.co/ibm-granite/granite-3.3-8b-instruct) by IBM, licensed Apache 2.0.
|
| 27 |
+
- **Method:** LoRA adapter (rank 16), one epoch, 38,488 training examples.
|
| 28 |
+
- **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.
|
| 29 |
+
- **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).
|
| 30 |
+
|
| 31 |
+
## Results
|
| 32 |
+
|
| 33 |
+
**These weights have not been re-graded on the extraction arena.**
|
| 34 |
+
|
| 35 |
+
The v1 release of this model was graded on 250 real job listings against two judge models, and those numbers are published on the v1 card. They are claims about the v1 weights only. Until we run the arena again on this variant, its quality is genuinely unknown, and we will not put a number on it that we have not measured.
|
| 36 |
+
|
| 37 |
+
If you need a model with a published score today, use the v1 release. If you want to help us grade this one, the arena is open: https://huggingface.co/datasets/JobOpportunitiesAPI/joa-extraction-arena
|
| 38 |
+
|
| 39 |
+
## Licence
|
| 40 |
+
|
| 41 |
+
The weights are licensed under the **JOA Model License** (LICENSE.md in this repository):
|
| 42 |
+
|
| 43 |
+
- You may use, modify, fine-tune, redistribute and sell JOA Advance, including in commercial and hosted products.
|
| 44 |
+
- If you distribute it, or make a product or service that uses it available to others, show "Built with JOA Advance v2 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.
|
| 45 |
+
- Keep the base model's Apache 2.0 licence and notices.
|
| 46 |
+
- Do not imply endorsement.
|
| 47 |
+
|
| 48 |
+
## Attribution
|
| 49 |
+
|
| 50 |
+
JOA Advance v2 is a fine-tune of ibm-granite/granite-3.3-8b-instruct 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.
|
| 51 |
+
|
| 52 |
+
## Contact
|
| 53 |
+
|
| 54 |
+
- General: hello@jobopportunitiesapi.org
|
| 55 |
+
- Legal matters: luca@tzekos.eu
|
| 56 |
+
- Phone: +30 2311 113 603
|
| 57 |
+
- Job Opportunities API (JOA) is a sole proprietorship of Loukas Tzekos, Didaskalisis Papathanasiou Vas. 79, 54629 Thessaloniki, Greece. VAT EL117613696.
|
adapter_config.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"alora_invocation_tokens": null,
|
| 3 |
+
"alpha_pattern": {},
|
| 4 |
+
"arrow_config": null,
|
| 5 |
+
"auto_mapping": null,
|
| 6 |
+
"base_model_name_or_path": "/valhalla/projects/ehpc-aif-2026pg01-1124/models/arena/ibm-granite__granite-3.3-8b-instruct",
|
| 7 |
+
"bias": "none",
|
| 8 |
+
"corda_config": null,
|
| 9 |
+
"ensure_weight_tying": false,
|
| 10 |
+
"eva_config": null,
|
| 11 |
+
"exclude_modules": null,
|
| 12 |
+
"fan_in_fan_out": false,
|
| 13 |
+
"inference_mode": true,
|
| 14 |
+
"init_lora_weights": true,
|
| 15 |
+
"kasa_config": null,
|
| 16 |
+
"layer_replication": null,
|
| 17 |
+
"layers_pattern": null,
|
| 18 |
+
"layers_to_transform": null,
|
| 19 |
+
"loftq_config": {},
|
| 20 |
+
"lora_alpha": 32,
|
| 21 |
+
"lora_bias": false,
|
| 22 |
+
"lora_dropout": 0.05,
|
| 23 |
+
"lora_ga_config": null,
|
| 24 |
+
"megatron_config": null,
|
| 25 |
+
"megatron_core": "megatron.core",
|
| 26 |
+
"modules_to_save": null,
|
| 27 |
+
"monteclora_config": null,
|
| 28 |
+
"peft_type": "LORA",
|
| 29 |
+
"peft_version": "0.21.0",
|
| 30 |
+
"qalora_group_size": 16,
|
| 31 |
+
"r": 16,
|
| 32 |
+
"rank_pattern": {},
|
| 33 |
+
"revision": null,
|
| 34 |
+
"target_modules": [
|
| 35 |
+
"up_proj",
|
| 36 |
+
"q_proj",
|
| 37 |
+
"gate_proj",
|
| 38 |
+
"k_proj",
|
| 39 |
+
"o_proj",
|
| 40 |
+
"v_proj",
|
| 41 |
+
"down_proj"
|
| 42 |
+
],
|
| 43 |
+
"target_parameters": null,
|
| 44 |
+
"task_type": "CAUSAL_LM",
|
| 45 |
+
"trainable_token_indices": null,
|
| 46 |
+
"use_bdlora": null,
|
| 47 |
+
"use_dora": false,
|
| 48 |
+
"use_qalora": false,
|
| 49 |
+
"use_rslora": false,
|
| 50 |
+
"velora_config": null
|
| 51 |
+
}
|
adapter_model.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:5a536676f1f73075b83fde2977efd25cd8b164c5b21b11e74e6c3cda874633fb
|
| 3 |
+
size 197993952
|
chat_template.jinja
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{# Alias tools -> available_tools #}
|
| 2 |
+
{%- if tools and not available_tools -%}
|
| 3 |
+
{%- set available_tools = tools -%}
|
| 4 |
+
{%- endif -%}
|
| 5 |
+
{%- if messages[0]['role'] == 'system' %}
|
| 6 |
+
{%- set system_message = messages[0]['content'] %}
|
| 7 |
+
{%- set loop_messages = messages[1:] %}
|
| 8 |
+
{%- else %}
|
| 9 |
+
{%- set system_message = "Knowledge Cutoff Date: April 2024.
|
| 10 |
+
Today's Date: " + strftime_now('%B %d, %Y') + ".
|
| 11 |
+
You are Granite, developed by IBM." %}
|
| 12 |
+
{%- if available_tools and documents %}
|
| 13 |
+
{%- set system_message = system_message + " You are a helpful assistant with access to the following tools. When a tool is required to answer the user's query, respond only with <|tool_call|> followed by a JSON list of tools used. If a tool does not exist in the provided list of tools, notify the user that you do not have the ability to fulfill the request.
|
| 14 |
+
Write the response to the user's input by strictly aligning with the facts in the provided documents. If the information needed to answer the question is not available in the documents, inform the user that the question cannot be answered based on the available data." %}
|
| 15 |
+
{%- elif available_tools %}
|
| 16 |
+
{%- set system_message = system_message + " You are a helpful assistant with access to the following tools. When a tool is required to answer the user's query, respond only with <|tool_call|> followed by a JSON list of tools used. If a tool does not exist in the provided list of tools, notify the user that you do not have the ability to fulfill the request." %}
|
| 17 |
+
{%- elif documents %}
|
| 18 |
+
{%- set system_message = system_message + " Write the response to the user's input by strictly aligning with the facts in the provided documents. If the information needed to answer the question is not available in the documents, inform the user that the question cannot be answered based on the available data." %}
|
| 19 |
+
{%- elif thinking %}
|
| 20 |
+
{%- set system_message = system_message + " You are a helpful AI assistant.
|
| 21 |
+
Respond to every user query in a comprehensive and detailed way. You can write down your thoughts and reasoning process before responding. In the thought process, engage in a comprehensive cycle of analysis, summarization, exploration, reassessment, reflection, backtracing, and iteration to develop well-considered thinking process. In the response section, based on various attempts, explorations, and reflections from the thoughts section, systematically present the final solution that you deem correct. The response should summarize the thought process. Write your thoughts between <think></think> and write your response between <response></response> for each user query." %}
|
| 22 |
+
{%- else %}
|
| 23 |
+
{%- set system_message = system_message + " You are a helpful AI assistant." %}
|
| 24 |
+
{%- endif %}
|
| 25 |
+
{%- if 'citations' in controls and documents %}
|
| 26 |
+
{%- set system_message = system_message + '
|
| 27 |
+
Use the symbols <|start_of_cite|> and <|end_of_cite|> to indicate when a fact comes from a document in the search result, e.g <|start_of_cite|> {document_id: 1}my fact <|end_of_cite|> for a fact from document 1. Afterwards, list all the citations with their corresponding documents in an ordered list.' %}
|
| 28 |
+
{%- endif %}
|
| 29 |
+
{%- if 'hallucinations' in controls and documents %}
|
| 30 |
+
{%- set system_message = system_message + '
|
| 31 |
+
Finally, after the response is written, include a numbered list of sentences from the response with a corresponding risk value that are hallucinated and not based in the documents.' %}
|
| 32 |
+
{%- endif %}
|
| 33 |
+
{%- set loop_messages = messages %}
|
| 34 |
+
{%- endif %}
|
| 35 |
+
{{- '<|start_of_role|>system<|end_of_role|>' + system_message + '<|end_of_text|>
|
| 36 |
+
' }}
|
| 37 |
+
{%- if available_tools %}
|
| 38 |
+
{{- '<|start_of_role|>available_tools<|end_of_role|>' }}
|
| 39 |
+
{{- available_tools | tojson(indent=4) }}
|
| 40 |
+
{{- '<|end_of_text|>
|
| 41 |
+
' }}
|
| 42 |
+
{%- endif %}
|
| 43 |
+
{%- if documents %}
|
| 44 |
+
{%- for document in documents %}
|
| 45 |
+
{{- '<|start_of_role|>document {"document_id": "' + document['doc_id'] | string + '"}<|end_of_role|>
|
| 46 |
+
' }}
|
| 47 |
+
{{- document['text'] }}
|
| 48 |
+
{{- '<|end_of_text|>
|
| 49 |
+
' }}
|
| 50 |
+
{%- endfor %}
|
| 51 |
+
{%- endif %}
|
| 52 |
+
{%- for message in loop_messages %}
|
| 53 |
+
{{- '<|start_of_role|>' + message['role'] + '<|end_of_role|>' + message['content'] + '<|end_of_text|>
|
| 54 |
+
' }}
|
| 55 |
+
{%- if loop.last and add_generation_prompt %}
|
| 56 |
+
{{- '<|start_of_role|>assistant' }}
|
| 57 |
+
{%- if controls %}
|
| 58 |
+
{{- ' ' + controls | tojson()}}
|
| 59 |
+
{%- endif %}
|
| 60 |
+
{{- '<|end_of_role|>' }}
|
| 61 |
+
{%- endif %}
|
| 62 |
+
{%- endfor %}
|
tokenizer.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
tokenizer_config.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"add_prefix_space": false,
|
| 3 |
+
"backend": "tokenizers",
|
| 4 |
+
"bos_token": "<|end_of_text|>",
|
| 5 |
+
"clean_up_tokenization_spaces": true,
|
| 6 |
+
"eos_token": "<|end_of_text|>",
|
| 7 |
+
"errors": "replace",
|
| 8 |
+
"is_local": true,
|
| 9 |
+
"local_files_only": true,
|
| 10 |
+
"model_max_length": 9223372036854775807,
|
| 11 |
+
"pad_token": "<|end_of_text|>",
|
| 12 |
+
"padding_side": "left",
|
| 13 |
+
"tokenizer_class": "TokenizersBackend",
|
| 14 |
+
"unk_token": "<|end_of_text|>",
|
| 15 |
+
"vocab_size": 49152
|
| 16 |
+
}
|
training_args.bin
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:db5b0c5ba9557209cefbe9d7d417f2bb724d1e759acee9fc715096ce18923e7b
|
| 3 |
+
size 5265
|