跳轉到

使用者對話流程

Time Compass 使用兩層路由決策:第一層決定整體 pipeline(Router),第二層判斷排程任務等級(SchedulingRouter)。


Router 決策流程

Router 為系統首道決策點,判斷使用者意圖、情緒強度,並決定後續模組執行順序。

決策樹

flowchart TD
    U["使用者輸入"] --> C1{"是否是第一個使用者輸入?"}

    C1 -->|"是"| C2{"是否要調用核心功能<br>(Summary 或 Scheduling)?"}
    C1 -->|"否"| UNKNOWN["✓ 處理邏輯待完善<br>(目前保留)"]

    C2 -->|"只需要情緒"| EM_ONLY["✓ Pipeline: [EmotionSupport]<br>單獨情緒回應"]
    C2 -->|"無關"| OUT_UNSUPPORTED["✓ Pipeline: []<br>Router 輸出:<br>- 感謝訊息<br>- 提示支援功能<br>(Emotion、Summary、Scheduling)"]
    C2 -->|"需要核心功能"| E["判斷情緒強度"]

    EM_ONLY --> OUT1["待組裝至 final_reply"]
    OUT_UNSUPPORTED --> OUT1

    E -->|"低落"| P0["✓ 情緒判斷為低落<br>Router 短回覆: 1~2 句接住<br>Pipeline: [EmotionSupport, ...]"]
    P0 --> EM1["EmotionSupport<br>(前置:接住情緒)"]

    E -->|"普通或高漲"| P1["✓ 情緒判斷為普通/高漲<br>Router 短回覆: 1 句<br>Pipeline: [...](不含前置 Emotion)"]

    P1 --> I["意圖判斷"]
    EM1 --> I

    I -->|"Summary"| SUMMARY["✓ Pipeline 加入 Summary"]
    I -->|"Scheduling"| SCHED["✓ Pipeline 加入 Scheduling"]
    I -->|"兩者皆需"| BOTH["✓ Pipeline: [..., Summary, Scheduling]"]

    SUMMARY --> T["判斷是否需後置情緒"]
    SCHED --> T
    BOTH --> T

    T -->|"低落或需暖收尾"| EM2["✓ Pipeline 加入 EmotionSupport<br>(後置:暖收尾)"]
    T -->|"不需要"| OUT2["最終輸出"]
    EM2 --> OUT2

Router 輸入規格

欄位 型別 說明
user_input string 使用者輸入文字(必填)
dialog_history string 對話歷史(選填,預設空字串)

Router 輸出規格

欄位 型別 說明
pipeline_description string 1~3 句話的流程說明,對使用者描述接下來會做的步驟(不在此展開具體內容)
pipeline List[Literal] 要執行的模組陣列,允許元素:EmotionSupport, Summary, Scheduling

Router Signature

RouterSignature

目標: 簡短判斷使用者需求並決定後續 pipeline

輸入: - dialog_history (string) - 對話歷史 - user_input (string) - 這一輪的完整輸入

輸出: - pipeline_description (string) - 流程說明(1~3 句話) - pipeline (List[Literal]) - 要執行的模組名稱

Router 使用範例

router = RouterModule()
result = router(
    user_input="我覺得有點沮喪,回顧一下這週好嗎?",
    dialog_history=""
)

print(result.pipeline_description)
# 輸出: "我先接住你的心情,接著一起回顧這週。"

print(result.pipeline)
# 輸出: ["EmotionSupport", "Summary"]

SchedulingRouter 任務等級判斷流程

當 Router 決定進入 Scheduling 後,Scheduling 模組內部有一個子路由 SchedulingRouter,負責判斷使用者的需求等級並決定後續子流程。

任務等級定義

等級 標籤 特徵 示例
L1 想法級 空泛目標、模糊期待、未明確化 "我希望重新找到工作的熱情"
L2 方案級 具體任務、有明確範疇、但未到可排程 "我要整理過去 2 週的工作成果"
L3 行動級 可排程微任務、含時間尺度、含完成判準 "明天早上 9~10 點整理過去 2 週的記錄"

SchedulingRouter 決策流程

flowchart TD
    R["SchedulingRouter<br>判斷輸入與任務等級"]

    R --> D{"使用者輸入為 L3(行動級)等級<br>或明確要求進入 L3 嗎?"}

    D -->|"是"| A["選擇 DraftAction<br>生成帶時間的可執行行動"]
    D -->|"否"| S["選擇 DraftPlan<br>生成方案與候選時段"]

    A --> Q1["AskQuestion<br>若有缺資訊則追問"]
    S --> Q2["AskQuestion<br>若有缺資訊則追問"]

    Q1 --> END1["回傳結果並建議下一步"]
    Q2 --> END2["回傳結果並建議下一步"]

SchedulingRouter 輸出規格

欄位 型別 說明 可見性
catch_and_rephrase string 路由簡短回覆並重述使用者意圖(便於手術模組接手) 使用者可見
ai_can_do string 針對該輸入,AI 可立即執行的動作摘要(例如:提供候選時段、拆任務、追問參數) 使用者可見
task_level string 判定的任務等級:L1(想法級) / L2(方案級) / L3(行動級) 內部

AI 可做動作清單

SchedulingRouter 在 ai_can_do 欄位中應列舉:

  • 【時間窗】提供候選時段或排程建議
  • 【原子化】自動拆解複雜任務為微任務
  • 【澄清問題】根據缺資訊自動生成追問
  • 【驗收標準】協助定義完成判準
  • 【風險識別】列舉排程假設與潛在風險

後續子流程

根據 SchedulingRouter 判斷結果,會進入不同的子流程:

若進入 DraftPlan(L2 方案級)

DraftPlan Signature
  ↓
  - draft_plan (string) - 友善的草案說明(含候選時段與說明)
  - constraints_and_missing_info (string) - 誠實說明缺資訊、假設、風險
  ↓
AskQuestion
  ↓
  - questions (string) - 自動生成的追問
  - next_steps_suggestion (string) - 後續建議步驟

若進入 DraftAction(L3 行動級)

DraftAction Signature
  ↓
  - action_description (string) - 可直接執行的行動描述
  - start_instructions (string) - 行動啟動說明
  - constraints_and_missing_info (string) - 缺資訊、假設、風險
  ↓
AskQuestion
  ↓
  - questions (string) - 自動生成的追問
  - next_steps_suggestion (string) - 後續建議步驟

使用範例

scheduling = SchedulingModule()
result = scheduling(
    interaction_context=ctx,
    time_interval_data=available_times
)

# 如果判斷為 L3(行動級)
print(result['draft_action'].action_description)
# 輸出: "明天 9:00 開始整理過去 2 週的工作紀錄,預計 1 小時完成"

print(result['ask_question'].questions)
# 輸出: "請確認: (1) 明天 9:00 時有沒有其他行程? (2) 這份紀錄最後要給誰看?"

# 如果判斷為 L2(方案級),則會進入 DraftPlan
print(result['draft_plan'].draft_plan)
# 輸出: "根據你的描述,我建議這樣安排..."

Prompt 設計約定

兩層路由均使用以下約定以確保一致性:

約定 適用對象
Prompt 應傳達「只判斷,不執行細節」 Router、SchedulingRouter
Prompt 應提醒下一層子任務 SchedulingRouter(提醒會進 DraftPlan / DraftAction)
Prompt 應在父模組責任範圍內停止 所有 Signature
誠實說明風險與假設(不隱暪) DraftPlan、DraftAction、AskQuestion

完整 Signature 規格: SIGNATURE-DIRECTORY.md

整體架構: C4-DIAGRAM.md