iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
生成式 AI

打造基於 MCP 協議與 n8n 工作流的會議處理 Agent系列 第 23

Day 23 智慧對話升級 — 多輪澄清與脈絡記憶強化

  • 分享至 

  • xImage
  •  

昨天我們成功建立了智慧澄清對話機制與歷史會議問答功能,讓 AI 能主動確認使用者意圖,並針對載入的會議記錄進行後續提問,但是當使用者的指令非常模糊時,系統往往只能進行一次澄清就必須嘗試執行,而且對話過程中缺乏明確的視覺提示,使用者不易理解當前所處的狀態。

因此今天的目標是實作多輪澄清對話機制,讓 AI 能夠進行連續追問直到意圖完全明確,同時建立對話記憶能力,使 AI 能理解上下文,並精煉核心 Prompt 與錯誤處理,打造更智慧、更自然的互動體驗。

今天的目標與挑戰

  • 建立多輪澄清對話流程,讓 AI 能持續追問直到確認意圖
  • 建立對話記憶機制,讓 AI 理解前後文脈絡
  • 精煉「意圖分析」與「問答」的核心 Prompt,強化判斷邏輯
  • 新增視覺化的狀態提示,讓使用者清楚知道目前的對話狀態
  • 新增對話重置機制,允許使用者中斷澄清流程重新開始
  • 設計智慧的最終判斷機制,在多輪對話後仍無法確認意圖時,由 AI 做出最合理的推斷

Step 1:設計多輪澄清對話架構

首先要重新設計澄清對話的流程,讓系統能夠支援連續追問。

1-1 分析多輪對話的核心需求

在設計多輪對話前,我們先來整理核心需求,大致分為以下幾點:

  • 對話狀態管理:系統必須記住目前在第幾輪對話、已經收集到哪些資訊
  • 意圖累積機制:每一輪的使用者回應都應該被累積,而不是覆蓋前一輪的資訊
  • 終止條件判斷:系統必須有明確的邏輯判斷何時該繼續追問、何時該執行任務
  • 脫離機制:使用者應該能隨時中斷澄清流程,重新開始或取消任務

1-2 更新對話狀態管理結構

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,  # 新增:設定最多允許的澄清輪數
}

資料結構說明

  1. clarification_round:這個計數器用來追蹤當前是第幾輪澄清,防止無限循環的對話。
  2. accumulated_info:這個字典用來儲存每一輪對話中確認的資訊,例如使用者選擇的動作類型、特別關注的重點等。
  3. max_rounds:設定最大澄清輪數為 3 輪,如果超過這個次數仍無法確認意圖,系統將使用預設設定執行任務。

Step 2:設計脈絡感知的意圖分析 Prompt

現在要升級意圖分析的 Prompt,讓它能夠理解對話歷史並進行更精確的判斷。

2-1 更新 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

Prompt 設計要點

  • 脈絡感知:透過加入 conversation_historyaccumulated_info,讓 AI 能理解之前的對話脈絡,避免重複詢問。
  • 動態內容:Prompt 會根據當前對話狀態動態調整,在首輪和後續輪次提供不同的引導資訊。
  • 明確規則:特別強調「不要重複詢問」和「聚焦核心問題」,提升澄清效率。
  • 防止過度澄清:加入「累積資訊已足夠時應執行」的規則,避免 AI 過度追問細節。

Step 3:多輪澄清與最終智慧判斷

重新建構 process_new_meeting 函式,導入一個更好的多輪對話循環以及最終智慧判斷機制。

3-1 重構 process_new_meeting 函式

我修改了 app.py 中的 process_new_meeting 函式,主要邏輯如下

  1. 正常澄清循環(第 1 到 3 輪):
    • 呼叫 analyze_intent 進行意圖分析。
    • 如果 proceedtrue,則立即跳出循環並執行任務。
    • 如果 proceedfalse,則向使用者顯示澄清問題,並繼續下一輪循環。
  2. 最終智慧判斷(超過 max_rounds 時):
    • 如果經過 3 輪對話後意圖仍然模糊,系統不會再向使用者提問。
    • 取而代之的是,它會將完整的對話歷史打包,交給 AI 進行一次「最終判斷」。
    • AI 會被要求根據所有對話內容,盡力推斷出一個最合理的指令來執行,或者判斷對話無效並建議使用者重新開始。
