wuname
V2EX  ›  游戏

3 天,我用 LLM 造了一群会记忆、会自保、会贸易、会谈恋爱、还会抗命的 AI 游戏

  •  1
     
  •   wuname · 6h 39m ago · 578 views

    开始

    不知道大家有没有玩过文明 6 、红警、铁锈战争、Unciv 、骑砍这类游戏,反正我小时候很喜欢玩哈哈,初中时还组过战队打比赛来着。有一天我在刷 ByteTech 时见到了一个关于 AI 小镇的文章,当时就想着能不能把 AI 接入到游戏里,使游戏里的每个单位都有自己的想法,自己行动,自己生存,于是,便有了这个游戏。

    github 开源地址: https://github.com/wunameya/qx

    体验地址:qx.wuname.eu.org(用了 cloudflare 家的 cdn ,如果感觉很慢可以打开科学上网)

    一些截图

    没错,AI 也会谈恋爱,并且可以生孩子(生的孩子自动加入己方阵营)。

    没错,AI 也可以交易和赠予物品。

    没错,AI 也会打猎和建造建筑以及吃饭。

    架构玩法介绍

    实现很简单,就是一股脑把周围环境信息、记忆、这个世界的规则、玩家给的方针、能选择的动作都喂给大模型,最后大模型给出最合理的动作。

    ATB + AP:让执行阶段既有顺序又有节奏

    这是一个战旗类的游戏,AI 行动肯定要有个行动顺序

    单位行动顺序不是简单轮流,而是类似 ATB 的行动条模型。速度受多种因素影响:

    • 基础机动能力;

    • 装备修正;

    • 人格倾向,例如勇气、攻击性、审慎;

    • 饥饿、疲劳、受伤、士气等状态;

    • 当前任务偏置;

    • 连续同阵营行动的平衡惩罚。

    每个单位在执行阶段有 AP 。攻击、移动、观察、防御、生产、建造、强化、交易等动作消耗不同 AP 。饥饿和疲劳会压缩行动能力。

    AI 决策:把模型关进合法动作空间

    我的做法是把 AI 决策拆成四层:

    服务端生成候选动作
          ↓
    LLM 在候选空间里选择
          ↓
    结构化 Schema 校验
          ↓
    业务规则二次裁决
          ↓
    执行器修改世界状态
    

    先枚举候选,再让模型选择

    单位行动前,服务端会基于真实世界状态生成动作候选,例如:

    • 可以移动到哪些相邻格;

    • 可以攻击哪些敌人;

    • 可以观察、防御、撤退;

    • 可以吃什么、喝什么、捡什么;

    • 可以和谁交谈、交易、表白、救援;

    • 可以在哪些地形上采集、狩猎、钓鱼、采矿;

    • 可以建造、拆除、收获哪些设施;

    • 如果没有好动作,至少可以 hold 或 observe 。

    LLM 看到的不是一个无限开放世界,而是一个经过服务端裁剪的合法动作空间。

    这件事非常关键:不要用 prompt 请求模型遵守规则,要用程序把非法动作从动作空间里删掉。

    Prompt 模板:不是把世界一股脑喂给模型

    单位决策 Prompt 的核心不是“描述得越多越好”,而是把信息分层、裁剪、结构化。当前模板大致分成这些块:

    单位决策提示词版本: action_params_v4
    当前回合 / 当前阶段 / 本次可用 AP
    MOVE 坐标白名单:只列本回合真正可到达的空地
    阵营自然语言方针上下文:全局方针 + 单位任务 + 即时令
    单位资料:属性、HP 、饥饿、背包、装备、位置、阵营
    单位人格:勇气、忠诚、攻击性、审慎、社交、稳定等
    记忆摘要:近期事件 + 长期摘要 + 闪回记忆
    关系网:对附近单位的信任、亲密、恐惧、竞争等
    世界知识:这个单位已经学到的地形/资源/敌情规律
    环境摘要:脚下地形、设施、天气、最近威胁、可见友军/敌军
    合法候选动作列表:attack/move/trade/build/dialogue/hold...
    参数填写规则:每类 action 能填哪些字段,哪些字段必须为空
    决策流程:先确认合法动作,再理解方针,再按风险排序,最后输出 JSON
    

    其中几个设计点很关键:

    • 环境信息只给局部和摘要:地图不会整张展开,而是给“视野内地形”“最近敌军距离”“本回合可到达地块”“脚下可做事项”等压缩信息。

    • 记忆不是全量聊天记录:短期记忆保留事件粒度,长期记忆用摘要;再加上关系、世界知识和闪回召回。

    • 动作空间是结构化枚举:模型不是自由写动作,而是在服务端生成的候选动作中选。

    • 玩家方针是强信号,不是硬 RPC:Prompt 会明确注入方针和任务,但后续还有服从度、风险和合法性裁决。

    对应的核心构造代码可以压缩成下面这个片段:

    输出解析:JSON Schema + 业务校验 + 兜底动作

    当前没有用正则解析自然语言,也没有让模型直接调用游戏函数。LLM 走的是结构化 JSON:

    1. 服务端根据候选动作动态生成 JSON Schema ;

    2. Provider 使用 OpenAI-compatible 的结构化输出能力;

    3. 返回后先做 JSON Schema 校验;

    4. 再把 choice 映射回候选动作;

    5. 最后用业务规则重新校验;

    6. 失败时降级为保守动作,例如 hold 、observe 或 confused decision 。

    动态 Schema 的重点是:action 是当前候选动作枚举,move 坐标用 const 限死到合法坐标。

    执行入口也保持这条边界:模型只产出 unitDecisionPayload,真正落地必须经过 validateDecisionexecuteDecision

    记忆系统:角色连续性的底层设施

    LLM NPC 最大的问题不是不聪明,而是容易“无历史”。

    如果一个角色刚被队友救过,下一回合却完全忘了这件事,那它就只是一个会说话的状态机。反过来,如果把所有历史都塞进 prompt ,又会造成上下文爆炸、成本上升、响应变慢。

    所以记忆系统要解决的不是“多记一点”,而是:

    记住值得记住的,忘掉应该忘掉的,并在相似情境下想起来。

    结构化记忆,而不是聊天记录数组

    记忆被分成多个类别:

    • 实体记忆:我认识谁,他做过什么;

    • 空间记忆:哪里危险,哪里有资源;

    • 关系记忆:谁救过我,谁背叛过我;

    • 事件记忆:一次战斗、一次受伤、一次交易;

    • 世界知识:阵营、地形、敌人动向;

    • 长期摘要:跨多个回合压缩后的生平片段。

    每条记忆都有重要性、情绪权重、显著度、是否永久、来源和发生回合。

    显著度、遗忘和闪回

    记忆会随时间衰减,但不是线性消失。重要事件、强情绪事件、关系事件会保留更久。当前环境如果和历史事件相似,还会触发“闪回”。

    例如:

    • 单位再次进入曾经被伏击的森林;

    • 附近出现曾经伤害过它的人;

    • 天气、地形、敌人组合与某段痛苦记忆高度相似。

    这类记忆会被重新召回,并进入本次决策上下文。

    这比“最近 N 条聊天记录”更接近角色认知:人不是机械回放全部历史,而是在处境相似时想起关键片段。

    短期事件 + 长期摘要

    长期对局里,事件会越来越多。系统会把较旧的记忆压缩成长期摘要,保留角色人生轨迹,而不是保留每个细节。

    所以记忆分两种粒度:

    短期:事件粒度,适合即时决策
    长期:摘要粒度,适合人格连续性
    

    这也是控制 LLM 成本的关键。

    恋爱与家庭:关系不是玩家按钮,而是双方同意

    恋爱系统没有把“结婚”做成玩家直接触发的按钮。触发条件分为三层:

    1. 前置关系:两名单位必须有多轮真实对话,并且双方关系都达到熟悉阈值;

    2. 提议判断:LLM 同时扮演双方,判断是否有人主动提出确认亲密关系;

    3. 双方同意:只有双方都真心同意,关系才成立。

    Prompt 里不会直接写一个“好感度=80 可以结婚”的硬规则,而是把关系摘要、对话历史、性格、阵营压力和最近事件放进上下文。好感度在规则层表现为 relationTier、互相信任/亲密等关系状态; LLM 负责把这些状态翻译成当下是否愿意推进关系。

    孩子出生也不是纯随机。名字、生平和人格向量由 LLM 根据父母资料生成,但人格会经过规则层归一化;如果模型失败,则使用规则 fallback 。孩子的基础人格是父母人格均值与一个确定性随机人格混合:

    这个设计避免了两个问题:玩家不能强迫单位恋爱;模型也不能凭一句浪漫台词绕过双方同意和关系门槛。

    贸易:等价交换靠候选生成和同意校验

    贸易系统的核心不是让模型“理解经济学”,而是让服务端先生成可交易候选:谁有物品、谁有钱、距离是否相邻、物品基础价值是多少、能否赠与/售卖/调拨金币。模型只能在这些候选里选择。

    执行时,交易接收方还会单独做一次同意判断。这个 Prompt 明确要求目标单位只代表自己判断,可以因为敌我关系、风险、战略价值、补给不足或不信任而拒绝。

    所以“会不会亏本买卖”的答案是:系统允许单位因为关系、救急或战略需要做非等价交换,但不会让模型凭空创建交易;接收方可以拒绝,失败或格式异常也默认拒绝。经济公平由候选价格、背包/钱包校验和双方同意共同约束。

    总结感想

    这里写一些最近开发的感想吧。似乎将 AI 接入游戏的落地还很少,但我觉得如果真的落地了我觉得现在的游戏将会更加有意思,毕竟谁不想和一个活生生的,会自己思考的 AI 、NPC 打交道呢。

    这仅仅是一个 Demo ,后续有时间我也会继续迭代的。加入更多的规则和玩法,让 AI 持续去探索,我觉得这样这个游戏将会越来越有趣,比如增加更多的建筑,更多的事件,甚至将每个单位的智商属性和使用的大模型进行挂钩,智商属性越高的 AI 越聪明,对记忆系统进行优化等等,我相信如今大模型的能力也能够驾驭得了这么多的输入。

    我也觉得如今 AI 大模型的发达,可能更利好于个人开发者,其一呢个人开发者往往使用的是很通用的技术,而不是像企业一样有繁琐的流程、各种基建。AI 训练的语料也都是最直接、原始的方式,所以个人开发者的技术栈与预训练语料天然对齐,而企业往往需要一套封装。比如一般个人开发者上线是直接使用 Linux 命令、docker ,而企业往往都会自建一套自己的流程和平台,这次游戏还有以前我做的个人项目上线往往都是让 AI 自己开发完成就自己上线了,但是在企业想做到这一步可能还得投入不少的人力成本来训练 AI 。其二呢 AI 把过去个人开发者必须外包的设计、文案等职能内化到一人手中,让 "一人公司" 第一次具备商业可行性。比如这次游戏的一些设计、文案都是由 AI 设计的(也抄了不少 Unciv 的)。

    标题中的三天,其实是断断续续加起来的三天。放在三年前,我相信随便拉一个编程高手,或者拉一个经验丰富,合作默契的团队,三天肯定是做不出这样一个玩意的,即使是一个 demo ,可能三周还差不多?

    但是现在,仅仅是我这样一个还没毕业的菜鸟,只花了三天时间做出来了。可以见到 AI 对咱们的提效是多么巨大。不仅仅是软件行业,在各行各业,我觉得 AI 的冲击都将会更加猛烈。

    从 chatgpt2022 年出来,那时我好像还高中来着,那时借助 AI 编程的方式是把代码粘贴到聊天框里,然后他吐出来我再粘回去。到 2024 用的 copilot ,就是根据上下文自动提示代码,然后 tab 补全。2025 用的是 cursor ,就能够读取项目下的所有代码,然后根据提示词自己写代码了。到如今的 codex ,claudecode ,和 cursor 的区别,就是直接把看代码的地方扣掉了。AI 在编程落地的方式突飞猛进,在其他领域的发展我也相信也会这样突飞猛进。 有了 AI 的帮助,我相信人类能离理想中的乌托邦更进一步。

    4 replies    2026-06-04 15:05:56 +08:00
    fridaycatye
        1
    fridaycatye  
       6h 2m ago
    弄的有点复杂了,而且游戏节奏太慢了,进去定好方针,很长时间没事干 。我方自己操作,对方 llm 操作是否更好一点
    AlanAdam
        2
    AlanAdam  
       3h 3m ago
    只能吸引特定人群,像我点进去就不知道能干什么
    cocong
        3
    cocong  
       2h 46m ago
    感谢分享,能学到很多,收藏了。
    chairuosen
        4
    chairuosen  
       2h 7m ago
    不是。。。而是。。。太多了有点过敏反应了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5278 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 09:13 · PVG 17:13 · LAX 02:13 · JFK 05:13
    ♥ Do have faith in what you're doing.