# 正念 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 的動態修正