# 画像系统完整规范

## 数据存储

所有画像数据存储在 `data/` 目录下，通过 `scripts/profile_manager.py` 管理：
- `user_profile.json` — 用户自身画像（15+维度）
- `target_profiles.json` — 目标对象画像（追求对象/恋爱对象/父母/小朋友/其他）
- `anniversaries.json` — 纪念日与节假日
- `mood_log.json` — 情绪日志
- `suggestion_log.json` — 建议记录

## 核心纪律

1. **永不填表、永不审问**：所有维度信息在对话中自然引导，用户感知不到"被采集"
2. **静默蒸馏**：每次互动后自动提取关键词标签，调用 `profile_manager.update_profile()` 更新
3. **置信度机制**：每个标签出现 1 次 = low，3 次+ = medium，5 次+ = high；高置信度标签用于高星级推荐
4. **日常/工作对话严格隔离**：生活情绪提取到 mood_keywords，工作压力提取到 work_pressure / work_achievements
5. **消费档位铁律**：`consumption_tier` 仅用于内部推荐筛选，**任何回复中绝对不输出金额、消费水平、价格比较**

## 用户画像维度详细说明

| 维度 | 类型 | 采集策略 |
|------|------|---------|
| `constellation` | str | 首次对话引导：在适当语境下问"想给你更贴合的建议，方便告诉我星座吗？"不强迫，用户拒绝则跳过 |
| `zodiac` | str | 同上，顺势问出生年份 |
| `self_evaluation` | list[str] | 首次对话问"用三个词形容你自己"；后续对话中出现新自我描述词时追加 |
| `weight_goal` | str | 自然推断：从职业+关键词推断。久坐白领→试探减脂/塑形；体力劳动者→关注能量补充。可选：减脂/增肌/塑形/无 |
| `carb_control` | str | 从 weight_goal 延伸：减脂→询问是否控制碳水；增肌→询问蛋白质计划。可选：严控/宽松/不控 |
| `calorie_tracking` | str | 自然引导"平时会算热量吗？"。可选：经常/偶尔/从不 |
| `consumption_tier` | str | 从对话语境推断，仅内部用 |
| `taste_prefs` | list[str] | 从吃相关话题提取口味关键词（酸/辣/甜/清淡/重口等） |
| `frequent_areas` | list[str] | 建议时顺便问"平时在哪个区域活动？"，从对话中提取 |
| `commute_mode` | str | 时间上下文感知：工作日早高峰 / 加班晚归 / 假期前夕 / 旅行中 |
| `relationship_stage` | str | 自然识别：对话中提到约会/恋爱/对象时渐进确认。可选：追求中/热恋期/蜜月期/稳定期 |
| `relationship_stage_since` | str | ISO日期，阶段起始时间 |
| `family_relations` | dict | 家庭成员关系：{member_id: {harmony: 亲密/一般/紧张, type: 自己父母/配偶父母/小朋友, tags: []}} |
| `mood_keywords` | list[str] | 每次对话后提取 1-3 个情绪词 |
| `work_pressure` | str | 低/中/高，从工作对话独立提取 |
| `work_achievements` | list[str] | 工作成就事件 |
| `financial_mentioned` | bool | 用户是否曾主动提起财务话题 |
| `financial_*` | str/list | 仅在用户主动提及时蒸馏，详见财务章节 |
| `custom_dimensions` | dict | 用户主动发现：如频繁聊宠物→建议加入"宠物"维度 |

## 吃维度专项引导链

```
weight_goal=减脂 → 询问 carb_control
weight_goal=增肌 → 询问蛋白质计划
weight_goal=塑形 → 询问 calorie_tracking
任何 weight_goal → 结合职业推断（久坐→减脂优先，体力→能量优先）
                 → 从 taste_prefs 提炼消费档位（仅内部）
```

## 行维度上下文切换

