# 正念 APP｜用戶畫像打分標準（User Profile Scoring Spec · V1）

> **用途**：
> 本文件定義「問卷完成後，如何將答案轉換為可計算的用戶畫像（User Profile）」；
> 該畫像將用於後續的 **個性化內容推薦 / 推送排序**。
>
> **設計原則**：
>
> * 不做心理診斷，只描述「此刻允許被如何對待」
> * 區分 **身份（離散）** 與 **狀態（連續）**
> * 允許「通用」與「高個性化」內容並存

---

## 一、整體結構概覽

問卷完成後，系統需生成一個用戶畫像 **U**，包含四個維度：

1. **mom_stage**（母職階段｜離散型）
2. **emotion**（當下情緒｜連續型）
3. **context**（影響來源｜離散型）
4. **need**（當下最需要的支持｜離散型）

該畫像將與內容畫像 **Cᵢ** 進行匹配，計算推薦分數。

### V1.1 工程補充欄位（用於不確定性控制/可觀測）

> 目的：在 Push 等高風險場景，當用戶畫像可能過期或不可靠時，自動「降個性化 / 降風險」。

建議在 U 中補充以下元資訊（不影響原有四維度打分）：

* `profile_version`：如 `"v1.1"`
* `profile_source`：`questionnaire`（後續可擴展 `behavior` / `mixed`）
* `profile_generated_at`：ISO8601 時間戳
* `profile_confidence`（= `conf_U`）：`0–1`
* `profile_answered`：各題是否作答（用于区分“跳过” vs “明确选择”）
  * `stage/emotion/context/need`：`true/false`

`profile_confidence` 建議規則（V1.1 默認，可調參）：

* 問卷剛完成：`conf_U = 1.0`
* 隨時間衰減（避免用過期狀態強個性化推送）：
  * 0–7 天：`conf_U = 1.0`
  * 7–30 天：線性衰減到 `0.7`
  * 30 天以上：`conf_U = 0.5`（除非用戶重新做問卷或有行為信號更新）

#### V1.2：支持“可跳过题目”的画像输出与置信度（工程必读）

> 前提：问卷允许用户跳过任意题目（包括 mom_stage / emotion / context / need）。
> 目标：保证任何情况下都能生成“可计算的 U”，并在不确定时自动降个性化/降风险。

**V1.2 输出原则：**

* **mom_stage 跳过**：按安全策略处理为 `unknown`（即 `U.stage.unknown=1`），同时 `profile_answered.stage=false`
* **emotion 跳过**：`U.emotion_score` 置为缺省（建议直接不输出该字段或输出 `null`），同时 `profile_answered.emotion=false`
* **context 跳过**：`U.context` 输出为空对象 `{}`，同时 `profile_answered.context=false`
* **need 跳过**：`U.need` 输出为空对象 `{}`，同时 `profile_answered.need=false`

> 说明：
>
> * 之所以“mom_stage 跳过也当作 unknown”，是为了在 Push 等高风险场景优先保证不冒犯（unknown 语义：不希望被母职身份定义）。
> * emotion/context/need 跳过不强行填默认值，避免制造“伪精确画像”；改由推荐算法在打分时走“通用值 + 不确定性惩罚”（见「个性化推荐算法规则」V1.2 补充）。

**V1.2 `conf_U` 计算（在 V1.1 时间衰减基础上叠加“作答完整度”）：**

定义：

* `conf_time`：按 V1.1 时间衰减得到（0–1）
* `answered_count = Σ I[profile_answered.* = true]`，总题数 `total_questions = 4`
* `completion = answered_count / total_questions`
* `completion_factor = 0.5 + 0.5 * completion`（答得越少越不确定，但仍保留基础信息）

则：

* `conf_U = clamp(conf_time * completion_factor, 0.2, 1.0)`

> Push 推送時若 `conf_U` 偏低，推薦系統需啟用 `P_uncertainty` 並限制 `personalization_power` 上限（見「個性化推薦算法規則」V1.1）。

---

## 二、mom_stage（母職階段）— 離散型

### 問卷題目

**Which stage of motherhood are you in?**

選項與對應標籤：

* Pregnant / Preparing → `mom_stage: expecting`
* Parenting → `mom_stage: parenting`
* Prefer not to say → `mom_stage: unknown`

### 打分方式（One-Hot）

| 欄位                | 值     |
| ----------------- | ----- |
| U.stage.expecting | 1 或 0 |
| U.stage.parenting | 1 或 0 |
| U.stage.unknown   | 1 或 0 |

> **說明**：
>
> * `mom_stage` 是「身份 / 階段」，不是強度，不做連續軸線
> * `unknown` 的語義是：**不希望被母職身份定義**（不是「沒有孩子」）
> * 若该题被跳过：按安全策略输出 `unknown`，同时 `profile_answered.stage=false`

### 推送原則（高層）

* `unknown`：避免任何「你應該怎麼當媽媽」的內容
* `expecting`：避免「已經有孩子」的育兒細節
* `parenting`：可接受具體育兒壓力、現實困境相關內容

---

## 三、emotion（當下情緒）— 連續型（0–1）

