persim-gemma-12b

An open-weight generator for the PerSim pipeline from "When to Personalize Household Object Search: A Rigidity-Gated Hybrid Policy" (arXiv:2607.00022, accepted to IROS 2026 · code).

Given a Big-Five personality vector and a household object, the model predicts where a person with those traits keeps the object and what items are typically nearby, as strict JSON:

{"rooms": ["Kitchen", "Living Room"],
 "cooccurrence": ["plate", "coaster", "bottle_of_water"],
 "rigidity": 4}

About the rigidity field. The SFT supervision includes each survey participant's placement-rigidity rating (1–5), so the model learned to emit one. The PerSim pipeline does not consume this generated value: the paper's rigidity gate uses ρ(o) aggregated from the human survey, not model output. Treat the generated rigidity as an auxiliary field and ignore it unless you have a specific use for it.

In the paper, this generator role was played by a supervised-fine-tuned Gemini 2.5 Flash (Vertex AI). That tuned model exists only as a Google-hosted endpoint — Vertex AI does not allow exporting tuned weights, so it cannot be released. This model is a fine-tune of Gemma 4 12B IT on the same SFT supervision (xianyao/persim-sft: human-calibrated placement anchors from a N=200 study), released so the personality-conditioned placement stage of the PerSim pipeline can run on open weights.

Validated scope and recommended pipeline configuration

This model is validated for the placement-anchor task above and for the pipeline's layout stage (generate_layouts.py). For the open-ended stages — persona generation (generate_persona.py) and multi-day trajectory simulation (generate_trajectories.py) — use the base google/gemma-4-12B-it: in our smoke tests the base model completes those stages cleanly, while this fine-tune tends to fall back to its anchor JSON schema mid-diary (see Known gaps below). All pipeline scripts accept --model, so the two models can be mixed per stage:

python generate_persona.py      --model google/gemma-4-12B-it
python generate_layouts.py      --model xianyao/persim-gemma-12b
python generate_trajectories.py --model google/gemma-4-12B-it

Point the pipeline's .env (LLM_BASE_URL) at an OpenAI-compatible endpoint serving the respective model (e.g. one vLLM instance per model):

vllm serve xianyao/persim-gemma-12b          # exposes http://localhost:8000/v1

Note the paper's data was produced by a single fine-tuned proprietary model running every LLM stage; this two-model split is the recommended configuration for open weights, not a claim of equivalence with the paper's setup.

Usage (standalone anchor prediction)

Use the official chat template in default (non-thinking) mode — this is the training format:

from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "xianyao/persim-gemma-12b"
tok = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype="bfloat16", device_map="auto")

SYSTEM = ("You are a household behavior predictor. Given a person's Big Five personality traits "
          "(Openness, Conscientiousness, Extraversion, Agreeableness, Neuroticism, each on a 0-1 scale) "
          "and a household object, predict where this person typically places the object and what other "
          "items are usually nearby. Respond in JSON format with two fields: \"rooms\" (a ranked list of "
          "rooms, most likely first) and \"cooccurrence\" (a ranked list of nearby items, most likely first).")

messages = [
    {"role": "system", "content": SYSTEM},
    {"role": "user", "content": "Personality: O=0.8, C=0.9, E=0.5, A=0.6, N=0.3\nObject: mug"},
]
inputs = tok.apply_chat_template(messages, add_generation_prompt=True, enable_thinking=False,
                                 return_dict=True, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=128, do_sample=True, temperature=0.7, top_p=0.95)
print(tok.decode(out[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True))

Training

Base model google/gemma-4-12B-it (Apache 2.0)
Data xianyao/persim-sft placement anchors, converted to chat-SFT format; content used verbatim (no cleaning or rewriting)
Method LoRA (rank 8, alpha 16, all-linear targets; 33M trainable params), bf16, merged for release
Hyperparameters lr 1e-4 cosine, warmup ratio 0.03, 3 epochs, effective batch 16, cutoff 512
Compute 564 steps, 3h12m on NVIDIA DGX Spark (GB10); final loss ≈ 0.29

Evaluation

Format-compliance acceptance test on 60 (personality, object) combinations — personality vectors drawn with a fixed seed (20260709), so nearly all combinations are unseen during training — using the released merged weights and the official chat template:

Decoding Valid JSON rooms/cooccurrence/rigidity present, rigidity ∈ [1,5]
Greedy 60/60 (100%) 60/60 (100%)
Sampling (T=0.7, top-p 0.95) 60/60 (100%) 60/60 (100%)

Spot checks behave as expected (toothbrush → Bathroom with rigidity 5; mug → Kitchen with plate/coaster nearby; trait conditioning visibly changes room-distribution breadth), and outputs preserve the pipeline's snake_case item vocabulary (e.g. bottle_of_water).

In a pipeline smoke test (2 personas × 1 scene × 2 simulated days), the layout stage passed all check_layouts.py validations with this model (the base model occasionally emits invalid anchors at that stage).

Known gaps and directions

Relative to the paper's proprietary generator — a single fine-tuned Gemini 2.5 Flash running every LLM stage — this open release currently covers the placement/layout stage only. The gaps below are measured, and the directions listed are exploratory: no timeline is promised, and the as-is terms in Limitations apply throughout.

  • Trajectory stage. When asked for multi-day movement diaries, this model drifts back to its anchor JSON schema (wrapping the required event array in an object and inserting rooms/cooccurrence/rigidity fields), while base Gemma 4 12B IT completes the stage cleanly with substantially higher daily item coverage. Direction: mixing trajectory-format and general instruction data into the SFT recipe; acceptance is format validity plus action-level pass rate at parity with the base model.
  • Natural-language personality input. Training inputs are structured trait strings (O=0.8, C=0.9, ...); free-text persona descriptions are untested. Direction: multi-view SFT over paraphrased and natural-language variants of the same anchors.
  • Behavior-level rigidity validation. The model outputs a per-anchor rigidity score; whether simulated movement frequency downstream actually tracks that score has not been demonstrated end-to-end. Direction: movement-plausibility supervision derived from the paper's human-rated data.

Progress on these will ship as separate follow-up releases, not as in-place weight updates to this repository, so results referencing this model remain reproducible.

Limitations

  • Not validated for equivalence with the paper's generator. The paper's data and results were produced with a fine-tuned Gemini 2.5 Flash. This model is trained on the same SFT data but we have not re-run the paper's generation, validation, or downstream training with it. Distributional differences are expected. Provided as-is.
  • The supervision covers 15 everyday objects and household room vocabularies from the underlying study; behavior outside that scope (novel objects, non-residential scenes, non-English prompts) is untested.
  • Trait vectors are Big-Five scores in [0,1]; inputs outside this convention may degrade output quality.

Citation

@article{li2026personalize,
  title   = {When to Personalize Household Object Search: A Rigidity-Gated Hybrid Policy},
  author  = {Li, Xianyao and Wang, Yuhai and Xiao, Hu and Smith, Kaleb and Ye, Gilbert Yang and Du, Eric Jing},
  journal = {arXiv preprint arXiv:2607.00022},
  year    = {2026}
}

Derived from Gemma. Gemma is provided by Google; use is subject to the base model's license and terms.

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

Model tree for xianyao/persim-gemma-12b

Adapter
(23)
this model

Dataset used to train xianyao/persim-gemma-12b

Paper for xianyao/persim-gemma-12b