iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0

經過前面幾天的流程建置,今天迎來了第一步:讓 AI 擁有「記憶力」。如果 AI 只能一問一答,那只是個笨重的機器人。多輪對話的核心在於追蹤 conversation_id,讓 AI 記得我們前面說過什麼。
而過程並不順利,我遇到了 Webhook 監聽中斷、405 Method Not Allowed、Gemini 模型超載 (503),甚至還有模型名稱不匹配 (404) 等一連串的困境。
但最終還是順利完成了!

一、多輪對話的技術核心:Conversation ID

  • 定義: 什麼是 conversation_id? (一個獨特的 ID,用來標識整個對話過程。)
  • 運作原理:
    • 第一次呼叫: 請求中不帶 conversation_id,Dify 自動生成一個新的 ID 並回傳。
    • 後續呼叫: 每次請求都必須將上一次收到的 ID 傳回去,Dify 就能根據這個 ID 查詢並加載歷史對話記錄。
  • API 端點: 確認使用 chat-messages 而非 completion-messages

二、Dify 應用配置(快速回顧)

  • 應用類型: 聊天助手 (Chatbot)。
  • 獲取金鑰: 取得 API Key 作為 n8n 的 Authorization 憑證。

三、n8n 流程建構:三個關鍵節點的調整

這部分是實作的重點,需要強調與「單輪對話」的差異。
節點的設置和前一篇大同小異:
https://ithelp.ithome.com.tw/upload/images/20251015/201690789pL2wJW1LW.png

1. Webhook 節點 (接收請求)

延續上一篇的節點新增內容:

  • 設定: POST 方法,確保 Respond 設置為 Using 'Respond to Webhook' Node
  • 重點: Webhook 必須準備好接收包含 conversation_id 的 JSON。

2. HTTP Request 節點 (呼叫 Dify API)

  • 核心調整: 修正 MethodPOST (解決 405 錯誤)。
  • JSON Body 必須包含 conversation_id
    {
      // ...其他參數
      "query": "{{$json['body']['message']}}",
      "conversation_id": "{{$json['body']['conversation_id']}}" // 👈 重點!
    }
    

https://ithelp.ithome.com.tw/upload/images/20251015/20169078b9rL9dE26U.png

3. Set 節點 (抽取回覆與 ID)

  • 目的: 不僅抽取 AI 的答案,還要確保將 conversation_id 帶出來,回傳給呼叫端。
  • 設定: 建立兩個欄位:
    • reply: ={{$json["answer"]}}
    • conversation_id: ={{$json["conversation_id"]}} // 👈 重點!
      https://ithelp.ithome.com.tw/upload/images/20251015/20169078URwtF1AzeO.png

4. Respond to Webhook 節點

  • 目的: 回傳 Set 節點輸出的完整 JSON,包含 reply 和新的/舊的 conversation_id

四、PowerShell 測試:實戰多輪對話

1. 第一次對話 (創建 ID)

  • 指令: 不傳入 conversation_id
  • 重點說明: 必須將返回的 conversation_id 儲存到 $conversation_id 變數中。
    Powershell:
$uri = "http://localhost:5678/webhook-test/dify-test17"
$message1 = '我現在正在學習 n8n 和 Dify 的串接'

# 完整 POST 請求:使用反引號 (`) 換行時,不要在同一行中斷執行
$json1 = '{"message":"' + $message1 + '"}' 
$result1 = Invoke-RestMethod -Uri $uri `
  -Method POST `
  -Headers @{ "Content-Type" = "application/json; charset=utf-8" } `
  -Body ([System.Text.Encoding]::UTF8.GetBytes($json1))

# 顯示第一次結果,並將 conversation_id 儲存在變數中
Write-Host "--- 第一次對話結果 ---"
$result1 | ConvertTo-Json -Depth 4
$conversation_id = $result1.conversation_id
Write-Host "儲存的 Conversation ID: $conversation_id"

https://ithelp.ithome.com.tw/upload/images/20251015/20169078vDssh0Ycb3.png

2. 第二次對話 (延續記憶)

  • 指令: 必須在 JSON Body 中帶入上一步儲存的 $conversation_id
  • 驗證結果: 展示 AI 如何在第二次對話中記得第一次的主題(例如 n8n 和 Dify)。
    Powershell:
# 確保 $conversation_id 變數仍有值

$uri = "http://localhost:5678/webhook-test/dify-test17"
$message2 = '請問這兩個工具各自的優勢是什麼?' 

# 第二次呼叫:傳入 message 和 $conversation_id
$json2 = '{"message":"' + $message2 + '", "conversation_id":"' + $conversation_id + '"}'
$result2 = Invoke-RestMethod -Uri $uri `
  -Method POST `
  -Headers @{ "Content-Type" = "application/json; charset=utf-8" } `
  -Body ([System.Text.Encoding]::UTF8.GetBytes($json2))

# 顯示第二次結果
Write-Host "--- 第二次對話結果 ---"
$result2 | ConvertTo-Json -Depth 4

https://ithelp.ithome.com.tw/upload/images/20251015/20169078xAqQBb1cxq.png

五、實戰除錯與經驗分享 (文章高價值部分)

實作過程中遇到的障礙和解決方案:

  1. Webhook 測試模式限制: (解決方案:每次測試前需點擊 Execute,或改用生產 URL。)
  2. HTTP Method 錯誤 (405): (解決方案:HTTP Request 節點必須使用 POST。)
  3. 模型服務錯誤 (503): (解決方案:模型超載,需在 Dify 中切換到 GPT-3.5-TurboGemini Flash 等負載較低的模型。)
  4. 模型名稱錯誤 (404): (解決方案:檢查 Dify 文件,確保使用 API 供應商承認的正確模型名稱,例如 gemini-2.5-flash。)

上一篇
Day 16 : 串接n8n與Dify
下一篇
Day 18 : Notion - AI 會議記錄自動結構化
系列文
從零開始 : 學習運用 n8n 與 Dify 的 AI 自動化實戰30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言