Spaces:
Running
Running
File size: 9,595 Bytes
e8989ed e160620 e8989ed e160620 e8989ed ee5007b | 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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Minecraft Agent — Qwen3.5-9B</title>
<style>
:root {
--bg: #0d1117; --card: #161b22; --border: #30363d;
--text: #e6edf3; --muted: #8b949e; --green: #3fb950; --blue: #58a6ff; --gold: #d29922;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body { background: var(--bg); color: var(--text); font-family: -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; line-height: 1.6; }
.container { max-width: 1080px; margin: 0 auto; padding: 0 24px 80px; }
header { text-align: center; padding: 64px 0 40px; }
header .emoji { font-size: 56px; }
h1 { font-size: 36px; margin: 12px 0 8px; }
header p { color: var(--muted); font-size: 17px; max-width: 640px; margin: 0 auto; }
.badges { margin-top: 18px; }
.badge { display: inline-block; padding: 4px 12px; border-radius: 999px; font-size: 13px; margin: 3px; border: 1px solid var(--border); color: var(--muted); }
.badge.green { color: var(--green); border-color: var(--green); }
.badge.blue { color: var(--blue); border-color: var(--blue); }
h2 { font-size: 24px; margin: 56px 0 20px; padding-bottom: 10px; border-bottom: 1px solid var(--border); }
h2 .num { color: var(--blue); margin-right: 10px; font-family: ui-monospace, monospace; }
table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 15px; }
th, td { padding: 10px 14px; text-align: left; border: 1px solid var(--border); }
th { background: var(--card); color: var(--muted); font-weight: 600; }
tr:nth-child(even) td { background: rgba(255,255,255,0.02); }
.hl { color: var(--green); font-weight: 700; }
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px; margin: 18px 0; }
.card { background: var(--card); border: 1px solid var(--border); border-radius: 10px; padding: 18px; }
.card .k { color: var(--muted); font-size: 13px; text-transform: uppercase; letter-spacing: .05em; }
.card .v { font-size: 21px; font-weight: 700; margin-top: 4px; }
.card .s { color: var(--muted); font-size: 13px; margin-top: 4px; }
.traj { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 16px; margin: 20px 0; }
.step { background: var(--card); border: 1px solid var(--border); border-radius: 10px; overflow: hidden; }
.step img { width: 100%; display: block; aspect-ratio: 16/9; object-fit: cover; }
.step .meta { padding: 12px 14px; }
.step .t { color: var(--muted); font-size: 12px; }
.step .a { font-family: ui-monospace, "SF Mono", monospace; font-size: 13px; color: var(--gold); margin-top: 4px; word-break: break-all; }
pre { background: var(--card); border: 1px solid var(--border); border-radius: 10px; padding: 16px 18px; overflow-x: auto; font-size: 13.5px; line-height: 1.7; }
code { font-family: ui-monospace, "SF Mono", monospace; }
p code, li code { background: rgba(255,255,255,0.07); padding: 2px 6px; border-radius: 5px; font-size: 13px; color: var(--gold); }
.note { background: rgba(88,166,255,0.08); border: 1px solid rgba(88,166,255,0.3); border-radius: 10px; padding: 14px 18px; margin: 18px 0; font-size: 14.5px; }
ul { margin: 10px 0 10px 22px; }
li { margin: 6px 0; }
a { color: var(--blue); text-decoration: none; }
a:hover { text-decoration: underline; }
.instr { background: rgba(63,185,80,0.08); border: 1px solid rgba(63,185,80,0.35); border-radius: 10px; padding: 14px 18px; margin: 18px 0; font-size: 16px; }
footer { margin-top: 64px; text-align: center; color: var(--muted); font-size: 13px; }
</style>
</head>
<body>
<div class="container">
<header>
<div class="emoji">⛏️</div>
<h1>Minecraft Agent — Qwen3.5-9B</h1>
<p>A vision-language agent that plays Minecraft from raw first-person pixels (640×360 @ 20 FPS) and emits structured text actions. Stage-3 SFT on 200k+ human gameplay trajectories.</p>
<div class="badges">
<span class="badge green">24.9% success (easy-ng, 29-frame context)</span>
<span class="badge blue">Base: Qwen3.5-9B</span>
<span class="badge">6M frames · 20 FPS</span>
<span class="badge">Text-action space</span>
<a href="cot.html" class="badge green" style="text-decoration:none">CoT Demo Dataset →</a>
</div>
</header>
<h2><span class="num">01</span>Model</h2>
<div class="cards">
<div class="card"><div class="k">Architecture</div><div class="v">Qwen3.5-9B</div><div class="s">Hybrid linear/full attention + ViT tower</div></div>
<div class="card"><div class="k">Weights</div><div class="v">17.5 GB</div><div class="s">bf16 · single safetensors</div></div>
<div class="card"><div class="k">Checkpoint</div><div class="v">step 3000</div><div class="s">run nf-noop2 (keep_p=0.2 + focal 0.75)</div></div>
<div class="card"><div class="k">License</div><div class="v">Apache-2.0</div><div class="s">Model repo on the Hub</div></div>
</div>
<p>➡ <a href="https://huggingface.co/EmberJin/Minecraft-Agent-Qwen3.5-9B-Stage3" target="_blank"><strong>EmberJin/Minecraft-Agent-Qwen3.5-9B-Stage3</strong></a></p>
<h2><span class="num">02</span>Evaluation</h2>
<p style="color:var(--muted)">Benchmark <b>easy-ng</b>: 202 non-GUI tasks (153 Embodied <code>mine_block</code> + 49 Combat <code>kill_entity</code>) × 3 rollouts, difficulty=easy, 200-step episodes.</p>
<table>
<tr><th>Inference history window</th><th>Success</th><th>Embodied</th><th>Combat</th></tr>
<tr><td>3 frames (naive default)</td><td>15.0%</td><td>17.9%</td><td>6.2%</td></tr>
<tr><td><b>29 frames (matches training context)</b></td><td class="hl">24.9%</td><td class="hl">24.8%</td><td class="hl">25.2%</td></tr>
</table>
<div class="note">💡 <b>Key finding</b>: aligning the inference context length with the 30-step training segments yields <b>+9.9pp</b> over the naive 3-frame window — memory truncation was a hidden bottleneck. Combat more than quadruples (6.2% → 25.2%): tracking an enemy that leaves the field of view requires long-term memory.</div>
<h2><span class="num">03</span>Training Recipe</h2>
<table>
<tr><th>Component</th><th>Value</th></tr>
<tr><td>Base model</td><td>Qwen3.5-9B (stage-2)</td></tr>
<tr><td>Data</td><td><code>minecraft-text-action-dataset-noop-filtered</code> — 92.85% of raw dataset after removing 7.15% pure no-op collapse trajectories</td></tr>
<tr><td>No-op frame drop (<code>KEEP_NO_OP_P</code>)</td><td><b>0.2</b> (drop 80% of no-op frames at data level)</td></tr>
<tr><td>Focal loss</td><td>decay = 0.75 (down-weights repeated consecutive actions)</td></tr>
<tr><td>Sample format</td><td>30-step trajectory segments: <code>user(prompt+instruction+img) → assistant(action) → user(img) → …</code></td></tr>
</table>
<h2><span class="num">04</span>Action Space</h2>
<p>The model outputs a single line per step:</p>
<pre>Action: move(dx, dy) and press(keys) and click(button)</pre>
<ul>
<li><code>move(dx, dy)</code> — mouse movement (horizontal, vertical)</li>
<li><code>press(keys)</code> — <code>w/a/s/d</code> movement, <code>space</code> jump, <code>e</code> inventory, <code>1</code>–<code>9</code> hotbar, <code>left.control</code> sprint, <code>left.shift</code> careful move</li>
<li><code>click('left')</code> attack / <code>click('right')</code> place or use</li>
<li><code>no_op</code> — wait</li>
</ul>
<h2><span class="num">05</span>A Real Trajectory from Training Data</h2>
<div class="instr">🎯 Task instruction: <b>Mine the cobweb to clear the path.</b></div>
<p style="color:var(--muted)">Six frames (evenly sampled from a 30-step segment) with the ground-truth actions the model learns to imitate:</p>
<div class="traj">
<div class="step"><img src="assets/frame_0.jpg" alt="frame 0"><div class="meta"><div class="t">step 0</div><div class="a">Action: move(-53, 0) and press(a)</div></div></div>
<div class="step"><img src="assets/frame_1.jpg" alt="frame 6"><div class="meta"><div class="t">step 6</div><div class="a">Action: move(0, 0) and press(w, a)</div></div></div>
<div class="step"><img src="assets/frame_2.jpg" alt="frame 12"><div class="meta"><div class="t">step 12</div><div class="a">Action: move(13, 13) and press(w)</div></div></div>
<div class="step"><img src="assets/frame_3.jpg" alt="frame 18"><div class="meta"><div class="t">step 18</div><div class="a">Action: move(80, 0) and press(d)</div></div></div>
<div class="step"><img src="assets/frame_4.jpg" alt="frame 24"><div class="meta"><div class="t">step 24</div><div class="a">Action: move(7, -7) and press(w, d, left.control)</div></div></div>
<div class="step"><img src="assets/frame_5.jpg" alt="frame 29"><div class="meta"><div class="t">step 29</div><div class="a">Action: move(0, 0) and press(w, left.control)</div></div></div>
</div>
<h2><span class="num">06</span>Inference</h2>
<pre># vLLM
vllm serve EmberJin/Minecraft-Agent-Qwen3.5-9B-Stage3 \
--limit-mm-per-prompt '{"image": 30}' \
--enable-prefix-caching \
--max-model-len 32768</pre>
<div class="note">⚠️ GUI tasks (crafting / smelting / chest interaction) are out of scope: all text-action models score 0% on them — the action space has no interface-coordinate grounding.</div>
<footer>
Minecraft Agent · Qwen3.5-9B Stage3 · easy-ng benchmark · single seed<br>
<a href="cot.html" style="color: var(--blue); text-decoration: none;">CoT Demo Dataset</a> · 531 trajectories
<a href="https://huggingface.co/EmberJin/Minecraft-Agent-Qwen3.5-9B-Stage3">Model repository</a>
</footer>
</div>
</body>
</html>
|