A complete pipeline for detecting hallucinations in Arabic LLM outputs using fine-tuned BERT models. This starter kit supports both subtasks of Track 1 (1.1 and 1.2), enabling you to build and evaluate hallucination detection systems with ease.
All submissions must adhere to the following requirements:
Base Model: Must be a fine-tuned generative language model
Training Data: Participants are allowed to use external data for fine-tuning their models
Evaluation Constraints: During evaluation, the following are NOT allowed:
⚠️ Rationale: The task evaluates the model itself, not its ability to retrieve information.
We provide a submission notebook template (SUBMISSION_TEMPLATE.ipynb) that handles all evaluation. To submit:
TASK variable to specify your submission task ("1.1" or "1.2")MODEL_PATH to point to your model directory.zip file) containing:
SUBMISSION_TEMPLATE.ipynb notebooktask1.1_data/ and task1.2_data/ directories.zip file via the official submission linkWhen you submit, we will:
Important:
[DO NOT MODIFY] in the notebook — they define the official evaluation protocolThe HalluScoring challenge focuses on detecting factual hallucinations in model-generated answers to Arabic questions. This kit provides:
.xlsx/.csv files directly, auto-detecting the format and mapping columnsTask 1.1: Train and evaluate on the Subtask 1.1 set
task1.1_data/task1.1_train.xlsx, task1.1_data/task1.1_dev.xlsxTask 1.2: Train and evaluate on the Subtask 1.2 set
task1.2_data/task1.2_train.xlsx, task1.2_data/task1.2_dev.xlsx├── README.md # This file
├── train.py # Train BERT models for hallucination detection
├── predict.py # Run inference and generate predictions
├── task1.1_data/ # Subtask 1.1 train/dev files
│ ├── task1.1_train.xlsx
│ └── task1.1_dev.xlsx
├── task1.2_data/ # Subtask 1.2 train/dev files
│ ├── task1.2_train.xlsx
│ └── task1.2_dev.xlsx
└── outputs/ # Generated during training / inference
├── task1.1/
│ ├── camelbert/best_model/
│ ├── arbert/best_model/
│ ├── marbert/best_model/
│ ├── mbert/best_model/
│ ├── predictions_<model>.csv # written by predict.py
│ └── all_dev_results.json
└── task1.2/
└── ... (same layout)
No conversion step is required. Files are read directly and the loader picks the
reader from the file's actual content (magic bytes), so a mislabeled .csv/.xlsx
still loads correctly.
The starter-kit .xlsx headers are mapped automatically to canonical names:
| Starter-kit header | Canonical name |
|---|---|
ID | id |
Question | question |
Gold Answer | gold_answer |
Generator_model | model_name |
Generated_answer | model_answer |
Label | label |
A pre-mapped .csv with canonical columns (question, model_answer,
[label], [model_name]) also works directly.
cd HalluScoring2026-Track1-StarterKit
pip install torch transformers pandas openpyxl scikit-learn scipy
By default, paths are resolved automatically from --data_dir (default: current
directory) using the task<X>_data/ layout, so the simplest invocation is:
python train.py --task 1.1
python train.py --task 1.2
python train.py --task 1.1 1.2
For a single task, use the generic flags:
python train.py --task 1.1 \
--train_path task1.1_data/task1.1_train.xlsx \
--dev_path task1.1_data/task1.1_dev.xlsx
For both tasks at once, use the task-specific flags:
python train.py --task 1.1 1.2 \
--train_path_task1_1 task1.1_data/task1.1_train.xlsx \
--dev_path_task1_1 task1.1_data/task1.1_dev.xlsx \
--train_path_task1_2 task1.2_data/task1.2_train.xlsx \
--dev_path_task1_2 task1.2_data/task1.2_dev.xlsx
By default, all 4 models are trained. To train only specific models:
python train.py --task 1.1 --models camelbert marbert
Available models: camelbert, arbert, marbert, mbert (or all)
| Key | Model |
|---|---|
camelbert | CAMeL-Lab/bert-base-arabic-camelbert-mix |
arbert | UBC-NLP/ARBERT |
marbert | UBC-NLP/MARBERTv2 |
mbert | google-bert/bert-base-multilingual-cased |
| Flag | Default |
|---|---|
--max_length | 512 |
--batch_size | 16 |
--num_epochs | 5 |
--learning_rate | 2e-5 |
--warmup_ratio | 0.1 |
--weight_decay | 0.01 |
--seed | 42 |
--output_dir | ./outputs |
For each task and model, the script will:
outputs/task<X>/<model>/best_model/outputs/all_dev_results.jsonpredict.py runs the best saved models on a test/dev file and writes per-model
predictions. It detects labels automatically (or force with --has_labels).
python predict.py --task 1.1 --test_path test.xlsx
python predict.py --task 1.2 --test_path test.xlsx
If your file contains a Label/label column, metrics are computed
automatically. You can also force it:
python predict.py --task 1.2 \
--test_path task1.2_data/task1.2_dev.xlsx --has_labels
This computes and prints:
python predict.py --task 1.1 --test_path test.xlsx --models camelbert arbert
For each model, predictions are saved to
outputs/task<X>/predictions_<model>.csv. Each row is the original input plus:
prob_hallucinated — predicted probability of hallucinationpredicted_label — 0/1 (threshold 0.5)When labels are present, a summary table is printed and metrics are written to
outputs/task<X>/test_results.json.
# 1. Train all models for both tasks (uses default task1.1_data/ & task1.2_data/)
python train.py --task 1.1 1.2
# 2. Generate predictions for Task 1.1
python predict.py --task 1.1 --test_path test_task1.1.xlsx
# 3. Generate predictions for Task 1.2
python predict.py --task 1.2 --test_path test_task1.2.xlsx
Released soon...
Join the discord: HalluScoring 2026 Challenge Discord for questions, discussions, and updates.
This starter kit is provided for the HalluScoring 2026 challenge.
A complete pipeline for detecting hallucinations in Arabic LLM outputs using fine-tuned BERT models. This starter kit supports both subtasks of Track 1 (1.1 and 1.2), enabling you to build and evaluate hallucination detection systems with ease.
All submissions must adhere to the following requirements:
Base Model: Must be a fine-tuned generative language model
Training Data: Participants are allowed to use external data for fine-tuning their models
Evaluation Constraints: During evaluation, the following are NOT allowed:
⚠️ Rationale: The task evaluates the model itself, not its ability to retrieve information.
We provide a submission notebook template (SUBMISSION_TEMPLATE.ipynb) that handles all evaluation. To submit:
TASK variable to specify your submission task ("1.1" or "1.2")MODEL_PATH to point to your model directory.zip file) containing:
SUBMISSION_TEMPLATE.ipynb notebooktask1.1_data/ and task1.2_data/ directories.zip file via the official submission linkWhen you submit, we will:
Important:
[DO NOT MODIFY] in the notebook — they define the official evaluation protocolThe HalluScoring challenge focuses on detecting factual hallucinations in model-generated answers to Arabic questions. This kit provides:
.xlsx/.csv files directly, auto-detecting the format and mapping columnsTask 1.1: Train and evaluate on the Subtask 1.1 set
task1.1_data/task1.1_train.xlsx, task1.1_data/task1.1_dev.xlsxTask 1.2: Train and evaluate on the Subtask 1.2 set
task1.2_data/task1.2_train.xlsx, task1.2_data/task1.2_dev.xlsx├── README.md # This file
├── train.py # Train BERT models for hallucination detection
├── predict.py # Run inference and generate predictions
├── task1.1_data/ # Subtask 1.1 train/dev files
│ ├── task1.1_train.xlsx
│ └── task1.1_dev.xlsx
├── task1.2_data/ # Subtask 1.2 train/dev files
│ ├── task1.2_train.xlsx
│ └── task1.2_dev.xlsx
└── outputs/ # Generated during training / inference
├── task1.1/
│ ├── camelbert/best_model/
│ ├── arbert/best_model/
│ ├── marbert/best_model/
│ ├── mbert/best_model/
│ ├── predictions_<model>.csv # written by predict.py
│ └── all_dev_results.json
└── task1.2/
└── ... (same layout)
No conversion step is required. Files are read directly and the loader picks the
reader from the file's actual content (magic bytes), so a mislabeled .csv/.xlsx
still loads correctly.
The starter-kit .xlsx headers are mapped automatically to canonical names:
| Starter-kit header | Canonical name |
|---|---|
ID | id |
Question | question |
Gold Answer | gold_answer |
Generator_model | model_name |
Generated_answer | model_answer |
Label | label |
A pre-mapped .csv with canonical columns (question, model_answer,
[label], [model_name]) also works directly.
cd HalluScoring2026-Track1-StarterKit
pip install torch transformers pandas openpyxl scikit-learn scipy
By default, paths are resolved automatically from --data_dir (default: current
directory) using the task<X>_data/ layout, so the simplest invocation is:
python train.py --task 1.1
python train.py --task 1.2
python train.py --task 1.1 1.2
For a single task, use the generic flags:
python train.py --task 1.1 \
--train_path task1.1_data/task1.1_train.xlsx \
--dev_path task1.1_data/task1.1_dev.xlsx
For both tasks at once, use the task-specific flags:
python train.py --task 1.1 1.2 \
--train_path_task1_1 task1.1_data/task1.1_train.xlsx \
--dev_path_task1_1 task1.1_data/task1.1_dev.xlsx \
--train_path_task1_2 task1.2_data/task1.2_train.xlsx \
--dev_path_task1_2 task1.2_data/task1.2_dev.xlsx
By default, all 4 models are trained. To train only specific models:
python train.py --task 1.1 --models camelbert marbert
Available models: camelbert, arbert, marbert, mbert (or all)
| Key | Model |
|---|---|
camelbert | CAMeL-Lab/bert-base-arabic-camelbert-mix |
arbert | UBC-NLP/ARBERT |
marbert | UBC-NLP/MARBERTv2 |
mbert | google-bert/bert-base-multilingual-cased |
| Flag | Default |
|---|---|
--max_length | 512 |
--batch_size | 16 |
--num_epochs | 5 |
--learning_rate | 2e-5 |
--warmup_ratio | 0.1 |
--weight_decay | 0.01 |
--seed | 42 |
--output_dir | ./outputs |
For each task and model, the script will:
outputs/task<X>/<model>/best_model/outputs/all_dev_results.jsonpredict.py runs the best saved models on a test/dev file and writes per-model
predictions. It detects labels automatically (or force with --has_labels).
python predict.py --task 1.1 --test_path test.xlsx
python predict.py --task 1.2 --test_path test.xlsx
If your file contains a Label/label column, metrics are computed
automatically. You can also force it:
python predict.py --task 1.2 \
--test_path task1.2_data/task1.2_dev.xlsx --has_labels
This computes and prints:
python predict.py --task 1.1 --test_path test.xlsx --models camelbert arbert
For each model, predictions are saved to
outputs/task<X>/predictions_<model>.csv. Each row is the original input plus:
prob_hallucinated — predicted probability of hallucinationpredicted_label — 0/1 (threshold 0.5)When labels are present, a summary table is printed and metrics are written to
outputs/task<X>/test_results.json.
# 1. Train all models for both tasks (uses default task1.1_data/ & task1.2_data/)
python train.py --task 1.1 1.2
# 2. Generate predictions for Task 1.1
python predict.py --task 1.1 --test_path test_task1.1.xlsx
# 3. Generate predictions for Task 1.2
python predict.py --task 1.2 --test_path test_task1.2.xlsx
Released soon...
Join the discord: HalluScoring 2026 Challenge Discord for questions, discussions, and updates.
This starter kit is provided for the HalluScoring 2026 challenge.