# 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 在面對模糊指令的情況下的自主決策能力。它不再是個只會被動提問的工具,而是一個會努力「想辦法」完成任務的智慧助理。這樣不僅提升了任務成功率,也讓使用者體驗更加流暢,避免了因反覆提問而產生的挫敗感。

3-2 新增 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 生成訊息,而像「已重置」或簡單的錯誤提示,則保持固定文字,以兼顧對話的自然度與系統的回應效率。


Step 4:整合至 Gradio 介面

為了提升互動體驗,讓使用者能清楚了解目前的系統狀態,我也在 Gradio 介面上做了兩項重要的更新。

4-1 新增「對話狀態」提示

新增了一個視覺化的狀態提示框,能一眼看出 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]
    )

程式說明

  • CSS 樣式:在 gr.Blocks 中定義了不同狀態的樣式 。
  • Gradio 元件:使用 gr.Markdown 作為顯示元件,並透過 elem_classes 綁定樣式 。
  • 狀態更新:在 process_new_meeting 函式中,根據對話流程回傳不同的狀態常數 (STATUS_READY, STATUS_CLARIFYING) 來更新顯示 。

4-2 新增「重置對話」按鈕

為了讓使用者在澄清流程中隨時可以重新開始,我加入了一個「重置對話」按鈕,讓使用者可以重置對話狀態。

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 函式綁定,點擊後會清空對話紀錄並更新狀態顯示 。

Step 5:測試與驗證

現在來測試新加入的功能。

5-1 測試多輪澄清流程與最終智慧判斷

  1. 啟動 Gradio 並上傳音檔
python app.py
  1. 連續模糊回覆:狀態提示框變為「澄清中
    • 使用者:「處理」
      智慧判斷(處理)1
    • 使用者:「都可以」
      智慧判斷(都可以)2
    • 使用者:「隨便」
      智慧判斷(隨便)3
  2. 觀察最終判斷:在第三輪提問後,AI 不再提問,他會根據上下文自己判斷使用者的意圖。
  3. 確認後執行:若AI 根據推斷的指令最後判斷結果為「使用者希望我們處理會議相關的事務」之類的,他就會自己直接執行會議摘要的處理,完成任務。
    模型智慧判斷
    智慧判斷(你決定)4

5-2 測試對話重置功能

  1. 點擊重置按鈕:進行模糊回答後,並在 AI 回覆後,點擊「🔄 重置對話」按鈕。
  2. 結果驗證
    • 對話視窗被清空。
    • 狀態提示框變回「準備就緒」。
    • 系統內部狀態已重置,可以開始一輪全新的對話。
      Home Page

今天的成果總結

完成項目

  • 成功建立了多輪澄清對話機制,讓 AI 能夠透過連續追問來精準理解使用者意圖
  • 實作了對話記憶與資訊累積功能,使 AI 能理解上下文,避免重複提問
  • 設計了最終智慧判斷機制,當對話陷入僵局時,AI 能主動推斷並提出合理方案
  • 在 Gradio 介面新增了視覺化狀態提示對話重置功能,大幅提升了使用者體驗
  • 精煉了核心 Prompt,強化了 AI 在不同對話階段的判斷邏輯與回應能力

心得

今天我讓我的 AI 助理學會了透過多輪澄清機制,來了解使用者的意圖,它不再是一個指令一個動作的機器,而是一個會思考、會追問的夥伴,最後的最終智慧判斷設計,它為模糊的對話提供了一個「出口」,而不是讓使用者陷入無限提問的挫敗感中。

我也在 Gradio 前端介面上加了兩個「狀態提示」和「重置按鈕」小小的功能,這樣可以讓使用者清楚知道「我們現在在哪個階段」,並賦予了他們隨時「喊停」的權力,這些的機制與功能,不只讓 AI 的自主決策能力往前邁了一大步,也提升了使用者體驗。

🎯 明天計劃

強化中文時間解析能力,並升級至 Faster-Whisper 引擎以大幅提升音訊轉錄的速度與資源使用效率。


上一篇
Day 22 智慧對話機制 — 澄清意圖與會議脈絡問答
下一篇
Day 24 效能與精度雙升級 — 導入優先級時間解析與 Faster-Whisper
系列文
打造基於 MCP 協議與 n8n 工作流的會議處理 Agent28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言