JEV 玩贪吃蛇:每秒 3 步,模型到底判断了什么?

简介: 本文展示用JEV框架让模型玩贪吃蛇:每秒3步,将局面转为四向选择题,输出方向概率。本地Laya实现,不调远程API;程序预计算安全与路径特征,模型仅对标签化选项做判断。附JEV教学Skill供延伸实践。(239字)

JEV 玩贪吃蛇:每秒 3 步,模型到底判断了什么?

我做了一个 JEV 玩贪吃蛇 的案例:蛇每走一步,就把当前局面变成一道选择题,让判断模型给出方向和四个选项的概率。贪吃蛇适合拿来试这个思路,因为问题很小,结果却很直接——选完以后,下一格会不会撞、会不会吃到食物,马上就能看到。

如果你也想从这个实验继续找 JEV 的其他用法,文中附了一个 JEV 教学 Skill(夸克网盘下载)。它按场景整理了游戏、浏览器操作、模型路由等案例,带截图和原帖链接;放进 Agent 的技能目录后,可以按自己的任务去找相近的做法。这个包是延伸阅读,不含本文的贪吃蛇源码。

这次实跑用本地 Laya 实现 JEV 式的 state + Choice → 选择 + 概率,没有调用远程 JEV API。速度调到每秒 3 步后,录了下面这段 GIF。

录制约 10 秒,蛇走了 30 步、吃到 1 个食物,得分 100。页面当时显示 31 次请求,平均往返约 220 毫秒,超时和接口错误都是 0。这是一次运行片段,不是胜率测试。调用数比已执行步数多 1,也不能直接理解为“多走了一步”:控制器执行完一步就会开始准备下一步的问题。

为什么这里用 Choice,而不是让模型自由回答?

JEV 的判断结构可以写成“state + 问题 → 判断 + 概率”。贪吃蛇的一步恰好可以拆得很小:state 说明现在的局面,问题是“这四个方向选哪个”,答案被限制在四个候选中。我们需要的是下一步动作,不需要模型写一篇路线分析。

但“把棋盘交给模型”和“把判断后的局面交给模型”是两种完全不同的实验。这版默认模式走的是第二种。浏览器把蛇身、方向和食物位置交给游戏代理;代理用代码排除撞墙、撞身体和掉头的方向,再计算每个合法方向走过去后的食物距离、可达空格和死胡同风险。可达空格由 flood fill 算出,死胡同判断还检查能否沿着蛇尾出去。这些数字和标签都是程序算的,不是模型看图算的。

代理随后才发起 Choice。真实代码里最关键的是下面几行:

const request = buildRequest(game, analyze(game), strategy);
const res = await client.systemOne({
   
  state: request.state as never,
  questions: {
    move: choice(request.instructions, request.criteria as Record<string, string>) },
});

拆开一条真实的输入和输出

从 logs/laya-trace.jsonl 取出的一次原始输入如下。四个键 slot 1/2/3/4 在游戏里固定对应上、下、左、右。

{
   
  "state": "Safe route: yes. Food reachable through empty cells: yes.",
  "questions": {
   
    "move": {
   
      "type": "choice",
      "instructions": "Choose the best safe move toward food.",
      "criteria": {
   
        "slot 1": "Poor. Safe. Longer route.",
        "slot 2": "Good. Safe. Shortest route to food.",
        "slot 3": "Worst. Blocked. Collision.",
        "slot 4": "Poor. Safe. Longer route."
      }
    }
  }
}

返回的 answers.move 关键字段是:

{
   
  "choice": "slot 2",
  "probabilities": {
   
    "slot 1": 0.0774,
    "slot 2": 0.6358,
    "slot 3": 0.059,
    "slot 4": 0.2278
  },
  "confidence": 0.286
}

这一回模型选 slot 2,代理把它翻译为“向下”。这条记录还有 input_tokens=78、output_tokens=0:接口给的是选项分数,不是一段生成的路线分析。0.6358 是这个选项在本次回答里的概率;confidence=0.286 是接口另一个字段。它们不能合成一句“模型有 63.58% 的把握不会死”。概率没有经过本游戏的生存率校准,也没有自动证明这个选择能带来长期高分。

这条输入还有一个更重要的细节:slot 2 的文字已经写着“安全、到食物的最短路线”。程序先用如下评分规则挑出偏好的方向,再把好坏写进选项;模型在这版模式里主要是在读这些等级标签:

