給當下的你 — 語料調度儀表板

MVP 1A 內部測試工具 · API:
控制區
可用快速選擇帶入測試 token,也可手動輸入 token 測試白名單外情境。
原始 JSON(開發用)
▼ 展開

    
規則說明

本頁用於整理目前模擬器採用的抽選規則。

抽選不是直接從 300 筆語料裡抽一筆

抽選分為兩個階段。第一階段先決定這次落在哪個 Level;第二階段才在該 Level 內依條件挑語料。候選不足時才進 Fallback,Fallback 是補救機制,不是主要設計方向。

類型 規則 量化設定 原始說法
Level 基礎權重 各 Level 初始抽選機率基礎值 A:60 / B:15 / C:10 / D:10 / E:5 A:60% B:25% C:10% D:5%(無 E)
使用次數調整 依同日已抽次數(第 1/2/3 次)調整各 Level 權重 第 1 次:A +15
第 2 次:A -15、B +20、C +15
第 3 次:A -25、B -5、C +20、D +20
第1次:A(flow/slow)
第2次:B/C(slow)
第3次:C/D(pause)
NEW 使用次數 Rhythm 加分 依同日已抽次數(draw_order)對候選語料的 rhythm_tags 加分。這是第二階段語料抽取的加分,不是 Level 權重加分。受 CR031_ENABLED 與 shouldApplyCr031RhythmBonus 控制;E level 不套用,D + 非 quiet / transition 不套用。 第 1 次:flow +10、slow +10
第 2 次:slow +15
第 3 次:pause +15
同上
時段調整 依台北時間時段(day / evening / late_night)調整 Level 權重 day 05:00–17:59:A +5、B +5
evening 18:00–22:59:B +5、C +5
late_night 23:00–04:59:C +5、D +5
day:A/B 提高;evening:B/C 提高;late_night:C/D 提高
最近排除 最近使用過的語料從候選池排除 最近 10 筆 排除最近 30 筆(語料增加後可以考慮)
Context Tag 加分 前句 primary context 對候選語料的 context_tags 加分 heavy → quiet +10 不再壓(換 B / quiet / slow)
Rhythm Tag 加分 依前句 context 對候選語料的 rhythm_tags 加分 quiet → flow +15
NEW heavy → slow +10
quiet:加一點流動;heavy:不再壓(換 B / quiet / slow)
Context 連續限制 同 primary context 連續出現達上限時,排除該 context 語料 上限 2 次 同 context 最多連續 2 次
Level 連續限制 同 Level 連續出現達上限時,排除該 Level 候選語料 上限 2 次 同 level 最多連續 2 次
NEW CR-031 Rhythm Streak 同一 rhythm 連續出現達上限時,排除該 rhythm 候選語料 同 rhythm 最多連續 2 次 避免:pause→pause→pause;flow→flow→flow;建議:slow→pause→slow→flow;使用者確認衍生為同 rhythm 最多連續 2 次 hard constraint
NEW CR-031 D Hard Constraint Level D 且 context 為 quiet / transition 時,限定只選 pause rhythm 語料 D + quiet / transition → pause only;非 pause 排除候選池 D:quiet/transition→pause(其他禁止)
Fallback 機制 候選不足時依序放寬限制,並記錄觸發的 fallback key F1 context_streak_relaxed
F2 recent_exclude_relaxed
F3 heavy_avoid_context_relaxed
F4a d_hard_constraint_relaxed_pause_pool
F4b d_hard_constraint_relaxed_full_pool
E1 emergency_relax_rhythm_streak
E2 global_emergency_all_active
工程補救機制,非原始規格
NEW CR-031 Level / Context → Rhythm Matrix

此 matrix 說明當「前一句 primary context」落在特定情境時,不同 Level 下候選語料的 rhythm 方向。

Level 量化設定(程式實際) 原始說法
A A + scattered → slow +10 / flow +10
A + normal → flow +10
A + quiet → slow +10
A + heavy / low / transition → 無 matrix 加分
scattered → slow/flow;normal → flow;quiet → slow
B 1. Level 層:上一句 context_tags 含 heavy → Level B +10
2. Context 層:候選語料 context_tags 含 quiet → +10;含 heavy → 排除
3. Rhythm 層:上一句 context_tags 含 heavy,且候選 rhythm = slow → slow +10(CR031_HEAVY_RECOVERY_BONUS)

注:heavy recovery bonus 屬於 CR031_HEAVY_RECOVERY_BONUS,不等同於 B level matrix。
全部 slow(heavy 限制)

這對應:上一句 = heavy,下一句不再壓,往 B / quiet / slow 方向走。
C C 有明確 LEVEL_CONTEXT_RHYTHM_BONUS matrix:
C + normal → slow +10
C + quiet → slow +10 / pause +10
C + heavy → slow +10
C + scattered / low / transition → 無 matrix 加分

套用條件:CR031_ENABLED = true(目前為 true),且 selectedLevel = C(C 不受 D gating 限制,永遠套用)。
normal → slow;quiet → slow/pause;heavy → slow
D D + quiet / transition → pause only(hard constraint)
非 pause rhythm 的候選語料直接排除候選池,不是加分機制。

D + 其他 context(scattered / normal / low / heavy)→ CR-031 rhythm 加分不套用(shouldApplyCr031RhythmBonus 回傳 false)
quiet/transition → pause(其他禁止)

*「前一句 primary context」= todayHistory 最後一筆的 context_tags 第一個 tag。
* E level 不套用 CR-031 rhythm 加分(shouldApplyCr031RhythmBonus 回傳 false)。

