File size: 1,739 Bytes
038aa4b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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