昨天我們成功建立了智慧澄清對話機制與歷史會議問答功能,讓 AI 能主動確認使用者意圖,並針對載入的會議記錄進行後續提問,但是當使用者的指令非常模糊時,系統往往只能進行一次澄清就必須嘗試執行,而且對話過程中缺乏明確的視覺提示,使用者不易理解當前所處的狀態。
因此今天的目標是實作多輪澄清對話機制,讓 AI 能夠進行連續追問直到意圖完全明確,同時建立對話記憶能力,使 AI 能理解上下文,並精煉核心 Prompt 與錯誤處理,打造更智慧、更自然的互動體驗。
首先要重新設計澄清對話的流程,讓系統能夠支援連續追問。
在設計多輪對話前,我們先來整理核心需求,大致分為以下幾點:
在 app.py
,更新 clarification_context
的資料結構
# 更新全域對話狀態管理
clarification_context = {
"audio_path": None,
"original_instruction": None,
"conversation_history": [],
"is_in_clarification": False,
"last_suggestions": [],
"clarification_round": 0, # 新增:追蹤目前是第幾輪澄清
"accumulated_info": {}, # 新增:用來累積已確認的資訊
"max_rounds": 3, # 新增:設定最多允許的澄清輪數
}
clarification_round
:這個計數器用來追蹤當前是第幾輪澄清,防止無限循環的對話。accumulated_info
:這個字典用來儲存每一輪對話中確認的資訊,例如使用者選擇的動作類型、特別關注的重點等。max_rounds
:設定最大澄清輪數為 3 輪,如果超過這個次數仍無法確認意圖,系統將使用預設設定執行任務。現在要升級意圖分析的 Prompt,讓它能夠理解對話歷史並進行更精確的判斷。
build_intent_analysis_prompt
函式在 app.py
中更新 build_intent_analysis_prompt
函式,讓它能動態地將對話歷史與已確認資訊載入到 Prompt 中。
def build_intent_analysis_prompt(conversation_history=None, accumulated_info=None):
# 建立脈絡感知的意圖分析 Prompt,支援多輪對話記憶與累積資訊
base_prompt = """你是一個專業的指令分析專家。你的任務是分析使用者的會議處理指令,判斷意圖是否明確,並決定是否需要進一步澄清。
[指令分析標準]
1. **明確指令的特徵**:
- 明確指出要執行的動作(摘要、任務提取、參與者辨識等)
- 提及需要特別注意的重點(時間、人員、專案等)
- 指令完整且無歧義
2. **需要澄清的情況**:
- 指令過於簡短或模糊(如「處理一下」、「分析」)
- 缺少關鍵資訊(如未說明要提取什麼)
- 包含多個動作但未明確優先順序
- 使用模糊的詞彙(如「大概」、「可能」、「差不多」)
[分析步驟]
1. **識別動作**:使用者想要執行什麼動作
2. **評估完整性**:執行該動作需要的資訊是否充足
3. **判斷明確度**:指令是否清晰無歧義
4. **檢查累積資訊**:結合先前對話中已確認的資訊進行綜合判斷
"""
if conversation_history and len(conversation_history) > 0:
history_text = "\n[對話歷史]\n"
for i, turn in enumerate(conversation_history, 1):
user_msg = turn.get("user", "")
history_text += f"第 {i} 輪 - 使用者:{user_msg}\n"
base_prompt += history_text
if accumulated_info and len(accumulated_info) > 0:
info_text = "\n[已確認資訊]\n"
for key, value in accumulated_info.items():
info_text += f"- {key}:{value}\n"
base_prompt += info_text
base_prompt += "\n請根據上述已確認的資訊,判斷還需要補充哪些細節。\n"
base_prompt += """
[輸出格式]
請嚴格按照以下 JSON 格式回傳:
如果指令明確,回傳:
{
"is_clear": true,
"intent": "使用者的明確意圖描述",
"actions": ["動作1", "動作2"],
"proceed": true,
"confirmed_info": {
"action_type": "摘要+任務提取",
"focus_points": ["時間", "人員"]
}
}
如果需要澄清,回傳:
{
"is_clear": false,
"unclear_points": ["不明確的地方1", "不明確的地方2"],
"clarification_question": "請問您希望我執行以下哪些動作?",
"suggestions": [
"選項1:生成會議摘要與提取任務",
"選項2:只提取行動任務",
"選項3:完整分析包含摘要、任務、參與者與時間"
],
"proceed": false
}
[重要規則]
1. 如果累積資訊已經足夠執行基本任務,即使有些細節未確認,也應設定 proceed 為 true
2. 澄清問題應該具體且聚焦,一次只問一個核心問題
3. 建議選項應該實用且易於理解
4. 避免重複詢問已確認的資訊
"""
return base_prompt
conversation_history
和 accumulated_info
,讓 AI 能理解之前的對話脈絡,避免重複詢問。重新建構 process_new_meeting
函式,導入一個更好的多輪對話循環以及最終智慧判斷機制。
process_new_meeting
函式我修改了 app.py
中的 process_new_meeting
函式,主要邏輯如下
analyze_intent
進行意圖分析。proceed
為 true
,則立即跳出循環並執行任務。proceed
為 false
,則向使用者顯示澄清問題,並繼續下一輪循環。max_rounds
時):
# process_new_meeting 函式的部分邏輯
# ...(前段程式碼)
# 澄清模式中的後續回應流程
else:
clarification_context["clarification_round"] += 1
current_round = clarification_context["clarification_round"]
# ...(組合指令等程式碼)
progress(None, desc=f"第 {current_round} 輪確認中...")
intent_result = analyze_intent(...)
# ...(錯誤處理)
# 意圖已確認則執行任務(無論在第幾輪)
if intent_result.get("proceed", False):
# ...(直接執行任務的邏輯)
# 超過最大輪數但仍未確認,進行最終智慧判斷
elif current_round > clarification_context["max_rounds"]:
progress(None, desc="進行最終意圖分析...")
# 建立最終判斷專用 Prompt
final_prompt = f"""你已經進行了 {clarification_context['max_rounds']} 輪澄清對話。
現在請根據以下完整的對話記錄,做出最終判斷。
# ...(如先前討論的 Prompt 內容)
"""
final_result = call_lm_studio_api(...)
if final_result.get("proceed", False):
# AI 成功推斷出意圖,執行任務
# ...
else:
# AI 無法推斷,建議使用者重新開始
# ...
# 仍需繼續澄清(尚未超過最大輪數)
else:
# ...(繼續顯示澄清問題)
這個新流程的意義在於, AI 在面對模糊指令的情況下的自主決策能力。它不再是個只會被動提問的工具,而是一個會努力「想辦法」完成任務的智慧助理。這樣不僅提升了任務成功率,也讓使用者體驗更加流暢,避免了因反覆提問而產生的挫敗感。
為了讓「最終確認」和「無法理解」的訊息更自然,我新增了一個 generate_ai_confirmation_message
函式。它會根據情境,呼叫 AI 生成個人化、有溫度的回應,而不是顯示寫死的文字。
def generate_ai_confirmation_message(message_type, **kwargs):
# 使用 AI 生成關鍵確認訊息,提升對話自然度
if message_type == "final_confirmation":
system_prompt = """你是一個專業的會議助理...現在要向使用者確認你的理解是否正確。
# ...(如先前討論的 Prompt 內容)
"""
user_message = f"""...我理解使用者的需求是:
**執行指令**:{kwargs.get('instruction')}
**推斷依據**:{kwargs.get('reasoning')}
請生成一個最終確認訊息。
"""
elif message_type == "cannot_understand":
# ...(對應的 Prompt)
result = call_lm_studio_api(system_prompt, user_message, temperature=0.7)
return result.get("content", "訊息生成失敗")
我選擇只在關鍵的、複雜的情境下(如最終判斷、無法理解)使用 AI 生成訊息,而像「已重置」或簡單的錯誤提示,則保持固定文字,以兼顧對話的自然度與系統的回應效率。
為了提升互動體驗,讓使用者能清楚了解目前的系統狀態,我也在 Gradio 介面上做了兩項重要的更新。
新增了一個視覺化的狀態提示框,能一眼看出 AI 目前是「準備就緒」還是「澄清中」。
# 定義狀態
STATUS_READY = """<div class="status-indicator status-ready">準備就緒</div>"""
STATUS_CLARIFYING = """<div class="status-indicator status-clarifying">澄清中</div>"""
# Gradio 介面定義
with gr.Blocks(css=..."""
.status-indicator { ... }
.status-ready { background-color: #d4edda; ... }
.status-clarifying { background-color: #fff3cd; ... }
""") as demo:
...
status_display = gr.Markdown(value=STATUS_READY, elem_classes="status-box")
...
# 在函式回傳時更新 status_display
new_meeting_submit.click(
fn=process_new_meeting,
...,
outputs=[..., status_display]
)
gr.Blocks
中定義了不同狀態的樣式 。gr.Markdown
作為顯示元件,並透過 elem_classes
綁定樣式 。process_new_meeting
函式中,根據對話流程回傳不同的狀態常數 (STATUS_READY
, STATUS_CLARIFYING
) 來更新顯示 。為了讓使用者在澄清流程中隨時可以重新開始,我加入了一個「重置對話」按鈕,讓使用者可以重置對話狀態。
def reset_conversation():
global clarification_context
# 重置所有狀態
clarification_context = {
"audio_path": None, "original_instruction": None, "conversation_history": [],
"is_in_clarification": False, "last_suggestions": [],
"clarification_round": 0, "accumulated_info": {}, "max_rounds": 3,
}
# 回傳空的對話紀錄與準備就緒狀態
return [], STATUS_READY
# Gradio 介面
...
reset_button = gr.Button("🔄 重置對話", variant="secondary")
...
reset_button.click(
fn=reset_conversation,
inputs=None,
outputs=[new_meeting_chatbot, status_display]
)
reset_conversation
函式,用於清空 clarification_context
,將所有狀態恢復到初始值 。click
事件與 reset_conversation
函式綁定,點擊後會清空對話紀錄並更新狀態顯示 。現在來測試新加入的功能。
python app.py
✅ 完成項目
Prompt
,強化了 AI 在不同對話階段的判斷邏輯與回應能力今天我讓我的 AI 助理學會了透過多輪澄清機制,來了解使用者的意圖,它不再是一個指令一個動作的機器,而是一個會思考、會追問的夥伴,最後的最終智慧判斷設計,它為模糊的對話提供了一個「出口」,而不是讓使用者陷入無限提問的挫敗感中。
我也在 Gradio 前端介面上加了兩個「狀態提示」和「重置按鈕」小小的功能,這樣可以讓使用者清楚知道「我們現在在哪個階段」,並賦予了他們隨時「喊停」的權力,這些的機制與功能,不只讓 AI 的自主決策能力往前邁了一大步,也提升了使用者體驗。
🎯 明天計劃
強化中文時間解析能力,並升級至 Faster-Whisper 引擎以大幅提升音訊轉錄的速度與資源使用效率。