AI 代理生成 SQL 但在第二個查詢後停止執行

大家好,

我正在嘗試使用 AI 代理節點、Ollama 和 PostgreSQL 構建一個工作流。
前兩個問題(需要生成 SQL 查詢)進行得很順利。但是到了第三個問題(需要從數據庫獲取數據),Ollama 正確生成了 SQL 查詢,但卻停止了,沒有在 getData 節點上執行它。

請分享你的工作流

關於你的 n8n 設置的信息

  • n8n 版本: 2.21.5
  • 數據庫(默認:SQLite): SQLite
  • n8n EXECUTIONS_PROCESS 設置(默認:own, main):
  • 運行 n8n 的方式: Docker
  • 操作系統: Linux

@flipflip,你可以試試這個嗎?

嗨 @flipflip

我認為原因是你在 Ollama 節點上的 numPredict: 1024 設置。這將模型的回應限制在每回合 1024 個 token。經過 2 次查詢後,你的對話歷史紀錄(工具調用、結果、表格結構)會增長,模型在完成工具調用生成之前就會耗盡輸出 token。

試試以下兩件事:

  1. 在 Ollama 節點選項中將 numPredict 增加到至少 4096。

  2. 將你的 Postgres Chat Memory 上的 contextWindowLength 從 20 減少到 5-10 左右。每條訊息都包含完整的工具調用結果,所以 20 條訊息會快速耗盡你的 16384 內容視窗。

將這些與 @kjooleng 的系統提示詞更改結合使用,應該就能通過第 3 次查詢。

如果這有幫助的話請告訴我們!

@flipflip

看看這是否符合你的需求:
GitLab MCP Server.json (5,0,KB)

有兩件事值得檢查:首先,查看 AI Agent 節點設定並檢查「Max Iterations」值 - Ollama 模型有時會在處理 2 個工具呼叫後耗盡迭代預算,這可能解釋了代理程式產生了 SQL 但沒有執行 GetData 呼叫。把它增加到 15-20 並測試。

其次,檢查 PostgreSQL 節點如何作為工具連接。如果它使用「Execute Query」操作,且 SQL 透過像 {{ $fromAI('query') }} 這樣的表達式傳遞,請確保 fromAI 中的欄位名稱與代理程式輸出的內容完全相符。此處不相符會導致工具執行但不返回任何內容,而 Ollama 會默默停止而不是重試。

最可能的罪魁禍首是 qwen3:14b 在產生 SQL 後無法可靠地輸出正確的工具呼叫。AI Agent 節點等待 LLM 返回結構化的工具呼叫 — 如果模型只是以純文字方式寫出 SQL 然後停止,代理絕不會觸發 getData 節點。它看不到工具呼叫,認為任務已完成,並返回空白回應。

以下是一些可以嘗試的方法,按優先順序排列:

  1. 暫時啟用中間步驟。在 Agent 節點中,打開「返回中間步驟」選項。重新執行相同的第三個問題。你將看到代理確切做了什麼 — 它是否呼叫了 getData 並使用了什麼查詢,還是在產生 SQL 文字後就停止了。這立即告訴你問題在哪裡。
  2. 檢查你的系統提示。如果只是一個佔位符「My prompt」,代理不知道它必須對每個資料請求使用 getData 工具。加入明確的說明:
    「每當使用者提出需要從資料庫中取得資料的問題時,你必須使用適當的 SQL 查詢呼叫 ‘getData’ 工具。不要直接輸出 SQL;始終使用工具。」
  3. 嘗試支援函式呼叫的模型。qwen3:14b 在 Ollama 中可能沒有原生的函式呼叫支援,所以代理會回退到易於出錯的文字基礎解析器。改用 llama3.1:8b-instruct 或 mistral:7b-instruct(兩者已確認可透過 Ollama 支援工具呼叫)並測試第三個查詢是否執行。如果執行成功,問題就在於模型。
  4. 增加 numPredict 或移除限制。你的 numPredict 是 1024 個符號。如果 SQL 查詢加上工具呼叫語法超過該限制,模型可能會在發出信號工具呼叫的最終 } 之前被截斷。將 numPredict 設定為 -1(無限制)或提高到 4096。
  5. 檢查 Postgres 記憶體消耗。雖然不太可能在恰好第 2 個查詢時造成硬停止,但較長的記憶體視窗會使上下文變得混亂並迷惑模型。暫時將 contextWindowLength 設定為 5 並進行測試。如果第三個查詢之後能正常執行,你可以將其調回。

從 #1 和 #3 開始 — 那些是最快排除的。如果你在中間步驟中看到代理絕不呼叫工具,那就是模型輸出的問題。告訴我們你的發現。

大家好,

感謝 @kjooleng 和 @houda_ben 的建議,我成功解決了這個問題。到目前為止,儘管已經測試了 10 個需要混合使用記憶體和資料庫查詢的問題,我還是沒有再遇到這個問題。當然,我大幅豐富了基礎提示詞,以整合我的限制和需求。

感謝大家的幫助。