🚀 在线体验:访问 https://cookiegg.github.io/UnchosenPath/ 立即开始你的人生推演!
一个基于 AI 大语言模型驱动的互动式人生模拟游戏,通过深度的社会洞察和第一性原理推演,模拟不同年龄,不同境遇的人在指定时间段内的人生轨迹。用户通过一系列关键决策,体验不同选择带来的人生结果,最终获得个性化的人生评价报告。
- 教育意义:帮助年轻人思考未来规划、职业选择和人生决策
- 社会洞察:基于真实的社会趋势(AI 发展、人口结构、经济转型、地缘政治)进行推演
- 个性化体验:根据用户的教育背景、家庭条件、性格特质生成定制化剧情
- 技术创新:展示 AI 在互动叙事和决策模拟领域的应用潜力
- 支持多个主流 AI 提供商(Gemini、DeepSeek、Qwen、GLM、OpenAI 等)
- 完整的游戏状态管理和本地持久化
- 响应式设计,支持桌面和移动端
- 类型安全的 TypeScript 实现
- 优雅的错误处理和重试机制
- Node.js 16+
- npm 或 yarn
# 1. 克隆项目
git clone <repository-url>
cd UnchosenPath
# 2. 安装依赖
npm install
# 3. 启动开发服务器
npm run dev
# 4. 访问应用
# 浏览器打开 http://localhost:3000# 构建生产版本
npm run build
# 预览生产构建
npm run preview构建产物位于 dist/ 目录。
下图展示了十年人生模拟器的完整系统架构,包括用户界面、组件层、服务层、AI 提供商集成以及数据持久化等核心模块:
架构说明:
- 用户层:用户通过 Web 界面进行操作和输入
- 应用层:
App.tsx作为主应用,负责状态管理和路由控制 - 组件层:可复用的 UI 组件(按钮、场景卡片等)
- 服务层:
geminiService.ts封装了与 AI 的交互逻辑 - AI 提供商:支持多个 AI 提供商(Gemini、DeepSeek、Qwen 等)
- 数据层:使用 LocalStorage 进行游戏状态和配置的持久化
- 数据处理:JSON 清理、重试机制和错误处理
- 状态机:管理游戏的各个阶段(角色创建、游戏进行、加载、结束)
用户创建个性化的角色档案,这些信息将影响 AI 生成的剧情走向。系统支持多种人生状态,从学生到在职、创业、待业等,提供全面的角色定制能力。
基础信息
- 姓名(name): 字符串,必填
- 性别(gender): 男/女
- 年龄(age): 数字,范围 18-65 岁
- 籍贯(hometown): 省市结构化数据(province + city)
- 当前所在地(currentLocation): 省市结构化数据
当前状态与教育
-
当前状态(currentStatus):
- 学生
- 在职
- 创业
- 待业
- 自由职业
- 退休
-
学历水平(education):
- 无
- 高中
- 大专
- 本科
- 硕士
- 博士
-
当前年级(grade): 仅当状态为"学生"时显示
- 小学(一年级至六年级)
- 初中(初一至初三)
- 高中/职高(高一至高三)
- 大学/大专(大一至大五)
- 研究生(研一至研三、博士在读)
-
高校层次(universityTier): 仅当年级为大学/研究生时显示
- Top 2(清北)
- C9/华五
- 985/211 重点大学
- 普通一本/二本
- 大专/职业院校
- 海外名校(QS Top 100)
- 普通海外高校
职业与专业
- 职业(profession): 非学生状态时填写,支持智能自动补全
- 示例:软件工程师、医生、教师
- 专业(major): 学生状态时填写,支持智能自动补全
- 示例:计算机科学、临床医学、金融学
家庭背景
-
家庭经济状况(familyBackground):
- 富裕(家产丰厚/有矿)
- 中产(衣食无忧/城市土著)
- 工薪(普通家庭)
- 贫困(寒门学子)
-
父母职业(parentsOccupation):
- 务农
- 小生意
- 白领
- 基层公务员
- 中高层管理
- 老板/企业家
- 专业人士
- 其他
性格测试(MBTI)
- 能量来源: E(外向)/ I(内向)
- 认知方式: S(实感)/ N(直觉)
- 决策方式: T(思考)/ F(情感)
- 生活方式: J(判断)/ P(感知)
- 实时显示 MBTI 类型(如 INTJ)和对应人格名称(如"建筑师")
能力与背景
- 特长与技能(skills): 字符串,必填
- 示例:编程、写作、设计、外语等
- 自定义备注(customBio): 可选,用于补充个人故事或特殊设定
- 使用 React State 管理表单数据
- 动态表单:根据"当前状态"和"年级"显示/隐藏相关字段
- 智能组件:
LocationCascader: 省市级联选择器ProfessionAutocomplete: 职业/专业智能补全
- 表单验证:
- 必填字段检查(姓名、籍贯、所在地、技能)
- 条件必填(学生需填专业和年级,非学生需填职业)
- 大学生需选择高校层次
- 自动聚焦到姓名输入框,优化用户体验
- 响应式布局:支持桌面和移动端
用户去对应的模型供应商处申请API Key, 填入就行.
| 提供商 | 默认模型 | Base URL | 特点 |
|---|---|---|---|
| Google Gemini | gemini-2.5-flash | SDK 直连 | 推荐,支持环境变量 |
| DeepSeek | deepseek-chat | https://api.deepseek.com | 深度求索 |
| Moonshot (Kimi) | moonshot-v1-8k | https://api.moonshot.cn/v1 | 月之暗面 |
| Qwen (阿里云) | qwen-plus | https://dashscope.aliyuncs.com/compatible-mode/v1 | 通义千问 |
| GLM (智谱) | glm-4-flash | https://open.bigmodel.cn/api/paas/v4 | 智谱 AI |
| OpenAI | gpt-4o-mini | https://api.openai.com/v1 | ChatGPT |
| Custom | 自定义 | 自定义 | 自定义提供商 |
- 本地存储: 配置保存在
localStorage中(key:life_sim_ai_config) - 预设配置: 每个提供商有预设的 Base URL 和模型名称
- 配置界面: 模态弹窗,支持动态切换提供商
interface AIConfig {
provider: ModelProvider; // 提供商类型
apiKey: string; // API 密钥
baseUrl: string; // API 基础 URL
modelName: string; // 模型名称
}enum GameState {
INTRO = 'INTRO', // 角色创建
PLAYING = 'PLAYING', // 游戏进行中
LOADING_TURN = 'LOADING_TURN', // 加载下一回合
GAME_OVER = 'GAME_OVER', // 游戏结束
ERROR = 'ERROR' // 错误状态
}- 自动保存: 游戏状态变化时自动保存到
localStorage - 断点续玩: 刷新页面后自动恢复进度
- 存储内容:
- 当前游戏状态
- 玩家档案
- 当前场景
- 最终评价
- 历史记录
life_sim_ai_config: AI 配置life_sim_game_state: 游戏状态
推演框架(基于第一性原理)
- 技术变革影响: AI、自动化对职业的替代性
- 人口与劳动力: 老龄化、生育率、就业竞争
- 经济与产业周期: 增长模式转型、新兴产业
- 教育与阶层流动: 学历贬值、体制内 vs 市场化
- 地缘政治: 中美关系、产业链重构
- 社会文化: 内卷、躺平、婚恋观念
- 人性弱点: 即时满足、认知偏差、社交困境、执行力问题
模拟原则
- 真实性:基于统计规律,避免"爽文"式逆袭
- 路径依赖:早期选择影响深远
- 多元成功观:不只以收入定义成功
- 宏观嵌入微观:通过具体事件体现大趋势
- 动态调整:根据选择和环境变化调整剧情
虚构名称规则
- 禁止使用真实公司名称(避免法律风险)
- 使用虚构但真实感的名称
- 行业特征明显
用户创建角色
↓
调用 initializeGame(profile)
↓
AI 生成初始场景(2025年,大学阶段)
↓
用户选择选项
↓
调用 nextTurn(choiceText)
↓
AI 生成下一场景(时间推进 0.5-2 年)
↓
重复直到 isGameOver = true
↓
调用 getFinalEvaluation()
↓
生成十年人生报告
interface GameScenario {
phase: string; // 时间节点(如"2026年春季 - 大一下学期")
description: string; // 详细的情境描述
options: GameOption[]; // 3-4 个选择
feedback?: string; // 对上一次选择的反馈
isGameOver: boolean; // 是否游戏结束
gameOverReason?: string; // 结束原因
}- 自动重试: 失败后自动重试 3 次
- 指数退避: 每次重试延迟时间递增(2s, 4s, 6s)
- 错误提取: 提取有用的错误信息展示给用户
const withRetry = async <T>(
fn: () => Promise<T>,
retries = 3,
delay = 2000
): Promise<T>AI 返回的内容可能包含 Markdown 代码块或额外文本,需要清理:
const cleanJson = (text: string): string => {
// 提取第一个 '{' 到最后一个 '}' 之间的内容
const firstBrace = text.indexOf('{');
const lastBrace = text.lastIndexOf('}');
return text.substring(firstBrace, lastBrace + 1);
}使用 React ErrorBoundary 捕获组件崩溃:
- 显示友好的错误页面
- 提供重新加载按钮
- 防止整个应用崩溃
记录用户在游戏中的每一次选择和结果,形成完整的人生履历。
interface HistoryItem {
phase: string; // 阶段(如"2026年春季")
description: string; // 情境描述
choiceText: string; // 用户的选择
feedback?: string; // AI 的反馈
timestamp: number; // 时间戳
}- 时间轴样式的垂直布局
- 每个节点显示阶段、情境、选择、反馈
- 支持滚动查看完整历史
interface FinalEvaluation {
score: number; // 人生满意度评分(0-100)
title: string; // 结局称号(如"A7 公务员"、"全球游民")
summary: string; // 深度分析十年路径
timeline: string; // 十年大事记(关键里程碑)
advice: string; // 给年轻人的建议
}- 80-100 分: 绿色(成功)
- 60-79 分: 琥珀色(中等)
- 0-59 分: 红色(需改进)
- 生成 Markdown 格式的完整报告
- 包含个人档案、人生履历、最终回顾、人生建议
- 文件名格式:
{姓名}_人生模拟_{时间戳}.md
用户填写角色信息
↓
点击"开始模拟人生"
↓
检查 AI 配置是否完整
↓
调用 initializeGame(profile)
↓
构建系统提示词(包含角色信息)
↓
创建 AI 会话(Gemini 或 OpenAI)
↓
发送初始化消息
↓
AI 返回 JSON 格式的初始场景
↓
清理和解析 JSON
↓
更新游戏状态为 PLAYING
↓
渲染场景卡片
用户点击选项
↓
调用 nextTurn(choiceText)
↓
发送用户选择到 AI
↓
AI 基于历史和选择生成下一场景
↓
返回 JSON 格式的场景数据
↓
清理和解析 JSON
↓
记录到历史数组
↓
检查 isGameOver 标志
↓
如果游戏结束 → 调用 getFinalEvaluation()
如果继续 → 渲染新场景
游戏结束(isGameOver = true)
↓
更新状态为 LOADING_TURN
↓
调用 getFinalEvaluation()
↓
发送评价请求到 AI
↓
AI 回顾所有历史决策
↓
生成评分、称号、总结、时间线、建议
↓
返回 JSON 格式的评价数据
↓
清理和解析 JSON
↓
更新状态为 GAME_OVER
↓
渲染最终报告页面
- 客户端存储: API Key 存储在浏览器 localStorage 中
- 本地存储: 所有游戏数据仅存储在用户浏览器中
- 无服务器: 不收集或上传用户数据
- AI 提供商: 用户输入会发送到选择的 AI 提供商
- 虚构名称: 避免使用真实公司名称
- 敏感话题: AI 提示词中包含内容审查指导
- 用户输入: 前端验证,防止注入攻击
- 打开应用,进入角色创建界面
- 点击右上角设置按钮,配置 AI 提供商和 API Key
- 填写个人信息(姓名、性别、籍贯等)
- 选择教育背景和家庭背景
- 完成 MBTI 性格测试
- 填写专业兴趣和特长技能
- 点击"开始模拟人生"
- 阅读当前场景描述
- 查看 AI 对上一次选择的反馈
- 从 3-4 个选项中选择一个
- 等待 AI 生成下一场景
- 重复步骤 1-4,直到游戏结束
- 游戏结束后自动显示最终报告
- 查看人生满意度评分
- 阅读结局称号和总结
- 查看十年轨迹时间线
- 阅读给年轻人的建议
- 可选:导出完整报告或重新开始
- 查看履历: 点击顶部"人生履历"按钮
- 重启游戏: 点击"重启人生"按钮
- 修改配置: 随时点击设置按钮修改 AI 配置
- 清除存档: 在角色创建界面点击"清除存档"
Q: AI 返回错误或无响应? A: 检查 API Key 是否正确,网络是否畅通,尝试切换其他 AI 提供商。
Q: 游戏进度丢失? A: 检查浏览器是否禁用了 localStorage,避免使用无痕模式。
Q: 移动端显示异常? A: 确保使用现代浏览器(Chrome、Safari、Firefox 最新版)。
Q: 如何获取 API Key? A: 访问对应 AI 提供商的官网注册并获取 API Key。
本项目采用 MIT License 开源许可协议。
这意味着:
- ✅ 可以自由使用、复制、修改、合并、发布、分发、再授权和/或销售本软件
- ✅ 可以用于商业目的
- ✅ 唯一要求:在所有副本中包含版权声明和许可声明
Copyright © 2025 墨渊Transhuman. All rights reserved.
感谢以下技术和服务:
- Google Gemini AI
- React 团队
- Vite 团队
- Tailwind CSS
- 所有开源贡献者
文档版本: v1.1
最后更新: 2025-11-26
适用项目版本: 1.0.0
