使用者對話流程¶
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