描述問題/錯誤/問題
描述:
使用 N8N Web Chat 介面 時,AI 生成的回應幾乎在每一行都呈現為項目符號,即使使用者的請求只是要強調回應的重要部分。
此行為似乎特定於 Web Chat 介面,在 n8n 環境中以本機方式與相同工作流程互動時不會發生 N8N Canvas 環境 。在 Canvas 聊天視窗中,回應格式正確,不包含過多或不必要的項目符號。
環境:
- N8N 版本: 1.123.64
- 部署: Azure 雲環境
工作流程組態:
- Chat Trigger
- AI Agent
- OpenAI Chat Model
- Simple Memory
- Think Model
其他資訊:
AI Agent 的 系統訊息 明確指示模型 不使用項目符號。儘管進行了此設定,通過 Web Chat 介面顯示的回應仍然在幾乎每一行上顯示項目符號。
錯誤訊息是什麼(如果有的話)?
請分享您的工作流程
(選取您畫布上的節點並使用鍵盤快捷鍵 CMD+C/CTRL+C 和 CMD+V/CTRL+V 來複製和貼上工作流程。)
分享最後一個節點傳回的輸出
您的 n8n 設定資訊
- n8n 版本:
- 資料庫(預設值: SQLite):
- n8n EXECUTIONS_PROCESS 設定(預設值: own, main):
- 執行 n8n 的方式(Docker、npm、n8n cloud、桌面應用程式):
- 作業系統:
嗨 @rajeevdas25 歡迎!
網頁聊天會將代理回應呈現為 Markdown,所以模型以 - 或 * 開頭的任何行都會變成項目符號,而編輯器聊天面板會以不同方式設定這些清單項目的樣式並看起來整潔。開啟上次執行並讀取 AI Agent 的原始 output 字串:如果行包含 - 或 * ,模型仍在發出清單標記,系統訊息無法阻止它。
在工作流程中刪除它們,而不是要求模型執行此操作。將聊天觸發回應模式設定為「當最後一個節點完成時」(在「串流回應」上,代理執行後沒有任何動作),然後在 AI Agent 後面新增一個程式碼節點:
const text = $json.output
.replace(/^[ \t]*[-*+][ \t]+/gm, '')
.replace(/^[ \t]*\d+\.[ \t]+/gm, '');
return [{ json: { output: text } }];
如果你在自己的頁面上嵌入 @n8n/chat 並想保留 Markdown,請使用在小工具樣式表後載入的 CSS 移除標記:
.chat-message-markdown ul,
.chat-message-markdown ol {
list-style: none;
padding-left: 0;
}
Hi @Anshul_Namdev,
感謝你的回覆。
為了提供更多的清晰度和背景資訊:輸出本身是格式良好的 Markdown,在 N8N 應用程式中顯示正確。但是,當它在 N8N 聊天介面中呈現時,格式完全遺失——這包括標題、標頭和項目符號,而不僅僅是額外項目符號的問題。
我們在之前的部署中(兩個月前設置)沒有遇到過這種行為。升級到版本 1.123.64 後,才開始發生此問題。
感謝你的幫助。
此致
敬禮
Hi @rajeevdas25,
這聽起來更像是 Web Chat Markdown 渲染問題,而不是 AI Agent 提示詞問題。
首先要檢查的是工作流在到達 Web Chat UI 之前返回的原始值。如果 Canvas 輸出包含普通段落,但嵌入的 Web Chat 在幾乎每一行都顯示項目符號,那麼格式化可能是在聊天小部件中的 Markdown 解析/渲染期間引入的,而不是由模型本身引入的。
幾個有用的測試:
-
臨時禁用 Chat Trigger/Web Chat 配置中的串流(如果已啟用),並比較結果。
-
在返回回應之前立即添加一個「編輯欄位」或「代碼」節點,並檢查確切的輸出字符串。
-
檢查原始輸出中的每一行是否以 -、*、• 或其他列表標記開頭。
-
返回一個受控的測試回應,例如:
First paragraph.\n\nSecond paragraph.\n\nImportant: this is highlighted without a list.
-
使用最少的鏈測試同一工作流:
Chat Trigger → AI Agent → Chat Model
臨時斷開 Simple Memory 和 Think Model,以排除其中之一修改或重新格式化最終消息的可能性。
-
嘗試在 Web Chat 回應之前返回已移除 Markdown 的純文字。
例如,作為診斷代碼節點:
const value =
$json.output ??
$json.text ??
$json.response ??
'';
const cleaned = String(value)
.replace(/^\s*[-*•]\s+/gm, '')
.replace(/\n{3,}/g, '\n\n');
return [{ json: { output: cleaned } }];
嗨 @rajeevdas25
開啟串流後,聊天小工具會在回覆區塊到達時逐塊解析,所以分隔標題、清單和段落的空行會在區塊之間遺失,整個訊息就會崩潰成平文本。畫布面板會一次接收完整的字串,這就是為什麼相同的輸出在那裡能正確呈現。
改為一次完整訊息而不是串流傳送回覆。將「聊天觸發回應模式」設定為「使用回應節點」,然後在 AI Agent 後面新增一個「聊天」節點,並將「操作」設定為「傳送訊息」,訊息設定為代理輸出:
{{ $json.output }}
文本會作為單一字串傳出,所以 Markdown 會被整體解析,標題和清單得以保留。「聊天」節點需要「聊天觸發模式」處於託管狀態,當模式為「內嵌」時不支援。