經過前面幾天的流程建置,今天迎來了第一步:讓 AI 擁有「記憶力」。如果 AI 只能一問一答,那只是個笨重的機器人。多輪對話的核心在於追蹤 conversation_id,讓 AI 記得我們前面說過什麼。
而過程並不順利,我遇到了 Webhook 監聽中斷、405 Method Not Allowed、Gemini 模型超載 (503),甚至還有模型名稱不匹配 (404) 等一連串的困境。
但最終還是順利完成了!
conversation_id? (一個獨特的 ID,用來標識整個對話過程。)conversation_id,Dify 自動生成一個新的 ID 並回傳。chat-messages 而非 completion-messages。Authorization 憑證。這部分是實作的重點,需要強調與「單輪對話」的差異。
節點的設置和前一篇大同小異:
延續上一篇的節點新增內容:
POST 方法,確保 Respond 設置為 Using 'Respond to Webhook' Node。conversation_id 的 JSON。Method 為 POST (解決 405 錯誤)。conversation_id:
{
// ...其他參數
"query": "{{$json['body']['message']}}",
"conversation_id": "{{$json['body']['conversation_id']}}" // 👈 重點!
}

conversation_id 帶出來,回傳給呼叫端。reply: ={{$json["answer"]}}
conversation_id: ={{$json["conversation_id"]}} // 👈 重點!
reply 和新的/舊的 conversation_id。conversation_id。conversation_id 儲存到 $conversation_id 變數中。$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"

$conversation_id。# 確保 $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

實作過程中遇到的障礙和解決方案:
Execute,或改用生產 URL。)HTTP Request 節點必須使用 POST。)GPT-3.5-Turbo 或 Gemini Flash 等負載較低的模型。)gemini-2.5-flash。)