最近 jev 的讨论挺多,我们把它接进了「斯坦福小镇」的 agent 模拟世界,做了一个小实验。
虽然它用了像素风游戏的表现形式,但这个世界里没有玩家角色。人类只能观察,不能控制居民。画面中所有会移动的角色,都是 agent 依靠 jev 自己决定要去哪里、找谁,以及什么时候停下来。
目前场景里有 20 个居民。每个人都有自己的身份、性格、当前状态和对世界的共同认知。
世界运行后,他们会不断经历这样一个循环:
观察当前环境 → 决定下一步做什么 → 移动 → 发起互动 → 对话 → 更新状态和记忆
这次主要实验的是:能不能让 jev 来负责 agent 最频繁的「下一步做什么」决策( repo 里面有录屏)
我们的做法不是让模型自由生成一段 JSON ,而是先由引擎计算出当前合法的候选动作,例如:
- 现在可以接近哪些人或物体
- 可以走向哪些地点
- 是否值得主动接触某个目标
- 如果不行动,应该短暂停留还是等待更久
然后把这些候选项交给 Jev 。一次请求里会同时询问 seek 、target 、roam 、place 和 idle_length ,再由代码按照固定规则组合成最终动作。
这样做主要解决了一个之前比较麻烦的问题:普通对话模型即使被要求输出 JSON ,仍然可能选择一个根本不存在、或者当前不可达的目标。Jev 的 Choice 问题只能从引擎提供的候选项里选择,相当于让非法动作从结构上就无法被表达。
同时,它还会返回每个选项的概率和置信度,所以右侧观察面板里可以看到类似这样的记录:
seek 0.83 · talk to Ovid p=0.62 c=0.70
这比让模型事后生成一句“我为什么这么做”,更方便观察 Agent 的真实决策过程。
当然,Jev 目前并没有负责整个 Agent 。
它只替换了动作决策这一环。人物对话、长期状态描述和记忆仍然由对话模型与 Embedding 完成。Jev 不生成文本,所以它很适合从有限选项中快速做决定,但不适合直接承担人物对白。
技术上目前是 TypeScript + React + PixiJS 。模拟本身运行在浏览器中,Node 代理只负责保存模型凭证和转发请求。默认运行 20 个 agent ,也可以调整到 50 个,用来观察多人场景下的行为和调用压力。
当前版本还有不少限制:
- 只有一个主要观察场景
- 默认刷新页面会重新开始一个世界
- Agent 数量增加后,对话模型的调用成本仍然比较明显
- Jev 不生成 intent 和动作描述,人物接近目标后的行为有时会显得比较直接
- 这仍然是一个 Agent loop 的实验,不是完整的虚拟社会
这里说的「斯坦福小镇」,主要指 Generative Agents / Smallville 这一类“观察数字居民自主生活”的方向,并不是对原项目的完整复刻。项目的早期工程基础来自 a16z 的 AI Town ,我们在上面继续做了自己的世界、像素场景和决策层实验。
代码和运行方式放在这里:
https://github.com/NevaMind-AI/jev-town
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/1244325
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.