# AI 健康教练人格分化 与 管家自助选择 — 设计规格 > 状态:待用户审查 · 日期:2026-08-23 · 作者:Sisyphus (brainstorming 产出) > 关联:`docs/mascot-design.md`(IP 官方命名)、`docs/function-analysis-by-membership.md`、会员体系 `docs/superpowers/specs/2026-07-09-family-membership-design.md` ## 一、背景与目标 两条需求线: 1. **AI 健康教练人格化**:普通家庭用户的 AI 健康教练提供两位人格可选——浠宝(温暖知心)/福宝(活泼行动派),话术差异化、共享健康知识库。 2. **管家自助选择**:L2(久久一生)订阅家庭除 AI 教练外享一对一真人管家,可浏览已认证管家并自助绑定/更换;Web 管理端增量补齐分配管理与停接开关。 ## 二、已确认决策(澄清问答记录) | # | 决策点 | 结论 | |---|--------|------| | 1 | 管家选择模式 | 自助直选:浏览→直接绑定,系统校验等级+容量,可随时更换;无推送通知 | | 2 | 高级档位判定 | 仅 L2 有效订阅家庭可自选管家;L1 仅 AI 教练 | | 3 | 人格差异方式 | 性格话术差异化:独立 system prompt,共享知识库与工具链 | | 4 | 选择粒度 | 用户级偏好(users.mascot 已按 user 隔离) | | 5 | 管理端范围 | 增量补齐:分配管理视图 + 强制解绑 + 管家停接新单开关;保留现有审核/结算 | | 6 | 存储方案修订 | 初选"新建 coach_personas 表",发现现有吉祥物管线后改为**复用**(users.mascot + MascotEnum + system_prompts),不建重复表 | | 7 | 命名 | 维持现名浠宝/福宝(IP 设计书 v2.2 官方命名),code 保持 xibao/fubao | ## 三、现状盘点(复用资产清单) ### 吉祥物管线(已存在,覆盖教练需求约 80%) | 层 | 资产 | 说明 | |----|------|------| | DB | `users.mascot VARCHAR(20)` | 用户级形象选择,值 xibao/fubao,schema.sql:34 | | Java 枚举 | `MascotEnum`(enums/MascotEnum.java) | XIBAO("xibao","女","温柔可爱的浠宝小女孩") displayName 浠宝;FUBAO("fubao","男","聪明活泼的福宝小男孩") displayName 福宝 | | 注入 | `AIChatController./chat/send`(:76-109)、`/nutrition/send`(:245-272) | 读 `user.getMascot()` → inputs 放入 mascot_name/mascot_gender/mascot_persona | | **缺口①** | `AIChatController./health-coach/send`(:420-447) | **漏注入**,需补齐 | | LangGraph 模型 | `app/models/common.py:11` `mascot_code: Optional[str]` | 字段已预留 | | **缺口②** | `app/graphs/health_coach_graph.py:89` | 只挂单一 `get_prompt("health_coach")`,无人格路由 | | 提示词服务 | `app/prompt_service.py` | 从 system_prompts 表按 prompt_key 加载(经 Java `/api/system-prompts/get`,TTL 缓存),DEFAULT_PROMPTS 兜底 | | 管理端 | `cfc-web/src/views/admin/SystemPromptManagement.vue` + `system_prompts` 表(schema.sql:4990) | prompt 内容后台可配,零发版改话术 | | 选择入口 | `cfc-frontend/pages/user-edit/user-edit.vue` | mascot 切换 UI 已有 | | 渲染 | `cfc-frontend/pages/ai/chat.vue`(944行) | mascotCode/mascotName/mascotIcon 主题化渲染已有 | ### 管家体系(已存在,自选为唯一新能力) | 资产 | 说明 | |------|------| | `butler_profiles`(schema.sql:2626) | tier/status/member_count/max_members/annual_fee_l1,l2/commission_rate_l1,l2/certificates/description | | `butler_assignments`(schema.sql:2690) | family_id UNIQUE(uk_family_assignment) ↔ butler_user_id + subscription_id + level + assigned_at;一家一管家 | | 订阅激活自动分配 | `MemberSubscriptionService.activateSubscription`:165 → `ButlerService.assignMemberToButler(familyId,subscriptionId,level,amount)`:298:approved+tier=level+member_count) ### 5.1 家庭端(新增控制器类 `FamilyButlerSelectController`,放 `controller/butler/` 包;Bean 名 familyButlerSelectController 与现有 butlerController 无冲突;业务方法加入现有 `ButlerService`) familyId 推导方式与 MembershipController 一致:`userMapper.selectById(userId).getFamilyId()`;familyId 为空 → error("未找到家庭信息")。 | 接口 | 校验/逻辑 | 返回 | |------|-----------|------| | `POST /api/butler/available-list` | 查询条件:status='approved' AND tier='L2' AND accepting=1 AND member_count>` | | `POST /api/butler/my-butler` | 按 familyId(取自 userId 归属家庭)查 assignments 行 + 关联管家摘要 + 当前订阅等级 | 有绑定返回详情;无绑定 data=null | | `POST /api/butler/select` `{butlerUserId}` | 事务内依次:①`getActiveSubscription` 且 level=='L2',否则 error("该功能面向久久一生会员")②目标管家 approved+tier='L2'+accepting=1③条件增容 `UPDATE butler_profiles SET member_count=member_count+1 WHERE id=? AND status='approved' AND accepting=1 AND member_count