千木之森:在3B模型上运行多代理经济系统
千木之森:在3B模型上运行多代理经济系统
关于一个由3B参数模型组成的交易委员会能做什么与不能做什么的构建小型黑客马拉松实地报告。
我为“构建小型黑客马拉松”打造了“千木之森”。这是一个微型经济系统:五位林地生物——每个都是运行在 Qwen2.5-3B 上的独立代理——用卵石交易五种商品,闲谈、囤积、恐慌。你轻戳森林,泡沫、崩盘与日益扩大的贫富差距便会自行显现。模型由 Modal 上的 vLLM 提供服务;一个 Gradio 应用成为观察这片森林的窗口。
这是一份面向使用小模型构建者的工程实地报告。简而言之:3B 模型是可靠的格式生成器,但推理能力不可靠;涌现系统需要人为设计的稀缺性;最佳演示点恰好位于技术约束与你早已深刻理解的事物之间。
为何小是设计而非局限
一个鲜活的经济系统需要多个代理在单次运行中反复思考多次。这正是前沿模型成为错误工具之处:每次更新运行一个交易委员会都太过缓慢且昂贵。小模型使实时多代理模拟切实可行。每个生物每回合只需一次批量 GPU 调用即可做出决策。
第一个经济系统出师未捷
最初的版本毫无作为。生产超过了消费,因此每个生物自给自足,毫无交易动机。市场完成一次出清后便陷入沉寂。解决方案是设计稀缺性:
- 饮食多样性: 每个生物每餐只能食用一种食物的一个单位,因此生存需要购买自己不产的食物。 - 腐败: 易腐食物若囤积便会腐烂,迫使剩余物资在其仍有价值时出售。 - 冬季燃料危机: 每个生物每回合必须消耗木柴,需求随时间增长,而只有一种生物生产木柴。
最后一项机制是戏剧性的源泉。单一供应商无法满足不断增长的需求,于是樵夫致富,其他生物则为了温暖而竞争。
有效的 JSON,薄弱的判断
在稀缺性确立之后,小模型的真实教训浮出水面。3B 模型在 100% 的调用中输出了有效的 JSON,但其经济判断力糟糕:一个生产橡子的生物竟会下单购买橡子——正是它过剩的东西。
解决方案并非使用更大的模型,而是更精准的提示。我告知每个代理它生产什么且绝不能购买,计算其短缺商品的精确列表,并给出一个工作示例。决策质量显著提升,生物们开始按照角色进行交易。整个循环包裹在一个容错的 JSON 解析与修复层中,因此格式错误的响应会退化为无操作而非使模拟崩溃。
第二个教训来自幸福感。我最初将其建模为一个累加器,任何长期短缺都会使每个生物的生命值在运行中降至零——这是一种死亡螺旋,既不好看,也惩罚了代理的不完美优化。我将其重构为均值回归的情绪状态,当生物吃饱且温暖时恢复,永远不会降至零。风险应归于卵石、价格和地位,而非饥饿。
于是它开始讲述故事
最令我满意的特性是将项目与市场历史联系起来。玩家可以绘制一幅“林地传奇”:将著名事件改编为林地民间传说。郁金香狂热化身为大橡子狂热。南海泡沫化身为空心原木贸易公司。1929 年的银行挤兑化身为对乌娜宝库的争夺。
这些并非装饰性文字。每个传奇都会触发真实冲击,代理们会做出反应。在一次运行中,我绘制了“对乌娜宝库的争夺”——谣传猫头鹰的宝库已空。乌娜开始清算她的蜂蜜以筹集卵石,供过于求使蜂蜜价格在接下来的回合中从 10 暴跌至 3。一个经过改编的银行挤兑令代理抛售资产并改变了市场价格。其中没有任何脚本。
为使这种效应可见,价格必须能够变动。此前价格冻结是因为代理们总是报出我展示给他们的参考价格。解决方案是让市场参考价格随每轮后的剩余供给与需求漂移:大量未满足的购买力推高价格,供过于求则压低价格。如今价格在稀缺期间形成趋势,在交易平衡时保持稳定。
实际发生了什么
一次具有代表性的十五回合运行,中途注入了干旱与冬季谣言:
| 指标 | 结果 | |------|------| | 有效 JSON 动作 | 100%(75 次调用全部成功) | | 每回合交易次数 | 稳定在 3 至 9 次,从未沉默 | | 蜂蜜价格 | 在银行挤兑传奇期间从 10 暴跌至 3 | | 木柴价格 | 随冬季稀缺加剧从 4 升至 7 | | 贫富差距(基尼系数) | 从 0.14 扩大至 0.38 | | 结果 | 樵夫最终最富有,囤积者破产 |
所有这些动作背后的推理过程都记录在开放的痕迹数据集中:每一行都包含生物的完整提示、原始响应、解析后的动作以及私有想法。
对小模型构建的启示
大部分工程工作在于通过结构与提示而非规模,弥合小模型可靠格式化与不可靠推理之间的差距。涌现系统需要人为设计的稀缺性;丰裕只会带来无聊。而最引人入胜的小模型演示并不需要人为制造的戏剧性。三个世纪的市场历史已然备好,一个由 3B 参数代理组成的委员会便足以将其演绎。
小模型,大冒险。试试 Space。
最初发表于 Medium。