const score = (f: MoveFacts) => (f.eats ? 1000 : 0) - 10 * (f.foodDistance ?? 99) + 0.01 * f.reachable;

吃到食物给了很高的优先级,距离每缩短一格加 10 分,可达空格只作很小的平局修正。这个规则是代码定的。把这段 GIF 说成“模型独立看懂棋盘、规划出了路线”,就超过了证据。

为什么把 up/down 改成 slot 1-4?

这不是为了让字段看起来整齐。项目的排查记录发现,直接用 up/down/left/right 当选项键时,回答会受方向英文词本身影响。换成中性的 slot,才能更清楚地测它有没有按选项描述来选。标签里的 Best/Good/Poor/Worst 也有作用:模型收到的是明确的等级,而不只是四段杂乱的棋盘数据。

项目此前的一次 283 个局面对照记录:同一份未微调权重、同一运行方式下,“完整棋盘 + 事实型选项”的命中率是 34.3%;“短 state + 字面标签”是 64.7%。记录中的输入长度也从约 404 token 缩到 63 token,耗时从约 256 毫秒降到 54 毫秒。这组数字来自此前的离线排查,不是根据这段 GIF 重新测出的数,也不是整局游戏的胜率。

排查笔记还提到决策头会截断过长的输入。因此,34.3% 不能直接当成模型在完整读取棋盘后的能力上限。短提示一方面减少了输入长度和等待时间,另一方面也把答案线索提前写进了标签。结果变好,不等于模型已经学会走棋。

模型的选择不一定等于蛇最后走的方向

每步约 330 毫秒。控制器在这段时间内等模型回答,到点就执行已有的选择;若回答没赶上,会用代码保底。只有一个合法方向时,也直接由代码走,不必请求模型。即使模型及时选出一个方向,安全覆盖还会检查它是否会撞或进死胡同;若不安全,就从安全方向里选概率最高的那个。

所以复盘时至少要分清三件事:模型原始选择、程序最终执行的方向、这一步后游戏发生了什么。只看最后的得分,没法知道究竟是模型选对了,还是保底与安全覆盖救了它。这版把每次原始输入输出写入 trace,游戏记录另存最终动作、耗时、超时和安全覆盖标记,就是为了能把它们分开看。

本地部署只补充与判断有关的部分:Laya 的 GGUF 主模型由 llama.cpp 提供逐 token 特征,独立的 head 文件负责给 Choice 选项打分;Python 桥接服务用 Laya 的 tokenizer 生成 token ID,把两部分接起来。模型文件包括 GGUF、决策头和 laya_head.py。llama.cpp 这边启用了 --embeddings --pooling none --ctx-size 8192 -b 2048 -ub 2045;只加载 GGUF 而没有决策头,不会得到上面这样的四项概率。

下一步怎么验证它真的在“看棋盘”?

我会把测试拆成两部分。第一部分固定一批相同的棋盘局面,分别让模型看短标签和完整棋盘,比较每步是否选到安全且合理的方向;同时统计各方向召回率和概率是否可信。这里不要在完整棋盘组预先写入 Good/Poor,否则还是在考它读标签。

第二部分才是整局游戏:固定初始随机种子,分别跑代码基线、当前紧凑提示和完整棋盘提示。因为不同策略走几步后遇到的局面就会分叉,整局结果要单独报告食物数、存活步数、死亡原因、回答耗时、超时次数和安全覆盖次数。这样才能回答一个更具体的问题:把这个判断模型放进游戏,究竟比代码本身多带来了什么。

如果你也想从这个实验继续找 JEV 的其他用法,文中附了一个 JEV 教学 Skill(夸克网盘下载)。它按场景整理了游戏、浏览器操作、模型路由等案例,带截图和原帖链接;放进 Agent 的技能目录后,可以按自己的任务去找相近的做法。这个包是延伸阅读,不含本文的贪吃蛇源码。

