很多做游戏的同学看到“A tycoon game where you run an AI company”这个构思,第一反应往往是:换皮。把“采矿”换成“训练模型”,把“工厂流水线”换成“数据中心”,再改一遍 UI,好像就能交差了。但真正动手设计之后你会发现,这个判断只对了一半。
AI 公司模拟经营游戏吸引人的地方,不完全在于“搞钱”,而在于它把算力、数据、模型质量、人才、产品上线、市场口碑这些要素拧成了一个非常特殊的资源循环。玩家不是在堆数值,而是在经营一家“持续训练模型并对外提供 AI 服务”的公司。它的成本结构、研发周期、收入方式,和传统经营游戏完全不同。
这篇文章会从一个可落地的原型出发,拆解 AI 公司模拟经营游戏的核心玩法循环、数值模型、系统分层,并给出一套基于 Python 的模拟核心实现。你可以把它看作一篇“AI 公司 Tycoon 游戏的数值与技术设计笔记”。读完以后,即使你暂时不写游戏,也能用这套思路快速验证一个模拟经营玩法的可行性。
1. 这篇文章真正要解决的问题
把“经营 AI 公司”做成游戏,最难的不是画一堆模型卡牌,也不是做一个招聘页面,而是回答三个问题:
第一,玩家每天、每月做什么?如果只是“点按钮买算力,再点按钮训练模型”,玩家很快就会流失。经营模拟的核心是让玩家在有限资源下做选择:是先买数据,还是先扩算力?是先做轻量 API,还是赌一把做对话大模型?这些选择必须产生可感知的后果。
第二,AI 公司的钱是怎么赚的?传统游戏里,工厂生产商品、商品卖钱、钱再买原料,循环非常清晰。但 AI 公司不是这样。模型训练完并不是终点,要持续承担 GPU 成本、数据更新成本、推理成本,还要面对产品同质化和市场口碑问题。如果游戏里没有体现“模型质量”和“产品收入”之间的非线性关系,玩家会觉得自己在玩一个加了 AI 名词的普通工厂。
第三,怎么让玩家感受到“成长”?现实里训练一个模型可能需要很多钱,但在游戏里,数值节奏必须被压缩。你既要让玩家在几十分钟内完成从“研究模型”到“上线产品”的完整循环,又要让每一步都有“变强”的感觉。
这篇文章的目标读者是:想开发 AI 题材模拟经营游戏的策划和程序,想用最小成本验证游戏玩法的独立开发者,以及正在做 AI 应用但对“如何把 AI 服务打包成产品”感兴趣的人。
我会先讲清楚 AI 公司模拟经营的核心概念和玩法映射,再给出一套三层系统架构,然后重点拆解数值公式和 Python 实现。最后会讲常见排错思路、工程化建议和商业化落地时需要避开的坑。
2. 模拟经营游戏的核心概念与玩法映射
在传统 Tycoon 游戏里,资源通常是“原料、生产线、商品、资金”。但在 AI 公司题材里,资源体系需要整体替换成下面五类:
| 游戏资源 | 对应现实概念 | 游戏中的用途 |
|---|---|---|
| 算力 Compute | GPU/TPU 集群、云端算力 | 训练模型和提供推理服务,越多研发越快 |
| 数据 Data | 训练集、用户反馈、标注数据 | 提升模型质量,缺少数据模型会“不聪明” |
| 模型 Model | 基础模型、专用模型 | 游戏里的“技术资产”,决定产品能力上限 |
| 产品 Product | API、SaaS、机器人、内容工具 | 对外提供服务和收入的主要来源 |
| 人才 Talent | 研究员、工程师、销售 | 决定研发速度、模型质量和产品落地能力 |
这里面最容易做错的是把“模型”当成普通商品。传统工厂里,商品一旦生产出来,成本和售价都比较固定。可 AI 模型不是这样。模型训练完还要持续喂养数据、持续迭代,而且模型质量直接决定产品能不能卖出去。
为了在游戏里体现这一点,我们可以把模型质量设计成一个综合数值,它受四个因素影响:基础模型潜力、投入算力、可用数据量、团队研发能力。最终某个产品的月收入,又和模型质量、市场需求、公司声誉挂钩。这样,玩家每一次买算力、买数据、招聘人才,最终都会通过“模型质量”反馈到“收入”上,形成完整的因果链。
另一个值得注意的概念是“产品生命周期”。真实 AI 产品很容易出现上线后热度下降、用户流失、竞品降价等情况。游戏里如果缺少市场衰减机制,玩家只要上线一个高收入产品,后面就什么都不用做了。所以我们还要在核心循环里加入“市场变化”这一层,比如需求波动、产品老化、竞品冲击。
3. 游戏系统的三层架构设计
我建议把 AI 公司模拟经营游戏拆成三层:
3.1 资源层
资源层负责管理算力、数据、资金、人才等基础资源。玩家通过市场购买算力,通过数据包或用户反馈积累数据,通过招聘获得研究员和工程师。
这一层的核心设计点是“资源要互相转换,但不能无脑转换”。比如:买算力可以加快训练,但会消耗大量资金;买数据可以提升质量,但数据过多时收益会递减;招研究员可以提升研发速度,但每月要发工资。玩家必须不断调整资源结构,而不是把某一个资源堆到最高。
3.2 研发层
研发层管理模型训练项目。玩家启动一个“训练项目”后,需要投入算力、数据和研发人力。项目进度不是瞬间完成的,而是随着时间不断推进。训练完成后,模型会获得一个“质量分”。
这一层的关键是“研发进度”和“模型质量”两个指标。进度决定项目什么时候能上线,质量决定上线后产品能赚多少钱。我们可以让进度和质量解耦:进度主要看工程师数量和算力;质量主要看数据规模、团队研发能力和项目基础潜力。
3.3 市场层
市场层负责把模型转变成产品并产生收入。比如,一个对话模型可以包装成“智能客服机器人”,一个分类模型可以做成“内容审核 API”。产品上线后,每月根据市场需求、模型质量、公司声誉产生收入。
这一层还要加入市场波动。比如某个月整体 AI 需求上升,曝光量增加;某个月出现大量竞品,产品收入下降。玩家需要根据市场变化决定是继续投研发,还是转向其他产品线。
三层结构串起来以后,完整的玩法循环是:
- 花钱买算力和数据
- 启动模型训练项目
- 等待研发完成并获得模型质量
- 把模型包装成产品上线
- 产品每月产生收入
- 收入再投入到下一轮研发
- 同时根据市场波动调整策略
4. 数值设计:如何让游戏“看起来像一家 AI 公司”
有了系统架构,接下来重点看数值公式。这一部分决定玩家是否能感受到“我在做 AI 公司,而不是做面包工厂”。
4.1 模型质量公式
模型质量是全局最核心的数值。我的建议是:
model_quality = min(0.99, base_quality * compute_bonus * data_bonus * team_bonus)其中:
base_quality是模型基础潜力,比如轻量分类模型是 0.6,对话大模型是 0.75。compute_bonus和data_bonus使用对数函数,让资源投入存在边际递减。team_bonus和团队人数相关,人数越多团队经验越丰富,但人数本身不应该无限收益。
用对数函数而不是线性函数,是 AI 模拟经营里非常重要的一点。真实世界里,算力提升一倍,模型效果不一定会提升一倍,最后阶段甚至提不动。游戏里如果不做递减,玩家会只买同一种资源,游戏策略性会消失。
一个实际可用的公式可以写成:
compute_bonus = 1.0 + 0.20 * math.log10(1.0 + compute) data_bonus = 1.0 + 0.15 * math.log10(1.0 + data) team_bonus = 1.0 + 0.02 * (researchers + engineers)当compute = 20、data = 30、researchers = 1、engineers = 1时,compute_bonus约 1.26,data_bonus约 1.22,team_bonus为 1.04。这个幅度正好能让人感觉到“我投入资源后模型确实变强了”,但又不至于无脑碾压。
4.2 产品收入公式
产品收入可以直接和模型质量挂钩。公式可以写成:
monthly_revenue = product_price * market_demand * confidence_factor * reputation_factor其中:
product_price是产品挂牌价,比如智能客服每月 3000 元。market_demand是当前市场对该类产品的需求,范围 0 到 1。confidence_factor和模型质量相关。质量越高,客户越愿意付费。reputation_factor和公司声誉相关,声誉高会让产品更容易卖出去。
这里的重点是:模型质量越高,客户对产品的信心越强。如果模型质量只有 0.3,产品基本上没有收入;质量到 0.8 以上,收入才会有明显增长。
4.3 研发进度公式
项目进度不可能瞬间完成。我建议用每月进度累加:
project.progress += 0.1 * engineers + 0.05 * researchers工程师对进度贡献更大,研究员对质量贡献更大,这样两种人才各有定位。玩家必须考虑先招谁:想快速上线,招工程师;想做出高质量产品,招研究员。
4.4 数值检查表
设计完成后,建议用一张表检查数值是否合理:
| 检查项 | 目标 |
|---|---|
| 初始资金能否撑过第一个项目 | 至少能覆盖前 6 个月工资和研发成本 |
| 第一轮产品上线后是否回本 | 大约 10-20 个月回本比较有经营感 |
| 资源投入是否边际递减 | 必须明显,否则玩家会堆单一资源 |
| 模型质量是否设上限 | 设 0.99 上限,防止数值爆炸 |
| 市场是否有周期波动 | 有,否则后期会变成挂机游戏 |
5. 环境准备与前置条件
接下来进入代码实现。这一节不是做一个完整商业游戏,而是用最小原型跑通“AI 公司模拟经营”的核心循环。
建议环境如下:
- Python 3.9 及以上版本
- 不需要第三方依赖,使用标准库即可
- 任意支持 UTF-8 编码的编辑器,比如 VS Code、PyCharm
- 操作系统不限,Windows、macOS、Linux 都可以
项目目录建议这样组织:
ai_company_tycoon/ ├── config/ │ └── ai_company_config.json ├── simulation/ │ └── core.py ├── run_demo.py └── README.md配置文件用来放所有游戏参数。这样做的好处是:策划和程序可以分工,程序不需要为每个参数改动重新编译;后续做 Web 版或移动端时,也可以把这套 JSON 配置直接搬到服务端。
在实际项目中,版本不需要过于纠结。你完全可以用 Python 3.9 开始,后续如果要做 Unity 客户端再重写核心逻辑。先把玩法验证跑通,远比一开始就上重型框架重要。
6. 核心流程拆解与完整代码实现
下面我们按照“配置文件 → 模拟核心 → 运行脚本”的顺序来实现。
6.1 配置文件
创建config/ai_company_config.json:
{ "start_capital": 1200000, "resources": { "compute": { "base_price": 100 }, "data": { "base_price": 50 }, "talent": { "researcher_base_salary": 15000, "engineer_base_salary": 10000 } }, "models": [ { "id": "classifier_cpu", "name": "轻量分类模型", "required_scale": 1, "base_quality": 0.6, "dev_cost": 120000 }, { "id": "chat_llm", "name": "对话大模型", "required_scale": 8, "base_quality": 0.75, "dev_cost": 500000 } ], "products": [ { "id": "content_moderation_api", "name": "内容审核 API", "model_id": "classifier_cpu", "market_demand": 0.7, "base_price": 800 }, { "id": "customer_service_bot", "name": "智能客服机器人", "model_id": "chat_llm", "market_demand": 0.5, "base_price": 3000 } ] }这个配置里藏着几个关键设计:
required_scale是启动模型训练的最少算力要求。玩家算力不足时不能启动大项目。dev_cost是模型研发的一次性成本。market_demand是产品所在赛道的需求,不同产品线有不同的市场空间。base_price是产品月定价,可以理解成客户购买服务后每月支付的价格。
6.2 模拟核心
创建simulation/core.py:
import json import math from dataclasses import dataclass, field from typing import Dict, List @dataclass class CompanyState: capital: float compute: float = 0.0 data: float = 0.0 research_points: float = 0.0 month: int = 0 researchers: int = 1 engineers: int = 1 active_projects: List[Dict] = field(default_factory=list) products: List[Dict] = field(default_factory=list) reputation: float = 50.0 def to_dict(self) -> Dict: return { "month": self.month, "capital": round(self.capital, 2), "compute": round(self.compute, 2), "data": round(self.data, 2), "research_points": round(self.research_points, 2), "researchers": self.researchers, "engineers": self.engineers, "reputation": round(self.reputation, 2), "products": self.products, } class AICompanySimulator: def __init__(self, config_path: str): with open(config_path, "r", encoding="utf-8") as f: self.config = json.load(f) self.state = CompanyState(capital=float(self.config["start_capital"])) def buy_resource(self, resource: str, amount: float) -> bool: if resource not in ("compute", "data"): return False price = float(self.config["resources"][resource]["base_price"]) cost = price * amount if self.state.capital < cost: return False self.state.capital -= cost setattr(self.state, resource, getattr(self.state, resource) + amount) return True def start_project(self, model_id: str, product_id: str) -> bool: try: model = next(m for m in self.config["models"] if m["id"] == model_id) product = next(p for p in self.config["products"] if p["id"] == product_id) except StopIteration: return False if product["model_id"] != model_id: return False required_scale = float(model["required_scale"]) if self.state.compute < required_scale: return False dev_cost = float(model["dev_cost"]) if self.state.capital < dev_cost: return False self.state.capital -= dev_cost self.state.active_projects.append({ "model_id": model_id, "product_id": product_id, "progress": 0.0 }) return True def step_month(self): self.state.month += 1 self.state.research_points += 2.0 * self.state.researchers completed = [] for project in self.state.active_projects: project["progress"] += 0.1 * self.state.engineers + 0.05 * self.state.researchers if project["progress"] >= 1.0: completed.append(project) for project in completed: self._complete_project(project) self.state.active_projects.remove(project) self._pay_salaries() self._collect_revenue() self._apply_market_effects() def _complete_project(self, project: Dict): model = next(m for m in self.config["models"] if m["id"] == project["model_id"]) product = next(p for p in self.config["products"] if p["id"] == project["product_id"]) quality = self._calc_model_quality(model) self.state.products.append({ "name": product["name"], "model_id": model["id"], "quality": quality, "monthly_price": float(product["base_price"]), "market_demand": float(product["market_demand"]), }) self.state.reputation = min(100.0, self.state.reputation + quality * 5) def _calc_model_quality(self, model: Dict) -> float: base_quality = float(model["base_quality"]) compute_bonus = 1.0 + 0.20 * math.log10(1.0 + self.state.compute) data_bonus = 1.0 + 0.15 * math.log10(1.0 + self.state.data) team_bonus = 1.0 + 0.02 * (self.state.researchers + self.state.engineers) quality = base_quality * compute_bonus * data_bonus * team_bonus return round(min(0.99, quality), 4) def _pay_salaries(self): researcher_salary = float(self.config["resources"]["talent"]["researcher_base_salary"]) engineer_salary = float(self.config["resources"]["talent"]["engineer_base_salary"]) self.state.capital -= researcher_salary * self.state.researchers self.state.capital -= engineer_salary * self.state.engineers def _collect_revenue(self): for product in self.state.products: demand = float(product["market_demand"]) quality = float(product["quality"]) price = float(product["monthly_price"]) confidence = 1.0 - max(0.0, 0.8 - quality) reputation_factor = 1.0 + self.state.reputation / 200.0 revenue = price * demand * confidence * reputation_factor self.state.capital += revenue def _apply_market_effects(self): for product in self.state.products: if self.state.month % 7 == 0: product["market_demand"] = max(0.1, float(product["market_demand"]) * 0.95)这段代码的核心逻辑很清晰:
start_project会检查模型、产品、算力、资金四个条件,避免玩家乱开项目。step_month代表一个月的模拟推进。先加研发进度,再完成项目,然后发工资、收收入、触发市场波动。_calc_model_quality使用对数函数控制资源边际递减。_collect_revenue把模型质量转成客户付费信心,质量越高,产品收入越高。_apply_market_effects每 7 个月让市场需求下降 5%,避免玩家一个产品吃一辈子。
6.3 运行脚本
创建run_demo.py:
from simulation.core import AICompanySimulator def main(): sim = AICompanySimulator("config/ai_company_config.json") sim.buy_resource("compute", 20.0) sim.buy_resource("data", 30.0) if not sim.start_project("chat_llm", "customer_service_bot"): print("启动项目失败,请检查资金、算力是否足够") return for _ in range(12): sim.step_month() state = sim.state print( f"第{state.month:02d}月 | " f"资金: {state.capital:>12,.2f} | " f"算力: {state.compute:>6.1f} | " f"数据: {state.data:>6.1f} | " f"产品数: {len(state.products)}" ) if __name__ == "__main__": main()运行方式:
python run_demo.py这样我们就搭好了一个最小可玩的 AI 公司模拟经营原型。
7. 运行结果与效果验证
如果一切正常,控制台输出会类似下面这样:
第01月 | 资金: 671,500.00 | 算力: 20.0 | 数据: 30.0 | 产品数: 0 第02月 | 资金: 646,500.00 | 算力: 20.0 | 数据: 30.0 | 产品数: 0 第03月 | 资金: 621,500.00 | 算力: 20.0 | 数据: 30.0 | 产品数: 0 第04月 | 资金: 596,500.00 | 算力: 20.0 | 数据: 30.0 | 产品数: 0 第05月 | 资金: 571,500.00 | 算力: 20.0 | 数据: 30.0 | 产品数: 0 第06月 | 资金: 546,500.00 | 算力: 20.0 | 数据: 30.0 | 产品数: 0 第07月 | 资金: 523,731.25 | 算力: 20.0 | 数据: 30.0 | 产品数: 1 第08月 | 资金: 500,962.50 | 算力: 20.0 | 数据: 30.0 | 产品数: 1 第09月 | 资金: 478,193.75 | 算力: 20.0 | 数据: 30.0 | 产品数: 1 第10月 | 资金: 455,425.00 | 算力: 20.0 | 数据: 30.0 | 产品数: 1 第11月 | 资金: 432,656.25 | 算力: 20.0 | 数据: 30.0 | 产品数: 1 第12月 | 资金: 409,887.50 | 算力: 20.0 | 数据: 30.0 | 产品数: 1怎么判断这个原型是成功的?主要看三点:
第一,项目不是瞬间完成的。对话大模型需要约 7 个月才能上线,这给了玩家“研发周期”的感知。第二,产品上线后确实能产生收入,但收入不足以覆盖全部成本,说明玩家还需要继续优化资源结构。第三,资金曲线是稳定下降的,说明当前配置属于偏困难启动,玩家需要通过后续融资、提高模型质量、拓展产品线来扭亏为盈。
如果跑出来不是这个结果,不要急着调代码。先检查 JSON 文件是不是 UTF-8 编码,再检查start_project是否成功返回True。可以在启动项目后打印sim.state.capital来确认研发费用是否被扣除。
8. 常见问题与排查思路
原型阶段最容易出问题的点其实不在 Python 语法,而在配置和数值设计。下面这张表总结了我在类似模拟项目里最常遇到的几类问题:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 读取 JSON 报错 | 文件编码不是 UTF-8 | 用编辑器查看右下角编码 | 另存为 UTF-8 编码 |
| 启动项目一直失败 | 资金或算力不足 | 打印start_project的返回值和当前资源 | 给 UI 加“启动条件不满足”提示 |
| 模型质量永远是 0.99 | 对数增长过快,资源上限没控制 | 打印compute_bonus、data_bonus | 调低系数,或增加质量衰减 |
| 第 7 个月才上线产品 | 研发速度太慢 | 查看project["progress"]的增长速度 | 加大工程师对进度的贡献 |
| 后期资金爆炸 | 收入增长没有边际递减 | 观察月现金流曲线 | 增加维护成本、市场衰减、竞品事件 |
| 产品没有收入 | market_demand过低 | 打印配置中产品需求 | 调大需求,或让模型质量影响需求上限 |
排查的时候我建议采用“从配置到代码”的顺序。先确认配置里的数字是否符合预期,再确认模拟核心里的公式是否正确,最后才看 UI 和交互。很多数值问题并不是代码 bug,而是配置参数错得离谱。
另外需要注意,_collect_revenue里的confidence系数可能大于 1,这是故意的。质量很高时,客户愿意支付比挂牌价更高的费用,因为产品“值这个价”。如果你不想让收入膨胀,可以使用min(1.2, confidence)做一个上限。
9. 工程化与产品化建议
上面的原型只解决了一个问题:核心循环能不能跑通。但如果要把它做成真正的游戏,还需要补很多工程化能力。
9.1 配置和代码分离
建议所有数值参数都放在 JSON 或数据库里,而不是硬编码在 Python 中。到后期,策划会频繁调整算力价格、模型参数、产品需求,如果每次都要改代码,会非常痛苦。把配置抽出来以后,策划可以直接改配置,程序只需要保证配置加载逻辑稳定。
9.2 事件系统驱动
不要把所有逻辑都塞进一个step_month。更好的做法是设计一个事件队列:
- “模型训练完成”是一个事件。
- “市场需求变化”是一个事件。
- “突发竞品出现”是一个事件。
- “公司获得融资”是一个事件。
事件驱动的好处是,后续加新玩法不需要改核心循环,只要注册新事件即可。比如做“AI 产品被黑客攻击”事件,只需要在事件处理器里减声誉,不影响其他模块。
9.3 数据持久化
原型里没有存档功能。真实游戏必须考虑玩家离线后的状态。建议用 SQLite 保存公司状态,用 Redis 保存实时排行榜。如果做单机游戏,至少要把CompanyState序列化成 JSON 再写文件。
9.4 监控和日志
模拟经营游戏最容易出现“数值悄悄崩了”的问题。建议在每个step_month末尾记录一条日志,包含资金、算力、数据、模型质量、产品收入、月现金流。如果测试时发现玩家第 20 个月资金变得异常,可以通过日志迅速回溯。
9.5 关于合规与安全
如果你要做成多人在线游戏,还要考虑玩家输入内容的过滤、账号体系的安全、排行榜防作弊等问题。任何涉及玩家上传内容的产品,都应该在服务端做内容校验,不要在客户端只做一次过滤就认为是安全的。游戏后台的管理操作要遵循最小权限原则,避免普通玩家误触管理接口。
9.6 先做数值原型,再写游戏引擎
这一点对新团队尤其重要。很多团队一上来就做 3D 场景、角色动画、UI 特效,结果核心玩法还没跑通。建议先用 Python 或 Excel 搭建数值模型,验证完“模型质量—产品收入—资金循环”是否成立,再进入实际客户端开发。数值模型是整个游戏的骨架,骨架没做好,换再好看的皮肤也留不住玩家。
10. 后续可以继续深入的方向
如果你已经跑通这个原型,下一步可以按下面的优先级继续扩展:
先做一个简单 UI,让玩家能看见算力、数据、资金、模型质量这些关键指标。UI 不需要好看,但要能清晰表达“我在这一步投入了什么,换来了什么”。
然后添加事件系统。比如每个月有概率触发“竞争对手发布新模型”,如果玩家不跟进,产品收入就会下降。这类事件能让游戏从“纯数值堆叠”变成“有决策冲突”。
接着可以扩展产品线。不要只做 API 和客服机器人,还可以加入 AI 绘画工具、AI 编程助手、Agent 应用等。不同产品线使用不同模型,对应不同的市场需求和收入曲线。
最后考虑融资和上市系统。AI 公司是典型的“高投入、高估值”行业,玩家可以通过融资获得大量资金,但也必须承担对赌、估值稀释、战略方向被投资人干预等代价。这会让经营决策更有戏剧性。
当然,具体做哪些内容,取决于你想让游戏面向硬核模拟玩家还是休闲玩家。硬核玩家愿意接受复杂的人员管理和研发管线,休闲玩家则需要更快拿到正反馈。最好的做法,是像前面说的那样,先用一套可配置的数值模型跑出多条成长路径,再根据目标玩家群体做减法。
做 AI 公司模拟经营游戏,本质上不是写一套复杂算法,而是找到一个让玩家不断做选择的循环。算力、数据、模型质量、产品收入、市场波动,每一个数值都应该服务于这个循环。先把这条链做扎实,再考虑画面和表现层,游戏自然会好玩起来。