Multiple Choice
Safetensors
English
modernbert
decision-index
typed-decisions
ettin
cross-encoder

Mola 150M

Mola 150M answers typed decisions: given a state (text or JSON) and one or more questions, each a choice among named options or a yes/no statement, it returns a probability for every option. It is a 149M-parameter ModernBERT encoder that reads all the questions about a state in one forward pass.

Parameters 149,311,489
Initial weights cross-encoder/ettin-reranker-150m-v1
Context 8,192 tokens, nothing truncated (past the encoder config's 7,999 positions; rotary embeddings)
Licence CC BY-NC 4.0, non-commercial use (LICENSE)

Results: Decision Index 0.3, public suite

Public index Raw index Breadth (skill)
31.34 48.83 27.66
Area Weight Benchmarks Skill Coverage
Knowledge & Reasoning 25.8% 11 11.97 99.98%
Language Understanding 25.8% 9 30.22 99.91%
Retrieval & Classification 20.0% 6 51.43 100.00%
Tools & Automation 18.3% 5 50.09 99.86%
Arts & Human Taste 10.0% 6 9.86 99.99%
  • Complete run of the kit (commit 9eb2dbe, edition 0.3): 140,178 scored requests, 140,170 answered, 8 unsupported (their state does not fit 8,192 tokens; they count as wrong). Results, scores and environment: codavidgarcia/mola-decision-index-results.
  • Latency per request on NVIDIA GeForce RTX 4090 (torch 2.11.0+cu126, CUDA 12.6), device-synchronized, model loading excluded: median 7.3 ms, p95 28.5 ms, mean 11.9 ms.
  • The public index is 20% of the board's Full score; the other 80% comes from private tests run by the maintainers.
  • Train splits of several of the suite's benchmarks are in the training data, so those scores are in-distribution results.

Use

from mola import Mola

model = Mola("codavidgarcia/mola-150m")    # or a local folder holding these files
model.answer(
    state={"ticket": "My card was charged twice for the same order."},
    questions={
        "intent": {"type": "choice", "instructions": "What does the customer want?",
                   "criteria": {"refund": "Money back for the duplicate charge", "cancel": "Cancel the order",
                                "info": "Just asking for information"}},
        "urgent": {"type": "noul", "instructions": "The customer needs a fast response."},
    })
# {"intent": {"type": "choice", "choice": ..., "probabilities": {...}}, "urgent": {"type": "noul", "noul": ...}}

mola.py needs torch, transformers (5.17.0, pinned in requirements.txt) and safetensors. The weights are stored with encoder. and head. prefixes, so transformers' AutoModel does not load them; use mola.py.

With the Decision Index kit (commit 9eb2dbe) on PYTHONPATH and a suite built with it, from this folder:

python -m decision_index pipeline --engine decision_index_engine:MolaEngine --option device=cuda --edition 0.3 --suite-dir <suite-0.3> --compact --out runs/mola-150m

Add --no-verify if your build fails the kit's frozen-file check (see the results dataset card).

How it reads a request

<state as sorted JSON>
(Q1) (choice) <instructions>
[MASK] <option 1>
[MASK] <option 2>
(Q2) (noul) <instructions>
[MASK] no
[MASK] yes

A choice option is the description given in criteria (the key when the description is null). A small head (LayerNorm, Linear, GELU, Linear) turns the hidden state at each [MASK] into one logit, and a softmax runs over each question's own options; a noul answer is the probability of yes. When the questions do not fit together in 8,192 tokens, each question gets its own sequence over the same state; when the state does not fit together with one of its questions on its own, the whole request is refused (TooLong, Unsupported in the kit). On CUDA the encoder runs in bfloat16 autocast.

Training

Full fine-tuning in stages on public datasets converted to typed decisions (among them the tasksource and Bekko collections, the train splits of several Decision Index benchmarks and other public datasets of the same task forms), with a cross-entropy loss between the softmax over each question's options and the row's target distribution. Sources, licences and attributions: DATA.md.

Limitations

  • Mostly English. The public suite also scores Arabic (iSarcasmEval) and Japanese and Spanish (Amazon ESCI) requests; no language was evaluated on its own.
  • Knowledge-heavy and multi-step reasoning benchmarks (GSM8K, GPQA, HLE, BBH) stay close to chance: a 150M encoder holds little world knowledge and does no step-by-step computation.
  • The head was trained toward each row's target distribution; its probabilities are not calibrated on new domains, so check them on your data before setting a threshold.
  • Requests whose state does not fit 8,192 tokens together with one of their questions are refused, never cut.

Licence

CC BY-NC 4.0 for the weights and code: non-commercial use, with attribution. The licence grants no trademark rights to the name "Mola" (section 2(b)(2)); please do not publish a modified model as Mola. The encoder derives from cross-encoder/ettin-reranker-150m-v1 (Apache-2.0), itself trained from the Ettin encoders (MIT); both notices are in LICENSE. Training-data licences and attributions: DATA.md.

Downloads last month
22
Safetensors
Model size
0.1B params
Tensor type
F32
·
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for codavidgarcia/mola-150m

Finetuned
(8)
this model

Datasets used to train codavidgarcia/mola-150m