抽取邏輯:不是直接抽一句,而是先抽 Level,再抽語料

模擬器不是從全部語料中直接挑最高分,也不是 AI 即時生成。
它會先判斷本輪適合的 Level,再從該 Level 裡依照 tag 加分做第二次加權抽取。

核心公式
下一句語料 =
今日第幾次使用
+
現在時間
+
上一則語料的 context
+
最近使用紀錄
各因素的作用:
今日第幾次 — 影響哪個 Level 被加權
現在時間 — 日/夜/深夜對應不同 Level 傾向
上一則 context — 影響本輪 Level 與 tag 加分
最近使用紀錄 — 排除近期語料,避免重複
完整抽取流程
使用者感應 NFC
第一階段:抽 Level
依基礎權重、使用次數、時段、前句 context 加權
進入該 Level 候選池
依 selected_level 篩出語料
排除限制
排除最近出現、連續 Level、連續 Context、連續 Rhythm、D hard constraint
加分排序 / 加權抽選
依 context / rhythm 加分,加權隨機選出
選出三句話
↓ 若候選不足
Fallback
補救機制,非主要設計方向
第一階段範例:Level 怎麼被抽中
範例數字,非固定結果——實際數字會依使用次數、時間與前次語料狀態變動
各 Level 本輪計算後的最終權重(範例):
A = 60 + 15 + 5 = 80
B = 15 + 5 = 20
C = 10
D = 10
E = 5
總分 = 125
假設 Math.random() = 0.52,則 0.52 × 125 = 65
落點 65 落在哪個 Level 區間?
Level 抽選區間(總計 125,以寬度表示各 Level 比例)
A(0–80)
B(80–100)
C
D
E
因為 65 落在 A 區間(0 ≤ 65 < 80),所以本輪抽中 Level A
Level 區間對照:A:0–79 | B:80–99 | C:100–109 | D:110–119 | E:120–124
數字會依使用次數、時間與前次語料狀態變動。
第二階段範例:從 Level A 裡抽語料
範例數字,非固定結果——實際數字會依 tag 組合與前次語料狀態變動
Level A 候選語料的本輪 tag 分數(範例):
A-001 = 1
A-002 = 16 (flow tag 加分)
A-003 = 1
A-004 = 1
總分 = 19
假設 Math.random() = 0.7,則 0.7 × 19 = 13.3
落點 13.3 落在哪筆語料區間?
語料抽選區間(總計 19,以寬度表示各語料比例)
001
A-002(1–17)
003
004
因為 13.3 落在 A-002 區間(1 ≤ 13.3 < 17),所以最後抽中 A-002
⚠ 權重高代表比較容易被抽中,不代表一定會被抽中。
數字會依 tag 組合與前次語料狀態變動。
不要誤解
常見誤解提醒:
  1. 不是 AI 即時生成
  2. 不是直接從 300 筆語料挑最高分
  3. 不是 Level A 就永遠最容易出現(次數、時段都會改變權重)
  4. 權重高只是機率較高,不是保證抽中
  5. Fallback 是候選不足時的補救機制,不是主要抽選流程
語料分布

本頁用於檢查目前語料標籤分布是否支撐抽選規則。資料來自 Remote D1 messages 表 read-only SELECT,統計範圍為 is_active = 1 的 300 筆語料。

所有 TAG 清單
情境標籤 Context
normal — 一般狀態
scattered — 分散、心亂
low — 低落
heavy — 沉重
transition — 轉換中
quiet — 安靜、內收
節奏標籤 Rhythm
pause — 停
slow — 慢
flow — 流動
觸發來源 Trigger
self — 純內在
thought — 思緒
feeling — 情緒
state — 整體狀態
Level × Rhythm
Level flow slow pause 合計
A 843960
B 6441060
C 1141860
D 15321360
E 4362060
總數 4419660300
占比 14.7%65.3%20.0%100%

目前語料 rhythm 以 slow 為主,代表整體語氣偏穩、慢、陪伴;pause 可支撐 D/E 或 quiet / transition 的停頓需求;flow 用於較輕、推進感較強的語句。

Level × Context
Level normal scattered low heavy transition quiet 合計
A 8025167460
B 2232156360
C 3901074060
D 24115119060
E 1113037860
總數 1045101423315300
占比 34.7%1.7%33.7%14.0%11.0%5.0%100%

目前 context 以 normal 與 low 為主,兩者合計約 68.4%。quiet 僅 15 筆,scattered 僅 5 筆,屬於低量標籤,後續若要提高這類情境的穩定性,需留意語料補充。

資料觀察:C + quiet = 0、D + quiet = 0。CR-031 中 D + quiet 屬於 pause hard constraint 情境,但目前 D level 沒有 quiet 語料,因此此情境會進入 fallback。此為語料分布現況,不代表抽選邏輯錯誤。

Level × Trigger
Level self thought feeling state 合計
A 19365060
B 17430060
C 14451060
D 4785060
E 4983060
總數 146140140300
占比 48.7%46.7%4.7%0.0%100%

Trigger tags 目前僅記錄與分析使用,不參與抽選加權。

目前 trigger 以 self 與 thought 為主,合計約 95.4%。feeling 僅 14 筆,state 目前為 0 筆。此區僅作為語料結構觀察,不影響抽選加權。

資料來源:Remote D1 messages 表 read-only SELECT;統計範圍為 is_active = 1 的 300 筆語料。