Views
No views yet
{"action":"index::<k>"} を返すことを目的に最適化されています。index::<k> は、あなたのエージェントが提示する候補リストの 0-based インデックス)Qwen/Qwen3-1.7BCANDIDATES(内部で index にマッピング){ "action": "index::<k>" }index に変換したもの)を提示し、1 手を選択させる。action を読み取り、あなたの index_map[k] に解決して実行してください。1from transformers import AutoTokenizer, AutoModelForCausalLM
2from peft import PeftModel
3
4BASE = "Qwen/Qwen3-1.7B"
5ADAPTER = "hellohazime/qwen3-1p7b-pokellm-lora_50k_ep0p05"
6
7tok = AutoTokenizer.from_pretrained(BASE, trust_remote_code=True)
8if tok.pad_token_id is None and tok.eos_token_id is not None:
9 tok.pad_token = tok.eos_token
10
11base = AutoModelForCausalLM.from_pretrained(BASE, trust_remote_code=True, device_map="auto")
12model = PeftModel.from_pretrained(base, ADAPTER)
13
14# --- 推論の例(厳密JSONを狙うプロンプト) ---
15obs = "turn | 3\nyour_active | Gholdengo\nopp_active | Great Tusk\nmoves | Make It Rain, Shadow Ball, Trick, Focus Blast"
16# 例: allowed は内部で index に並べ替えた候補(move群→switch群)に対応
17allowed = ["index::0","index::1","index::2","index::3"] # 例
18prompt = (
19 "You are a Gen9 OU single-battle agent.\n"
20 "Return exactly one JSON object on a single line.\n"
21 'Schema: {"action": "index::<k>"} No markdown, no extra text.\n'
22 f"ALLOWED: {' | '.join(allowed)}\n\n"
23 f"{obs}\n\n"
24 "Action:"
25)
26
27inputs = tok(prompt, return_tensors="pt").to(model.device)
28out_ids = model.generate(
29 **inputs,
30 max_new_tokens=48,
31 do_sample=False, # 温度0相当
32 eos_token_id=tok.eos_token_id,
33 pad_token_id=tok.eos_token_id
34)
35print(tok.decode(out_ids[0], skip_special_tokens=True))Note: MLX ランタイムで LoRA を直接ロードするには別途変換が必要です(標準の PEFT/Torch では上記のように動作します)。
jakegrigsby/metamon-parsed-replays(Showdown リプレイの構造化アーカイブ)system: 「厳密 JSON で 1 手のみ返す」等の指示user: { "state": {...}, "CANDIDATES": ["index::0", ...] }assistant: { "action": "index::<k>" }index::<k> に対応付け。r=8, alpha=16, dropout=0.05, bias="none"
target_modules: q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_projtransformers.TrainingArguments(optim="adamw_torch"))per_device_train_batch_size=8, gradient_accumulation_steps=1)eval_ratio ≈ 5%, eval_steps=500 前後
EarlyStoppingCallback(patience=3, metric=eval_loss)実行スクリプトは TRLSFTTrainerを用いた標準的な SFT(packing 無効、formatting_funcで chat template を適用)構成です。
poke-env 経由gen9ou(同一チーム同士で LLM vs Random の簡易ベースライン){"action": "index::<k>"})| Model | Adapter | Win% | Fallback% | Avg Lat(ms) |
|---|---|---|---|---|
| Qwen/Qwen3-1.7B | — | 50.0 | 31.74 | 450.3 |
uv run python eval_vs_ou.py \
--n_battles 10 \
--backend hf \
--model Qwen/Qwen3-1.7B \
--adapter outputs/qwen3-1p7b_lora_50k_ev0p05 \
--format gen9ou \
--schema index \
--team1 teams/ou_team.txt \
--team2 teams/ou_team.txt| Model | Win% | Fallback% | Avg Lat(ms) | p95(ms) | Decis. | Battles |
|---|---|---|---|---|---|---|
| Qwen/Qwen3-1.7B + outputs/qwen3-1p7b_lora_50k_ev0p05 | 70.00 | 0.00 | 1646.1 | 1731.6 | 363 | 10 |
RandomPlayer。本 LoRA の “index スキーマ厳守” と最小限観測だけで、安定した JSON 出力を確認。training_args.bin を参照)