相关文章
|
4天前
|
人工智能 JavaScript API
阿里云百炼Qwen3.8‑Omni‑Flash模型能力拆解:免费100万Tokens
阿里云发布Qwen3.8‑Omni‑Flash——原生全模态大模型,支持1M长序列及音视频理解、生成与编辑、视频问答等Agentic能力;免费体验100万Tokens,兼容OpenAI协议,开箱即用。(239字)
133 1
|
21小时前
|
存储 缓存 编解码
剪映导出失败怎么办?提示磁盘空间不足或卡在99%,电脑版按这4步排查
剪映导出失败?别急着删缓存!本指南针对Windows专业版,按报错现象(磁盘不足、卡住、C盘变小、特定位置失败)分步排查:先查C盘及目标盘空间、导出路径权限、缓存与草稿区别,再检素材与设置。附官方依据与安全工具入口,保草稿、准定位、稳导出。(239字)
|
1天前
|
SQL 人工智能 Java
调试 SQL 该像调试代码一样
SQL调试长期困于“猜结果”困境:嵌套查询难追踪、中间态不可见、错误难定位。SQLazy首创分步式SQL语言,支持单步执行与实时结果查看,让窗口函数等复杂逻辑可审计、可验证,真正实现像调试代码一样调试SQL。
|
1天前
|
人工智能 Python
Python统计重复项时如何保留核对线索
围绕Python统计重复项时如何保留核对线索,从保留原始清单开始,再检查明确计数条件,最后只读输出统计结果。用小范围实际核对,让信息更清楚,日后取用和复查更方便。内容由 AI 辅助整理。
Python统计重复项时如何保留核对线索
|
1天前
|
存储 弹性计算 安全
阿里云 ChatOps Agent 让非标准化环境可修复:内核漏洞换盘后的容器恢复
本文分享我们使用阿里云 ChatOps Agent 修复 Linux 内核漏洞的真实实践:面对非标准化的服务器环境,我们在替换 ECS 系统盘后借助 Agent 的参照物 diff 能力,把未知配置差异自动找出来,让容器服务快速恢复。
阿里云 ChatOps Agent 让非标准化环境可修复:内核漏洞换盘后的容器恢复
|
1天前
|
人工智能 自然语言处理 安全
智能小Q是什么?阿里云Quick BI 智能小Q指南、你的小龙虾数据大脑
阿里云Quick BI智能小Q是大模型驱动的数据分析AI智能体,无需编码、免部署、高安全。集成“问数、解读、报表、报告”四大Skill,分钟级生成深度分析报告,支持嵌入主流AI工作台,新用户享30天免费试用。阿里云Quick BI智小Q官网:https://t.aliyun.com/U/5o18cj
|
1天前
|
缓存 自然语言处理 搜索推荐
多语言外贸网站的国际化架构:URL设计、hreflang信号与静态资源多区域加速的工程实践
2026 年再看多语言外贸网站,容易被低估的往往不是翻译工作量,而是国际化架构本身——URL 怎么设计搜索引擎才分得清语种、翻译后的静态资源怎么在多区域就近加速、hreflang 信号上线后怎么持续校验不退化。这篇不聊选型,只聊工程:把一个面向多语种市场的站点,从 URL 骨架、hreflang 双通道、静态资源多区域分发,到线上巡检这几块拆清楚,说清楚每一块在云上怎么落地。 一、URL 设计:子目录为主,权重收拢 多语种站点的 URL 结构有国家顶级域名、子域名、子目录三种。工程上对大多数团队,子目录是默认起点:example.
|
1天前
|
存储 人工智能 自然语言处理
面向未来的数据架构:新一代企业级BI系统建设方案思考
本文探讨面向未来的企业级BI系统架构升级,指出传统BI在数据接入、语义统一和分析灵活性上的结构性瓶颈,提出“语义优先、分析即执行、可信内嵌”三大设计原则,并以阿里云瓴羊Quick BI AIPro为例,解析其四层AI-native架构与7道可信防线,助力企业实现从“看数”到“用数”“决策即执行”的跃迁。
|
1天前
|
人工智能 自然语言处理 BI
2026数字化转型必修课:企业如何应用BI系统打通数据孤岛
数据孤岛正严重制约客服、市场、售后等业务效率:投诉无跟进、ROI难测算、故障难溯源。阿里云瓴羊Quick BI以AI-native架构,支持50+数据源直连、自然语言问数(智能小Q)、统一指标口径与行列级权限,助力企业快速打通孤岛,实现“看到—知道—做到”闭环。
|
1天前
|
缓存 分布式计算 前端开发
Gemini 2.5 Flash API 接入实战:低价背后的隐藏问题与 minimal thinking 配置踩坑记录
Gemini 3.7 Flash于2026年8月13日上线,限时定价$0.75/$3.75(输入/输出每百万token),至2026年12月31日止,之后翻倍。关键变更:移除`minimal`推理档位(调用将报错)、默认`thinking_level=medium`、输出上限65,536 token。强项为长上下文检索、视频理解与前端代码生成;弱项在长时终端任务与低延迟交互。

热门文章

最新文章