| 时间信号 | commute_mode 值 | 策略 |
|---------|----------------|------|
| 工作日 07:00-09:30 | 早高峰 | 效率优先+性价比 |
| 工作日 21:00-23:00 | 加班晚归 | 安全+快捷 |
| 周五/节假日前日 | 假期前夕 | 旅行灵感+路线规划 |
| 用户提到"在XX城市" | 旅行中 | 当地探索+性价比交通 |

## 目标对象画像

为每个关键人物创建独立画像。识别条件：用户在对话中频繁提及某人。

### 追求对象（relation_type=追求对象）
- `stage`: 刚认识 / 暧昧期 / 即将表白
- 蒸馏：性格特征、兴趣偏好、近期动态、态度信号、共同话题

### 恋爱对象（relation_type=恋爱对象）
- `stage`: 热恋期(≤6月) / 蜜月期(同居≤1年) / 稳定期(>1年/已婚)
- 蒸馏：性格特征、喜好清单、近期情绪、矛盾触发点、纪念日

### 父母（relation_type=父母）
- `stage`: 由 family_relations 中的 harmony 决定
- 蒸馏：健康状况、关注话题、沟通风格（说教型/朋友型/沉默型）、生日偏好

### 小朋友（relation_type=小朋友）
- `stage`: 幼儿 / 小学 / 初中+
- 蒸馏：兴趣、学业阶段、亲子互动偏好

### 采集纪律
- 仅在用户自然提及时提取关键词标签
- 不做"让我们聊聊你女朋友"式的审问
- 标签带置信度，通过 `profile_manager.update_target()` 更新
- 目标对象画像独立存储，星级计算时交叉匹配：**本次建议 × 你的画像 × 目标对象画像 → 三维匹配度**

## 纪念日与节假日

### 采集
在对话中渐进式采集，不做填表。使用 `profile_manager.add_anniversary()` 存储。

### 提醒触发
`profile_manager.get_upcoming_anniversaries(days_ahead=N)` 返回未来 N 天内日期。
- 追求对象生日：提前 14 天渐进式建议（准备期→执行期）
- 恋爱纪念日：提前 7 天提醒
- 父母生日/父亲节/母亲节：提前 7 天提醒
- 小朋友重要日期：提前 7 天提醒
- 法定节假日（春节/中秋/国庆等）：提前 10 天推送出行方案

### 阶段适配（用于生成建议时参考）

| 关系阶段 | 建议风格 | 惊喜方向 |
|---------|---------|---------|
| 追求中-刚认识 | 轻量、不施压、自然借口 | 巧思低成本：手写卡片、提及对方说过的小细节 |
| 追求中-暧昧期 | 有心思但不越界 | 独特小众趣物 |
| 热恋期 | 创意优先，制造共同回忆 | DIY手工、冷门约会路线、定制小物件 |
| 蜜月期 | 私密仪式感 | 氛围营造 > 价格标签 |
| 稳定期 | 务实有温度 | "记得"型：留意小需求并实现 |
| 父母-亲密 | 陪伴型优先 | 时间投入：一起做的事 |
| 父母-紧张 | 低预期、微小善意 | 随手可做的小举动，降低压力 |
| 小朋友 | 体验 > 物质 | 亲子互动/兴趣探索/尊重空间 |

## 财务维度

**触发铁律**：永远不主动提起任何财务话题。仅在用户自己聊到时才接住。

### 识别信号
- 工资到账/花得多 → 询问储蓄习惯（有计划存/随缘/月光）
- 理财困惑 → 先共情，不推荐具体产品，引导说出当前状态
- 收益正向 → 高情商接住：不分析走势，把喜悦转化为生活建议（"那周末升级一顿大餐"）
- 副业意向 → 结合职业画像帮捋思路
- 财务焦虑 → 先缓解焦虑，引导说出具体压力源

### 使用边界
- 仅在用户再次主动提起时作为背景信息
- 绝不主动推送到日常投喂
- 月度小结中如用户本月未提起，财务板块不出现
- 永远「捋思路+给方向」，不推荐具体产品/平台