ARTICLE DETAIL

资讯详情

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

AI驱动的城市建造游戏:从多智能体系统到My AI Town实战

AI驱动的城市建造游戏:从多智能体系统到My AI Town实战 大家好我是专注于技术实战与经验分享的博主。今天我们来深入探讨一个非常有趣且前沿的交叉领域AI驱动的城市建造游戏。如果你是一位游戏开发者或者对AI在游戏中的应用充满好奇那么这篇文章正是为你准备的。我们将通过一个具体的开源项目——My AI Town来剖析AI如何从简单的NPC行为模拟演进为能够自主规划、协作并驱动整个虚拟社会运转的复杂系统。本文将从核心概念、技术演进、实战部署到未来展望为你提供一个从入门到进阶的完整视角。1. 背景与核心概念AI如何重塑模拟游戏在传统的城市建造或模拟经营类游戏中如《模拟城市》、《环世界》NPC非玩家角色的行为通常由开发者预设的有限状态机FSM或行为树Behavior Tree驱动。它们遵循固定的脚本缺乏真正的自主性和“灵魂”。玩家扮演的是全知全能的“上帝”负责一切决策。AI驱动的城市建造游戏则颠覆了这一范式。其核心思想是赋予每个虚拟居民AI Agent独立的思考、记忆、目标和社交能力让他们在一个共享的虚拟环境中自主生活、工作和互动从而自下而上地“涌现”出复杂的社会动态和城市发展轨迹。玩家更像一个观察者或规则设定者而非直接操控者。这种模式带来了几个革命性的变化动态叙事每个AI Agent都有自己的故事线它们之间的交互会产生无法预料的剧情每次游戏都是独一无二的。复杂系统模拟住房、就业、社交关系、资源分配等城市问题不再由玩家手动解决而是由AI居民通过其行为自然形成供需关系和解决方案。极高的可玩性与研究价值对于玩家这是一个充满未知的“数字蚁群”观察箱对于研究者这是一个绝佳的多智能体系统Multi-Agent System, MAS和生成式AI的应用试验场。My AI Town项目正是这一理念的杰出代表。它不是一个完整的商业游戏而是一个开源的技术演示与框架展示了如何利用大语言模型LLM构建具有记忆、规划和沟通能力的AI Agent社群。2. 环境准备与版本说明要运行或研究My AI Town你需要准备一个兼容的本地或云端开发环境。以下是基于项目最新情况的推荐配置核心环境要求操作系统macOS, Windows (通过WSL 2) 或 Linux。项目说明中提到了“ai小镇_macw”表明对macOS和Windows可能通过特定方式有支持。Python: 3.9 或 3.10。这是运行大多数AI框架的稳定版本。Node.js: 18.x 或更高版本。用于运行前端界面。Git: 用于克隆代码仓库。关键依赖与工具大语言模型LLM后端这是项目的“大脑”。你需要一个能够提供API的LLM服务。首选云端OpenAI GPT-4/GPT-3.5-Turbo API。你需要一个有效的OpenAI API密钥。备选本地可以部署本地模型如通过ollama运行Llama 3、Mistral或Qwen等开源模型。这需要较强的本地GPU算力。向量数据库用于存储和检索AI Agent的长期记忆。通常使用ChromaDB或Pinecone云端。开发工具推荐使用Cursor或VS Code进行开发它们对AI编程和提示词工程有很好的支持。项目结构预览克隆项目后你通常会看到类似以下的目录结构my_ai_town/ ├── backend/ # Python后端处理AI逻辑、记忆和模拟引擎 │ ├── agents/ # AI Agent的核心类定义 │ ├── memory/ # 记忆存储与检索模块 │ ├── environment/ # 游戏世界状态定义 │ └── server.py # FastAPI或类似框架的主服务器文件 ├── frontend/ # 前端界面可能是React/Vue/Next.js │ ├── public/ │ └── src/ ├── .env.example # 环境变量配置文件示例 ├── requirements.txt # Python依赖列表 ├── package.json # Node.js依赖列表 └── README.md # 项目说明文档重要提示AI领域迭代极快具体依赖版本请以项目仓库README.md和requirements.txt为准。下文的所有示例代码和配置思路具有通用性但实际参数需根据你使用的LLM API和项目版本进行调整。3. 技术架构与核心组件拆解理解My AI Town或类似项目的架构是进行二次开发或深度定制的基础。其核心是一个典型的“前端显示 后端模拟 AI大脑”三层结构。3.1 AI Agent的构成不止是聊天机器人每个AI居民都是一个独立的Agent它由多个模块协同工作身份与状态Profile State# 示例一个Agent的核心属性定义 class Agent: def __init__(self, name, age, occupation, traits): self.name name self.age age self.occupation occupation # 职业如“木匠”、“厨师” self.traits traits # 性格特质如“外向”、“好奇”、“节俭” self.location home # 当前所在位置 self.inventory [] # 携带物品 self.daily_plan [] # 今日计划 self.memory_stream [] # 记忆流记忆系统Memory System这是实现“长期人格”的关键。通常分为短期记忆/工作记忆存储最近几分钟的感知和想法。长期记忆使用向量数据库存储重要的经历、关系、知识。当Agent需要做决定时系统会从长期记忆中检索相关上下文。# 伪代码记忆存储与检索流程 def save_memory(agent, event_description): # 1. 将事件描述转换成向量嵌入embedding embedding llm_client.get_embedding(event_description) # 2. 存入向量数据库并关联Agent ID和时间戳 vector_db.add(embedding, metadata{agent_id: agent.id, event: event_description, timestamp: now()}) def retrieve_memories(agent, query, top_k5): # 1. 将查询语句也转换成向量 query_embedding llm_client.get_embedding(query) # 2. 在向量数据库中搜索与该Agent相关的最相似记忆 relevant_memories vector_db.search(query_embedding, filter{agent_id: agent.id}, top_ktop_k) return relevant_memories规划与决策引擎Planning EngineAgent不是被动响应而是主动规划。一个简单的规划循环可能是感知Perceive观察环境和其他Agent。反思Reflect从记忆中提取相关信息思考当前状况。规划Plan生成一个目标如“感到饥饿” - “目标获取食物”并分解为步骤“去市场” - “买面包” - “回家吃”。执行Act执行计划中的下一个动作并生成自然语言描述。这一过程的核心是向LLM发送精心设计的提示词Prompt。3.2 通信与协作多Agent系统的核心单个Agent的智能是有限的社会的“涌现”特性来自于交互。项目需要实现Agent之间的通信协议。直接对话一个Agent可以向另一个Agent发送消息。消息内容由发送方的LLM生成接收方会将其作为感知输入进行处理。环境广播Agent可以“自言自语”或做出公开动作其他在附近的Agent可以“听到”或“看到”。共享知识通过公共公告板或环境标记Agent可以留下信息供他人读取。3.3 模拟引擎与世界状态后端需要维护一个统一的世界状态World State这是一个权威的数据源记录所有对象的位置、资源数量、时间流逝等。它负责定时驱动以固定的时间步长如游戏内每1分钟推进模拟触发所有Agent的“感知-规划-行动”循环。冲突解决如果两个Agent试图同时占用同一资源引擎需要根据规则裁决。状态同步将世界状态的变化同步给前端进行渲染。4. 完整实战从零搭建一个简易AI小镇原型让我们抛开复杂的开源项目用最简化的代码勾勒一个AI小镇的核心运行逻辑。这将帮助你透彻理解其工作原理。4.1 项目初始化与依赖安装创建一个新的项目目录并安装基础依赖。# 创建项目目录 mkdir simple_ai_town cd simple_ai_town # 创建虚拟环境推荐 python -m venv venv # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate # 安装核心库 pip install openai chromadb python-dotenv创建.env文件存储你的API密钥# .env OPENAI_API_KEY你的_openai_api_key_here4.2 定义核心类世界与居民创建simulation.py文件。# simulation.py import os import time from datetime import datetime, timedelta from typing import List, Dict, Any import openai from dotenv import load_dotenv import chromadb from chromadb.config import Settings # 加载环境变量 load_dotenv() openai.api_key os.getenv(OPENAI_API_KEY) class MemoryStore: 简化的向量记忆存储 def __init__(self): self.client chromadb.Client(Settings(anonymized_telemetryFalse)) # 创建一个集合来存储记忆每个Agent一个集合 self.collection self.client.create_collection(nameagent_memories) def add_memory(self, agent_name: str, content: str, memory_type: strobservation): 添加一条记忆 self.collection.add( documents[content], metadatas[{agent: agent_name, type: memory_type, timestamp: datetime.now().isoformat()}], ids[f{agent_name}_{int(time.time())}] ) def get_related_memories(self, agent_name: str, query: str, n_results: int3) - List[str]: 检索相关记忆 results self.collection.query( query_texts[query], n_resultsn_results, where{agent: agent_name} # 过滤只属于该Agent的记忆 ) return results[documents][0] if results[documents] else [] class Agent: 一个简化的AI居民 def __init__(self, name: str, age: int, traits: str, initial_location: str): self.name name self.age age self.traits traits # 例如好奇友善喜欢烹饪 self.location initial_location self.status 空闲 self.memory_store MemoryStore() def perceive(self, world_state: Dict[str, Any]) - str: 感知世界生成一段描述 perception_prompt f 你是一个名为{self.name}的虚拟居民性格{self.traits}。 当前时间是{world_state[time]}你的位置在{self.location}。 你观察到{world_state[description]} 请用一句话描述你当前的感受和注意到的最重要的事情。 return self._call_llm(perception_prompt) def plan(self, perception: str) - str: 基于感知和记忆制定计划 # 1. 检索相关记忆 related_mems self.memory_store.get_related_memories(self.name, perception) memory_context \n.join(related_mems) if related_mems else 暂无特别相关的记忆。 # 2. 请求LLM制定计划 planning_prompt f 你是{self.name}。 你刚刚感知到{perception} 以下是你的相关记忆 {memory_context} 基于你的性格({self.traits})和当前情况你接下来最想做什么 请只输出一个简单的动作例如“去咖啡馆喝咖啡”、“回家休息”、“找朋友Alice聊天”。 plan self._call_llm(planning_prompt).strip() return plan def act(self, plan: str, world) - str: 执行计划并更新世界状态 # 这是一个非常简化的执行。真实项目里这里会解析计划改变Agent位置、状态并可能影响世界资源。 action_description f{self.name} 决定 {plan}。 print(f[行动] {action_description}) # 将这次行动作为记忆保存 self.memory_store.add_memory(self.name, f在{world.time}我{plan}。, action) # 非常简单的世界交互示例如果计划是去某地则移动 if 去 in plan: new_location plan.split(去)[-1].replace(。, ).strip() self.location new_location action_description f 现在位置变更为{new_location} return action_description def _call_llm(self, prompt: str, model: strgpt-3.5-turbo) - str: 调用OpenAI API的辅助函数 try: response openai.ChatCompletion.create( modelmodel, messages[{role: user, content: prompt}], temperature0.7, max_tokens150 ) return response.choices[0].message.content except Exception as e: print(fLLM调用失败: {e}) return 思考中... class World: 模拟世界 def __init__(self): self.time datetime.now().replace(hour8, minute0) # 从早上8点开始 self.agents: List[Agent] [] self.locations [家, 广场, 咖啡馆, 市场, 公园] def add_agent(self, agent: Agent): self.agents.append(agent) def describe(self) - str: 生成当前世界的描述 agent_locations {} for agent in self.agents: agent_locations.setdefault(agent.location, []).append(agent.name) desc f世界时间{self.time.strftime(%H:%M)}。 for loc, names in agent_locations.items(): desc f 在{loc}的有{, .join(names)}。 return desc def step(self): 推进一个时间步长 print(f\n 世界时间 {self.time.strftime(%H:%M)} ) world_state { time: self.time.strftime(%H:%M), description: self.describe() } for agent in self.agents: print(f\n--- {agent.name} 的回合 ---) # 感知 perception agent.perceive(world_state) print(f[感知] {perception}) # 规划 plan agent.plan(perception) print(f[计划] {plan}) # 行动 action_result agent.act(plan, self) # 行动结果可以进一步影响世界这里简化处理 # 时间流逝 self.time timedelta(minutes30)4.3 运行模拟观察AI社会的“涌现”创建主程序main.py。# main.py from simulation import World, Agent def main(): print(启动简易AI小镇模拟...) # 创建世界 town World() # 创建居民 alice Agent(nameAlice, age28, traits外向有创造力喜欢社交, initial_location家) bob Agent(nameBob, age35, traits务实勤劳喜欢独处, initial_location家) town.add_agent(alice) town.add_agent(bob) # 运行5个时间步长模拟2.5小时 for i in range(5): town.step() # 模拟间隔 time.sleep(1) print(\n模拟结束。) if __name__ __main__: main()4.4 运行与结果分析在终端运行python main.py你将看到类似如下的输出具体内容由LLM生成每次可能不同启动简易AI小镇模拟... 世界时间 08:00 --- Alice 的回合 --- [感知] 早上好新的一天开始了我充满活力想看看今天广场上会不会有什么有趣的活动。 [计划] 去广场散步看看有没有朋友。 [行动] Alice 决定 去广场散步看看有没有朋友。 现在位置变更为广场 --- Bob 的回合 --- [感知] 早上很安静我享受这份宁静想着今天该完成哪些工作。 [计划] 去市场购买今天需要的食材和工具。 [行动] Bob 决定 去市场购买今天需要的食材和工具。 现在位置变更为市场 世界时间 08:30 --- Alice 的回合 --- [感知] 我现在在广场阳光很好但有点冷清。我记得Bob通常这个时间会去市场。 [计划] 去市场找Bob顺便看看有没有新鲜水果。 [行动] Alice 决定 去市场找Bob顺便看看有没有新鲜水果。 现在位置变更为市场 ...结果说明自主性Alice和Bob基于自己的性格和感知做出了不同的初始决策。记忆影响在后续回合中Alice的感知里提到了“我记得Bob...”这体现了记忆对决策的影响虽然我们这里的记忆检索还很基础。社会性Alice在第二回合主动计划“去市场找Bob”产生了简单的社交导向行为。动态变化Agent的位置和计划随着时间推移而改变世界状态描述也随之更新。这个简易原型揭示了AI小镇的核心循环感知 - 检索记忆 - 规划 - 行动 - 存储记忆。完整的My AI Town项目在此基础上增加了更复杂的空间地图、物品系统、情感模型、更高效的记忆检索以及美观的前端可视化。5. 九个月演进对比从概念验证到复杂系统回顾过去九个月AI小镇类项目的发展清晰地展现了几个趋势从单轮对话到持续人格2023年初早期Agent更像一个独立的聊天机器人每次交互上下文有限缺乏长期一致性。现在通过向量数据库存储海量记忆并在每次决策时进行相关性检索Agent形成了连贯的“人生经历”和稳定的性格。提示词工程从简单的指令演变为包含角色设定、核心记忆、当前上下文、行动规范的复杂模板。从孤立个体到社会网络2023年中早期多个Agent共存但交互简单或仅限于广播。现在实现了定向通信、关系网络朋友、同事、家人、声誉系统和合作目标。Agent之间可以形成联盟、产生矛盾、传播谣言社会结构开始涌现。从文本模拟到多模态与环境具身2023年末至今早期世界和行动完全由文本描述。现在/前沿开始集成视觉模型让Agent“看到”像素化的游戏画面、代码执行能力让Agent能操作游戏API、物理引擎更真实的环境交互。Agent的“身体”和环境的“物理规则”变得更加重要。从研究演示到可玩性探索持续进行早期纯技术演示观赏性强但玩家介入点少。现在开发者开始探索玩家角色是规则制定者设定法律、经济系统、特殊Agent化身进入世界、还是幕后影响者通过事件编辑器触发灾难或庆典游戏性设计成为新的挑战。基础设施与性能优化成本早期完全依赖GPT-4成本高昂。现在通过小型模型微调、LLM调用优化如只对关键决策使用大模型、开源模型本地部署来降低成本。速度异步处理、事件驱动架构、更高效的向量检索使得模拟数百个Agent成为可能。6. 常见问题与排查思路在开发或运行此类项目时你会遇到一些典型问题。问题现象可能原因排查与解决思路Agent行为重复或无聊提示词过于简单记忆检索不相关LLM温度参数过低。1. 丰富提示词加入更多性格细节、禁忌和目标。2. 优化记忆检索的查询语句和元数据过滤。3. 适当调高temperature如0.8-1.0增加随机性。模拟运行速度极慢同步调用LLM API向量检索未优化世界状态更新逻辑复杂。1. 使用异步IO如asyncio、aiohttp并发调用LLM。2. 为向量数据库建立索引限制每次检索的条数。3. 将世界状态更新批量处理减少不必要的计算。LLM API调用超限或成本激增Agent每一步都调用LLM提示词token数过多。1. 实现分层决策简单决策如移动路径用规则系统复杂决策如社交再用LLM。2. 压缩提示词总结记忆而非全文注入。3. 设置预算监控和速率限制。Agent行为脱离逻辑或“发疯”LLM产生“幻觉”提示词约束力不足世界状态反馈不准确。1. 在提示词中加强约束如“你必须基于以下事实行动...”。2. 实现验证层Agent行动前先用简单规则检查是否可行如“目标地点是否存在”。3. 给LLM提供更精确、结构化的环境描述。前端显示卡顿或不同步前后端通信频率过高状态更新未做差分。1. 采用WebSocket进行双向实时通信替代频繁的HTTP轮询。2. 后端只推送发生变化的世界状态片段。3. 前端使用防抖debounce技术优化渲染。记忆检索效果差嵌入模型不匹配记忆存储的元数据不完善。1. 确保记忆检索使用的嵌入模型与存储时一致。2. 为记忆添加丰富的元数据类型、重要性、情感色彩、相关人物等便于精准过滤。7. 最佳实践与工程建议如果你想基于此概念开发自己的项目以下经验值得参考设计优先AI在后不要指望LLM解决所有问题。首先用传统游戏设计方法定义清晰的世界规则、经济系统、物理层。LLM是高级决策层应建立在稳定的底层模拟之上。构建可观测与调试工具这是最重要的工程实践。必须为每个Agent配备详细的日志系统记录其完整的“思维链”感知、检索到的记忆、计划、行动。开发一个调试面板可以实时查看任一Agent的内部状态、记忆和最近的想法。这是理解复杂系统行为、排查诡异问题的唯一途径。模块化与数据驱动将Agent组件记忆、规划、通信设计成可插拔的模块。这样你可以轻松更换不同的LLM提供商、向量数据库或规划算法。将Agent的性格、初始知识、世界规则定义为JSON或YAML配置文件实现数据驱动无需修改代码即可创建新角色或调整平衡性。实施严格的“安全护栏”LLM不可控必须设置边界。所有Agent的最终行动必须经过一个安全过滤层检查是否违反游戏规则如试图获取不存在的物品、移动到非法区域。对于文本输出尤其是Agent间对话考虑进行内容过滤避免生成不当内容。性能与成本优化策略缓存对常见的、确定性的查询结果如“从家到广场的路径”进行缓存。摘要定期将琐碎的短期记忆总结成一条长期记忆减少存储和检索的负担。模型分级对创造性规划使用能力强的大模型如GPT-4对简单分类或摘要使用成本低的小模型如GPT-3.5-Turbo甚至开源小模型。拥抱开源与社区My AI Town等项目是绝佳的起点。不要重复造轮子先 Fork 代码阅读其架构理解其设计取舍。关注如LangChain、AutoGen、CrewAI等AI Agent框架的发展它们提供了构建多智能体系统的标准化工具和模式。AI驱动的模拟游戏正处于爆发前夜它不仅是游戏设计的革命更是研究人类社会、经济、组织的数字实验室。从九个月前粗糙的概念演示到今天具备记忆、社交和初步“人格”的复杂系统进展令人惊叹。然而挑战依然巨大如何让模拟既有趣又稳定如何平衡开放性与可控性如何将高昂的AI成本降至消费级水平对于开发者而言现在入场正当时。你可以从搭建一个只有两个Agent的微型世界开始观察它们如何互动。重点不是复现一个完整的游戏而是深入理解感知-记忆-规划-行动这一核心循环并亲手构建起调试和观察这套系统的工具。在这个过程中积累的关于提示词工程、向量检索、异步编程和系统架构的经验其价值将远超项目本身。
返回列表