虚拟驾驶:每一帧都问一次
新酷实时循环三车道、前车、限速 —— 一秒几跳,而刹车距离必须算准
社区里那批 Jev demo(开车、Minecraft、Subway Surfers)共用同一个骨架:游戏持有状态,代码生成合法动作,模型只当分类器。这一页把那个骨架原样搭出来,再补上 Jev 结构上没有的那一层 —— 那个要跟车距比大小的数。
为什么要快 一帧 16 毫秒。判断要是花三秒,这个循环根本立不起来 —— 不是「慢一点」,是这一类应用整个不存在。
这是个演示用的简化世界,不是自动驾驶系统。反应时间 0.8 秒、路面减速度 7.5 / 4.5 m/s² 都是写在题面里的假设值。
跑起来
每一跳都是一次真请求 —— 没有预录,暂停就真的停了。世界状态在你的浏览器里, 中途可以随手改(下雨、前车急刹、玩家拔刀),模型立刻就看见了。
等你点开始
这一跳算出来的数
- 车速
- 90 km/h
- 与前车
- 48 m
- 反应距离算的
- —
- 制动距离算的
- —
- 停车距离算的
- —
- 还差算的
- —
标「算的」那几行是本跳算出来的 —— 页面画的和决策依据的是同一个数。
改完直接「走一步」—— 世界状态在浏览器里,模型每一跳都是无状态的一次调用。
这一跳的接线
① 车机
状态一直在你这边,模型不持有任何东西
合法动作由你的代码生成,模型只在里面挑
一段话 + 选项
② 判断层 · Jett
3 个问题一次前向答完,不是问 3 次
回来的是选项 + 把握程度,不用再解析文字
② 数值 · Jett(与判断同一次请求)
需要的那个数随判断一起回来
精确值,带单位,可以逐位核对
答案 + 那个数
③ 车机
执行动作,世界更新
然后进入下一个 tick
往返 3 问 · 1 个数值问题
接进你的系统
下面就是这一页真正发出去的东西。把 state 换成你的场景、criteria 换成你的动作集, 它就是你的了。
① 判断层 —— 一次请求,3 个问题一起问
POST /v1/systemone
{
"model": "memorylake-c1",
"state": "你在高速上,当前中间道,车速 90 公里/小时,限速 100。正前方有车,距离 48 米,它的速度是 72 公里/小时。路面干燥。左侧车道空着。右侧车道空着。",
"questions": {
"action": {
"type": "choice",
"instructions": "这一刻该怎么操作?",
"criteria": {
"accelerate": "加速",
"hold": "保持",
"brake": "减速",
"left": "并到左道",
"right": "并到右道",
"other": "以上都不合适"
}
},
"hard_brake": {
"type": "noul",
"instructions": "是否需要紧急制动(而不是缓慢减速)?"
},
"risk": {
"type": "score",
"instructions": "当前这一刻的风险有多高?",
"criteria": [
"低",
"需要留意",
"高"
]
}
}
}回来的是 {answers: {key: {value, probs}}} ——不用再写一个解析器去猜模型想说什么, 也不用为「它这次多说了一句」写兜底。
③ 循环 —— 你要写的就这几行
while (running) {
const state = describe(world) // 你的状态 → 一段话
const legal = legalActions(world) // 合法动作:你的 if,不是模型的记性
const ans = await systemone(state, legal)
world = apply(world, ans.action.value, ans.margin.value)
}模型不持有任何状态 —— 每一跳都是无状态调用。 这意味着它可以并发、可以重放、可以随时换掉。