llm_decision_cispo: reason, then decide
The second stage of a reasoning decision model (Jeeves). It starts from a stage-1 checkpoint (model.init), samples
method.group_size reasoning chains per question, rewards each by the probability the head then gives the right
option, and reinforces the chains that beat their group's mean (CISPO: the importance weight of each reasoning token
is capped). The head's loss after reasoning and without reasoning is added, so the one-pass answer keeps working.
Use it when reasoning measurably helps on your questions: compare accuracy with think_accuracy in stage 1's
validation, or run evaluation_decision with think: both.
Rows
The same Jev records as stage 1.
Config
# Reasoning decision model, stage 2 (Jeeves CISPO): the model reasons, then decides. Reasoning that leads the head
# to the right option more surely than the other chains sampled for the same question is reinforced.
# Run configs/llm/decision_pointer.yaml first: `model.init` points at the checkpoint it writes. That path contains
# the stage-1 experiment key, which `llmclick validate configs/llm/decision_pointer.yaml` prints.
pipeline:
recipe: llm_decision_cispo
name: decision-cispo-qwen3.5-0.8b
seed: 20260920
output_dir: ./output
model:
architecture: hybrid
name: Qwen/Qwen3.5-0.8B
revision: 2fc06364715b967f1860aea9cf38778875588b17
head: pointer
init: output/decision-pointer-qwen3.5-0.8b-e442dea1/validate/checkpoint # exists only if stage 1 passed validation
data:
sources:
- name: local_jsonl
path: samples/llm_decision.jsonl
limit: 48
validation: 0.15
method:
group_size: 4 # reasoning chains sampled per question
max_think: 64
temperature: 1.0
rollout_weight: 0.5 # head loss after reasoning
anchor_weight: 0.5 # head loss without reasoning, so the one-pass answer keeps working
length_hinge: 48 # chains longer than this lose up to length_penalty_cap of their reward
calibration: 0.15
training:
epochs: 1
lr: 2.0e-5
batch_size: 3 # questions per step; each gets group_size chains
max_length: 768
max_steps: 4
adapter: {name: lora, r: 16, alpha: 32}
validation:
min: {accuracy: 0.3} # think_accuracy (after reasoning) is reported next to accuracy
Use
uv run llmclick run configs/llm/decision_pointer.yaml # stage 1; prints the experiment key
uv run llmclick run configs/llm/decision_cispo.yaml # model.init points at stage 1's validate/checkpoint
- Gate:
accuracy(one pass) withthink_accuracy(after reasoning) next to it, both calibrated. - Cost: each step forwards
batch_sizexgroup_sizesequences;method.max_thinkcaps a chain, andlength_hingemakes long chains lose reward. - Settings:
method.iterationsandmethod.clipreuse a sampled group for several steps (seellm_grpo).
Source: configs/llm/decision_cispo.yaml. This page is generated; edit the source and run npm run sync.