ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

大语言模型独立决策《文明7》130回合:架构、提示词与实战复盘

大语言模型独立决策《文明7》130回合:架构、提示词与实战复盘 1. 项目缘起与整体设计思路1.1 为什么我会想到让模型独立玩《文明7》最初冒出这个念头其实源于一次很普通的周末。我在Steam上重开了一局《文明7》选的是标准速度、大陆地图、君主难度打到中世纪的时候突然被邻居宣战手忙脚乱地调兵、切产能、换政策卡一晚上下来脑子嗡嗡的。关掉游戏之后我就在想这种回合制、信息完全结构化、决策空间又极大的游戏不正是大语言模型最擅长的场景吗棋盘状态可以序列化成文本每个回合的决策可以拆成看状态—做判断—输出指令三步理论上完全可以交给一个模型去跑。于是就有了这个项目让模型独立完成《文明7》的130个回合全程不插手我只负责把游戏状态喂给它、把它的决策翻译成游戏内操作。130回合这个数字不是随便定的标准速度下130回合大概能推进到文艺复兴到工业时代之间足够经历远古的扩张、古典的战争、中世纪的发育这几个关键阶段能比较全面地考察模型在长周期决策上的表现。这里要先说清楚一个前提我做的不是让模型直接操作游戏客户端而是搭了一套半自动的桥接流程。游戏本身的状态我通过截图加人工整理的方式转成结构化文本模型的输出则是自然语言指令再由我手动或脚本执行。之所以不追求全自动是因为《文明7》的UI识别和操作注入在Windows上做起来坑太多而我的核心目的是观察模型的决策质量不是做一个外挂工具。这个取舍后面会详细讲。1.2 整体架构三层分离的设计整个项目我拆成了三层这个分层思路是我踩了不少坑之后才定下来的强烈建议想复现的朋友直接照搬。第一层是状态采集层。负责把游戏当前回合的关键信息提取出来包括当前回合数、科技树进度、市政树进度、城市列表及各自的人口/产能/产出、军事单位位置与血量、外交关系状态、资源储备、当前可研究项目等。这一层我一开始想用OCR全自动做试了两天发现《文明7》的字体渲染在不同分辨率下差异很大识别错误率高得离谱最后改成截图我手动填表的半自动方式。虽然慢但数据准确率是100%对于观察模型决策来说数据准确性比自动化程度重要得多。第二层是决策层也就是模型本身。我把状态整理成一段结构化的提示词连同游戏规则说明、当前战略目标、历史决策记录一起发给模型让它输出这一回合的完整决策。这里有个关键设计我要求模型输出的不是单个操作而是本回合行动计划包含科技选择、市政选择、每个城市的生产队列、单位移动方向、是否发起外交动作等。这样做的好处是模型能看到全局避免它只顾着眼前一个单位而忘了整体节奏。第三层是执行与记录层。我根据模型的输出在游戏里操作同时把这一回合的状态、模型决策、实际执行结果、下一回合的状态变化全部记录下来。这份记录是后面分析模型表现的核心素材130回合下来我攒了差不多两万多字的决策日志。1.3 方案选型背后的几个关键考量为什么用文本而不是图像直接喂给多模态模型我试过。把游戏截图直接丢给模型让它看图决策效果很不稳定。模型能认出这是一张地图但对具体的地形、单位类型、城市位置的判断经常出错尤其是单位堆叠在一起的时候。文本化之后虽然损失了视觉信息但每个字段都是明确的模型的推理链条清晰得多。这就像你让一个人看地图找路给他一张模糊的照片不如给他一份带坐标的清单。为什么选130回合而不是更多因为再往后游戏的复杂度会指数级上升。工业时代之后单位数量、城市数量、外交关系都会变得极其庞杂光是状态文本就会超过模型的上下文窗口。130回合是一个在足够长和可控之间的平衡点。如果你用的是支持超长上下文的模型可以尝试跑到200回合但要做好状态压缩的准备。为什么强调独立因为我想观察的是模型的原始决策能力而不是我引导下的表现。整个过程中我只在模型输出明显违反游戏规则比如让一个没有建造者的城市去修路的时候才纠正其余一律不干预。哪怕它做了一个在我看来很蠢的决定比如在战争期间去研究一个无关紧要的科技我也让它继续。这种放任才能暴露模型的真实水平。2. 核心细节解析与实操要点2.1 状态文本的字段设计与取舍状态文本是整个项目的输入核心字段设计得好不好直接决定模型能不能做出合理决策。我前后改了四版最终定下来的字段清单是这样的回合与时代当前回合数、当前时代、距离下个时代还有多少回合文明概况文明名称、领袖、当前政体、已解锁的政策卡槽科技与市政已研究完成的科技/市政列表、当前正在研究的项目及剩余回合城市详情每座城市的名称、人口、当前生产项目、每回合产出食物/产能/金币/科技/文化、区域与建筑列表、是否有城墙军事单位每个单位的类型、位置坐标、血量、剩余移动力、是否已行动外交状态与每个已知文明的关系值、是否处于战争/同盟/开放边境状态资源与财政金币储备、每回合收支、战略资源与奢侈资源数量战略目标我设定的当前阶段目标比如20回合内建立第三座城市这里有个细节值得展开位置坐标怎么表示。我一开始用绝对坐标结果模型完全无法理解单位在(23,45)意味着什么。后来改成相对描述比如侦察兵位于首都东北方向约6格处靠近一片沙漠模型的判断准确率明显提升。这说明模型对空间关系的理解更依赖语义描述而非数字坐标。如果你要做类似项目建议在坐标后面附上地形和邻近特征的文字说明。另一个取舍是要不要把全部城市都列出来。早期只有两三座城市的时候没问题到了中期有七八座城市状态文本会变得很长。我的做法是首都和前线城市详细列出后方安全城市只列关键信息人口、生产项目、产出。这样既控制了长度又保证了模型对关键区域的关注度。2.2 提示词的结构与迭代过程提示词我迭代了大概六七个版本最终稳定下来的结构是四段式第一段是角色设定与规则约束。明确告诉模型它扮演的是一个《文明7》的决策者需要遵守游戏规则输出格式必须是结构化的行动计划。这一段我写得比较克制没有堆砌太多你是一个专家之类的话因为实测下来这类话对决策质量提升有限反而会占用上下文。第二段是当前状态。就是上面说的状态文本直接贴进去。第三段是历史决策摘要。不是把过去所有回合都贴进去而是每5回合做一次摘要记录这5回合做了什么、达成了什么、遇到了什么问题。这样模型能保持对长期战略的记忆又不会让上下文爆炸。第四段是本回合要求。明确告诉模型这一回合需要输出哪些内容格式是什么。比如请输出1. 科技选择及理由2. 市政选择及理由3. 每座城市的生产项目4. 每个单位的移动指令5. 外交动作如有。提示提示词里千万不要写请仔细思考、一步一步来这种话。我试过模型会真的输出一大段思考过程把上下文撑爆而且决策质量并没有提升。直接要求它输出结论和简短理由就够了。2.3 决策粒度的选择为什么是回合计划而不是单步操作这个设计是我从一次失败中总结出来的。最开始我让模型每次只做一个决策比如这个侦察兵往哪走结果模型完全失去了战略视角侦察兵在地图上乱转科技研究也是东一榔头西一棒子。后来改成回合计划模型必须先想清楚这一回合的整体目标再分配具体操作决策的连贯性立刻上了一个台阶。这背后的逻辑其实很简单回合制游戏的决策是耦合的。你研究什么科技会影响你能造什么单位你造什么单位会影响你能打什么仗你打什么仗又会影响你需要什么科技。如果把这些拆开单独决策模型就失去了这种耦合关系。让它在一次输出里同时考虑所有维度它才能做出自洽的决策。当然代价是输出变长了。一个完整的回合计划大概有300到500字130回合下来就是几万字。但这是值得的因为决策质量比输出长度重要得多。2.4 执行环节的容错设计模型输出的指令不可能100%可执行。常见的问题包括让一个已经行动过的单位再行动、让城市生产一个还没解锁的建筑、让单位移动到一个不可到达的位置。我的处理方式是先尝试执行执行不了就记录原因然后告诉模型这个指令无法执行原因是XXX请重新决策这一项。这个反馈循环很重要。如果不告诉模型为什么失败它下一回合还会犯同样的错误。我在日志里专门开了一栏记录执行失败项130回合下来大概有40多次失败主要集中在单位移动和建筑生产上。把这些失败案例整理出来其实是一份很好的模型常见错误清单。注意不要因为模型犯错就手动帮它改。让它自己从错误中调整才能观察到它的学习能力。我前20回合忍不住帮它改了几次后来发现这样会污染数据从第21回合开始就严格不干预了。3. 实操过程与核心环节实现3.1 环境准备与工具链搭建先说环境。我是在Windows上跑的因为《文明7》在Windows上的兼容性最好。整个工具链其实很轻量不需要什么复杂的框架游戏本体Steam版《文明7》标准速度大陆地图君主难度截图工具Windows自带的截图WinShiftS就够用我设了个快捷键每回合截一张全图状态整理用Excel做了一张状态表每回合填一行字段就是上面说的那些模型调用通过API调用把状态文本和提示词拼好发过去拿到回复后复制到日志里日志记录用Markdown文件每回合一个二级标题下面分状态、决策、执行结果、备注四块这套流程听起来很土但实测下来最稳。我试过用脚本自动化一部分比如自动读取游戏内存来获取状态结果发现《文明7》的内存结构在更新后经常变维护成本太高不如手动填表来得可靠。对于个人项目来说可靠性比自动化程度重要。如果你想让流程更顺滑可以考虑用Python写一个简单的脚本把状态文本和提示词模板拼好直接调用API然后把回复保存到文件。这样能省掉复制粘贴的功夫。但状态采集那一步我还是建议手动因为游戏状态的语义化描述需要人来判断机器很难做好。3.2 前30回合扩张期的决策观察前30回合是远古时代到古典时代的过渡核心任务是探索、扩张、建立基础设施。这段时期模型的决策有几个明显特点。侦察兵的使用上模型表现得出乎意料地好。它会给侦察兵规划一条螺旋向外的探索路线而不是直线乱走。第8回合的时候它甚至主动让侦察兵绕开了一个蛮族营地理由是当前军力不足以清剿优先探索。这个判断在早期是很合理的。城市选址上模型的表现就参差不齐了。第15回合它选择在一条河边建城理由是河流提供淡水、贸易路线和防御加成这个判断没问题。但第22回合它把第三座城建在了一个离首都很远、周围全是沙漠的位置理由是这里有铁资源。问题是那个位置防守极其困难后来果然被邻居宣战丢掉了。这说明模型对资源价值和战略位置的权衡还不够成熟容易被单一资源吸引。科技选择上模型倾向于优先研究军事科技。前30回合它把青铜器、铁器都点了但农业和陶器这些基础科技反而落后。这导致它的城市人口增长缓慢中期产能不足。我在日志里记了一笔模型对经济基础决定上层建筑的理解不足过度重视军事。3.3 中段60回合战争与外交的考验第40回合左右邻居蒙古对我宣战这是整个项目最精彩的一段。模型在战争中的表现可以打70分。防守阶段它做得不错。它迅速把边境城市的产能切到城墙同时把分散的单位向边境集结。第43回合它做了一个很聪明的决定主动放弃了一座防守薄弱的前线城市把兵力收缩到第二道防线。这个以空间换时间的判断说实话让我有点惊讶。反攻阶段就暴露问题了。模型在守住第一波进攻后急于反攻把主力部队全部压上结果后方空虚被另一侧的蛮族偷袭丢了两座城市。它在日志里的理由是蒙古军力已衰弱应趁势追击但它没有考虑到蛮族的威胁。这说明模型在多线作战时的注意力分配还有欠缺。外交方面模型的表现比较被动。整个130回合里它只主动发起过两次外交动作一次是请求和平一次是提议开放边境。它很少主动结盟或挑拨其他文明之间的关系。这可能是提示词里没有强调外交策略的原因也可能是模型本身对这类软性操作不够敏感。3.4 后40回合发育与收尾第90回合之后战争结束进入发育期。这段时期模型的决策质量明显提升可能是因为局势简单了它能把注意力集中在经济和科技上。城市专业化是这段时期的亮点。模型主动把城市分成了科技城、工业城、商业城三类分别侧重不同的区域建设。第105回合它甚至调整了政策卡给科技城配了科研加成的卡给工业城配了产能加成的卡。这个操作我没有提示过是它自己根据城市产出数据推断出来的。科技树规划也变得更合理。它开始补之前落下的基础科技同时有针对性地研究能解锁关键建筑和单位的科技。第115回合它完成了工业化研究产能直接上了一个台阶。但收尾阶段也有问题。第125回合左右模型开始出现决策疲劳的迹象。它的输出变短了理由也变简单了有些回合甚至只写了继续当前生产就没了。这可能是因为上下文太长模型对早期信息的注意力下降了。如果你要跑更长的回合建议每20回合做一次状态重置把历史信息压缩成摘要重新开始。3.5 关键参数与配置参考为了方便想复现的朋友我把核心配置整理成了一张表配置项我的设置说明游戏速度标准快速和史诗速度的回合数不同130回合对应标准速度地图类型大陆大陆地图的外交和战争更频繁适合观察决策难度君主难度太低模型没有压力太高容易早期崩盘文明选择随机随机能避免模型针对特定文明优化状态更新频率每回合每回合更新一次状态保证决策的时效性历史摘要频率每5回合每5回合做一次历史摘要控制上下文长度提示词长度约800-1200字状态文本加提示词的总长度控制在模型上下文窗口的1/3以内单回合输出长度约300-500字模型输出的回合计划长度太短信息不足太长浪费上下文提示如果你用的模型上下文窗口比较小可以把历史摘要频率改成每3回合一次或者只保留最近10回合的详细记录更早的只保留摘要。4. 常见问题与排查技巧实录4.1 模型输出格式错乱怎么办这是最常见的问题。模型有时候会忘记输出格式要求把行动计划写成一大段散文或者漏掉某个必填项。我的处理方式是在提示词末尾加一个格式模板明确写出请严格按照以下格式输出然后把模板贴上去。实测下来加了模板之后格式错误率从30%降到了5%以下。如果模型还是格式错乱可以在提示词里加一句如果格式不正确我会要求你重新输出。这句话对模型有威慑作用它会更加注意格式。但不要频繁使用否则会占用上下文。4.2 模型决策前后矛盾怎么处理这个问题在中后期特别明显。比如模型第80回合决定优先发展科技第85回合又突然把产能全切去造兵。这种矛盾通常是因为模型忘记了之前的决策。我的解决办法是在历史摘要里明确记录当前战略目标并且在每回合的提示词里重复一遍。比如当前战略目标优先发展科技军事只做防御。这样模型每次决策前都会看到这个目标矛盾率明显下降。如果矛盾还是发生不要急着纠正。先观察一两回合看模型是不是有新的理由。有时候它是在根据局势调整这种调整是合理的。只有当它明显是忘了的时候才在下一回合的提示词里提醒它。4.3 上下文超限的应对策略130回合下来如果每回合都保留完整记录上下文肯定会超。我的应对策略是三层压缩第一层是状态压缩。后方城市只保留关键字段已完成的科技和市政只保留列表不保留详情。第二层是历史压缩。每5回合做一次摘要只记录做了什么、结果如何、当前目标。第三层是决策压缩。早期的决策记录只保留结论不保留理由。比如第30回合研究铁器就够了不需要保留当时的长篇理由。这三层压缩下来130回合的总上下文能控制在模型窗口的60%左右留出足够的空间给当前回合的详细状态。4.4 常见问题速查表问题现象可能原因解决方法模型输出格式错乱提示词格式要求不明确在提示词末尾加格式模板决策前后矛盾历史信息丢失或上下文过长在提示词里重复当前战略目标加强历史摘要模型忽略某些城市状态文本太长注意力分散压缩后方城市信息突出关键城市单位移动指令不可执行模型对地图理解有误在坐标后附地形描述执行失败时反馈原因模型决策变短变敷衍上下文过长导致注意力下降做状态重置压缩历史信息科技选择不合理模型对科技树理解不足在提示词里附上关键科技的前置关系外交动作太少提示词未强调外交在每回合要求里明确列出外交选项战争决策冒进模型对多线威胁评估不足在状态里明确标注各方向的威胁等级4.5 几条踩坑之后才明白的经验第一条不要追求全自动。我一开始花了很多时间想做一个全自动的状态采集和操作注入系统结果发现维护成本极高而且经常出错。后来改成半自动虽然每回合要花几分钟手动操作但数据质量高项目能持续跑下去。对于个人项目来说能跑完比跑得快重要。第二条状态描述要说人话。模型不是数据库它对结构化字段的理解不如对自然语言描述的理解。比如城市A人口5产能8不如城市A是一座中等规模的城市人口5每回合能产出8点产能来得有效。后者虽然啰嗦但模型能更好地理解这个城市的状态。第三条给模型留出犯错空间。不要指望模型每一步都做对。我在项目初期总是忍不住想纠正它后来发现这样反而看不到它的真实能力。让它犯错然后观察它怎么调整这才是这个项目最有价值的部分。第四条记录比决策更重要。130回合下来模型的具体决策我记不清了但那份两万多字的日志是我最大的收获。它记录了模型在什么情况下会做出什么决策哪些决策合理哪些不合理。这份日志的价值远超项目本身。第五条控制预期。模型不是围棋AI它没有经过专门的《文明7》训练。它的决策水平大概相当于一个玩了几十小时的普通玩家能做出合理决策但也会有明显的失误。接受这一点你才能客观地评估它的表现。5. 模型表现的综合评估与延展思考5.1 130回合的整体表现打分如果非要给模型这130回合的表现打个分我会给72分。具体拆解一下扩张与探索80分。侦察兵的使用和早期城市选址整体合理但偶尔会被单一资源吸引而忽略战略位置。战争与防守70分。防守时的收缩判断很出色但反攻时的多线评估不足容易顾此失彼。经济与科技75分。中后期的城市专业化和科技规划做得不错但早期对基础科技的重视不够。外交55分。这是最弱的一环主动外交动作太少对文明间关系的利用不足。长周期一致性65分。中后期出现决策疲劳输出变短前后矛盾增多。这个分数说明模型已经具备了基本的战略决策能力但在多维度权衡和长周期一致性上还有明显短板。5.2 这个项目还能怎么延展如果你对这个项目感兴趣有几个方向可以继续挖多模型对比。我用的是一个模型如果你有条件可以同时跑几个不同的模型用同样的状态和提示词对比它们的决策差异。这个对比会很有意思能看出不同模型在战略思维上的特点。难度梯度实验。我跑的是君主难度你可以试试从开拓者到神级的不同难度观察模型在不同压力下的表现变化。难度越高模型的失误会被放大得越明显。特定场景专项测试。比如专门测试模型在被两家同时宣战时的表现或者开局位置极差时的应对策略。这种专项测试能更精准地定位模型的能力边界。决策日志的量化分析。我这次主要是定性观察如果你懂数据分析可以把日志里的决策量化比如统计科技选择中军事科技占比、战争回合的产能分配比例等用数据说话会更有说服力。5.3 关于模型决策能力的一点个人观察跑完这130回合我最大的感受是模型在有明确规则、有清晰状态、有单一目标的场景下表现很好但在多目标权衡、信息不完整、需要长期规划的场景下就明显吃力。这其实和人类玩家的成长路径很像——新手总是顾此失彼老手才能面面俱到。模型在战争中的表现让我印象最深。它能做出放弃城市收缩防线这种反直觉但正确的决策说明它有一定的战略推理能力。但它在反攻时的冒进又说明它对风险的评估还不够成熟。这种有亮点也有硬伤的表现恰恰说明它不是一个简单的规则引擎而是一个有一定推理能力的决策者。另外一点观察是模型的决策质量跟状态描述的清晰度高度相关。状态描述得越清楚它的决策越合理状态描述模糊的时候它就开始瞎猜。这提醒我们用好模型的关键不在于模型本身而在于你怎么把问题描述给它。这个道理放在任何AI应用场景里都成立。最后分享一个小技巧如果你也想做类似的项目建议从50回合开始不要一上来就挑战130回合。50回合足够你跑通整个流程发现大部分问题而且不会因为周期太长而中途放弃。等流程顺了再逐步增加回合数。我自己就是先跑了30回合的测试确认流程可行之后才正式开跑130回合的。
返回列表