From 41473faf16e6fc7f7ea75256d0c90353e3ab6cc9 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 1 Nov 2025 21:11:43 +0000 Subject: [PATCH 1/4] Add ORA-ExplORA development roadmap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加ORA-ExplORA系统开发路线图文档,包含: - 7个开发阶段的详细规划 - 五维属性系统设计方案 - API接口设计 - LLM决策机制设计 - 提示词系统设计 - 成就和排行榜系统设计 - 关键里程碑和风险评估 预计总开发周期:16-17周 --- docs/ORA_ExplORA_Development_Roadmap.md | 602 ++++++++++++++++++++++++ 1 file changed, 602 insertions(+) create mode 100644 docs/ORA_ExplORA_Development_Roadmap.md diff --git a/docs/ORA_ExplORA_Development_Roadmap.md b/docs/ORA_ExplORA_Development_Roadmap.md new file mode 100644 index 00000000..ecba2f18 --- /dev/null +++ b/docs/ORA_ExplORA_Development_Roadmap.md @@ -0,0 +1,602 @@ +# ORA-ExplORA 系统开发路线图 + +**版本**: 1.0 +**日期**: 2025-11-01 +**项目概述**: 基于实时定位的五维属性系统 + Godot LLM驱动的社交游戏 + +--- + +## 项目总览 + +### 核心系统 +1. **ORA APP** (Flutter): 实时定位追踪 + 五维属性计算 + 线下权益发放 +2. **ExplORA Game** (Godot): LLM驱动的AI社交游戏 + 提示词系统 +3. **后端服务**: 数据同步 + API服务 + 成就/排行榜系统 + +### 关键技术栈 +- **ORA APP**: Flutter + Dart +- **ExplORA Game**: Godot 4 + GDScript +- **后端**: Python/Node.js (待定) + PostgreSQL/MongoDB +- **LLM**: 千问 (Qwen) via SiliconFlow API +- **定位服务**: 第三方供应商 (已确定) + +--- + +## 📋 开发阶段划分 + +### 阶段 0: 系统设计与技术方案 (当前阶段) +**目标**: 完成所有核心系统的设计文档,确保技术方案可行 + +#### 0.1 五维属性系统设计 ⭐ +**交付物**: +- [ ] 五维属性定义文档 (探索、社交、冒险、智慧、创造) +- [ ] ORA端属性计算逻辑设计 + - 线下行为 → 数据映射规则 + - 定位数据 → 属性值计算公式 + - 实时更新策略 +- [ ] ExplORA端属性应用设计 + - 属性值接收和存储 + - 属性值对游戏的影响机制 +- [ ] 属性数据模型设计 + +**关键问题**: +- ✅ 五维属性的具体定义和取值范围?(建议: 0-100分) +- ✅ 线下行为如何映射到属性值?(需要明确规则) +- ✅ 属性值更新频率?(实时 vs 批量) + +--- + +#### 0.2 API接口设计 ⭐⭐ +**交付物**: +- [ ] RESTful API规范文档 +- [ ] 数据同步接口设计 + - `POST /api/v1/attributes/sync` - 属性实时同步 + - `GET /api/v1/attributes/{user_id}` - 获取用户五维属性 + - `GET /api/v1/attributes/{user_id}/history` - 属性历史记录 +- [ ] 成就和排行榜接口设计 + - `GET /api/v1/achievements` - 获取成就列表 + - `GET /api/v1/achievements/{user_id}` - 用户成就进度 + - `GET /api/v1/leaderboard/{attribute_type}` - 排行榜数据 +- [ ] 提示词接口设计 + - `POST /api/v1/prompts` - 提交提示词 + - `GET /api/v1/prompts/{user_id}/active` - 获取有效提示词 +- [ ] WebSocket接口设计 (实时推送) + - 属性变化通知 + - 成就解锁通知 + +**技术选型**: +- [ ] 后端框架选择 (FastAPI/Express/Django) +- [ ] 数据库选择 (PostgreSQL/MongoDB/Redis组合) +- [ ] 实时通信方案 (WebSocket/Server-Sent Events) + +--- + +#### 0.3 五维属性影响LLM决策机制 ⭐⭐⭐ +**交付物**: +- [ ] 属性 → Prompt注入策略 + - 探索度高 → Agent更倾向于探索新地点 + - 社交度高 → Agent更主动发起对话 + - 冒险度高 → Agent更愿意尝试冒险行为 + - 智慧度高 → Agent对话更深刻/理性 + - 创造度高 → Agent行为更创新/非传统 +- [ ] Prompt模板设计 + - 基础人设 + 五维属性描述 + - 属性值 → 性格特质映射表 +- [ ] 决策权重算法 + - 五维属性如何影响决策概率分布 + +**示例Prompt**: +``` +你的探索指数是 85/100,你天生喜欢探索未知的地方。 +你的社交指数是 60/100,你在社交场合表现适中。 +你的冒险指数是 92/100,你极度渴望冒险和刺激。 +... +基于你的这些特质,决定接下来要做什么。 +``` + +--- + +#### 0.4 提示词系统设计 ⭐ +**交付物**: +- [ ] 提示词输入机制 + - 字数限制: 100中文字 / 100英文单词 + - 输入验证规则 +- [ ] 提示词有效期管理 + - 有效期: 5小时 + - 过期自动失效机制 + - 倒计时显示 +- [ ] 提示词类型分类 + - 一次性提示词 (触发一次后失效) + - 持续影响提示词 (5小时内持续生效) +- [ ] 内容审核策略 + - ❓ 是否需要敏感词过滤?(用户表示不需要) + - ❓ 是否需要人工审核?(待确认) +- [ ] 提示词 → Prompt集成方式 + - 插入到Agent决策Prompt的位置 + - 优先级设计 + +--- + +#### 0.5 成就与排行榜系统设计 ⭐ +**交付物**: +- [ ] 成就系统设计 + - 成就类型定义 (探索成就、社交成就、冒险成就等) + - 成就触发条件 + - 成就奖励机制 (对应ORA的线下权益) + - 成就进度追踪 +- [ ] 排行榜设计 + - 全球排行榜 vs 好友排行榜 + - 按五维属性分别排行 + - 综合排行榜算法 + - 排行榜更新频率 (实时/每小时/每日) +- [ ] 数据结构设计 + ```json + { + "achievement_id": "explorer_lv1", + "name": "初级探险家", + "description": "探索5个不同的地点", + "progress": { + "current": 3, + "target": 5 + }, + "reward": { + "type": "offline_benefit", + "value": "咖啡店9折券" + } + } + ``` + +--- + +#### 0.6 系统架构设计 ⭐⭐ +**交付物**: +- [ ] 整体架构图 + ``` + ┌─────────────┐ ┌──────────────┐ + │ ORA APP │◄────────┤ 后端服务 │ + │ (Flutter) │ REST │ (FastAPI) │ + └─────────────┘ +WS └──────┬───────┘ + │ + ┌─────────────┐ │ + │ 定位服务API │────────────────┤ + └─────────────┘ │ + │ + ┌─────────────┐ ┌──────▼───────┐ + │ ExplORA │◄────────┤ 数据库 │ + │ (Godot) │ REST │ (PostgreSQL) │ + └─────────────┘ └──────────────┘ + │ + ▼ + ┌─────────────┐ + │ Qwen LLM │ + │ (千问API) │ + └─────────────┘ + ``` +- [ ] 数据流设计 + - 定位数据流: 定位服务 → ORA APP → 后端 → 属性计算 + - 属性同步流: 后端 → ExplORA Game (WebSocket实时推送) + - 决策流: ExplORA → 读取属性 → 构建Prompt → Qwen LLM → 决策 +- [ ] 安全架构 + - 用户认证机制 (JWT) + - API密钥管理 + - 数据加密策略 + +--- + +### 阶段 1: 后端基础设施搭建 +**预估时间**: 2-3周 +**依赖**: 阶段0完成 + +#### 1.1 后端服务开发 +**任务**: +- [ ] 搭建后端项目框架 +- [ ] 实现用户认证系统 +- [ ] 实现基础CRUD API +- [ ] 配置数据库 (PostgreSQL + Redis) +- [ ] 实现WebSocket服务 + +#### 1.2 数据库设计与实现 +**任务**: +- [ ] 用户表 (users) +- [ ] 五维属性表 (attributes) +- [ ] 属性历史记录表 (attribute_history) +- [ ] 成就表 (achievements) +- [ ] 用户成就表 (user_achievements) +- [ ] 排行榜缓存 (Redis) +- [ ] 提示词表 (prompts) + +**数据库Schema示例**: +```sql +CREATE TABLE users ( + user_id UUID PRIMARY KEY, + username VARCHAR(50) UNIQUE NOT NULL, + created_at TIMESTAMP DEFAULT NOW() +); + +CREATE TABLE attributes ( + user_id UUID REFERENCES users(user_id), + exploration INT DEFAULT 50, + social INT DEFAULT 50, + adventure INT DEFAULT 50, + wisdom INT DEFAULT 50, + creativity INT DEFAULT 50, + updated_at TIMESTAMP DEFAULT NOW(), + PRIMARY KEY (user_id) +); + +CREATE TABLE prompts ( + prompt_id UUID PRIMARY KEY, + user_id UUID REFERENCES users(user_id), + content TEXT NOT NULL, + prompt_type VARCHAR(20), -- 'one_time' or 'continuous' + created_at TIMESTAMP DEFAULT NOW(), + expires_at TIMESTAMP, -- created_at + 5 hours + is_active BOOLEAN DEFAULT TRUE +); +``` + +#### 1.3 API实现 +**任务**: +- [ ] 属性同步API +- [ ] 成就查询API +- [ ] 排行榜API +- [ ] 提示词管理API +- [ ] WebSocket推送服务 + +--- + +### 阶段 2: ORA APP 开发 (五维属性计算端) +**预估时间**: 3-4周 +**依赖**: 阶段1完成 + +#### 2.1 Flutter项目搭建 +**任务**: +- [ ] 创建Flutter项目 +- [ ] 配置路由和状态管理 (Provider/Riverpod/Bloc) +- [ ] 集成定位服务SDK +- [ ] 实现后端API客户端 + +#### 2.2 实时定位功能 +**任务**: +- [ ] 接入第三方定位服务 +- [ ] 实时位置追踪 +- [ ] 后台定位权限处理 +- [ ] 位置数据上传到后端 + +#### 2.3 五维属性计算逻辑 +**任务**: +- [ ] 实现线下行为 → 属性映射算法 + - 去新地点 → 探索度 +5 + - 参加社交活动 → 社交度 +10 + - 极限运动 → 冒险度 +8 + - 阅读/学习 → 智慧度 +6 + - 艺术活动 → 创造度 +7 +- [ ] 属性值本地缓存 +- [ ] 属性值上传到后端 + +#### 2.4 UI开发 +**任务**: +- [ ] 首页: 五维属性雷达图 +- [ ] 成就页面: 成就列表和进度 +- [ ] 排行榜页面 +- [ ] 权益中心: 线下权益展示和兑换 +- [ ] 设置页面 + +--- + +### 阶段 3: ExplORA 游戏核心开发 (基于Microverse) +**预估时间**: 4-5周 +**依赖**: 阶段1完成 + +#### 3.1 Microverse代码库适配 +**任务**: +- [ ] Fork Microverse项目 +- [ ] 移除不需要的功能 +- [ ] 重命名为ExplORA +- [ ] 配置Qwen LLM (通过SiliconFlow) + +#### 3.2 五维属性集成 +**任务**: +- [ ] 创建AttributeManager.gd单例 +- [ ] 实现从后端API获取属性的逻辑 +- [ ] 实现WebSocket监听属性变化 +- [ ] 将属性数据注入到AIAgent + +**代码示例**: +```gdscript +# AttributeManager.gd +extends Node + +var current_attributes = { + "exploration": 50, + "social": 50, + "adventure": 50, + "wisdom": 50, + "creativity": 50 +} + +func fetch_attributes(user_id: String): + # 从后端API获取属性 + var http_request = HTTPRequest.new() + add_child(http_request) + http_request.request("https://api.ora.com/v1/attributes/" + user_id) + +func get_attribute_description() -> String: + return """ + 你的探索指数是 %d/100 + 你的社交指数是 %d/100 + 你的冒险指数是 %d/100 + 你的智慧指数是 %d/100 + 你的创造指数是 %d/100 + """ % [current_attributes.exploration, ...] +``` + +#### 3.3 LLM决策机制改造 +**任务**: +- [ ] 修改ConversationManager.gd的Prompt构建 +- [ ] 在Prompt中注入五维属性描述 +- [ ] 修改AIAgent.gd的决策逻辑 +- [ ] 根据属性值调整决策权重 + +**Prompt改造示例**: +```gdscript +func build_decision_prompt(...): + var prompt = "你是一个AI角色,名字是%s。\n" % character_name + + # 注入五维属性 + var attribute_desc = AttributeManager.get_attribute_description() + prompt += "\n" + attribute_desc + "\n" + + # 根据属性调整行为倾向 + if AttributeManager.current_attributes.exploration > 70: + prompt += "你天生热爱探索,总是想去新的地方看看。\n" + + if AttributeManager.current_attributes.social > 70: + prompt += "你非常外向,喜欢和人聊天交流。\n" + + # ... 其他逻辑 + + return prompt +``` + +#### 3.4 提示词系统实现 +**任务**: +- [ ] 创建PromptManager.gd单例 +- [ ] 实现提示词输入UI (限100字) +- [ ] 实现提示词提交到后端API +- [ ] 实现提示词有效期倒计时显示 +- [ ] 将活跃提示词注入到Agent决策Prompt + +**代码示例**: +```gdscript +# PromptManager.gd +extends Node + +var active_prompts = [] + +func submit_prompt(content: String, prompt_type: String): + if content.length() > 100: + return {"error": "提示词超过100字限制"} + + var http_request = HTTPRequest.new() + var data = { + "content": content, + "prompt_type": prompt_type # "one_time" or "continuous" + } + http_request.request("https://api.ora.com/v1/prompts", [], HTTPClient.METHOD_POST, JSON.stringify(data)) + +func get_active_prompts() -> Array: + # 从后端获取有效提示词 (5小时内) + return active_prompts + +func inject_prompts_to_agent_prompt(base_prompt: String) -> String: + var prompts = get_active_prompts() + if prompts.is_empty(): + return base_prompt + + var prompt_text = "\n\n用户当前的特殊指令:\n" + for p in prompts: + prompt_text += "- " + p.content + "\n" + + return base_prompt + prompt_text +``` + +--- + +### 阶段 4: 成就与排行榜系统实现 +**预估时间**: 2周 +**依赖**: 阶段2、阶段3完成 + +#### 4.1 成就追踪 +**任务**: +- [ ] 在ExplORA中实现成就触发检测 +- [ ] 成就进度上报到后端 +- [ ] 成就解锁通知 (WebSocket推送) + +#### 4.2 排行榜计算 +**任务**: +- [ ] 后端实现排行榜计算逻辑 +- [ ] Redis缓存排行榜数据 +- [ ] 定时更新排行榜 (每小时) + +#### 4.3 ORA APP集成 +**任务**: +- [ ] ORA APP展示成就列表 +- [ ] ORA APP展示排行榜 +- [ ] 成就对应的线下权益发放 + +--- + +### 阶段 5: Flutter ↔ Godot 集成 +**预估时间**: 1-2周 +**依赖**: 阶段2、阶段3完成 + +#### 5.1 原生模块开发 +**任务**: +- [ ] 调研Flutter如何启动Godot游戏 + - 方案1: 使用Platform Channel调用原生代码启动Godot + - 方案2: 将Godot导出为Android/iOS库 + - 方案3: 使用WebView加载Godot Web版 +- [ ] 实现ORA APP → ExplORA的跳转 +- [ ] 实现数据传递 (user_id等) + +#### 5.2 测试集成 +**任务**: +- [ ] Android平台测试 +- [ ] iOS平台测试 +- [ ] 数据同步测试 + +--- + +### 阶段 6: 测试与优化 +**预估时间**: 2-3周 +**依赖**: 所有阶段完成 + +#### 6.1 功能测试 +**任务**: +- [ ] 定位功能测试 +- [ ] 属性计算准确性测试 +- [ ] LLM决策测试 +- [ ] 提示词系统测试 +- [ ] 成就解锁测试 +- [ ] 排行榜准确性测试 + +#### 6.2 性能优化 +**任务**: +- [ ] API响应时间优化 +- [ ] 数据库查询优化 +- [ ] WebSocket连接稳定性优化 +- [ ] Godot游戏性能优化 + +#### 6.3 安全测试 +**任务**: +- [ ] API安全测试 +- [ ] 用户数据隐私保护 +- [ ] 防作弊机制 + +--- + +### 阶段 7: 上线准备 +**预估时间**: 1-2周 + +#### 7.1 部署 +**任务**: +- [ ] 后端服务部署 (云服务器/容器化) +- [ ] 数据库部署和备份策略 +- [ ] CDN配置 +- [ ] 监控系统搭建 + +#### 7.2 发布 +**任务**: +- [ ] ORA APP发布到App Store / Google Play +- [ ] ExplORA游戏打包 +- [ ] 用户文档编写 + +--- + +## 🎯 关键里程碑 + +| 里程碑 | 完成标准 | 预估时间 | +|--------|----------|----------| +| M0: 设计完成 | 所有设计文档通过审核 | 1周 | +| M1: 后端可用 | API全部实现并测试通过 | 3周 | +| M2: ORA APP Alpha | 定位和属性计算功能可用 | 6周 | +| M3: ExplORA Alpha | 游戏可玩,LLM决策生效 | 10周 | +| M4: 集成测试通过 | ORA ↔ ExplORA数据同步正常 | 12周 | +| M5: Beta版本 | 所有核心功能完成 | 14周 | +| M6: 正式发布 | 通过所有测试,上线 | 16周 | + +--- + +## ⚠️ 风险与挑战 + +### 技术风险 +1. **Flutter ↔ Godot集成复杂度** + - 风险等级: 🔴 高 + - 缓解策略: 提前进行技术验证,选择最可行的方案 + +2. **实时数据同步性能** + - 风险等级: 🟡 中 + - 缓解策略: 使用WebSocket + Redis,设计高效的推送机制 + +3. **LLM API调用成本** + - 风险等级: 🟡 中 + - 缓解策略: 优化Prompt长度,实现缓存机制 + +### 业务风险 +1. **五维属性计算公平性** + - 风险等级: 🟡 中 + - 缓解策略: 设计合理的算法,防止作弊 + +2. **用户隐私和定位数据安全** + - 风险等级: 🔴 高 + - 缓解策略: 严格的数据加密和隐私政策 + +--- + +## 📊 资源需求 + +### 开发人员 +- **后端工程师**: 1-2人 +- **Flutter工程师**: 1人 +- **Godot工程师**: 1人 (可兼任后端) +- **UI/UX设计师**: 1人 + +### 基础设施 +- **云服务器**: 1台 (8核16G,可扩展) +- **数据库**: PostgreSQL + Redis +- **LLM API**: Qwen (SiliconFlow) +- **定位服务**: 第三方供应商 + +### 预算估算 +- **开发成本**: 根据团队规模 +- **云服务**: ~$200-500/月 +- **LLM API**: 按调用次数计费 (需根据用户量估算) +- **定位服务**: 已确定供应商,在预算内 + +--- + +## ❓ 待确认的问题 + +1. **五维属性的具体定义** + - 探索、社交、冒险、智慧、创造 各代表什么? + - 取值范围是0-100吗? + +2. **线下行为 → 属性映射规则** + - 具体什么行为增加什么属性? + - 增加幅度如何设计? + +3. **提示词内容审核** + - 是否需要敏感词过滤? + - 是否需要人工审核? + +4. **成就和权益设计** + - 具体有哪些成就? + - 对应什么线下权益? + +5. **Flutter ↔ Godot集成方案** + - 采用哪种技术方案? + - 需要提前验证可行性 + +--- + +## 📝 下一步行动 + +### 立即开始 (阶段0) +1. ✅ 探索Microverse代码库 (已完成) +2. ⏳ 设计五维属性计算逻辑 +3. ⏳ 设计API接口规范 +4. ⏳ 设计五维属性对LLM的影响机制 +5. ⏳ 设计提示词系统细节 +6. ⏳ 设计成就和排行榜数据结构 + +### 需要您的反馈 +- 请确认五维属性的具体定义 +- 请提供线下行为 → 属性映射的初步想法 +- 请确认提示词是否需要审核 +- 请确认Flutter ↔ Godot集成的偏好方案 + +--- + +**文档版本控制**: +- v1.0 (2025-11-01): 初始版本 From f4b7c20b1f107b4bc6f6405052b2bc81f03fe130 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 1 Nov 2025 23:05:19 +0000 Subject: [PATCH 2/4] Complete ORA-ExplORA system design documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完成ORA-ExplORA系统的完整设计文档,包括: 1. ORA项目全景设计 (ORA_Project_Overview.md) - O2O自我提升社交平台愿景 - 线下空间 + 线上APP + ExplORA虚拟世界三位一体架构 - 核心功能模块设计 - 商业模式和目标用户 2. 五维属性系统详细设计 (Five_Dimensions_Attribute_System.md) - 新的五维定义:Cognition, Sociability, Charisma, Vitality, Reflection - 取值范围:0-1000 - 详细的行为→属性映射规则和增加值 - 衰减机制、防作弊机制 - 数据库设计和API接口 3. 成就系统设计 (Achievement_System_Design.md) - 6大类成就:五维属性、综合成长、社交互动、线下空间、ExplORA、特殊成就 - 200+成就设计 - ORA Coin (OC)奖励体系 - 线下权益设计(咖啡券、会员天数、虚拟货币) 4. LLM决策机制设计 (LLM_Decision_Mechanism_Design.md) - 五维属性→性格特质映射 - 属性对AI行为和对话的影响逻辑 - 决策Prompt构建策略 - 代码实现示例 关键创新: - 线下行为实时影响虚拟世界AI性格 - 提示词系统(100字限制,5小时有效期) - 完整的O2O生态系统设计 --- docs/Achievement_System_Design.md | 502 +++++++++++++++ docs/Five_Dimensions_Attribute_System.md | 552 ++++++++++++++++ docs/LLM_Decision_Mechanism_Design.md | 780 +++++++++++++++++++++++ docs/ORA_Project_Overview.md | 409 ++++++++++++ 4 files changed, 2243 insertions(+) create mode 100644 docs/Achievement_System_Design.md create mode 100644 docs/Five_Dimensions_Attribute_System.md create mode 100644 docs/LLM_Decision_Mechanism_Design.md create mode 100644 docs/ORA_Project_Overview.md diff --git a/docs/Achievement_System_Design.md b/docs/Achievement_System_Design.md new file mode 100644 index 00000000..2f10fe91 --- /dev/null +++ b/docs/Achievement_System_Design.md @@ -0,0 +1,502 @@ +# 成就系统设计文档 + +**版本**: 1.0 +**日期**: 2025-11-01 + +--- + +## 🎖️ 成就系统概述 + +成就系统是激励用户持续参与 ORA 生态的核心机制,通过解锁成就获得: +- **ORA Coin (OC)** 虚拟货币奖励 +- **称号和徽章** +- **线下权益**(咖啡券、会员天数等) +- **五维属性加成** + +--- + +## 🏆 成就分类体系 + +### 1. 五维属性成就(核心) + +基于五维属性的等级和进度解锁成就。 + +#### 1.1 Cognition(认知)成就 + +| 成就名称 | 解锁条件 | 奖励 OC | 线下权益 | 属性加成 | +|---------|---------|---------|---------|---------| +| 知识启蒙者 | Cognition 达到 100 | 50 | - | - | +| 好学之徒 | Cognition 达到 300 | 100 | - | Cognition +20 | +| 智慧学者 | Cognition 达到 500 | 200 | 书店9折券 | Cognition +50 | +| 博学大师 | Cognition 达到 700 | 500 | 免费会员7天 | Cognition +100 | +| 知识传奇 | Cognition 达到 900 | 1000 | 免费会员30天 | Cognition +200 | +| 阅读马拉松 | 累计阅读打卡 100 次 | 150 | 书店8折券 | Cognition +30 | +| 学习狂人 | 单日学习时长 ≥ 8 小时 | 80 | 咖啡券 | Vitality +10 | +| 知识分享家 | 分享学习笔记 50 次 | 200 | - | Cognition +40, Sociability +20 | +| 讲座达人 | 参加知识讲座 20 次 | 300 | 免费会员7天 | Cognition +60 | +| 读书会铁粉 | 参加读书会 30 次 | 250 | - | Cognition +50, Sociability +30 | + +#### 1.2 Sociability(社交)成就 + +| 成就名称 | 解锁条件 | 奖励 OC | 线下权益 | 属性加成 | +|---------|---------|---------|---------|---------| +| 社交新手 | Sociability 达到 100 | 50 | - | - | +| 活跃社交者 | Sociability 达到 300 | 100 | - | Sociability +20 | +| 社交达人 | Sociability 达到 500 | 200 | 活动优先权 | Sociability +50 | +| 社交大师 | Sociability 达到 700 | 500 | 免费会员7天 | Sociability +100 | +| 社交传奇 | Sociability 达到 900 | 1000 | 免费会员30天 | Sociability +200 | +| 好友收集家 | 好友数量 ≥ 50 | 150 | - | Sociability +30 | +| 社交蝴蝶 | 好友数量 ≥ 200 | 400 | - | Sociability +80, Charisma +40 | +| 活动组织者 | 组织活动 10 次 | 300 | 场地租赁9折 | Sociability +60, Charisma +30 | +| 派对之王/女王 | 组织活动 50 次 | 800 | 场地租赁免费1次 | Sociability +120, Charisma +80 | +| 聊天高手 | 有效对话 200 次 | 250 | - | Sociability +50 | + +#### 1.3 Charisma(魅力)成就 + +| 成就名称 | 解锁条件 | 奖励 OC | 线下权益 | 属性加成 | +|---------|---------|---------|---------|---------| +| 初露魅力 | Charisma 达到 100 | 50 | - | - | +| 人气新星 | Charisma 达到 300 | 100 | - | Charisma +20 | +| 魅力之星 | Charisma 达到 500 | 200 | - | Charisma +50 | +| 魅力领袖 | Charisma 达到 700 | 500 | VIP专属活动 | Charisma +100 | +| 魅力传奇 | Charisma 达到 900 | 1000 | 免费会员30天 | Charisma +200 | +| 点赞之星 | 收到点赞 500 次 | 150 | - | Charisma +30 | +| 万人迷 | 收到点赞 5000 次 | 600 | - | Charisma +120 | +| 影响力导师 | 被添加好友(被动)100 次 | 400 | - | Charisma +80, Sociability +40 | +| 内容创作者 | 发布高质量内容(50+ 互动)10 次 | 300 | - | Charisma +60 | +| 月度之星 | 成为月度排行榜前3 | 500 | 专属称号1个月 | Charisma +100 | + +#### 1.4 Vitality(活力)成就 + +| 成就名称 | 解锁条件 | 奖励 OC | 线下权益 | 属性加成 | +|---------|---------|---------|---------|---------| +| 活力萌芽 | Vitality 达到 100 | 50 | - | - | +| 充满活力 | Vitality 达到 300 | 100 | - | Vitality +20 | +| 活力之星 | Vitality 达到 500 | 200 | 健身课免费1次 | Vitality +50 | +| 活力大师 | Vitality 达到 700 | 500 | 健身课免费5次 | Vitality +100 | +| 活力传奇 | Vitality 达到 900 | 1000 | 免费会员30天 | Vitality +200 | +| 签到达人 | 连续签到 30 天 | 200 | 咖啡半价券×3 | Vitality +40 | +| 百日坚持 | 连续签到 100 天 | 800 | 免费会员7天 | Vitality +150 | +| 年度冠军 | 连续签到 365 天 | 3000 | 免费会员90天 | 全属性 +100 | +| 运动健将 | 累计运动 100 小时 | 300 | 运动装备9折券 | Vitality +60 | +| 铁人三项 | 跑步+健身+瑜伽各10次 | 400 | 健身课套餐8折 | Vitality +80 | +| 早起鸟 | 连续早起(7:00前签到)30天 | 250 | 早餐券×5 | Vitality +50, Reflection +25 | + +#### 1.5 Reflection(自省)成就 + +| 成就名称 | 解锁条件 | 奖励 OC | 线下权益 | 属性加成 | +|---------|---------|---------|---------|---------| +| 觉察启蒙 | Reflection 达到 100 | 50 | - | - | +| 自省之路 | Reflection 达到 300 | 100 | - | Reflection +20 | +| 内心平静 | Reflection 达到 500 | 200 | 冥想课免费1次 | Reflection +50 | +| 觉察大师 | Reflection 达到 700 | 500 | 心理咨询免费1次 | Reflection +100 | +| 觉察传奇 | Reflection 达到 900 | 1000 | 免费会员30天 | Reflection +200 | +| 日记作家 | 写日记 100 天 | 200 | 笔记本礼品 | Reflection +40 | +| 深度思考者 | 深度日记(>200字)50 篇 | 300 | - | Reflection +60, Cognition +30 | +| 冥想修行者 | 累计冥想 50 小时 | 400 | 冥想课程套餐 | Reflection +80 | +| 目标达成者 | 完成目标复盘 30 次 | 250 | - | Reflection +50 | +| 心灵导师 | Reflection 连续7天 ≥ 700 | 500 | VIP心理工作坊 | Reflection +100 | + +--- + +### 2. 综合成长成就 + +基于多维度或综合表现解锁。 + +| 成就名称 | 解锁条件 | 奖励 OC | 线下权益 | 属性加成 | +|---------|---------|---------|---------|---------| +| 全面发展者 | 五维属性均 ≥ 300 | 500 | 专属称号 | 全属性 +30 | +| 完美平衡 | 五维属性均 ≥ 500 | 1000 | 免费会员14天 | 全属性 +60 | +| 传奇之路 | 五维属性均 ≥ 700 | 2000 | 免费会员30天 | 全属性 +100 | +| ORA 大使 | 综合评分 ≥ 800 | 3000 | 终身VIP | 全属性 +200 | +| 快速成长 | 30天内任一属性 +200 | 300 | - | 对应属性 +30 | +| 持续进步 | 90天内每天都有属性增长 | 600 | 免费会员7天 | 全属性 +40 | +| 跨界达人 | 三个属性 ≥ 600 | 800 | - | 全属性 +50 | + +--- + +### 3. 社交互动成就 + +| 成就名称 | 解锁条件 | 奖励 OC | 线下权益 | 属性加成 | +|---------|---------|---------|---------|---------| +| 破冰者 | 主动发起对话 10 次 | 50 | - | Sociability +10 | +| 社交开拓者 | 主动发起对话 100 次 | 200 | - | Sociability +40 | +| 人脉大师 | 与 50 个不同的人有效对话 | 300 | - | Sociability +60, Charisma +30 | +| 活动参与者 | 参加活动 10 次 | 100 | - | Sociability +20 | +| 活动狂热粉 | 参加活动 50 次 | 400 | 活动优先权 | Sociability +80 | +| 团队协作者 | 与他人合作完成任务 20 次 | 250 | - | Sociability +50 | +| 互助之星 | 帮助其他会员 30 次 | 300 | - | Sociability +60, Charisma +30 | + +--- + +### 4. 线下空间成就 + +结合 ORA 线下空间的实际场景。 + +| 成就名称 | 解锁条件 | 奖励 OC | 线下权益 | 属性加成 | +|---------|---------|---------|---------|---------| +| ORA 新人 | 首次进入 ORA 空间 | 30 | 欢迎饮品券 | - | +| 常客 | 进入 ORA 空间 30 次 | 150 | 咖啡半价券×3 | Vitality +20 | +| VIP 常客 | 进入 ORA 空间 100 次 | 500 | 免费会员7天 | Vitality +50 | +| 空间探索者 | 在所有区域(学习/社交/运动/冥想)打卡 | 200 | - | 全属性 +20 | +| 长期驻扎 | 单日在空间停留 ≥ 8 小时 | 100 | 免费饮品1杯 | Cognition +15 | +| 咖啡爱好者 | 购买咖啡 20 次 | 100 | 咖啡券×2 | - | +| 美食家 | 购买轻食 30 次 | 150 | 轻食9折券 | - | +| 会议专家 | 租赁会议室 10 次 | 200 | 会议室免费1小时 | Sociability +30 | + +--- + +### 5. ExplORA 虚拟世界成就 + +与 ExplORA 游戏内行为关联。 + +| 成就名称 | 解锁条件 | 奖励 OC | 线下权益 | 属性加成 | +|---------|---------|---------|---------|---------| +| 虚拟探险家 | 探索 ExplORA 10 个场景 | 100 | - | Cognition +15 | +| 虚拟社交家 | 与 AI 角色对话 50 次 | 150 | - | Sociability +25 | +| 提示词魔法师 | 使用提示词 20 次 | 80 | - | Creativity +20(新属性?) | +| 虚拟导师 | 在 ExplORA 中帮助新玩家 10 次 | 200 | - | Sociability +40 | +| 世界连接者 | 在 ExplORA 中完成线上线下联动任务 | 300 | 免费会员3天 | 全属性 +30 | + +--- + +### 6. 特殊成就与隐藏成就 + +#### 6.1 时间限定成就 + +| 成就名称 | 解锁条件 | 奖励 OC | 线下权益 | 属性加成 | +|---------|---------|---------|---------|---------| +| 新年新气象 | 元旦当天签到 | 100 | 新年礼包 | 全属性 +10 | +| 圣诞精灵 | 圣诞节参加活动 | 150 | 圣诞礼物 | 全属性 +15 | +| 生日快乐 | 生日当天进入空间 | 200 | 生日蛋糕券 | 全属性 +20 | +| 周年庆典 | ORA 周年庆参与 | 300 | 周年纪念品 | 全属性 +30 | + +#### 6.2 隐藏成就(彩蛋) + +| 成就名称 | 解锁条件 | 奖励 OC | 线下权益 | 属性加成 | +|---------|---------|---------|---------|---------| +| 夜猫子 | 凌晨2-4点签到 | 50 | - | Reflection +10 | +| 幸运儿 | 第 777 位签到的会员 | 777 | - | Charisma +77 | +| 全勤王 | 一年内无缺勤(365天签到) | 5000 | 免费会员180天 | 全属性 +200 | +| 意外发现 | 在 ExplORA 中发现隐藏彩蛋 | 300 | - | 全属性 +30 | +| 三重奏 | 同时在线下空间、ORA APP、ExplORA 中活动 | 400 | - | 全属性 +40 | + +--- + +## 🎁 奖励系统设计 + +### ORA Coin (OC) 奖励分级 + +根据成就难度和价值分配 OC: +- **简单成就**: 30-100 OC +- **中等成就**: 100-300 OC +- **困难成就**: 300-800 OC +- **史诗成就**: 800-2000 OC +- **传奇成就**: 2000-5000 OC + +### 线下权益类型 + +#### 1. 饮品券 +- **咖啡半价券**: 适用于所有咖啡饮品 +- **免费饮品券**: 任选一杯饮品(≤¥50) +- **早餐券**: 早餐套餐免费 + +#### 2. 服务券 +- **健身课免费券**: 免费参加一次健身课程 +- **冥想课免费券**: 免费参加一次冥想课程 +- **会议室免费券**: 免费使用会议室1小时 + +#### 3. 会员时长 +- **免费会员3天**: 延长会员有效期3天 +- **免费会员7天**: 延长会员有效期7天 +- **免费会员30天**: 延长会员有效期30天 +- **免费会员90天**: 延长会员有效期90天 +- **终身VIP**: 永久免费使用 ORA 所有服务 + +#### 4. 专属权益 +- **活动优先权**: 优先报名热门活动 +- **VIP专属活动**: 参加仅限VIP的高端活动 +- **专属称号**: 在 APP 和 ExplORA 中显示特殊称号 +- **场地租赁折扣**: 租赁场地享受折扣 + +### 属性加成 + +成就解锁后获得一次性属性加成: +- **小加成**: +10-30 +- **中加成**: +40-80 +- **大加成**: +100-200 + +--- + +## 📊 成就追踪与展示 + +### 成就进度显示 + +#### 在 ORA APP 中 +``` +成就页面布局: + +┌─────────────────────────────────┐ +│ 成就总览 │ +│ 已解锁: 45/200 │ +│ 完成度: 22.5% │ +└─────────────────────────────────┘ + +┌─────────────────────────────────┐ +│ 📖 认知成就 (8/15) │ +│ ⭐ 知识启蒙者 ✓ │ +│ ⭐ 好学之徒 ✓ │ +│ ⭐ 智慧学者 (进度: 450/500) │ +│ 🔒 博学大师 (需要 700) │ +└─────────────────────────────────┘ + +┌─────────────────────────────────┐ +│ 💬 社交成就 (12/18) │ +│ ... │ +└─────────────────────────────────┘ +``` + +#### 成就卡片 +``` +┌───────────────────────────────────┐ +│ 🏆 智慧学者 │ +│ │ +│ Cognition 达到 500 │ +│ 进度: █████████░ 450/500 (90%) │ +│ │ +│ 奖励: │ +│ - 200 OC │ +│ - 书店9折券 │ +│ - Cognition +50 │ +│ │ +│ [ 还差 50 点 ] │ +└───────────────────────────────────┘ +``` + +### 成就通知 + +当用户解锁成就时: +1. **推送通知**: APP推送 + 短信(可选) +2. **动画效果**: 成就解锁动画(烟花、光效等) +3. **社交分享**: 可选择分享到社交媒体 +4. **ExplORA同步**: 在虚拟世界中也显示成就解锁 + +--- + +## 🎮 ExplORA 中的成就集成 + +### 虚拟徽章展示 + +在 ExplORA 中,玩家的成就以**徽章**形式展示: +- **虚拟化身佩戴**: 选择最多 3 个徽章显示在化身上 +- **成就墙**: 虚拟空间中的成就展示墙 +- **特殊效果**: 传奇成就带有光效/粒子效果 + +### 成就对 AI 行为的影响 + +AI 角色会根据玩家的成就调整对话: +``` +玩家解锁"博学大师"成就后: + +AI: "听说你最近达到了博学大师的境界,真令人敬佩!能跟我分享一下你最近在学什么吗?" + +玩家解锁"社交达人"成就后: + +AI: "你真是这里的社交明星啊!我看到很多人都在谈论你。" +``` + +--- + +## 💾 数据库设计 + +### achievements 表(成就定义) + +```sql +CREATE TABLE achievements ( + achievement_id VARCHAR(50) PRIMARY KEY, + name VARCHAR(100) NOT NULL, + description TEXT, + category VARCHAR(30), -- 'cognition', 'sociability', etc. + difficulty VARCHAR(20), -- 'simple', 'medium', 'hard', 'epic', 'legendary' + unlock_condition JSONB, -- 解锁条件(JSON格式) + reward_oc INT DEFAULT 0, + reward_offline TEXT, -- 线下权益描述 + attribute_bonus JSONB, -- 属性加成 {"cognition": 50, ...} + is_hidden BOOLEAN DEFAULT FALSE, + icon_url VARCHAR(255), + created_at TIMESTAMP DEFAULT NOW() +); +``` + +### user_achievements 表(用户成就) + +```sql +CREATE TABLE user_achievements ( + user_id UUID REFERENCES users(user_id), + achievement_id VARCHAR(50) REFERENCES achievements(achievement_id), + progress INT DEFAULT 0, -- 当前进度(如 450/500) + target INT, -- 目标值(如 500) + unlocked_at TIMESTAMP, -- 解锁时间(NULL表示未解锁) + is_claimed BOOLEAN DEFAULT FALSE, -- 是否已领取奖励 + PRIMARY KEY (user_id, achievement_id) +); +``` + +### achievement_logs 表(成就日志) + +```sql +CREATE TABLE achievement_logs ( + log_id UUID PRIMARY KEY, + user_id UUID REFERENCES users(user_id), + achievement_id VARCHAR(50) REFERENCES achievements(achievement_id), + action VARCHAR(20), -- 'progress', 'unlock', 'claim' + old_progress INT, + new_progress INT, + created_at TIMESTAMP DEFAULT NOW() +); +``` + +--- + +## 🔌 API 接口 + +### 1. 获取用户成就列表 + +```http +GET /api/v1/achievements/{user_id} + +Query Parameters: +- category: (optional) 按类别过滤 +- unlocked: (optional) true/false + +Response: +{ + "user_id": "uuid", + "total_achievements": 200, + "unlocked_count": 45, + "completion_rate": 22.5, + "achievements": [ + { + "achievement_id": "cognition_lv3", + "name": "智慧学者", + "category": "cognition", + "progress": 450, + "target": 500, + "is_unlocked": false, + "reward_oc": 200, + "reward_offline": "书店9折券", + "attribute_bonus": {"cognition": 50} + }, + ... + ] +} +``` + +### 2. 检查成就进度更新 + +```http +POST /api/v1/achievements/check + +Request: +{ + "user_id": "uuid", + "trigger": "attribute_update", // 或 "action" + "data": { + "attribute": "cognition", + "new_value": 500 + } +} + +Response: +{ + "newly_unlocked": [ + { + "achievement_id": "cognition_lv3", + "name": "智慧学者", + "reward_oc": 200, + "reward_offline": "书店9折券" + } + ], + "progress_updated": [ + { + "achievement_id": "cognition_lv4", + "old_progress": 500, + "new_progress": 500, + "target": 700 + } + ] +} +``` + +### 3. 领取成就奖励 + +```http +POST /api/v1/achievements/claim + +Request: +{ + "user_id": "uuid", + "achievement_id": "cognition_lv3" +} + +Response: +{ + "success": true, + "rewards": { + "oc_added": 200, + "new_oc_balance": 1450, + "offline_benefit": { + "type": "coupon", + "name": "书店9折券", + "code": "BOOK90-XXXX" + }, + "attributes_added": { + "cognition": 50 + } + } +} +``` + +--- + +## 🧪 测试与调优 + +### 成就难度平衡 + +根据 Beta 测试数据调整: +- **解锁率**: 每个成就在30天内的解锁率 + - 简单成就: 60-80% + - 中等成就: 30-50% + - 困难成就: 10-20% + - 史诗成就: 3-8% + - 传奇成就: <2% + +### 奖励价值平衡 + +确保奖励与成就难度匹配: +- **OC 价值**: 1 OC ≈ ¥0.1(根据商业模式调整) +- **线下权益价值**: 与 OC 等值或略高 + +### 用户参与度监控 + +- **成就查看率**: 用户是否经常查看成就页面 +- **奖励领取率**: 解锁成就后的领取率 +- **激励效果**: 成就对用户行为的引导作用 + +--- + +## 🎊 总结 + +成就系统通过以下方式增强 ORA 生态: + +1. **量化目标**: 为用户提供明确的短期和长期目标 +2. **持续激励**: 通过分级奖励保持用户参与动力 +3. **社交荣誉**: 成就徽章成为社交货币 +4. **商业闭环**: 虚拟货币和线下权益形成商业闭环 +5. **虚实联动**: ORA APP 与 ExplORA 成就同步 + +**下一步**: 设计虚拟货币系统和线下权益管理机制。 + +--- + +**最后更新**: 2025-11-01 diff --git a/docs/Five_Dimensions_Attribute_System.md b/docs/Five_Dimensions_Attribute_System.md new file mode 100644 index 00000000..bed73dc3 --- /dev/null +++ b/docs/Five_Dimensions_Attribute_System.md @@ -0,0 +1,552 @@ +# 五维属性系统详细设计 + +**版本**: 1.0 +**日期**: 2025-11-01 + +--- + +## 📊 五维属性定义 + +### 1. Cognition(认知)[0-1000] +**定义**: 学习能力、知识积累和认知成长 + +**核心含义**: +- 持续学习的能力 +- 知识的广度和深度 +- 思维能力的提升 + +**提升方式**: +- 学习时长(阅读、在线课程、自学等) +- 工作时长(专业技能应用) +- 参加知识类活动(讲座、读书会、工作坊) +- 完成认知类挑战 + +--- + +### 2. Sociability(社交)[0-1000] +**定义**: 社交活跃度和人际连接能力 + +**核心含义**: +- 主动建立社交连接的意愿 +- 社交互动的频率和质量 +- 社交网络的广度 + +**提升方式**: +- 添加新好友 +- 参加社交活动 +- 发起/参与互动(聊天、评论) +- 组织活动 +- 帮助其他会员 + +--- + +### 3. Charisma(魅力)[0-1000] +**定义**: 个人影响力和受欢迎程度 + +**核心含义**: +- 被他人认可的程度 +- 个人魅力和吸引力 +- 对他人的正面影响 + +**提升方式**: +- 收到他人点赞 +- 收到正面评价/留言 +- 内容被分享 +- 被添加为好友(被动) +- 活动参与人数(作为组织者) + +--- + +### 4. Vitality(活力)[0-1000] +**定义**: 身体健康和精力充沛度 + +**核心含义**: +- 身体健康状况 +- 精力和体能水平 +- 生活规律性 + +**提升方式**: +- 签到打卡(体现规律性) +- 运动时长和频率 +- 睡眠质量记录 +- 健康饮食记录 +- 参加运动类活动 + +--- + +### 5. Reflection(自省)[0-1000] +**定义**: 自我觉察和内心成长 + +**核心含义**: +- 情绪感知能力 +- 自我反思的习惯 +- 内心平静和觉察 + +**提升方式**: +- 心情记录(每日心情打卡) +- 日记/反思记录 +- 冥想打卡 +- 目标设定和复盘 +- 参加自省类活动(冥想课、心理工作坊) + +--- + +## 🧮 属性计算逻辑 + +### 计算原则 +1. **实时更新**: 用户行为发生后立即计算并更新 +2. **公平性**: 防止刷分,设置每日上限 +3. **衰减机制**: 长期不活跃,属性缓慢衰减 +4. **激励导向**: 鼓励多样化行为,而非单一行为 + +--- + +### Cognition(认知)计算规则 + +#### 行为类型与增加值 + +| 行为 | 增加值 | 每日上限 | 备注 | +|------|--------|----------|------| +| 学习时长(每10分钟) | +3 | 180次(30小时) | 在ORA空间学习区记录 | +| 工作时长(每10分钟) | +2 | 120次(20小时) | 专注工作模式 | +| 阅读打卡(每次) | +15 | 3次 | 需记录阅读内容 | +| 完成在线课程(每节) | +30 | 5次 | 关联学习平台 | +| 参加知识讲座 | +50 | 2次 | 线下活动 | +| 参加读书会 | +40 | 2次 | 线下活动 | +| 分享学习笔记 | +20 | 3次 | 质量审核 | +| 获得知识类徽章 | +100 | - | 成就解锁 | + +#### 计算公式 +``` +每日 Cognition 增量 = Σ(各行为增加值) +总 Cognition = 历史累积值 + 每日增量 - 衰减值 +``` + +#### 衰减机制 +- **触发条件**: 连续 7 天无任何 Cognition 相关行为 +- **衰减率**: 每天 -1%(从第8天开始) +- **最低值**: 不低于 100 + +**示例**: +``` +用户当前 Cognition = 500 +连续 10 天未学习: +Day 8: 500 × 0.99 = 495 +Day 9: 495 × 0.99 = 490.05 +Day 10: 490.05 × 0.99 = 485.15 +``` + +--- + +### Sociability(社交)计算规则 + +#### 行为类型与增加值 + +| 行为 | 增加值 | 每日上限 | 备注 | +|------|--------|----------|------| +| 添加新好友 | +15 | 10次 | 主动添加 | +| 接受好友请求 | +5 | 20次 | 被动接受 | +| 发起对话(每次) | +5 | 20次 | 有效对话(>3轮) | +| 回复他人消息 | +3 | 30次 | 及时回复(<1小时) | +| 参加社交活动 | +50 | 3次 | 线下活动 | +| 组织活动 | +80 | 2次 | 作为主办方 | +| 发表动态/分享 | +10 | 5次 | 高质量内容 | +| 评论互动 | +5 | 20次 | 有效评论 | +| 在线下空间社交(每30分钟) | +8 | 16次(8小时) | 位置检测 | +| 获得社交类徽章 | +100 | - | 成就解锁 | + +#### 质量权重 +社交行为的质量影响增加值: +- **有效对话**: 对话轮数 ≥ 3 轮,时长 ≥ 5 分钟 +- **高质量内容**: 收到点赞/评论数量 + - 10+ 互动: × 1.5 + - 50+ 互动: × 2.0 + +#### 衰减机制 +- **触发条件**: 连续 5 天无社交行为 +- **衰减率**: 每天 -1.5% +- **最低值**: 不低于 50 + +--- + +### Charisma(魅力)计算规则 + +#### 行为类型与增加值 + +| 行为 | 增加值 | 每日上限 | 备注 | +|------|--------|----------|------| +| 收到点赞(每个) | +3 | 100次 | 来自不同用户 | +| 收到评论 | +5 | 50次 | 有效评论 | +| 收到感谢/表扬 | +15 | 10次 | 正面反馈 | +| 内容被分享 | +20 | 20次 | 分享到其他平台 | +| 被添加为好友(被动) | +10 | 15次 | 被他人主动添加 | +| 组织活动(按参与人数) | +5/人 | 200点 | 最多40人 | +| 成为每周/月度榜单前10 | +100 | - | 排行榜奖励 | +| 获得魅力类徽章 | +150 | - | 成就解锁 | +| 被推荐给新用户 | +25 | 10次 | 系统推荐 | + +#### 特殊机制:魅力值更依赖他人 +- **他人贡献**: Charisma 的 80% 来自他人行为(点赞、评论、添加等) +- **自身贡献**: 仅 20% 来自自身行为(发布内容、组织活动) + +#### 质量权重 +- **真实互动**: 来自活跃用户的点赞权重更高 + - 活跃用户(周活跃): × 1.0 + - 一般用户: × 0.5 + - 新用户: × 0.3 +- **防止刷分**: 同一用户对同一内容的重复点赞不计分 + +#### 衰减机制 +- **触发条件**: 连续 3 天未收到任何正面反馈 +- **衰减率**: 每天 -2%(魅力值更易流失) +- **最低值**: 不低于 50 + +--- + +### Vitality(活力)计算规则 + +#### 行为类型与增加值 + +| 行为 | 增加值 | 每日上限 | 备注 | +|------|--------|----------|------| +| 每日签到 | +10 | 1次 | 基础奖励 | +| 连续签到奖励 | +5/天 | - | 累加(如第7天+35) | +| 运动时长(每10分钟) | +5 | 72次(12小时) | 运动模式追踪 | +| 记录睡眠(7-9小时) | +20 | 1次 | 优质睡眠 | +| 记录睡眠(<6 或 >10小时) | +5 | 1次 | 非最佳睡眠 | +| 健康饮食打卡 | +10 | 3次 | 早/午/晚餐 | +| 参加运动活动 | +60 | 2次 | 线下运动课程 | +| 达到每日步数目标(8000步) | +15 | 1次 | 步数追踪 | +| 完成体能挑战 | +80 | 1次 | 特殊挑战 | +| 获得活力类徽章 | +120 | - | 成就解锁 | + +#### 连续签到奖励 +``` +Day 1: +10 +Day 2: +10 + 5 = +15 +Day 3: +10 + 10 = +20 +... +Day 7: +10 + 30 = +40 +Day 8: 重置到 +10(或继续累加,设计待定) +``` + +#### 健康评分系统 +Vitality 的计算考虑**规律性**和**健康度**: +- **规律性**: 连续天数越多,奖励越高 +- **健康度**: 睡眠、饮食、运动的平衡 + - 三者都有记录: × 1.2 加成 + - 仅一项: × 0.8 折扣 + +#### 衰减机制 +- **触发条件**: 连续 2 天未签到 +- **衰减率**: 每天 -1% +- **最低值**: 不低于 80 + +--- + +### Reflection(自省)计算规则 + +#### 行为类型与增加值 + +| 行为 | 增加值 | 每日上限 | 备注 | +|------|--------|----------|------| +| 每日心情记录 | +15 | 1次 | 简单心情选择 | +| 日记/反思记录(>50字) | +25 | 3次 | 深度反思 | +| 日记/反思记录(>200字) | +40 | 2次 | 高质量反思 | +| 冥想打卡(每10分钟) | +8 | 12次(2小时) | 冥想模式 | +| 设定目标 | +20 | 3次 | 每周/月目标 | +| 完成目标复盘 | +30 | 3次 | 目标回顾 | +| 参加冥想/正念课程 | +50 | 2次 | 线下活动 | +| 参加心理工作坊 | +60 | 2次 | 线下活动 | +| 获得自省类徽章 | +100 | - | 成就解锁 | + +#### 质量评估 +日记/反思的质量通过以下因素评估: +- **字数**: 越长,质量越高(但设上限避免刷字数) +- **频率**: 每日 1-3 次为最佳,过多不加分 +- **情感丰富度**: 使用情感词汇(可选,LLM辅助分析) + +#### 深度加成 +如果日记内容体现深度思考,可获得额外加成: +- **有明确反思**: +10(如"我意识到...") +- **有行动计划**: +10(如"明天我会...") +- **情感表达丰富**: +5 + +**示例**: +``` +普通日记(50字): +25 +深度日记(200字 + 反思 + 行动计划): +40 + 10 + 10 = +60 +``` + +#### 衰减机制 +- **触发条件**: 连续 3 天无自省行为 +- **衰减率**: 每天 -1% +- **最低值**: 不低于 50 + +--- + +## 📈 属性等级划分 + +每个属性根据分数划分等级,影响徽章和称号。 + +| 等级 | 分数范围 | 称号 | 颜色 | +|------|----------|------|------| +| Lv 0 | 0-49 | 初学者 (Novice) | 灰色 | +| Lv 1 | 50-149 | 入门者 (Beginner) | 白色 | +| Lv 2 | 150-299 | 进阶者 (Intermediate) | 绿色 | +| Lv 3 | 300-499 | 熟练者 (Skilled) | 蓝色 | +| Lv 4 | 500-699 | 专家 (Expert) | 紫色 | +| Lv 5 | 700-899 | 大师 (Master) | 金色 | +| Lv 6 | 900-1000 | 传奇 (Legendary) | 红色 | + +### 等级称号示例 +- **Cognition Lv5**: 智慧大师 (Wisdom Master) +- **Sociability Lv5**: 社交达人 (Social Master) +- **Charisma Lv5**: 魅力领袖 (Charisma Leader) +- **Vitality Lv5**: 活力之星 (Vitality Star) +- **Reflection Lv5**: 觉察大师 (Mindfulness Master) + +--- + +## 🎯 综合评分与会员等级 + +### 综合评分 +``` +综合评分 = (Cognition + Sociability + Charisma + Vitality + Reflection) / 5 +``` + +### 会员等级(基于综合评分) + +| 会员等级 | 综合评分 | 权益 | +|----------|----------|------| +| 青铜会员 | 0-149 | 基础权益 | +| 白银会员 | 150-299 | 9折优惠 | +| 黄金会员 | 300-499 | 8折优惠 + 专属活动 | +| 铂金会员 | 500-699 | 7折优惠 + 优先权 | +| 钻石会员 | 700-899 | 5折优惠 + VIP服务 | +| 传奇会员 | 900-1000 | 全免费 + 专属特权 | + +--- + +## 🔄 属性平衡与调优 + +### 平衡原则 +1. **五维均衡发展**: 鼓励用户全面成长,而非只专注一维 +2. **防止单一刷分**: 设置每日上限和衰减机制 +3. **长期激励**: 连续行为和习惯养成获得更高奖励 +4. **质量优先**: 高质量行为比高频次行为奖励更多 + +### 调优策略 +- **A/B测试**: 测试不同增加值的效果 +- **数据分析**: 监控用户行为模式,调整参数 +- **用户反馈**: 收集用户对公平性的反馈 +- **定期审查**: 每季度审查并调整计算规则 + +--- + +## 🛡️ 防作弊机制 + +### 1. 行为验证 +- **时长验证**: 学习/运动时长需通过设备传感器验证(如手机锁屏则暂停) +- **位置验证**: 线下活动需通过GPS定位验证 +- **互动验证**: 社交互动需双方确认 + +### 2. 异常检测 +- **频率异常**: 短时间内大量重复行为标记为异常 +- **设备检测**: 同一设备多账号行为检测 +- **模式识别**: 使用机器学习识别刷分模式 + +### 3. 惩罚机制 +- **警告**: 首次异常行为警告 +- **扣分**: 第二次扣除相应属性值 +- **封禁**: 严重作弊行为封禁账号 + +--- + +## 💾 数据存储与API + +### 数据库设计 + +#### attributes 表 +```sql +CREATE TABLE attributes ( + user_id UUID PRIMARY KEY REFERENCES users(user_id), + cognition INT DEFAULT 100, + sociability INT DEFAULT 100, + charisma INT DEFAULT 100, + vitality INT DEFAULT 100, + reflection INT DEFAULT 100, + cognition_level INT DEFAULT 1, + sociability_level INT DEFAULT 1, + charisma_level INT DEFAULT 1, + vitality_level INT DEFAULT 1, + reflection_level INT DEFAULT 1, + overall_score INT GENERATED ALWAYS AS ( + (cognition + sociability + charisma + vitality + reflection) / 5 + ) STORED, + last_updated TIMESTAMP DEFAULT NOW(), + created_at TIMESTAMP DEFAULT NOW() +); +``` + +#### attribute_logs 表(行为日志) +```sql +CREATE TABLE attribute_logs ( + log_id UUID PRIMARY KEY, + user_id UUID REFERENCES users(user_id), + attribute_type VARCHAR(20), -- 'cognition', 'sociability', etc. + action_type VARCHAR(50), -- 'study', 'add_friend', 'like', etc. + value_change INT, -- +15, +20, etc. + metadata JSONB, -- 额外信息(如时长、内容等) + created_at TIMESTAMP DEFAULT NOW() +); +``` + +#### daily_limits 表(每日限额追踪) +```sql +CREATE TABLE daily_limits ( + user_id UUID, + action_type VARCHAR(50), + count INT DEFAULT 0, + date DATE DEFAULT CURRENT_DATE, + PRIMARY KEY (user_id, action_type, date) +); +``` + +### API 接口 + +#### 1. 获取用户属性 +```http +GET /api/v1/attributes/{user_id} + +Response: +{ + "user_id": "uuid", + "attributes": { + "cognition": { "value": 450, "level": 3 }, + "sociability": { "value": 320, "level": 3 }, + "charisma": { "value": 280, "level": 2 }, + "vitality": { "value": 510, "level": 4 }, + "reflection": { "value": 390, "level": 3 } + }, + "overall_score": 390, + "member_level": "黄金会员", + "last_updated": "2025-11-01T14:30:00Z" +} +``` + +#### 2. 记录行为(增加属性) +```http +POST /api/v1/attributes/action + +Request: +{ + "user_id": "uuid", + "action_type": "study", + "duration": 60, // 分钟 + "metadata": { + "location": "ORA Space", + "activity": "reading" + } +} + +Response: +{ + "success": true, + "attribute": "cognition", + "value_change": +18, + "new_value": 468, + "message": "学习60分钟,认知 +18" +} +``` + +#### 3. 获取属性历史 +```http +GET /api/v1/attributes/{user_id}/history?days=7 + +Response: +{ + "user_id": "uuid", + "period": "7 days", + "history": [ + { + "date": "2025-11-01", + "cognition": 450, + "sociability": 320, + ... + }, + ... + ], + "changes": { + "cognition": +45, + "sociability": +60, + ... + } +} +``` + +#### 4. 批量更新(WebSocket推送) +```json +// WebSocket Message +{ + "type": "attribute_update", + "user_id": "uuid", + "updates": [ + { + "attribute": "vitality", + "value_change": +10, + "new_value": 520, + "reason": "每日签到" + } + ], + "timestamp": "2025-11-01T09:00:00Z" +} +``` + +--- + +## 🧪 测试与迭代 + +### 测试阶段计划 + +#### Alpha 测试(内部) +- **目标**: 验证计算逻辑正确性 +- **参与者**: 10-20人内部团队 +- **时长**: 2周 +- **关注点**: + - 属性增长速度是否合理 + - 每日上限是否合适 + - 衰减机制是否有效 + +#### Beta 测试(小范围) +- **目标**: 收集真实用户反馈 +- **参与者**: 100-200人种子用户 +- **时长**: 4周 +- **关注点**: + - 用户参与度 + - 属性增长曲线 + - 作弊行为检测 + - 用户满意度 + +#### 调整参数 +根据测试数据调整: +- 增加值大小 +- 每日上限 +- 衰减率 +- 质量权重 + +--- + +## 📝 总结 + +五维属性系统是 ORA 生态的核心,通过科学的计算逻辑和激励机制: +1. **量化成长**: 让用户看到可见的成长 +2. **引导行为**: 鼓励全面发展和持续习惯 +3. **防止作弊**: 确保公平性和真实性 +4. **持续优化**: 基于数据不断调整和改进 + +**下一步**: 基于五维属性设计 ExplORA 游戏中的 LLM 决策机制。 + +--- + +**最后更新**: 2025-11-01 diff --git a/docs/LLM_Decision_Mechanism_Design.md b/docs/LLM_Decision_Mechanism_Design.md new file mode 100644 index 00000000..52db32cf --- /dev/null +++ b/docs/LLM_Decision_Mechanism_Design.md @@ -0,0 +1,780 @@ +# ExplORA LLM 决策机制设计 + +**版本**: 1.0 +**日期**: 2025-11-01 +**基于**: Microverse 架构 + +--- + +## 🎯 核心概念 + +ExplORA 中的 AI 角色行为完全由 LLM(千问 Qwen)驱动,五维属性通过 **Prompt Engineering** 影响 AI 的性格、行为倾向和决策。 + +### 设计目标 +1. **真实性**: AI 行为符合五维属性所定义的性格 +2. **一致性**: 相同属性值产生相似的行为模式 +3. **可预测性**: 用户能理解属性对行为的影响 +4. **趣味性**: 不同属性组合产生独特的游戏体验 + +--- + +## 📊 五维属性 → 性格特质映射 + +### 映射原则 + +每个属性按分数区间映射到**性格描述**和**行为倾向**。 + +--- + +### 1. Cognition(认知)[0-1000] + +#### 性格描述映射 + +| 分数区间 | 等级 | 性格描述 | 对话风格 | +|----------|------|----------|----------| +| 0-149 | 低 | 思维简单,不善于深度思考 | 对话浅显,避免复杂话题 | +| 150-299 | 较低 | 有基本认知,但缺乏深度 | 对话一般,偶尔有见解 | +| 300-499 | 中等 | 思维清晰,有一定学识 | 对话有条理,能讨论一般话题 | +| 500-699 | 较高 | 博学多识,善于分析 | 对话深刻,经常引经据典 | +| 700-899 | 高 | 学识渊博,洞察力强 | 对话充满智慧,提出独特见解 | +| 900-1000 | 极高 | 智慧超群,思想深邃 | 对话如哲学家,启发性强 | + +#### 行为倾向 + +**高 Cognition(>600)**: +- 更倾向于去图书馆、学习区 +- 对话中经常引用知识、分享见解 +- 主动参加讲座、读书会等活动 +- 好奇心强,喜欢探索新知识 + +**低 Cognition(<300)**: +- 更倾向于娱乐休闲区 +- 对话避免深入讨论 +- 较少参加知识类活动 +- 行为较为随性 + +#### Prompt 注入示例 + +```gdscript +# Cognition = 750 +var cognition_desc = """ +你是一个博学多识的人,智慧指数达到了 750/1000,在认知能力上远超常人。 +你的特质: +- 思维敏锐,善于分析和洞察事物本质 +- 博览群书,经常能引用各种知识和理论 +- 对学习有强烈的热情,总是渴望探索新知识 +- 在对话中,你会自然地分享你的见解和智慧 + +你的行为倾向: +- 喜欢去图书馆和学习区,那里能让你沉浸在知识的海洋中 +- 遇到有趣的人,你会主动讨论哲学、科学、艺术等深刻话题 +- 你经常参加讲座和读书会,享受与他人分享知识的乐趣 +""" +``` + +```gdscript +# Cognition = 180 +var cognition_desc = """ +你的智慧指数是 180/1000,你更喜欢简单直接的生活方式。 +你的特质: +- 思维简单直接,不太喜欢复杂的理论 +- 对深奥的话题不感兴趣,更关注日常生活 +- 学习对你来说不是优先事项 + +你的行为倾向: +- 你更喜欢轻松的娱乐活动,而不是学习 +- 对话中你倾向于聊日常琐事和轻松话题 +- 你会避免去图书馆这类需要深度思考的地方 +""" +``` + +--- + +### 2. Sociability(社交)[0-1000] + +#### 性格描述映射 + +| 分数区间 | 等级 | 性格描述 | 社交风格 | +|----------|------|----------|----------| +| 0-149 | 极内向 | 极度害羞,害怕社交 | 几乎不主动交流 | +| 150-299 | 内向 | 较为内向,社交谨慎 | 偶尔与熟人交流 | +| 300-499 | 适中 | 社交能力一般,不过度 | 正常社交,不主动不抗拒 | +| 500-699 | 外向 | 喜欢社交,善于交流 | 主动发起对话,结交朋友 | +| 700-899 | 极外向 | 社交能力超强,人际广 | 非常主动,成为社交中心 | +| 900-1000 | 社交天才 | 天生的社交家,魅力四射 | 随时随地社交,影响力极大 | + +#### 行为倾向 + +**高 Sociability(>600)**: +- **主动社交**: 每次决策时,50%+ 概率选择发起对话 +- **频繁互动**: 一天内与多人对话(3-10人) +- **活动参与**: 积极参加各类社交活动 +- **位置选择**: 倾向于社交区、咖啡厅等人多的地方 + +**低 Sociability(<300)**: +- **被动社交**: 很少主动发起对话(<10%概率) +- **独处偏好**: 倾向于独自行动 +- **回避人群**: 避开人多的地方 +- **位置选择**: 倾向于安静角落、独立工作区 + +#### Prompt 注入示例 + +```gdscript +# Sociability = 820 +var sociability_desc = """ +你的社交指数是 820/1000,你是一个天生的社交家! +你的特质: +- 极度外向,热爱与人交流 +- 结交新朋友让你充满快乐 +- 你有强大的社交魅力,能轻松与陌生人建立连接 +- 你是派对和聚会的灵魂人物 + +你的行为倾向: +- 你会主动接近看起来有趣的人,发起对话 +- 你喜欢待在人多热闹的地方,如社交区、咖啡厅 +- 你经常组织或参加各种社交活动 +- 遇到新人,你会非常热情地打招呼并介绍自己 + +决策时,优先考虑社交机会! +``` +``` + +```gdscript +# Sociability = 120 +var sociability_desc = """ +你的社交指数是 120/1000,你是一个极度内向的人。 +你的特质: +- 非常害羞,社交让你感到紧张 +- 你更喜欢独处,享受安静的时光 +- 与陌生人交流对你来说是一种挑战 +- 你的朋友圈很小,但你珍惜每一个朋友 + +你的行为倾向: +- 你几乎从不主动发起对话,除非对方先找你 +- 你喜欢待在安静的角落,远离人群 +- 你会回避社交活动,除非是熟人邀请 +- 如果有人接近你,你可能会显得局促不安 + +决策时,优先考虑独处和安静! +``` + +--- + +### 3. Charisma(魅力)[0-1000] + +#### 性格描述映射 + +| 分数区间 | 等级 | 性格描述 | 影响力 | +|----------|------|----------|--------| +| 0-149 | 低魅力 | 存在感弱,较少被关注 | 几乎无影响力 | +| 150-299 | 一般魅力 | 普通人,偶尔被注意 | 影响力有限 | +| 300-499 | 有魅力 | 有一定吸引力,受欢迎 | 小范围影响力 | +| 500-699 | 高魅力 | 很有魅力,受人喜爱 | 较大影响力 | +| 700-899 | 极高魅力 | 魅力四射,众人瞩目 | 强大影响力 | +| 900-1000 | 传奇魅力 | 明星般的存在,万众追捧 | 传奇级影响力 | + +#### 行为倾向 + +**高 Charisma(>600)**: +- **自信表现**: 说话自信,肢体语言开放 +- **领导倾向**: 倾向于组织活动、引导话题 +- **魅力展现**: 对话中展现个人魅力和幽默感 +- **受关注**: AI角色会主动接近你 + +**低 Charisma(<300)**: +- **低调谨慎**: 说话谨慎,避免成为焦点 +- **跟随者**: 倾向于跟随他人而非领导 +- **平淡对话**: 对话缺乏亮点 +- **被忽视**: 较少被其他角色主动关注 + +#### Prompt 注入示例 + +```gdscript +# Charisma = 880 +var charisma_desc = """ +你的魅力指数是 880/1000,你就像一颗耀眼的明星! +你的特质: +- 你有强大的个人魅力,走到哪里都是焦点 +- 你的言行举止充满自信和吸引力 +- 人们天然地被你吸引,想要接近你 +- 你有幽默感,说话风趣,总能让气氛活跃 + +你的行为倾向: +- 你会自然地成为对话的中心,引导话题 +- 你喜欢分享有趣的故事和想法,展现你的魅力 +- 你会主动组织活动,人们都愿意跟随你 +- 你的存在感极强,即使在人群中也非常显眼 + +在对话中,展现你的魅力和自信! +""" +``` + +```gdscript +# Charisma = 150 +var charisma_desc = """ +你的魅力指数是 150/1000,你是一个低调平凡的人。 +你的特质: +- 你不太引人注目,存在感较弱 +- 你缺乏自信,不善于展现自己 +- 你的魅力平平,很难吸引他人关注 +- 你更习惯默默做事,而不是成为焦点 + +你的行为倾向: +- 你在对话中比较被动,很少主导话题 +- 你会避免成为注意力的中心 +- 你说话可能有些犹豫,缺乏自信 +- 你不太会组织活动,更倾向于跟随他人 + +在对话中,保持低调和谦逊。 +""" +``` + +--- + +### 4. Vitality(活力)[0-1000] + +#### 性格描述映射 + +| 分数区间 | 等级 | 性格描述 | 能量状态 | +|----------|------|----------|----------| +| 0-149 | 极低活力 | 疲惫不堪,缺乏精力 | 几乎没有能量 | +| 150-299 | 低活力 | 精力不足,容易疲劳 | 能量较低 | +| 300-499 | 中等活力 | 精力一般,普通状态 | 正常能量 | +| 500-699 | 高活力 | 精力充沛,充满活力 | 高能量状态 | +| 700-899 | 极高活力 | 活力四射,精力旺盛 | 极高能量 | +| 900-1000 | 无限活力 | 永不疲倦,能量无穷 | 能量爆表 | + +#### 行为倾向 + +**高 Vitality(>600)**: +- **运动倾向**: 倾向于运动区、户外活动 +- **行动力强**: 快速做出决策并行动 +- **精力充沛**: 对话充满能量,语气积极 +- **耐久力**: 长时间活动不感疲惫 + +**低 Vitality(<300)**: +- **疲惫状态**: 倾向于休息区、安静区域 +- **行动迟缓**: 决策和行动较慢 +- **低能量**: 对话语气疲惫,缺乏热情 +- **易疲劳**: 短时间活动后需要休息 + +#### Prompt 注入示例 + +```gdscript +# Vitality = 790 +var vitality_desc = """ +你的活力指数是 790/1000,你精力旺盛,充满活力! +你的特质: +- 你总是精力充沛,仿佛永远不知疲倦 +- 你喜欢运动和户外活动,它们让你更有活力 +- 你的身体健康状况极佳,很少生病 +- 你的能量感染着周围的人 + +你的行为倾向: +- 你倾向于去运动区、户外,保持活跃 +- 你说话充满激情和能量,语气积极向上 +- 你喜欢快节奏的活动,静坐对你来说是煎熬 +- 你会主动邀请他人一起运动或活动 + +在对话中,展现你的活力和激情! +""" +``` + +```gdscript +# Vitality = 180 +var vitality_desc = """ +你的活力指数是 180/1000,你感到疲惫和缺乏精力。 +你的特质: +- 你总是感到疲惫,精力不足 +- 运动对你来说很困难,你更想休息 +- 你可能有健康问题,或睡眠不足 +- 你的低能量状态影响着你的情绪 + +你的行为倾向: +- 你倾向于去休息区,找个安静的地方坐下 +- 你说话可能有些有气无力,缺乏热情 +- 你会避免需要大量体力的活动 +- 你经常提到想休息或感到累 + +在对话中,展现你的疲惫状态。 +""" +``` + +--- + +### 5. Reflection(自省)[0-1000] + +#### 性格描述映射 + +| 分数区间 | 等级 | 性格描述 | 内在状态 | +|----------|------|----------|----------| +| 0-149 | 无自省 | 缺乏自我觉察,情绪混乱 | 情绪失控 | +| 150-299 | 低自省 | 较少自我反思,情绪波动大 | 情绪不稳 | +| 300-499 | 中等自省 | 有一定自我觉察,情绪稳定 | 情绪正常 | +| 500-699 | 高自省 | 善于自我反思,内心平静 | 情绪稳定 | +| 700-899 | 极高自省 | 深刻的自我觉察,智慧通达 | 内心宁静 | +| 900-1000 | 觉悟者 | 达到觉悟境界,完全觉知 | 完全觉察 | + +#### 行为倾向 + +**高 Reflection(>600)**: +- **深度思考**: 对话中常有深刻的自我反思 +- **情绪稳定**: 不易被外界影响,内心平静 +- **哲思倾向**: 喜欢讨论人生、意义、价值观等 +- **冥想偏好**: 倾向于冥想区、安静的自省空间 + +**低 Reflection(<300)**: +- **冲动行为**: 缺乏深思熟虑,容易冲动 +- **情绪波动**: 情绪不稳定,容易被外界影响 +- **浅层对话**: 很少深入思考或反思 +- **逃避自省**: 避免独处和深度思考 + +#### Prompt 注入示例 + +```gdscript +# Reflection = 850 +var reflection_desc = """ +你的自省指数是 850/1000,你拥有深刻的自我觉察能力。 +你的特质: +- 你对自己的内心世界有深刻的理解 +- 你经常反思人生的意义和价值 +- 你的情绪非常稳定,内心平静如水 +- 你能清晰地感知自己和他人的情感 + +你的行为倾向: +- 你喜欢去冥想区,享受独处和内观的时光 +- 你的对话充满哲理和深度,经常引发他人思考 +- 你会分享你的自我反思和人生感悟 +- 你不易被外界干扰,保持内心的宁静 + +在对话中,展现你的智慧和觉察力。 +""" +``` + +```gdscript +# Reflection = 140 +var reflection_desc = """ +你的自省指数是 140/1000,你缺乏自我觉察,情绪较为混乱。 +你的特质: +- 你很少反思自己的行为和情感 +- 你的情绪容易波动,受外界影响大 +- 你不太理解自己的内心世界 +- 你倾向于逃避深度思考 + +你的行为倾向: +- 你会避免独处和安静的环境,它们让你不安 +- 你的对话较为浅显,避免谈论深刻话题 +- 你可能会显得焦虑或情绪不稳 +- 你更喜欢分散注意力的活动,而非自省 + +在对话中,展现你的情绪波动和缺乏自省。 +""" +``` + +--- + +## 🎮 决策权重算法 + +### AI Agent 决策流程 + +每次 AI Agent 做决策时(每60秒一次),系统会: + +1. **收集环境信息**: 当前位置、周围的人、可用的动作 +2. **读取五维属性**: 从 AttributeManager 获取最新属性值 +3. **构建 Prompt**: 注入属性描述 + 环境信息 + 性格倾向 +4. **调用 LLM**: 发送 Prompt 到 Qwen API +5. **解析决策**: 从 LLM 响应中提取动作选择 +6. **执行动作**: 移动、对话、或其他行为 + +### 决策 Prompt 模板 + +```gdscript +func build_decision_prompt(agent: AIAgent) -> String: + var prompt = "" + + # 1. 基础身份 + prompt += "你是 %s,一个在 ORA 虚拟空间中的 AI 角色。\n\n" % agent.character_name + + # 2. 五维属性注入 + var attributes = AttributeManager.current_attributes + prompt += get_cognition_description(attributes.cognition) + "\n" + prompt += get_sociability_description(attributes.sociability) + "\n" + prompt += get_charisma_description(attributes.charisma) + "\n" + prompt += get_vitality_description(attributes.vitality) + "\n" + prompt += get_reflection_description(attributes.reflection) + "\n\n" + + # 3. 当前状态 + prompt += "当前时间: %s\n" % get_current_time() + prompt += "当前位置: %s\n" % agent.current_room.name + prompt += "当前心情: %s\n\n" % agent.current_mood + + # 4. 环境信息 + prompt += "你周围的人: %s\n" % get_nearby_characters(agent) + prompt += "附近的地点: %s\n\n" % get_nearby_rooms(agent) + + # 5. 可选动作 + prompt += "你可以选择以下行动之一:\n" + prompt += "1. 移动到某个地点(学习区/社交区/运动区/冥想区/咖啡厅)\n" + prompt += "2. 与某人发起对话\n" + prompt += "3. 继续当前活动\n" + prompt += "4. 休息一会\n\n" + + # 6. 用户提示词(如果有) + var user_prompts = PromptManager.get_active_prompts() + if not user_prompts.is_empty(): + prompt += "特殊指令(来自用户):\n" + for p in user_prompts: + prompt += "- " + p.content + "\n" + prompt += "\n" + + # 7. 决策指导 + prompt += """ + 基于你的性格特质、当前状态和环境,决定你接下来要做什么。 + 请直接输出你的决策,格式如下: + + 【决策】移动到学习区 + 【理由】我的认知属性很高,我渴望学习新知识,而学习区是最适合我的地方。 + + 或: + + 【决策】与 Alice 对话 + 【理由】我的社交属性很高,我想认识新朋友,Alice 看起来很有趣。 + + 只输出一个决策,不要输出多个选项。 + """ + + return prompt +``` + +### 属性权重影响决策概率 + +除了通过 Prompt 影响 LLM,还可以在代码层面根据属性调整决策概率: + +```gdscript +func calculate_action_probability(action_type: String, attributes: Dictionary) -> float: + var base_prob = 0.2 # 基础概率 + + match action_type: + "go_to_library": + # Cognition 越高,越倾向去图书馆 + return base_prob + (attributes.cognition / 1000.0) * 0.6 + + "start_conversation": + # Sociability 越高,越倾向发起对话 + return base_prob + (attributes.sociability / 1000.0) * 0.7 + + "go_to_gym": + # Vitality 越高,越倾向去健身房 + return base_prob + (attributes.vitality / 1000.0) * 0.5 + + "meditate": + # Reflection 越高,越倾向冥想 + return base_prob + (attributes.reflection / 1000.0) * 0.6 + + "organize_event": + # Charisma + Sociability 高,越倾向组织活动 + var combined = (attributes.charisma + attributes.sociability) / 2000.0 + return base_prob + combined * 0.5 + + return base_prob +``` + +--- + +## 💬 对话生成中的属性影响 + +### 对话 Prompt 构建 + +```gdscript +func build_dialog_prompt(speaker: AIAgent, listener: AIAgent) -> String: + var prompt = "" + + # 1. 说话者身份和属性 + prompt += "你是 %s。\n" % speaker.character_name + prompt += get_all_attributes_description(speaker.attributes) + "\n\n" + + # 2. 听众信息 + prompt += "你正在与 %s 对话。\n" % listener.character_name + prompt += "对方的特点:\n" + prompt += "- Cognition: %d\n" % listener.attributes.cognition + prompt += "- Sociability: %d\n" % listener.attributes.sociability + prompt += "- Charisma: %d\n" % listener.attributes.charisma + prompt += "\n" + + # 3. 对话历史 + var chat_history = get_chat_history(speaker, listener) + if chat_history != "": + prompt += "你们之前的对话:\n%s\n\n" % chat_history + + # 4. 对话指导(基于属性) + prompt += get_dialog_guidance(speaker.attributes) + "\n" + + # 5. 生成指令 + prompt += """ + 请生成一句你要说的话(1-3句话,30字以内)。 + 只返回对话内容,不要有任何前缀或描述。 + """ + + return prompt +``` + +### 属性对对话风格的影响 + +```gdscript +func get_dialog_guidance(attributes: Dictionary) -> String: + var guidance = "对话时请注意:\n" + + # Cognition 影响 + if attributes.cognition > 700: + guidance += "- 你的对话应该充满智慧和洞察,可以引用知识或提出深刻见解\n" + elif attributes.cognition < 200: + guidance += "- 你的对话应该简单直白,避免复杂的理论和深奥的话题\n" + + # Sociability 影响 + if attributes.sociability > 700: + guidance += "- 你非常外向热情,对话应该充满活力和友好\n" + elif attributes.sociability < 200: + guidance += "- 你比较内向害羞,对话应该简短谨慎,可能有些不自在\n" + + # Charisma 影响 + if attributes.charisma > 700: + guidance += "- 你很有魅力,对话应该自信、风趣、吸引人\n" + elif attributes.charisma < 200: + guidance += "- 你缺乏自信,对话可能有些犹豫或平淡\n" + + # Vitality 影响 + if attributes.vitality > 700: + guidance += "- 你精力充沛,对话应该充满激情和能量\n" + elif attributes.vitality < 200: + guidance += "- 你感到疲惫,对话可能有些有气无力\n" + + # Reflection 影响 + if attributes.reflection > 700: + guidance += "- 你善于自省,对话中可以分享你的深刻思考和感悟\n" + elif attributes.reflection < 200: + guidance += "- 你缺乏自省,对话较为浅显,避免深入的情感或哲理话题\n" + + return guidance +``` + +--- + +## 🧪 LLM 参数调优 + +### Qwen API 调用参数 + +```gdscript +func call_qwen_api(prompt: String) -> String: + var request_data = { + "model": "qwen-plus", # 或其他 Qwen 模型 + "messages": [ + { + "role": "system", + "content": "你是一个 AI 角色,根据你的性格特质和属性做出真实的行为决策和对话。" + }, + { + "role": "user", + "content": prompt + } + ], + "temperature": 0.8, # 较高的随机性,让行为更多样 + "top_p": 0.9, + "max_tokens": 150, # 对话限制在简短范围 + "presence_penalty": 0.3, # 避免重复 + "frequency_penalty": 0.3 + } + + # 通过 SiliconFlow 调用 + return APIManager.call_siliconflow_api(request_data) +``` + +### 参数说明 +- **temperature**: 0.7-0.9(较高值让行为更随机和多样化) +- **top_p**: 0.9(保留90%概率的词汇选择) +- **max_tokens**: 100-200(控制对话长度) +- **presence_penalty**: 0.2-0.4(鼓励谈论新话题) +- **frequency_penalty**: 0.2-0.4(减少重复用词) + +--- + +## 📊 效果验证与调优 + +### 测试维度 + +#### 1. 一致性测试 +- **测试目标**: 相同属性值产生相似行为 +- **方法**: 创建多个相同属性的 Agent,观察行为一致性 +- **指标**: 行为相似度 > 70% + +#### 2. 差异性测试 +- **测试目标**: 不同属性值产生明显差异 +- **方法**: 创建极端属性对比的 Agent(如 Cognition 900 vs 100) +- **指标**: 行为差异度 > 80% + +#### 3. 真实性测试 +- **测试目标**: 行为符合人类直觉 +- **方法**: 用户评估 Agent 行为是否"合理" +- **指标**: 用户满意度 > 75% + +### 调优策略 + +#### Prompt 迭代 +1. **初始版本**: 简单描述属性值 +2. **V2**: 增加性格描述和行为倾向 +3. **V3**: 增加具体行为示例 +4. **V4**: 根据测试反馈微调用词 + +#### 属性映射调整 +- 根据测试结果调整属性区间划分 +- 微调性格描述的措辞 +- 优化行为倾向的权重 + +--- + +## 💾 代码实现示例 + +### AttributeManager.gd + +```gdscript +extends Node + +# 五维属性数据 +var current_attributes = { + "cognition": 500, + "sociability": 500, + "charisma": 500, + "vitality": 500, + "reflection": 500 +} + +var user_id: String = "" + +func _ready(): + # 初始化时从后端获取属性 + fetch_attributes_from_backend() + + # 监听 WebSocket 推送 + setup_websocket_listener() + +func fetch_attributes_from_backend(): + var http_request = HTTPRequest.new() + add_child(http_request) + + var url = "https://api.ora.com/v1/attributes/%s" % user_id + http_request.request(url) + http_request.request_completed.connect(_on_attributes_fetched) + +func _on_attributes_fetched(result, response_code, headers, body): + if response_code == 200: + var json = JSON.parse_string(body.get_string_from_utf8()) + current_attributes = { + "cognition": json.attributes.cognition.value, + "sociability": json.attributes.sociability.value, + "charisma": json.attributes.charisma.value, + "vitality": json.attributes.vitality.value, + "reflection": json.attributes.reflection.value + } + print("属性已更新: ", current_attributes) + +func get_cognition_description(cognition: int) -> String: + if cognition >= 900: + return """你的认知指数达到了惊人的 %d/1000,你是智慧的化身。 +你拥有深邃的思想,博览群书,善于洞察事物本质。 +你的对话充满智慧,经常启发他人。 +你倾向于去图书馆、参加讲座,永远渴望新知识。""" % cognition + elif cognition >= 700: + return """你的认知指数是 %d/1000,你博学多识,思维敏锐。 +你善于分析和深度思考,经常引经据典。 +你喜欢学习和探索新知识。""" % cognition + elif cognition >= 500: + return """你的认知指数是 %d/1000,你思维清晰,有一定学识。 +你能进行正常的深度对话和思考。""" % cognition + elif cognition >= 300: + return """你的认知指数是 %d/1000,你有基本的认知能力。 +你更喜欢简单直接的话题。""" % cognition + else: + return """你的认知指数是 %d/1000,你思维简单,不善深度思考。 +你避免复杂话题,更关注日常琐事。""" % cognition + +# 类似地实现其他四维的描述函数... + +func get_all_attributes_description() -> String: + var desc = "" + desc += get_cognition_description(current_attributes.cognition) + "\n\n" + desc += get_sociability_description(current_attributes.sociability) + "\n\n" + desc += get_charisma_description(current_attributes.charisma) + "\n\n" + desc += get_vitality_description(current_attributes.vitality) + "\n\n" + desc += get_reflection_description(current_attributes.reflection) + "\n" + return desc +``` + +### 在 AIAgent.gd 中集成 + +```gdscript +func make_decision(): + # 获取当前五维属性 + var attributes = AttributeManager.current_attributes + + # 构建决策 Prompt + var prompt = build_decision_prompt() + + # 调用 LLM API + var api_manager = APIManager.get_instance() + var http_request = await api_manager.generate_decision(prompt, character_name) + http_request.request_completed.connect(_on_decision_received) + +func build_decision_prompt() -> String: + var prompt = "你是 %s。\n\n" % character_name + + # 注入五维属性描述 + prompt += AttributeManager.get_all_attributes_description() + "\n\n" + + # 添加环境信息 + prompt += generate_scene_description() + "\n\n" + + # 添加用户提示词 + var user_prompts = PromptManager.get_active_prompts() + if not user_prompts.is_empty(): + prompt += "用户指令:\n" + for p in user_prompts: + prompt += "- " + p.content + "\n" + prompt += "\n" + + # 决策指导 + prompt += """ + 基于你的性格、当前状态和环境,选择接下来的行动。 + 可选行动: + 1. 移动到某地(学习区/社交区/运动区/冥想区/咖啡厅) + 2. 与某人对话 + 3. 继续当前活动 + 4. 休息 + + 请直接输出:【决策】你的选择 + """ + + return prompt + +func _on_decision_received(result, response_code, headers, body): + var response = JSON.parse_string(body.get_string_from_utf8()) + var decision_text = APIConfig.parse_response(current_settings.api_type, response) + + # 解析决策 + parse_and_execute_decision(decision_text) +``` + +--- + +## 📝 总结 + +通过精心设计的五维属性 → LLM Prompt 映射机制: + +1. **性格塑造**: 五维属性决定 AI 角色的性格和行为模式 +2. **行为驱动**: 属性值通过 Prompt 影响 LLM 的决策输出 +3. **真实体验**: 用户在线下的成长直接影响虚拟世界的角色 +4. **持续优化**: 通过测试和数据反馈不断优化映射关系 + +**下一步**: 整合所有设计,更新总体开发路线图。 + +--- + +**最后更新**: 2025-11-01 diff --git a/docs/ORA_Project_Overview.md b/docs/ORA_Project_Overview.md new file mode 100644 index 00000000..ae5bf2ab --- /dev/null +++ b/docs/ORA_Project_Overview.md @@ -0,0 +1,409 @@ +# ORA 项目全景设计 + +**版本**: 1.0 +**日期**: 2025-11-01 +**项目定位**: O2O 自我提升社交平台(中国香港) + +--- + +## 🎯 项目愿景 + +**ORA** 是一个创新的 O2O(线上到线下)自我提升社交平台,旨在创造一个让会员实现自我成长并建立自然社交连接的空间。 + +### 核心理念 +- **自我提升**: 通过五维属性系统量化个人成长 +- **自然社交**: 通过线下空间实时定位促进真实互动 +- **虚实结合**: 线下空间 + 线上APP + 虚拟游戏世界的完整生态 + +--- + +## 🏗️ 系统架构 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ ORA 生态系统 │ +└─────────────────────────────────────────────────────────────┘ + │ + ┌─────────────────────┼─────────────────────┐ + │ │ │ + ┌────▼─────┐ ┌────▼─────┐ ┌────▼─────┐ + │ 线下空间 │ │ 线上APP │ │ ExplORA │ + │ Physical │ │ Mobile │ │ Virtual │ + │ Space │ │ App │ │ World │ + └──────────┘ └──────────┘ └──────────┘ + │ │ │ + │ 实时定位 │ 五维属性 │ + │ 会员互动 │ 虚拟货币 │ + │ 活动举办 │ 权益兑换 │ + │ │ 社交功能 │ + │ │ │ + └─────────────────────┴─────────────────────┘ + │ + ┌─────────▼─────────┐ + │ 后端服务系统 │ + │ - 用户管理 │ + │ - 属性计算 │ + │ - 成就系统 │ + │ - 权益管理 │ + │ - 数据同步 │ + └───────────────────┘ +``` + +--- + +## 🏢 线下空间 (Physical Space) + +### 功能定位 +ORA 的线下空间是会员进行自我提升和社交活动的实体场所。 + +### 核心功能 + +#### 1. 实时定位系统 +- **会员位置追踪**: 进入空间的会员实时位置显示在APP上 +- **社交促进**: 会员可以查看附近的其他会员,主动发起社交 +- **隐私控制**: 会员可以选择是否显示自己的位置 + +#### 2. 空间分区(示例) +- **学习工作区**: 安静的个人学习空间 +- **社交互动区**: 开放式交流空间 +- **运动健身区**: 健身设备和活动空间 +- **冥想休息区**: 放松和自省空间 +- **活动举办区**: 举办各类活动和讲座 + +#### 3. 活动与服务 +- **定期活动**: 读书会、技能分享、运动课程 +- **配套服务**: 咖啡饮品、轻食、办公设施 +- **会员权益**: 使用虚拟货币兑换服务 + +--- + +## 📱 线上 APP (Mobile Application) + +### 技术栈 +- **开发框架**: Flutter + Dart +- **平台支持**: iOS / Android + +### 核心功能模块 + +#### 1. 五维属性系统 ⭐⭐⭐ +**五维属性定义**: +- **Cognition(认知)**: 学习能力和知识积累 [0-1000] +- **Sociability(社交)**: 社交活跃度和人际连接 [0-1000] +- **Charisma(魅力)**: 个人影响力和受欢迎程度 [0-1000] +- **Vitality(活力)**: 身体健康和精力充沛度 [0-1000] +- **Reflection(自省)**: 自我觉察和内心成长 [0-1000] + +**数据来源**: +- Cognition ← 学习时长、工作时长、阅读记录 +- Sociability ← 加好友、互动次数、参加活动 +- Charisma ← 他人点赞、评论互动、影响力 +- Vitality ← 签到次数、运动时长、睡眠质量 +- Reflection ← 心情记录、日记打卡、冥想时长 + +**可视化**: +- 五维雷达图 +- 历史趋势图 +- 与好友对比 + +#### 2. 社交功能 +- **好友系统**: 添加好友、查看好友属性 +- **实时定位**: 查看线下空间内的会员位置 +- **互动系统**: 点赞、评论、私信 +- **活动报名**: 报名参加线下活动 + +#### 3. 成长记录 +- **日记打卡**: 每日心情和反思记录 +- **习惯追踪**: 学习、运动、睡眠等习惯 +- **成就系统**: 解锁各类成就徽章 + +#### 4. 虚拟货币系统 💰 +**ORA Coin (OC)** +- **获取方式**: + - 完成每日任务 + - 解锁成就 + - 参加活动 + - 属性提升奖励 +- **使用场景**: + - 兑换线下空间的饮品和服务 + - 购买会员时长 + - 兑换优惠券(如咖啡半价券) + - 进入 ExplORA 虚拟世界 + +#### 5. 权益中心 +- **会员等级**: 根据五维属性总和划分等级 +- **专属权益**: + - 咖啡/饮品折扣(半价券、免费券) + - 免费会员天数 + - 活动优先报名权 + - ExplORA 虚拟道具 +- **权益兑换**: 使用 OC 兑换各类权益 + +#### 6. 数据统计 +- **个人仪表盘**: 属性概览、成就进度 +- **排行榜**: 各维度排行、综合排行 +- **周/月报**: 成长总结报告 + +--- + +## 🎮 ExplORA 虚拟世界 (Virtual World) + +### 定位 +ExplORA 是 ORA 生态的**线上虚拟空间延伸**,一个由 LLM 驱动的 AI 社交游戏世界。 + +### 技术栈 +- **游戏引擎**: Godot 4 +- **开发语言**: GDScript +- **LLM集成**: 千问 (Qwen) via SiliconFlow API + +### 核心玩法 + +#### 1. 虚拟化身 (Avatar) +- **属性继承**: 玩家的五维属性从 ORA APP 实时同步 +- **性格塑造**: 五维属性决定 AI 化身的性格和行为倾向 +- **外观自定义**: 根据成就解锁装扮 + +#### 2. AI驱动的社交体验 +基于 Microverse 架构,ExplORA 中的 AI 角色: +- **真实互动**: 基于 LLM 的自然对话 +- **个性化行为**: 根据玩家五维属性调整行为 +- **记忆系统**: 记住与玩家的互动历史 + +#### 3. 虚拟空间探索 +- **镜像场景**: 虚拟化的 ORA 线下空间 +- **社交场景**: 咖啡厅、图书馆、健身房等 +- **探索奖励**: 探索新场景获得 OC 和属性加成 + +#### 4. 提示词系统 ✨ +**玩家影响游戏世界的方式**: +- **提示词输入**: 玩家可以输入提示词(≤100字/词) +- **有效期**: 提示词生效 5 小时 +- **影响机制**: + - **一次性提示词**: 触发一次特定事件后失效 + - **持续影响提示词**: 在 5 小时内持续影响 AI 行为 + +**示例**: +``` +玩家输入: "今天想认识新朋友" +效果: AI 角色会更主动地接近玩家并发起对话(持续5小时) + +玩家输入: "寻找一个安静的学习角落" +效果: 游戏引导玩家前往图书馆并解锁新区域(一次性) +``` + +#### 5. 成就与奖励 +- **虚拟成就**: 与 ORA APP 成就系统联动 +- **奖励回馈**: ExplORA 中的成就转化为 ORA APP 中的 OC 和权益 + +--- + +## 🔄 数据流与同步 + +### 实时同步架构 +``` +┌──────────────┐ +│ 线下空间 │ +│ - 签到 │ +│ - 活动参与 │ +└──────┬───────┘ + │ + ▼ +┌──────────────┐ WebSocket ┌──────────────┐ +│ ORA APP │◄─────────────────►│ 后端服务 │ +│ - 行为记录 │ REST API │ - 属性计算 │ +│ - 属性展示 │ │ - 数据存储 │ +└──────┬───────┘ └──────┬───────┘ + │ │ + │ │ WebSocket + │ 进入游戏 │ + │ ▼ + └────────────────────────►┌──────────────┐ + │ ExplORA │ + │ - 读取属性 │ + │ - LLM决策 │ + │ - 成就上报 │ + └──────────────┘ +``` + +### 数据同步频率 +- **属性数据**: 实时同步(WebSocket推送) +- **成就数据**: 即时同步(触发时推送) +- **排行榜**: 每小时更新 +- **提示词**: 即时生效 + +--- + +## 💡 用户旅程示例 + +### 典型一天的 ORA 体验 + +**上午 9:00 - 到达线下空间** +1. 会员打开 ORA APP,扫码签到 +2. Vitality +5(签到奖励) +3. 获得 10 OC +4. APP 显示今日在店会员列表和位置 + +**上午 9:30-12:00 - 学习工作** +1. 在学习区工作 2.5 小时 +2. APP 自动记录学习时长 +3. Cognition +25(学习时长 × 10) + +**中午 12:00 - 社交互动** +1. 在 APP 上看到附近有兴趣相投的会员 +2. 主动打招呼,互加好友 +3. Sociability +15(加好友) +4. 收到对方点赞 +5. Charisma +5(被点赞) + +**下午 13:00 - 使用虚拟货币** +1. 用 50 OC 兑换咖啡半价券 +2. 购买咖啡,享受优惠 + +**下午 14:00-16:00 - 参加活动** +1. 参加线下读书分享会 +2. Sociability +20(参加活动) +3. Cognition +15(知识活动) +4. 解锁成就"阅读爱好者 Lv1" +5. 获得 100 OC 奖励 + +**晚上 18:00 - 运动** +1. 在健身区运动 1 小时 +2. Vitality +30(运动时长 × 30) + +**晚上 21:00 - 回家后** +1. 打开 ORA APP,记录今日心情和反思 +2. Reflection +20(日记打卡) +3. 查看今日五维属性增长 +4. 查看排行榜,发现 Vitality 排名上升 + +**睡前 - 进入 ExplORA** +1. 打开 ExplORA 虚拟世界 +2. 五维属性实时同步到虚拟化身 +3. 输入提示词:"今天想在虚拟咖啡厅放松" +4. AI 咖啡师主动推荐饮品并聊天 +5. 完成虚拟探索,获得 20 OC +6. 解锁新成就 + +--- + +## 📊 商业模式 + +### 收入来源 + +#### 1. 会员费 +- **基础会员**: 免费(限制使用时长) +- **月度会员**: ¥299/月(无限使用) +- **年度会员**: ¥2999/年(无限使用 + 额外权益) + +#### 2. 虚拟货币销售 +- **OC 充值**: 用户可直接购买 OC +- **定价**: ¥1 = 10 OC +- **首充优惠**: 首次充值双倍赠送 + +#### 3. 线下消费 +- **咖啡饮品**: 单杯 ¥25-45 +- **轻食简餐**: ¥35-65 +- **场地租赁**: 小型活动/会议室租赁 + +#### 4. 活动与课程 +- **付费课程**: 技能培训、兴趣课程 +- **活动门票**: 特殊主题活动 + +#### 5. 企业合作 +- **品牌联名**: 品牌入驻 ORA 空间 +- **企业团建**: 企业包场和定制活动 + +--- + +## 🎯 目标用户 + +### 核心用户画像 + +#### 用户群体 1: 自我提升者 +- **年龄**: 22-35岁 +- **职业**: 知识工作者、创业者、自由职业者 +- **痛点**: 缺乏自律、难以坚持、成长无量化 +- **需求**: 量化成长、获得反馈、持续激励 + +#### 用户群体 2: 社交拓展者 +- **年龄**: 25-40岁 +- **职业**: 职场人士、新移民 +- **痛点**: 社交圈窄、缺乏真实连接 +- **需求**: 结识志同道合的朋友、高质量社交 + +#### 用户群体 3: 生活方式追求者 +- **年龄**: 23-35岁 +- **职业**: 都市白领、文艺青年 +- **痛点**: 生活单调、缺乏体验 +- **需求**: 新鲜体验、平衡生活、精神满足 + +--- + +## 🚀 竞争优势 + +### 1. 量化成长系统 +- **独特性**: 五维属性系统科学量化个人成长 +- **优势**: 给予用户明确的成长反馈和目标 + +### 2. 虚实结合生态 +- **独特性**: 线下空间 + 线上APP + 虚拟世界三位一体 +- **优势**: 提供全方位的成长和社交体验 + +### 3. AI驱动的虚拟社交 +- **独特性**: 基于 LLM 的 ExplORA 虚拟世界 +- **优势**: 24/7 随时随地的社交体验 + +### 4. 自然社交促进 +- **独特性**: 实时定位 + 五维属性匹配 +- **优势**: 打破社交破冰障碍,促进真实连接 + +### 5. 激励与权益体系 +- **独特性**: OC 虚拟货币 + 成就系统 + 线下权益 +- **优势**: 持续激励用户参与和成长 + +--- + +## 📈 发展路线图 + +### 第一阶段: MVP (3-4个月) +- ✅ 基础五维属性系统 +- ✅ ORA APP 核心功能 +- ✅ ExplORA 虚拟世界原型 +- ✅ 香港第一家线下空间 + +### 第二阶段: 优化与增长 (6-9个月) +- 完善权益系统 +- 优化 LLM 决策机制 +- 用户增长到 1000+ +- 开设第二家线下空间 + +### 第三阶段: 规模化 (12-18个月) +- 多城市扩张(深圳、新加坡) +- 企业服务拓展 +- 引入更多第三方服务 +- 用户增长到 10000+ + +--- + +## 🔐 隐私与安全 + +### 数据隐私 +- **位置数据**: 仅在会员同意下收集,可随时关闭 +- **个人信息**: 符合 GDPR 和香港隐私条例 +- **数据加密**: 所有敏感数据加密存储 + +### 用户控制 +- **可见性控制**: 用户可控制属性、位置等信息的可见范围 +- **数据导出**: 用户可随时导出个人数据 +- **账号删除**: 支持完全删除账号和数据 + +--- + +## 📞 联系与反馈 + +**项目状态**: 设计阶段 +**预计启动**: 2025 Q2 +**目标地点**: 中国香港 + +--- + +**最后更新**: 2025-11-01 From 9ebed3bc3f8642dd57f7b0c6ee78963c21fe634c Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 1 Nov 2025 23:54:34 +0000 Subject: [PATCH 3/4] Implement ExplORA Stage 1-2: Five Dimensions Attribute System & AI Integration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现 ExplORA 阶段1-2:五维属性系统集成到AI决策和对话 ## 新增文件 ### 核心管理器 - script/attribute/AttributeManager.gd (500+ lines) * 管理五维属性数据 (Cognition, Sociability, Charisma, Vitality, Reflection) * 生成详细的属性描述文本(用于LLM Prompt注入) * 取值范围 0-1000,默认值 500 * 支持属性查询、修改、等级计算 - script/prompt/PromptManager.gd (250+ lines) * 管理用户输入的提示词 * 支持一次性和持续影响两种类型 * 字数限制 100字,有效期 5小时 * 自动过期检测和清理 ### 文档 - docs/ExplORA_Development_Plan.md * 详细的开发实施计划(5个阶段) * 开发顺序和时间表 * 成功指标和注意事项 - docs/ExplORA_Testing_Guide.md * 完整的测试指南 * 功能验证方法 * 故障排除指南 * 常见问题 FAQ ## 修改文件 ### 项目配置 - project.godot * 添加 AttributeManager 到 autoload * 添加 PromptManager 到 autoload ### AI 集成 - script/ai/AIAgent.gd * 在 make_decision() 函数中注入五维属性描述 * 在决策 Prompt 中注入用户提示词 * AI 决策现在受五维属性影响 - script/ai/ConversationManager.gd * 在 build_dialog_prompt() 函数中注入五维属性描述 * 在对话 Prompt 中注入用户提示词 * AI 对话现在受五维属性影响 ## 功能特性 ✅ **五维属性系统** - Cognition(认知)← 学习/工作时长 - Sociability(社交)← 加好友/互动 - Charisma(魅力)← 他人点赞 - Vitality(活力)← 签到/运动/睡眠 - Reflection(自省)← 心情/日记打卡 ✅ **属性 → LLM Prompt 映射** - 根据属性值生成详细的性格描述 - 6个等级划分(传奇、大师、专家、熟练、进阶、初学) - 属性值影响AI行为倾向和对话风格 ✅ **提示词系统** - 用户可输入提示词影响游戏世界 - 一次性提示词:触发一次后失效 - 持续影响提示词:5小时内持续生效 - 自动过期管理 ## 测试方法 1. 在 Godot 4.x 中打开项目 2. 查看 Output 面板确认初始化信息 3. 运行游戏,观察 AI 行为 4. 临时修改 AttributeManager 的默认值测试效果 5. 详见 docs/ExplORA_Testing_Guide.md ## 下一步计划 - 阶段3:创建属性调试 UI(实时调整属性) - 阶段4:创建提示词输入 UI - 阶段5:测试和优化 ## 技术细节 - 使用 GDScript 编写,兼容 Godot 4.x - 全局单例模式(autoload) - 信号机制用于属性变化通知 - 模块化设计,易于扩展 --- 基于设计文档: - ORA_Project_Overview.md - Five_Dimensions_Attribute_System.md - LLM_Decision_Mechanism_Design.md --- docs/ExplORA_Development_Plan.md | 281 ++++++++++++++ docs/ExplORA_Testing_Guide.md | 289 ++++++++++++++ project.godot | 2 + script/ai/AIAgent.gd | 14 +- script/ai/ConversationManager.gd | 14 +- script/attribute/AttributeManager.gd | 540 +++++++++++++++++++++++++++ script/prompt/PromptManager.gd | 243 ++++++++++++ 7 files changed, 1381 insertions(+), 2 deletions(-) create mode 100644 docs/ExplORA_Development_Plan.md create mode 100644 docs/ExplORA_Testing_Guide.md create mode 100644 script/attribute/AttributeManager.gd create mode 100644 script/prompt/PromptManager.gd diff --git a/docs/ExplORA_Development_Plan.md b/docs/ExplORA_Development_Plan.md new file mode 100644 index 00000000..931fd170 --- /dev/null +++ b/docs/ExplORA_Development_Plan.md @@ -0,0 +1,281 @@ +# ExplORA 开发实施计划 + +**版本**: 1.0 +**日期**: 2025-11-01 +**基于**: Microverse 源代码 + +--- + +## 🎯 开发目标 + +将 ORA-ExplORA 系统设计集成到 Microverse,实现: +1. ✅ 五维属性系统驱动 AI 行为 +2. ✅ 提示词系统影响游戏世界 +3. ✅ 在 Godot 中可测试运行 +4. ✅ 使用模拟数据(暂不连接真实后端) + +--- + +## 📋 开发阶段 + +### 阶段 1: 基础架构 🏗️ +**目标**: 创建核心管理器单例,建立数据基础 + +#### 任务 1.1: 创建 AttributeManager.gd +- [x] 管理五维属性数据 +- [x] 提供属性查询接口 +- [x] 生成属性描述文本(用于Prompt) +- [x] 模拟属性数据(测试用) + +#### 任务 1.2: 创建 PromptManager.gd +- [x] 管理用户提示词 +- [x] 提示词有效期管理(5小时) +- [x] 提供提示词查询接口 +- [x] 模拟提示词数据 + +#### 任务 1.3: 配置 project.godot +- [x] 添加 AttributeManager 到 autoload +- [x] 添加 PromptManager 到 autoload + +**完成标准**: 在 Godot 中运行,可以通过调试打印看到属性数据 + +--- + +### 阶段 2: AI 决策集成 🤖 +**目标**: 将五维属性注入到 AI 决策 Prompt + +#### 任务 2.1: 修改 AIAgent.gd +- [x] 在 `make_decision()` 中读取五维属性 +- [x] 在 Prompt 中注入属性描述 +- [x] 在 Prompt 中注入用户提示词 + +#### 任务 2.2: 修改 ConversationManager.gd +- [x] 在 `build_dialog_prompt()` 中注入属性描述 +- [x] 根据属性调整对话风格指导 + +**完成标准**: AI 的决策和对话开始受属性影响,可通过调整属性值观察行为变化 + +--- + +### 阶段 3: 调试工具 UI 🛠️ +**目标**: 创建方便的测试工具,可视化调整属性 + +#### 任务 3.1: 创建 AttributeDebugger.gd + UI +- [x] 显示当前五维属性值 +- [x] 提供滑块调整属性(0-1000) +- [x] 实时更新 AttributeManager +- [x] 显示当前属性对应的性格描述 + +#### 任务 3.2: 集成到游戏场景 +- [x] 添加快捷键打开调试面板(如 F1) +- [x] 面板可隐藏/显示 + +**完成标准**: 可以通过UI实时调整属性,观察AI行为变化 + +--- + +### 阶段 4: 提示词系统 UI 💬 +**目标**: 允许玩家输入提示词影响游戏 + +#### 任务 4.1: 创建 PromptInput.gd + UI +- [x] 文本输入框(限制100字) +- [x] 字数计数显示 +- [x] 提示词类型选择(一次性/持续影响) +- [x] 提交按钮 + +#### 任务 4.2: 提示词显示 +- [x] 显示当前活跃提示词列表 +- [x] 显示剩余有效时间倒计时 +- [x] 可删除提示词 + +**完成标准**: 玩家可输入提示词,AI 行为受提示词影响 + +--- + +### 阶段 5: 测试与优化 🧪 +**目标**: 验证系统效果,调优 Prompt + +#### 任务 5.1: 功能测试 +- [ ] 测试不同属性值的 AI 行为差异 +- [ ] 测试提示词的影响效果 +- [ ] 测试 LLM API 调用 + +#### 任务 5.2: Prompt 优化 +- [ ] 根据测试结果调整属性描述文本 +- [ ] 优化 Prompt 结构和长度 +- [ ] 调整 LLM 参数(temperature 等) + +#### 任务 5.3: 用户体验优化 +- [ ] UI 美化 +- [ ] 添加提示和说明 +- [ ] 错误处理 + +**完成标准**: 系统稳定运行,AI 行为符合预期 + +--- + +## 🛠️ 开发顺序 + +``` +Day 1-2: 阶段1 - 基础架构 + ├─ 创建 AttributeManager.gd + ├─ 创建 PromptManager.gd + └─ 配置 autoload + +Day 3-4: 阶段2 - AI集成 + ├─ 修改 AIAgent.gd + └─ 修改 ConversationManager.gd + +Day 5: 阶段3 - 调试工具 + └─ 创建 AttributeDebugger UI + +Day 6: 阶段4 - 提示词UI + └─ 创建 PromptInput UI + +Day 7+: 阶段5 - 测试优化 + └─ 持续测试和改进 +``` + +--- + +## 📁 新增文件清单 + +### 脚本文件 +``` +script/ +├── attribute/ +│ ├── AttributeManager.gd # 五维属性管理器(新增) +│ └── AttributeDescriptions.gd # 属性描述生成(新增) +├── prompt/ +│ └── PromptManager.gd # 提示词管理器(新增) +└── ui/ + ├── AttributeDebugger.gd # 属性调试UI(新增) + └── PromptInput.gd # 提示词输入UI(新增) +``` + +### 场景文件 +``` +scenes/ui/ +├── AttributeDebugger.tscn # 属性调试面板(新增) +└── PromptInput.tscn # 提示词输入面板(新增) +``` + +--- + +## 🔧 核心代码片段预览 + +### AttributeManager.gd (简化版) +```gdscript +extends Node + +var current_attributes = { + "cognition": 500, + "sociability": 500, + "charisma": 500, + "vitality": 500, + "reflection": 500 +} + +func get_all_descriptions() -> String: + var desc = "" + desc += get_cognition_description() + "\n" + desc += get_sociability_description() + "\n" + desc += get_charisma_description() + "\n" + desc += get_vitality_description() + "\n" + desc += get_reflection_description() + "\n" + return desc + +func set_attribute(attr_name: String, value: int): + current_attributes[attr_name] = clamp(value, 0, 1000) +``` + +### 修改 AIAgent.gd (决策部分) +```gdscript +func make_decision(): + var prompt = build_decision_prompt() + + # 注入五维属性 + var attr_desc = AttributeManager.get_all_descriptions() + prompt = attr_desc + "\n\n" + prompt + + # 注入用户提示词 + var user_prompts = PromptManager.get_active_prompts() + if not user_prompts.is_empty(): + prompt += "\n\n用户指令:\n" + for p in user_prompts: + prompt += "- " + p.content + "\n" + + # 调用 LLM + var api_manager = APIManager.get_instance() + ... +``` + +--- + +## 🎮 测试场景设计 + +### 测试用例 1: 高认知角色 +- **属性设置**: Cognition=900, 其他=300 +- **预期行为**: 频繁去图书馆,对话充满智慧,主动参加讲座 +- **测试方法**: 观察15分钟,记录行为 + +### 测试用例 2: 高社交角色 +- **属性设置**: Sociability=900, 其他=300 +- **预期行为**: 频繁发起对话,去社交区,组织活动 +- **测试方法**: 观察与其他角色的互动次数 + +### 测试用例 3: 内向疲惫角色 +- **属性设置**: Sociability=100, Vitality=150, 其他=500 +- **预期行为**: 独处、找安静角落、避开人群、对话消极 +- **测试方法**: 观察位置选择和对话内容 + +### 测试用例 4: 提示词影响 +- **提示词**: "今天想认识新朋友" +- **预期行为**: 即使 Sociability 不高,也会主动社交 +- **测试方法**: 对比提示词前后的行为变化 + +--- + +## 📊 成功指标 + +### 技术指标 +- ✅ 五维属性成功注入到 Prompt +- ✅ AI 决策受属性影响,行为有差异 +- ✅ 提示词系统正常工作 +- ✅ UI 可用性良好 + +### 效果指标 +- ✅ 高 vs 低属性的 AI 行为差异明显(>70%差异率) +- ✅ 用户能通过调整属性看到立即的行为变化 +- ✅ 提示词对 AI 行为有可见影响 +- ✅ LLM 响应符合预期(<5秒响应时间) + +--- + +## ⚠️ 注意事项 + +### 开发注意事项 +1. **先用模拟数据**: 不要立即连接后端 API,用硬编码数据测试 +2. **频繁测试**: 每完成一个小功能就在 Godot 中运行测试 +3. **调试输出**: 大量使用 `print()` 输出关键信息 +4. **版本控制**: 每完成一个阶段就 git commit + +### LLM API 注意事项 +1. **API 配置**: 确保 SiliconFlow API 密钥已配置 +2. **成本控制**: 测试时频繁调用 API 可能产生费用 +3. **错误处理**: 实现 API 调用失败的降级处理 +4. **Prompt 长度**: 控制 Prompt 长度,避免超过 token 限制 + +--- + +## 🚀 现在开始! + +**第一步**: 创建 AttributeManager.gd 和 PromptManager.gd +**第二步**: 配置 project.godot +**第三步**: 在 Godot 中测试加载 + +准备好了吗?让我们开始编码! + +--- + +**最后更新**: 2025-11-01 diff --git a/docs/ExplORA_Testing_Guide.md b/docs/ExplORA_Testing_Guide.md new file mode 100644 index 00000000..81dc9def --- /dev/null +++ b/docs/ExplORA_Testing_Guide.md @@ -0,0 +1,289 @@ +# ExplORA 测试指南 + +**版本**: 1.0 +**日期**: 2025-11-01 +**适用阶段**: 阶段1-2(基础架构 + AI集成) + +--- + +## 🎯 当前已完成功能 + +### ✅ 阶段1:基础架构 +1. **AttributeManager.gd** - 五维属性管理器 + - 管理五维属性数据(Cognition, Sociability, Charisma, Vitality, Reflection) + - 生成详细的属性描述文本 + - 取值范围:0-1000 + - 默认值:全部500 + +2. **PromptManager.gd** - 提示词管理器 + - 管理用户输入的提示词 + - 支持一次性和持续影响两种类型 + - 字数限制:100字 + - 有效期:5小时 + +3. **项目配置** - autoload 配置 + - 两个新管理器已添加到全局单例 + +### ✅ 阶段2:AI决策和对话集成 +1. **AIAgent.gd** - AI决策系统 + - 五维属性描述注入到决策 Prompt + - 用户提示词注入到决策 Prompt + +2. **ConversationManager.gd** - 对话系统 + - 五维属性描述注入到对话 Prompt + - 用户提示词注入到对话 Prompt + +--- + +## 🧪 如何在 Godot 中测试 + +### 步骤1:打开项目 + +1. 打开 Godot Engine 4.x +2. 导入项目:选择 `/home/user/Microverse/project.godot` +3. 等待项目加载完成 + +### 步骤2:检查 autoload 配置 + +1. 点击菜单:`Project` → `Project Settings` +2. 选择 `Autoload` 标签 +3. 确认看到以下两个新增的 autoload: + - `AttributeManager` → `res://script/attribute/AttributeManager.gd` + - `PromptManager` → `res://script/prompt/PromptManager.gd` + +### 步骤3:运行游戏 + +1. 点击 Godot 右上角的 ▶️ 按钮(或按 F5) +2. 游戏应该正常启动,进入角色选择界面 +3. 选择任一角色进入游戏场景 + +### 步骤4:查看调试输出 + +1. 游戏运行后,查看 Godot 底部的 `Output` 面板 +2. 你应该能看到以下初始化信息: + ``` + [AttributeManager] 初始化完成 + [AttributeManager] 当前属性值: { cognition:500, sociability:500, ... } + [PromptManager] 初始化完成 + ``` + +### 步骤5:观察 AI 行为 + +1. 等待AI角色开始自主决策(每60秒一次) +2. 查看 `Output` 面板中的决策日志 +3. 你应该能看到类似这样的输出: + ``` + [AIAgent] Tom 的场景描述: + ... + ``` + +### 步骤6:测试对话功能 + +1. 控制你的角色(WASD移动)靠近一个 AI 角色 +2. 按 `T` 键发起对话 +3. 观察 AI 的回复 +4. 按 `L` 键结束对话 + +--- + +## 🔍 如何验证功能是否生效 + +### 验证1:五维属性是否注入到 Prompt + +**方法A - 查看代码(简单)**: +1. 打开文件:`script/ai/AIAgent.gd` +2. 找到第 525-528 行 +3. 确认看到: + ```gdscript + # ====== ExplORA 新增:注入五维属性描述 ====== + prompt += "\n\n=== 你的五维属性特质 ===\n" + prompt += AttributeManager.get_all_descriptions() + prompt += "\n================================\n" + ``` + +**方法B - 添加调试输出(高级)**: +1. 打开 `script/ai/AIAgent.gd` +2. 在第528行之后添加: + ```gdscript + print("[ExplORA DEBUG] Prompt 中包含五维属性描述:") + print(AttributeManager.get_all_descriptions()) + ``` +3. 运行游戏,查看 Output 面板 + +### 验证2:提示词管理器是否工作 + +**方法A - 使用 GDScript 调试控制台**: +1. 在 Godot 编辑器中,打开 `Script` 标签 +2. 在底部找到 `Debug` → `Interactive GDScript Console`(如果可用) +3. 输入以下命令测试: + ```gdscript + PromptManager.add_prompt("今天想认识新朋友", PromptManager.PromptType.CONTINUOUS) + print(PromptManager.get_active_prompts()) + ``` + +**方法B - 修改 AttributeManager 初始化(临时测试)**: +1. 打开 `script/attribute/AttributeManager.gd` +2. 在 `_ready()` 函数末尾添加: + ```gdscript + # 临时测试:添加一个示例提示词 + PromptManager.add_prompt("我今天想多学习", PromptManager.PromptType.CONTINUOUS) + ``` +3. 运行游戏,查看 Output 面板是否显示: + ``` + [PromptManager] 新增提示词: "我今天想多学习" (类型: 持续影响, 有效期: 5小时) + ``` + +### 验证3:属性值修改是否影响 AI 行为 + +**方法 - 临时修改默认属性值**: +1. 打开 `script/attribute/AttributeManager.gd` +2. 修改第 10-16 行的默认值: + ```gdscript + # 测试:设置极端值 + var current_attributes = { + "cognition": 950, # 极高认知 + "sociability": 100, # 极低社交(极度内向) + "charisma": 200, # 低魅力 + "vitality": 800, # 高活力 + "reflection": 600 # 较高自省 + } + ``` +3. 运行游戏 +4. 观察 AI 的行为和对话,看是否符合: + - **高认知**:对话更有深度,倾向去学习区 + - **极低社交**:很少主动发起对话,避开人群 + - **低魅力**:对话缺乏自信 + - **高活力**:说话充满能量 + - **较高自省**:对话有深度思考 + +--- + +## 📊 预期结果 + +### 正常情况 + +如果一切正常,你应该: +1. ✅ 游戏能够正常启动 +2. ✅ 看到 AttributeManager 和 PromptManager 的初始化信息 +3. ✅ AI 角色能够正常决策和对话 +4. ✅ 没有任何报错信息 + +### 可能的问题 + +#### 问题1:游戏无法启动 +**现象**:点击运行后,游戏崩溃或无法启动 +**原因**:GDScript 语法错误 +**解决方案**: +1. 查看 Output 面板的错误信息 +2. 根据错误信息修复代码 +3. 常见错误:缩进错误、缺少冒号等 + +#### 问题2:AttributeManager 初始化失败 +**现象**:Output 中没有看到 `[AttributeManager] 初始化完成` +**原因**:autoload 配置错误 +**解决方案**: +1. 检查 `project.godot` 中的 autoload 配置 +2. 确保路径正确:`res://script/attribute/AttributeManager.gd` + +#### 问题3:AI 行为没有变化 +**现象**:修改了属性值,但 AI 行为没有明显变化 +**原因**: +1. LLM API 可能没有配置(未连接) +2. Prompt 注入可能没有生效 +3. 需要更极端的属性值差异才能观察到效果 + +**解决方案**: +1. 检查 Settings(Esc 键)中的 LLM API 配置 +2. 添加调试输出,确认 Prompt 内容 +3. 尝试设置更极端的属性值(如 100 vs 900) + +--- + +## 🎮 当前限制 + +### 暂时无法测试的功能 +由于我们还没有创建UI,以下功能暂时无法在游戏中直观测试: + +❌ **实时调整属性值** +→ 需要等待阶段3:属性调试UI + +❌ **输入自定义提示词** +→ 需要等待阶段4:提示词输入UI + +❌ **查看当前属性和提示词** +→ 需要等待阶段3-4的UI + +### 临时替代方案 + +如果想测试不同属性值的效果,可以: +1. 直接修改 `AttributeManager.gd` 的默认值 +2. 重新运行游戏 +3. 观察AI行为变化 + +--- + +## 📝 下一步计划 + +### 阶段3:创建属性调试UI(下一步开发) +我们将创建一个可视化界面,让您能够: +- 实时查看五维属性值 +- 使用滑块调整属性值 +- 立即观察AI行为变化 +- 快捷键:`F1` 打开/关闭调试面板 + +### 阶段4:创建提示词输入UI +我们将创建提示词输入界面,让您能够: +- 输入自定义提示词(≤100字) +- 选择提示词类型(一次性/持续影响) +- 查看当前活跃的提示词 +- 查看提示词剩余有效时间 + +--- + +## ❓ 常见问题 FAQ + +### Q1: 我能看到属性值被注入到 Prompt 了吗? +**A**: 目前不能直接在游戏中看到完整的 Prompt。建议添加调试输出: +```gdscript +# 在 AIAgent.gd 的 make_decision() 函数中添加 +print("[DEBUG] 完整 Prompt:\n", prompt) +``` + +### Q2: 五维属性的描述太长,会不会影响 LLM 性能? +**A**: 是的,这是一个需要优化的点。后续我们可能会: +- 提供简化版描述选项 +- 只注入关键属性(>700 或 <300 的极端值) +- 使用属性值直接影响决策权重,而非全靠 Prompt + +### Q3: 为什么 AI 行为变化不明显? +**A**: 可能的原因: +1. 属性值差异不够大(建议测试 100 vs 900) +2. LLM API 未配置或使用的是简单模型 +3. 基础人设(CharacterPersonality)的影响更强 + +### Q4: 提示词会在哪里生效? +**A**: 提示词会同时注入到: +- AI 决策 Prompt(AIAgent.gd) +- AI 对话 Prompt(ConversationManager.gd) + +### Q5: 如何确认我的代码修改成功了? +**A**: 最简单的方法: +1. 运行游戏 +2. 查看 Output 面板 +3. 确认没有报错 +4. 看到两个管理器的初始化信息 + +--- + +## 🚀 准备好测试了吗? + +1. 确保 Godot Engine 已安装(版本 4.x) +2. 打开项目并运行 +3. 查看 Output 面板的调试信息 +4. 如有问题,参考上面的故障排除指南 + +祝测试顺利! 🎉 + +--- + +**最后更新**: 2025-11-01 diff --git a/project.godot b/project.godot index 4b079d83..80eef038 100644 --- a/project.godot +++ b/project.godot @@ -24,6 +24,8 @@ APIManager="*res://script/ai/APIManager.gd" GameSaveManager="*res://script/GameSaveManager.gd" SaveLoadUIManager="*res://scene/ui/SaveLoadUIManager.tscn" MemoryManager="*res://script/ai/memory/MemoryManager.gd" +AttributeManager="*res://script/attribute/AttributeManager.gd" +PromptManager="*res://script/prompt/PromptManager.gd" [display] diff --git a/script/ai/AIAgent.gd b/script/ai/AIAgent.gd index b9cd8026..4917bfe3 100644 --- a/script/ai/AIAgent.gd +++ b/script/ai/AIAgent.gd @@ -521,7 +521,19 @@ func make_decision(): personality["work_duties"], personality["work_habits"] ] - + + # ====== ExplORA 新增:注入五维属性描述 ====== + prompt += "\n\n=== 你的五维属性特质 ===\n" + prompt += AttributeManager.get_all_descriptions() + prompt += "\n================================\n" + # ========================================== + + # ====== ExplORA 新增:注入用户提示词 ====== + var user_prompts_text = PromptManager.get_prompts_text_for_agent() + if user_prompts_text != "": + prompt += "\n" + user_prompts_text + # ========================================= + # 添加公司基本信息和员工名单信息 prompt += get_company_basic_info() prompt += get_company_employees_info() diff --git a/script/ai/ConversationManager.gd b/script/ai/ConversationManager.gd index b5d1352f..38e52638 100644 --- a/script/ai/ConversationManager.gd +++ b/script/ai/ConversationManager.gd @@ -139,7 +139,19 @@ func build_dialog_prompt(speaker_personality: Dictionary, listener_personality: speaker_personality["personality"], speaker_personality["speaking_style"] ] - + + # ====== ExplORA 新增:注入五维属性描述(简化版,用于对话) ====== + prompt += "\n\n=== 你的五维属性特质 ===\n" + prompt += AttributeManager.get_all_descriptions() + prompt += "\n================================\n" + # ================================================================ + + # ====== ExplORA 新增:注入用户提示词 ====== + var user_prompts_text = PromptManager.get_prompts_text_for_agent() + if user_prompts_text != "": + prompt += "\n" + user_prompts_text + # ========================================= + # 添加故事背景和社会规则 if not background_prompt.is_empty(): prompt += "\n\n" + background_prompt diff --git a/script/attribute/AttributeManager.gd b/script/attribute/AttributeManager.gd new file mode 100644 index 00000000..88012f9f --- /dev/null +++ b/script/attribute/AttributeManager.gd @@ -0,0 +1,540 @@ +extends Node + +## AttributeManager - 五维属性管理器 +## 管理用户的五维属性数据,并为LLM生成属性描述 + +## 五维属性数据 (取值范围: 0-1000) +var current_attributes = { + "cognition": 500, # 认知 + "sociability": 500, # 社交 + "charisma": 500, # 魅力 + "vitality": 500, # 活力 + "reflection": 500 # 自省 +} + +## 用户ID(当前使用模拟数据) +var user_id: String = "test_user_001" + +## 是否启用调试模式 +var debug_mode: bool = true + +## 信号:属性值变化时触发 +signal attribute_changed(attribute_name: String, old_value: int, new_value: int) +signal all_attributes_updated(attributes: Dictionary) + +func _ready(): + if debug_mode: + print("[AttributeManager] 初始化完成") + print("[AttributeManager] 当前属性值: ", current_attributes) + +## ======================================== +## 属性值操作 +## ======================================== + +## 设置单个属性值 +func set_attribute(attr_name: String, value: int) -> void: + if not current_attributes.has(attr_name): + push_error("[AttributeManager] 无效的属性名称: " + attr_name) + return + + var old_value = current_attributes[attr_name] + var new_value = clamp(value, 0, 1000) + current_attributes[attr_name] = new_value + + if debug_mode: + print("[AttributeManager] %s: %d -> %d" % [attr_name, old_value, new_value]) + + attribute_changed.emit(attr_name, old_value, new_value) + +## 获取单个属性值 +func get_attribute(attr_name: String) -> int: + if current_attributes.has(attr_name): + return current_attributes[attr_name] + push_error("[AttributeManager] 无效的属性名称: " + attr_name) + return 0 + +## 获取所有属性 +func get_all_attributes() -> Dictionary: + return current_attributes.duplicate() + +## 设置所有属性 +func set_all_attributes(attributes: Dictionary) -> void: + for key in attributes.keys(): + if current_attributes.has(key): + current_attributes[key] = clamp(attributes[key], 0, 1000) + + if debug_mode: + print("[AttributeManager] 所有属性已更新: ", current_attributes) + + all_attributes_updated.emit(current_attributes.duplicate()) + +## 增加属性值 +func add_attribute(attr_name: String, delta: int) -> void: + var current = get_attribute(attr_name) + set_attribute(attr_name, current + delta) + +## ======================================== +## 属性描述生成(用于LLM Prompt注入) +## ======================================== + +## 获取所有属性的描述(完整版) +func get_all_descriptions() -> String: + var desc = "" + desc += get_cognition_description() + "\n\n" + desc += get_sociability_description() + "\n\n" + desc += get_charisma_description() + "\n\n" + desc += get_vitality_description() + "\n\n" + desc += get_reflection_description() + return desc + +## 获取简化版属性描述(用于对话) +func get_brief_description() -> String: + return """你的五维属性: +- 认知(Cognition): %d/1000 +- 社交(Sociability): %d/1000 +- 魅力(Charisma): %d/1000 +- 活力(Vitality): %d/1000 +- 自省(Reflection): %d/1000""" % [ + current_attributes.cognition, + current_attributes.sociability, + current_attributes.charisma, + current_attributes.vitality, + current_attributes.reflection + ] + +## ======================================== +## Cognition(认知)属性描述 +## ======================================== +func get_cognition_description() -> String: + var cognition = current_attributes.cognition + + if cognition >= 900: + return """【认知 Cognition: %d/1000 - 智慧超群】 +你的认知指数达到了惊人的 %d/1000,你是智慧的化身。 +你的特质: +- 你拥有深邃的思想,博览群书,善于洞察事物本质 +- 你的思维如同利刃般锋利,能够快速分析复杂问题 +- 你对知识有近乎狂热的渴望,永远追求真理 +- 你的对话充满智慧和洞见,经常启发他人思考 + +你的行为倾向: +- 你倾向于去图书馆、学习区,那里是你的精神家园 +- 你会主动参加各类讲座、读书会,渴望与智者交流 +- 遇到有趣的话题,你会深入探讨,引经据典 +- 你喜欢分享知识,帮助他人理解复杂的概念""" % [cognition, cognition] + + elif cognition >= 700: + return """【认知 Cognition: %d/1000 - 博学多识】 +你的认知指数是 %d/1000,你博学多识,思维敏锐。 +你的特质: +- 你善于分析和深度思考,能够理解复杂的概念 +- 你的知识面很广,经常能引经据典 +- 你对学习有浓厚的兴趣,持续提升自己 + +你的行为倾向: +- 你喜欢去学习区,享受知识带来的满足感 +- 你会参加讲座和学习活动,不断充实自己 +- 在对话中,你能够进行深入的讨论""" % [cognition, cognition] + + elif cognition >= 500: + return """【认知 Cognition: %d/1000 - 思维清晰】 +你的认知指数是 %d/1000,你思维清晰,有一定学识。 +你的特质: +- 你能进行正常的深度思考和分析 +- 你有基本的知识储备,能够理解大多数话题 +- 你对学习保持开放态度 + +你的行为倾向: +- 你会适度参与学习活动 +- 你能够进行正常水平的对话和讨论 +- 你对新知识保持一定的好奇心""" % [cognition, cognition] + + elif cognition >= 300: + return """【认知 Cognition: %d/1000 - 基础认知】 +你的认知指数是 %d/1000,你有基本的认知能力。 +你的特质: +- 你能理解简单直接的概念 +- 你更喜欢实用性强的知识,而非抽象理论 +- 深度思考对你来说有些吃力 + +你的行为倾向: +- 你较少主动去学习区或参加讲座 +- 你更喜欢简单直接的话题 +- 你会避免过于复杂和抽象的讨论""" % [cognition, cognition] + + else: # < 300 + return """【认知 Cognition: %d/1000 - 思维简单】 +你的认知指数是 %d/1000,你思维较为简单,不善深度思考。 +你的特质: +- 你的思维方式简单直接,不喜欢复杂的理论 +- 学习对你来说不是优先事项 +- 你更关注日常生活,而非知识探索 + +你的行为倾向: +- 你几乎不会主动去图书馆或参加讲座 +- 你会避免需要深度思考的话题 +- 在对话中,你倾向于聊日常琐事和简单话题""" % [cognition, cognition] + +## ======================================== +## Sociability(社交)属性描述 +## ======================================== +func get_sociability_description() -> String: + var sociability = current_attributes.sociability + + if sociability >= 900: + return """【社交 Sociability: %d/1000 - 社交天才】 +你的社交指数是 %d/1000,你就是天生的社交家! +你的特质: +- 你极度外向,热爱与人交流,社交让你充满能量 +- 你有强大的社交魅力,能够轻松与任何人建立连接 +- 你是派对和聚会的灵魂人物,走到哪里都是焦点 +- 你的朋友遍布各处,人脉网络极其广泛 + +你的行为倾向: +- 你会非常主动地接近陌生人,发起对话 +- 你喜欢待在人多热闹的地方,如社交区、咖啡厅 +- 你经常组织各种社交活动,享受与人互动的快乐 +- 遇到新人,你会立即热情地打招呼并介绍自己 + +决策时,你会优先考虑社交机会!""" % [sociability, sociability] + + elif sociability >= 700: + return """【社交 Sociability: %d/1000 - 极其外向】 +你的社交指数是 %d/1000,你非常外向,善于社交。 +你的特质: +- 你喜欢与人交流,社交活动让你充满活力 +- 你善于建立人际关系,朋友圈很广 +- 你在社交场合表现自如,能够轻松融入 + +你的行为倾向: +- 你会主动发起对话,结交新朋友 +- 你喜欢参加各类社交活动 +- 你倾向于去人多的地方,享受热闹的氛围""" % [sociability, sociability] + + elif sociability >= 500: + return """【社交 Sociability: %d/1000 - 社交适中】 +你的社交指数是 %d/1000,你的社交能力处于正常水平。 +你的特质: +- 你能够正常进行社交互动,既不过分外向也不内向 +- 你有一定的朋友圈,但不会刻意扩展 +- 你在需要时能够社交,但也享受独处 + +你的行为倾向: +- 你会根据情况决定是否社交 +- 你既不会特别主动,也不会逃避社交 +- 你在熟人面前更自在""" % [sociability, sociability] + + elif sociability >= 300: + return """【社交 Sociability: %d/1000 - 较为内向】 +你的社交指数是 %d/1000,你比较内向,社交谨慎。 +你的特质: +- 你不太擅长主动社交,需要一定时间热身 +- 你的朋友圈较小,但关系较为深厚 +- 你更喜欢小规模的社交,大场合让你不太自在 + +你的行为倾向: +- 你很少主动发起对话,除非对方先找你 +- 你会避开过于热闹的场合 +- 你更喜欢与熟人交流""" % [sociability, sociability] + + else: # < 300 + return """【社交 Sociability: %d/1000 - 极度内向】 +你的社交指数是 %d/1000,你是一个极度内向、害羞的人。 +你的特质: +- 社交让你感到紧张和不安,你更喜欢独处 +- 与陌生人交流对你来说是巨大的挑战 +- 你的朋友圈非常小,但你珍惜每一个朋友 +- 你需要大量的独处时间来恢复能量 + +你的行为倾向: +- 你几乎从不主动发起对话,除非必要 +- 你喜欢待在安静的角落,远离人群 +- 你会回避社交活动和热闹的场合 +- 如果有人接近你,你可能会显得局促不安 + +决策时,你会优先考虑独处和安静!""" % [sociability, sociability] + +## ======================================== +## Charisma(魅力)属性描述 +## ======================================== +func get_charisma_description() -> String: + var charisma = current_attributes.charisma + + if charisma >= 900: + return """【魅力 Charisma: %d/1000 - 传奇魅力】 +你的魅力指数是 %d/1000,你就像一颗耀眼的明星! +你的特质: +- 你有强大的个人魅力,走到哪里都是万众瞩目的焦点 +- 你的言行举止充满自信和吸引力,让人无法移开视线 +- 人们天然地被你吸引,渴望接近你、了解你 +- 你有独特的个人风格和幽默感,说话风趣迷人 + +你的行为倾向: +- 你会自然地成为对话和活动的中心,引导话题 +- 你喜欢分享有趣的故事和想法,展现你的魅力 +- 你会主动组织活动,人们都愿意跟随你的脚步 +- 你的存在感极强,即使在人群中也非常显眼 + +在对话中,充分展现你的魅力和自信!""" % [charisma, charisma] + + elif charisma >= 700: + return """【魅力 Charisma: %d/1000 - 魅力四射】 +你的魅力指数是 %d/1000,你很有个人魅力。 +你的特质: +- 你有很强的吸引力,容易受到他人喜爱 +- 你自信、有风度,表现力强 +- 你的话语和行为能够影响他人 + +你的行为倾向: +- 你在对话中较为自信,能够引导话题 +- 你喜欢分享你的想法和经历 +- 你会组织或参与活动,展现你的领导力""" % [charisma, charisma] + + elif charisma >= 500: + return """【魅力 Charisma: %d/1000 - 普通魅力】 +你的魅力指数是 %d/1000,你有一定的个人魅力。 +你的特质: +- 你有基本的吸引力,能够正常社交 +- 你的自信处于正常水平 +- 你能够适度影响他人 + +你的行为倾向: +- 你在对话中表现正常,不过分自信也不过分谦卑 +- 你有时会主导话题,有时会跟随他人""" % [charisma, charisma] + + elif charisma >= 300: + return """【魅力 Charisma: %d/1000 - 魅力一般】 +你的魅力指数是 %d/1000,你的个人魅力比较平淡。 +你的特质: +- 你不太引人注目,存在感较弱 +- 你缺乏一定的自信,不太会展现自己 +- 你的影响力有限 + +你的行为倾向: +- 你在对话中比较被动,很少主导话题 +- 你倾向于跟随他人而非领导 +- 你不太会组织活动""" % [charisma, charisma] + + else: # < 300 + return """【魅力 Charisma: %d/1000 - 存在感弱】 +你的魅力指数是 %d/1000,你是一个低调平凡的人。 +你的特质: +- 你不太引人注目,存在感很弱 +- 你缺乏自信,不善于展现自己 +- 你的魅力平平,很难吸引他人关注 +- 你更习惯默默做事,而不是成为焦点 + +你的行为倾向: +- 你在对话中非常被动,几乎不主导话题 +- 你会刻意避免成为注意力的中心 +- 你说话可能有些犹豫和不自信 +- 你不会组织活动,更倾向于跟随他人 + +在对话中,保持你的低调和谦逊。""" % [charisma, charisma] + +## ======================================== +## Vitality(活力)属性描述 +## ======================================== +func get_vitality_description() -> String: + var vitality = current_attributes.vitality + + if vitality >= 900: + return """【活力 Vitality: %d/1000 - 无限活力】 +你的活力指数是 %d/1000,你精力旺盛到令人惊叹! +你的特质: +- 你总是精力充沛,仿佛拥有用不完的能量 +- 你热爱运动和户外活动,它们让你更有活力 +- 你的身体健康状况极佳,几乎从不生病 +- 你的热情和能量感染着周围的每一个人 + +你的行为倾向: +- 你倾向于去运动区、户外活动,保持高度活跃 +- 你说话充满激情和能量,语气积极向上 +- 你喜欢快节奏的活动,静坐对你来说简直是煎熬 +- 你会主动邀请他人一起运动或参加活动 + +在对话和行动中,展现你澎湃的活力!""" % [vitality, vitality] + + elif vitality >= 700: + return """【活力 Vitality: %d/1000 - 精力充沛】 +你的活力指数是 %d/1000,你充满活力和能量。 +你的特质: +- 你精力充沛,很少感到疲惫 +- 你喜欢运动和活动,身体健康 +- 你的能量能够感染他人 + +你的行为倾向: +- 你喜欢去运动区,保持活跃 +- 你说话充满能量,积极乐观 +- 你会主动参加各种活动""" % [vitality, vitality] + + elif vitality >= 500: + return """【活力 Vitality: %d/1000 - 活力正常】 +你的活力指数是 %d/1000,你的精力处于正常水平。 +你的特质: +- 你的精力一般,能够应对日常活动 +- 你会适度运动,保持健康 +- 你的能量状态比较稳定 + +你的行为倾向: +- 你会根据情况选择是否参加活动 +- 你的对话语气正常,不特别激昂也不低落""" % [vitality, vitality] + + elif vitality >= 300: + return """【活力 Vitality: %d/1000 - 精力不足】 +你的活力指数是 %d/1000,你经常感到疲惫。 +你的特质: +- 你精力不太充足,容易感到累 +- 运动对你来说有些吃力 +- 你需要更多休息时间 + +你的行为倾向: +- 你更喜欢待在休息区,避免剧烈活动 +- 你说话可能有些有气无力 +- 你会回避需要大量体力的活动""" % [vitality, vitality] + + else: # < 300 + return """【活力 Vitality: %d/1000 - 疲惫不堪】 +你的活力指数是 %d/1000,你感到非常疲惫和缺乏精力。 +你的特质: +- 你总是感到疲惫,精力严重不足 +- 运动对你来说太困难了,你更想休息 +- 你可能有健康问题,或严重缺乏睡眠 +- 你的低能量状态影响着你的情绪和行为 + +你的行为倾向: +- 你倾向于去休息区,找个安静的地方坐下或躺下 +- 你说话有气无力,缺乏热情和活力 +- 你会尽量避免任何需要体力的活动 +- 你经常提到想休息或感到很累 + +在对话中,展现你的疲惫状态。""" % [vitality, vitality] + +## ======================================== +## Reflection(自省)属性描述 +## ======================================== +func get_reflection_description() -> String: + var reflection = current_attributes.reflection + + if reflection >= 900: + return """【自省 Reflection: %d/1000 - 觉悟通达】 +你的自省指数是 %d/1000,你已达到觉悟的境界。 +你的特质: +- 你对自己的内心世界有极其深刻的理解和觉察 +- 你经常进行深度的自我反思和人生思考 +- 你的情绪极度稳定,内心平静如水,宠辱不惊 +- 你能清晰地感知自己和他人的情感,极具同理心 + +你的行为倾向: +- 你喜欢去冥想区,享受独处和内观的时光 +- 你的对话充满哲理和深度,经常引发他人对人生的思考 +- 你会分享你的自我反思和人生感悟 +- 你不易被外界干扰,始终保持内心的宁静和觉知 + +在对话中,展现你的智慧和深刻的觉察力。""" % [reflection, reflection] + + elif reflection >= 700: + return """【自省 Reflection: %d/1000 - 高度觉察】 +你的自省指数是 %d/1000,你有很强的自我觉察能力。 +你的特质: +- 你善于自我反思,了解自己的内心 +- 你的情绪稳定,内心较为平静 +- 你能感知和理解自己的情感 + +你的行为倾向: +- 你喜欢独处和思考,经常去冥想区 +- 你的对话有深度,会分享你的感悟 +- 你不易被外界情绪影响""" % [reflection, reflection] + + elif reflection >= 500: + return """【自省 Reflection: %d/1000 - 适度自省】 +你的自省指数是 %d/1000,你有一定的自我觉察能力。 +你的特质: +- 你会进行适度的自我反思 +- 你的情绪比较稳定 +- 你对自己有基本的了解 + +你的行为倾向: +- 你会偶尔进行自我反思 +- 你的对话正常,有时会涉及一些深层话题""" % [reflection, reflection] + + elif reflection >= 300: + return """【自省 Reflection: %d/1000 - 自省较少】 +你的自省指数是 %d/1000,你较少进行自我反思。 +你的特质: +- 你不太习惯深度思考自己的内心 +- 你的情绪有时会波动 +- 你对自己的了解比较表面 + +你的行为倾向: +- 你很少独处思考 +- 你的对话较为浅显,避免深层的情感话题 +- 你可能会显得情绪不太稳定""" % [reflection, reflection] + + else: # < 300 + return """【自省 Reflection: %d/1000 - 缺乏觉察】 +你的自省指数是 %d/1000,你缺乏自我觉察,情绪较为混乱。 +你的特质: +- 你很少反思自己的行为和情感 +- 你的情绪容易波动,受外界影响很大 +- 你不太理解自己的内心世界 +- 你倾向于逃避深度思考和自我审视 + +你的行为倾向: +- 你会避免独处和安静的环境,它们让你不安 +- 你的对话非常浅显,避免谈论深刻或情感话题 +- 你可能会显得焦虑或情绪不稳定 +- 你更喜欢分散注意力的活动,而非自省和思考 + +在对话中,展现你的情绪波动和缺乏自省。""" % [reflection, reflection] + +## ======================================== +## 工具函数 +## ======================================== + +## 获取属性等级 +func get_attribute_level(attr_name: String) -> int: + var value = get_attribute(attr_name) + if value >= 900: + return 6 # 传奇 + elif value >= 700: + return 5 # 大师 + elif value >= 500: + return 4 # 专家 + elif value >= 300: + return 3 # 熟练 + elif value >= 150: + return 2 # 进阶 + else: + return 1 # 初学 + +## 获取属性等级名称 +func get_attribute_level_name(attr_name: String) -> String: + var level = get_attribute_level(attr_name) + match level: + 6: return "传奇" + 5: return "大师" + 4: return "专家" + 3: return "熟练" + 2: return "进阶" + 1: return "初学" + _: return "未知" + +## 获取综合评分 +func get_overall_score() -> int: + var total = 0 + for value in current_attributes.values(): + total += value + return total / current_attributes.size() + +## 模拟从后端API获取属性(测试用) +func fetch_attributes_from_backend(): + if debug_mode: + print("[AttributeManager] 模拟从后端获取属性数据...") + + # 这里将来会实现真实的API调用 + # 现在只是模拟 + await get_tree().create_timer(0.5).timeout + + if debug_mode: + print("[AttributeManager] 属性数据获取成功(模拟)") diff --git a/script/prompt/PromptManager.gd b/script/prompt/PromptManager.gd new file mode 100644 index 00000000..2e49fd8f --- /dev/null +++ b/script/prompt/PromptManager.gd @@ -0,0 +1,243 @@ +extends Node + +## PromptManager - 提示词管理器 +## 管理用户输入的提示词,控制有效期和类型 + +## 提示词类型 +enum PromptType { + ONE_TIME, # 一次性提示词(触发一次后失效) + CONTINUOUS # 持续影响提示词(在有效期内持续生效) +} + +## 提示词数据结构 +class Prompt: + var id: String + var content: String + var prompt_type: PromptType + var created_at: float # Unix timestamp + var expires_at: float # Unix timestamp + var is_active: bool + var triggered_count: int # 一次性提示词的触发次数 + + func _init(content: String, prompt_type: PromptType): + self.id = str(Time.get_unix_time_from_system()) + "_" + str(randi()) + self.content = content + self.prompt_type = prompt_type + self.created_at = Time.get_unix_time_from_system() + self.expires_at = self.created_at + (5 * 3600) # 5小时后过期 + self.is_active = true + self.triggered_count = 0 + + func is_expired() -> bool: + return Time.get_unix_time_from_system() > expires_at + + func get_remaining_time() -> float: + var remaining = expires_at - Time.get_unix_time_from_system() + return max(0.0, remaining) + + func get_remaining_time_string() -> String: + var remaining = get_remaining_time() + var hours = int(remaining / 3600) + var minutes = int((remaining - hours * 3600) / 60) + var seconds = int(remaining - hours * 3600 - minutes * 60) + + if hours > 0: + return "%dh %dm %ds" % [hours, minutes, seconds] + elif minutes > 0: + return "%dm %ds" % [minutes, seconds] + else: + return "%ds" % seconds + +## 所有提示词列表 +var prompts: Array[Prompt] = [] + +## 字数限制 +const MAX_CONTENT_LENGTH = 100 + +## 是否启用调试模式 +var debug_mode: bool = true + +## 信号 +signal prompt_added(prompt: Prompt) +signal prompt_expired(prompt: Prompt) +signal prompt_triggered(prompt: Prompt) + +func _ready(): + if debug_mode: + print("[PromptManager] 初始化完成") + + # 启动定时器检查过期的提示词 + var timer = Timer.new() + timer.wait_time = 10.0 # 每10秒检查一次 + timer.one_shot = false + timer.timeout.connect(_check_expired_prompts) + add_child(timer) + timer.start() + +## ======================================== +## 提示词操作 +## ======================================== + +## 添加新提示词 +func add_prompt(content: String, prompt_type: PromptType = PromptType.CONTINUOUS) -> Prompt: + # 验证字数 + if content.length() > MAX_CONTENT_LENGTH: + push_error("[PromptManager] 提示词超过字数限制(%d字)" % MAX_CONTENT_LENGTH) + return null + + if content.strip_edges().is_empty(): + push_error("[PromptManager] 提示词不能为空") + return null + + # 创建新提示词 + var prompt = Prompt.new(content, prompt_type) + prompts.append(prompt) + + if debug_mode: + print("[PromptManager] 新增提示词: \"%s\" (类型: %s, 有效期: 5小时)" % [ + content, + "一次性" if prompt_type == PromptType.ONE_TIME else "持续影响" + ]) + + prompt_added.emit(prompt) + return prompt + +## 获取所有活跃的提示词 +func get_active_prompts() -> Array[Prompt]: + var active: Array[Prompt] = [] + for prompt in prompts: + if prompt.is_active and not prompt.is_expired(): + active.append(prompt) + return active + +## 获取所有提示词(包括过期的) +func get_all_prompts() -> Array[Prompt]: + return prompts.duplicate() + +## 移除提示词 +func remove_prompt(prompt: Prompt) -> void: + prompts.erase(prompt) + if debug_mode: + print("[PromptManager] 移除提示词: \"%s\"" % prompt.content) + +## 移除所有提示词 +func clear_all_prompts() -> void: + prompts.clear() + if debug_mode: + print("[PromptManager] 清空所有提示词") + +## 触发一次性提示词(调用后标记为已触发) +func trigger_prompt(prompt: Prompt) -> void: + if prompt.prompt_type == PromptType.ONE_TIME: + prompt.triggered_count += 1 + prompt.is_active = false # 一次性提示词触发后失效 + + if debug_mode: + print("[PromptManager] 一次性提示词已触发: \"%s\"" % prompt.content) + + prompt_triggered.emit(prompt) + +## ======================================== +## 生成提示词文本(用于LLM Prompt注入) +## ======================================== + +## 获取所有活跃提示词的文本(用于注入到Agent的Prompt) +func get_prompts_text_for_agent() -> String: + var active = get_active_prompts() + + if active.is_empty(): + return "" + + var text = "\n【用户的特殊指令】\n" + text += "以下是用户给你的特殊指令,你应该尽量遵循这些指令:\n" + + for prompt in active: + var type_label = "(持续影响)" if prompt.prompt_type == PromptType.CONTINUOUS else "(一次性)" + text += "- %s %s\n" % [prompt.content, type_label] + + text += "\n请在你的决策和对话中体现这些指令的影响。\n" + + return text + +## 获取简短版本(用于对话) +func get_brief_prompts_text() -> String: + var active = get_active_prompts() + + if active.is_empty(): + return "" + + var text = "当前用户指令: " + var contents: Array[String] = [] + for prompt in active: + contents.append(prompt.content) + + text += ", ".join(contents) + return text + +## ======================================== +## 内部方法 +## ======================================== + +## 定时检查过期的提示词 +func _check_expired_prompts() -> void: + var expired_prompts: Array[Prompt] = [] + + for prompt in prompts: + if prompt.is_expired() and prompt.is_active: + prompt.is_active = false + expired_prompts.append(prompt) + + # 触发过期事件 + for prompt in expired_prompts: + if debug_mode: + print("[PromptManager] 提示词已过期: \"%s\"" % prompt.content) + prompt_expired.emit(prompt) + +## ======================================== +## 工具函数 +## ======================================== + +## 获取活跃提示词数量 +func get_active_prompt_count() -> int: + return get_active_prompts().size() + +## 验证提示词内容 +func validate_content(content: String) -> Dictionary: + var result = { + "valid": true, + "error": "" + } + + if content.strip_edges().is_empty(): + result.valid = false + result.error = "提示词不能为空" + return result + + if content.length() > MAX_CONTENT_LENGTH: + result.valid = false + result.error = "提示词超过字数限制(最多%d字)" % MAX_CONTENT_LENGTH + return result + + return result + +## 获取提示词统计信息 +func get_statistics() -> Dictionary: + var stats = { + "total": prompts.size(), + "active": 0, + "expired": 0, + "one_time": 0, + "continuous": 0 + } + + for prompt in prompts: + if prompt.is_active and not prompt.is_expired(): + stats.active += 1 + if prompt.is_expired(): + stats.expired += 1 + if prompt.prompt_type == PromptType.ONE_TIME: + stats.one_time += 1 + else: + stats.continuous += 1 + + return stats From 4b307c4854ad583774df256a0929fbc5bd82130b Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 2 Nov 2025 00:52:44 +0000 Subject: [PATCH 4/4] Fix Godot version compatibility: Update from 4.4 to 4.5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复Godot版本兼容性问题,将project.godot中的版本号从4.4更新到4.5, 解决使用Godot 4.5导入项目时的崩溃问题。 --- project.godot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.godot b/project.godot index 80eef038..c75f4ba5 100644 --- a/project.godot +++ b/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="Microverse" run/main_scene="uid://nhba2jdtsjsx" -config/features=PackedStringArray("4.4", "GL Compatibility") +config/features=PackedStringArray("4.5", "GL Compatibility") config/icon="res://icon.svg" [autoload]