### 問卷題目

**How are you feeling right now?**

### 映射為數值軸（能量／情緒穩定度）

| 選項          | tag                  | emotion_score |
| ----------- | -------------------- | ------------- |
| Low         | emotion: low         | 0.0           |
| Overwhelmed | emotion: overwhelmed | 0.2           |
| Tired       | emotion: tired       | 0.4           |
| Okay        | emotion: neutral     | 0.6           |
| Calm        | emotion: calm        | 0.8           |
| Joyful      | emotion: joyful      | 1.0           |

生成：`U.emotion_score ∈ [0,1]`；若该题跳过则输出 `null`（或不输出该字段），并通过 `profile_answered.emotion=false` 表示“未作答”

### 語義說明

* 這不是「快樂程度」，而是 **可承受刺激與吸收內容的能力**
* 分數越低，內容越需要「減壓、陪伴、允許停下」
* 分數越高，才適合「慶祝、提醒珍惜」

---

## 四、context（影響來源）— 離散型

### 問卷題目

**What’s been influencing how you feel?**

| 選項            | tag                   |
| ------------- | --------------------- |
| Family        | context: family       |
| Work or study | context: work         |
| Relationship  | context: relationship |
| Friends       | context: friends      |
| Health        | context: health       |

### 打分方式（One-Hot）

| 欄位                                                    | 值     |
| ----------------------------------------------------- | ----- |
| U.ctx.family / work / relationship / friends / health | 1 或 0 |

> 若该题被跳过：`U.context` 输出为空对象 `{}`，同时 `profile_answered.context=false`

### 語義說明

* context **不是情緒**，而是情緒的「觸發場景」
* 用於提升內容共感（語境命中），而非硬性過濾

---

## 五、need（最需要的支持）— 離散型（最關鍵）

### 問卷題目

**What kind of support do you need most right now?**

| 選項                 | tag                      |
| ------------------ | ------------------------ |
| Emotional support  | need: emotional_support  |
| Parenting pressure | need: parenting_pressure |
| Self-worth         | need: self_worth         |
| Anxiety relief     | need: anxiety_relief     |
| Rest & balance     | need: rest_balance       |

### 打分方式（One-Hot）

| 欄位                                                                                         | 值     |
| ------------------------------------------------------------------------------------------ | ----- |
| U.need.emotional_support / parenting_pressure / self_worth / anxiety_relief / rest_balance | 1 或 0 |

> 若该题被跳过：`U.need` 输出为空对象 `{}`，同时 `profile_answered.need=false`

### 語義說明

* `need` 是 **推薦權重最高的維度**
* 表示「她現在最缺的是哪一種心理資源」

---

## 六、跨維度約束（Hard Rules）

以下規則在推薦時 **優先於任何分數計算**：

### 核心禁推規則（V1.2）

1. **mom_stage = unknown**

   * ❌ 禁推：**高个性化**育儿压力内容（避免“把她当妈妈/正在育儿”对话）
     * 判定条件（与推荐算法一致，V1.2）：`Cᵢ.need_suitability[parenting_pressure]=1` 且 `Cᵢ.personalization_power=1`

2. **mom_stage = parenting**

   * ❌ 禁推：明確懷孕 / 孕期 / 胎動等內容

3. **emotion_score ≤ 0.2（low / overwhelmed）**

   * ❌ 禁推：高能量慶祝型（joyful 調性）內容

> 原則：
>
> * 這些不是「不準」，而是「會造成反感或退出」

---

## 七、用戶畫像最終輸出結構（示例）

```json
{
  "profile_version": "v1.1",
  "profile_source": "questionnaire",
  "profile_generated_at": "2026-01-30T00:00:00Z",
  "profile_confidence": 1.0,
  "profile_answered": {
    "stage": true,
    "emotion": true,
    "context": true,
    "need": true
  },
  "stage": {
    "expecting": 0,
    "parenting": 1,
    "unknown": 0
  },
  "emotion_score": 0.4,
  "context": {
    "work": 1
  },
  "need": {
    "rest_balance": 1
  }
}
```

### 跳过题目时的输出示例（V1.2）

> 示例：用户跳过 emotion / context / need；mom_stage 也跳过。

```json
{
  "profile_version": "v1.2",
  "profile_source": "questionnaire",
  "profile_generated_at": "2026-01-30T00:00:00Z",
  "profile_confidence": 0.5,
  "profile_answered": {
    "stage": false,
    "emotion": false,
    "context": false,
    "need": false
  },
  "stage": {
    "unknown": 1
  },
  "emotion_score": null,
  "context": {},
  "need": {}
}
```

---

## 八、設計總結（給產品／工程／AI Reviewer）

* **mom_stage / context / need**：描述「你現在允許我用什麼身份、從哪個角度對你說話」
* **emotion_score**：描述「你現在能承受多強的刺激與建議」
* 推薦的本質不是猜你是誰，而是 **避免用錯語氣對你說話**

> 本文件為 V1，後續可疊加：
>
> * 多選 context / need
> * 行為信號（點擊、收藏）對 emotion 的動態修正
