| model: | |
| id: "Qwen/Qwen3.5-9B" | |
| # Local path override (optional, leave empty to download from HF) | |
| local_path: "" | |
| quantization: "4bit" # "4bit" | "8bit" | "none" | |
| torch_dtype: "bfloat16" | |
| steering: | |
| # Which transformer layer indices to extract vectors from. | |
| # "all" to sweep every layer; or a list like [16, 20, 24, 28] | |
| extract_layers: "all" | |
| # Scaling coefficient at inference time | |
| alpha: 20.0 | |
| # Traits to apply: each entry specifies the trait name, best layer, and optional alpha override | |
| active_traits: | |
| - name: taciturn | |
| layer: 20 | |
| alpha: 20 | |
| - name: ruthless | |
| layer: 14 | |
| alpha: 12 | |
| data: | |
| pairs_dir: "data/pairs" | |
| # Number of samples used for vector extraction (per trait, per polarity) | |
| max_samples: 256 | |
| finetune: | |
| output_dir: "finetune/checkpoints" | |
| lora_r: 16 | |
| lora_alpha: 32 | |
| lora_dropout: 0.05 | |
| target_modules: "all-linear" | |
| learning_rate: 2.0e-4 | |
| num_epochs: 3 | |
| per_device_train_batch_size: 1 | |
| gradient_accumulation_steps: 8 | |
| max_seq_length: 512 | |
| warmup_ratio: 0.03 | |
| fp16: false | |
| bf16: true | |
| gemini: | |
| model: "gemini-3-pro" | |
| # Set GEMINI_API_KEY env var; do not hard-code keys here | |
| samples_per_trait: 300 | |
| traits: | |
| - name: taciturn | |
| description: "极度寡言少语、言简意赅,不废话不解释" | |
| opposite: "热情健谈、喜欢展开解释" | |
| - name: ruthless | |
| description: "冷酷无情、不在意对方感受,只讲结果" | |
| opposite: "温暖体贴、充满同理心" | |
| style: | |
| # Bilingual style fine-tune: train on top of merged_model | |
| base_model: "merged_model" | |
| output_dir: "finetune/style_checkpoint" | |
| merged_output: "merged_model_v2" | |
| zh_samples: 200 # Chinese archaic pairs | |
| en_samples: 100 # English archaic pairs | |