vheart-affect-v9

A LoRA adapter that turns Qwen3-4B into a fine-tuned affect source for the feltstate felt-state library.

This is the larger / finer reference. For a smaller / faster variant on the v8 24-label vocab, see kaishuiji/vheart-affect-v8.

What it does

Same shape as v8 โ€” reads a dialogue turn, emits an AffectDelta JSON. What changed:

  • Base bumped to Qwen3-4B โ€” broader Chinese coverage, sharper context handling.
  • Label vocab expanded to 50. v8's 24 labels collapsed bittersweet and wistful; v9 separates them. New labels span four regions:
    • Fine-grained high arousal (excited โ†’ thrilled / euphoric / exhilarated)
    • Fine-grained negative (angry / scared / panicked / indignant differentiated from frustrated)
    • Anticipation-class (dreading / longing / anticipating / nostalgic)
    • Social affect (embarrassed / proud / envious / grateful / ashamed)
  • Anticipation as a first-class field. v8 hinted at it; v9 outputs anticipation: {valence, arousal, weight} so the consumer can model forward-looking mood, not just present.

Why v9 over v8

use case adapter
Tight inter-rater on 24 labels, consumer GPU, fast v8
Finer mixed-feeling resolution, anticipation modeling, 4B GPU available v9

Training data โ€” not released

~800 SFT samples, hand-curated Chinese-first dialogue snippets. Data not released to protect contributor privacy. The schema and label vocabulary are documented; reproduction requires your own corpus.

Label vocab โ€” 50 labels (v9)

24 v8 labels retained (backward-compatible) plus 26 new. Anchor table follows the same (valence, arousal) format as v8 โ€” see label_anchors_v9.json in this repo for the full table.

Usage

from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer

base = "Qwen/Qwen3-4B"
tok = AutoTokenizer.from_pretrained(base)
mdl = AutoModelForCausalLM.from_pretrained(
    base, device_map="auto", torch_dtype="auto",
)
mdl = PeftModel.from_pretrained(mdl, "kaishuiji/vheart-affect-v9")
mdl.eval()

With feltstate

from feltstate import Engine
from feltstate.sources import VheartSource

eng = Engine(source=VheartSource("kaishuiji/vheart-affect-v9"))
eng.observe("ไปŠๆ™š่ท‘้€šไบ†ไธ‰ๅ‘จ็š„ๅฎž้ชŒใ€‚")
print(eng.state.mood.mixed_blend)

Limitations

  • GPU required. 4B + LoRA is ~6GB VRAM in fp16. v8 if you don't have one.
  • Chinese-first. Same caveat as v8.
  • Single-character measurement. Same caveat as v8.
  • Schema bound to feltstate. Same caveat as v8.
  • v9 vs v8 isn't a clean win on every metric. Internal stress test (mve_v02 baseline) had v8 slightly ahead on simple emotion_score; v9 wins on mixed-feeling and anticipation tasks. Pick what you measure for.

Citation

@software{feltstate_vheart_v9,
  author = {morephine},
  title = {feltstate / vheart-affect-v9},
  url = {https://huggingface.co/kaishuiji/vheart-affect-v9},
  year = {2026}
}

License

Apache 2.0 (matches Qwen3 base).

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

Model tree for kaishuiji/vheart-affect-v9

Finetuned
Qwen/Qwen3-4B
Adapter
(1065)
this model