navio-flow v1.0 β€” Maritime Email Classifier

LoRA adapter fine-tuned from Qwen/Qwen3-4B-Instruct-2507 for 4-class multi-label maritime chartering email classification.

Categories

  • vessel β€” Owner offers ship position (Open Tonnage)
  • cargo β€” Charterer seeks ship for cargo (Cargo Inquiry)
  • tct β€” Time Charter Trip (single voyage with daily hire rate)
  • other β€” S&P, market reports, ops, admin

Multi-label predictions allowed (e.g. ["cargo", "tct"]).

Test Set Performance (n=301)

Metric Value
Macro F1 0.7639
Set accuracy 0.7608

Per-class

Class Precision Recall F1
vessel 0.887 0.683 0.772
cargo 0.984 0.775 0.867
tct 0.714 0.625 0.667
other 0.621 0.947 0.750

Training Details

  • Framework: Unsloth 2026.4.8
  • Base model: Qwen/Qwen3-4B-Instruct-2507
  • Trainable params: 66,060,288 / 4,088,528,384 (1.62%)
  • Iters: 475
  • Wall-clock training time: 90.8 min
  • Final train loss: 0.7736
  • Hardware: NVIDIA A100-SXM4-40GB
  • Snapshot hash: b817d2b49800abae

Hyperparameters

  • LoRA rank: 32, alpha: 64, dropout: 0.05
  • Target modules: q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
  • Learning rate: 1e-4 (cosine schedule, 10% warmup)
  • Effective batch size: 32 (per_device 2 Γ— grad_accum 16)
  • Epochs: 5
  • Max sequence length: 2048
  • 4-bit QLoRA via bitsandbytes

Usage

from unsloth import FastLanguageModel

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="ihlee1/navio-flow-v1.0",
    max_seq_length=2048,
    load_in_4bit=True,
)
FastLanguageModel.for_inference(model)

# Use the system prompt from the snapshot
system_prompt = open("_system_prompt.txt").read()  # 580-token dense ruleset

messages = [
    {"role": "system", "content": system_prompt},
    {"role": "user", "content": "Subject: ...\n\nDELY Busan, REDELY Spore..."},
]
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
out = model.generate(**inputs, max_new_tokens=40)
print(tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
# Expected output: {"labels": ["vessel"]}

Limitations

  • Macro-F1 0.764 β€” below the V1.0 target of 0.93. Issues:
    • tct minority class (test n=19) β€” F1 0.67
    • Long emails truncated at max_seq_len=2048 (some originals 3000-3800 tokens)
    • Multi-label cases sparse in test set (n=5)
  • Trained on emails from one specific brokerage (~3000 examples). Generalization to other brokerages untested.

License

Apache 2.0 (inherits from Qwen3-4B-Instruct-2507).

Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for ihlee1/navio-flow-v1.0

Adapter
(5640)
this model