今天把環境架起來:用 Docker 跑 n8n、接上 Ollama,順便認識 AI Agent 節點底下的幾個插槽。
版本說明:本系列固定使用 n8n 2.38.7。n8n 的 AI 節點改版非常頻繁,同一個選項在不同版本可能換名字或換位置,看到畫面不一樣的話,先確認版本。
做 Multi-Agent,呼叫模型本身不難,最花時間的是搞清楚資料到底怎麼在 Agent 之間流動。n8n 每個節點吃進什麼、吐出什麼,在 Execution 裡都看得到,除錯「主管到底派給誰」的時候非常好用。
代價是彈性不如直接寫程式。什麼情況該換成 LangGraph 這類框架,留到 Day 30 討論。
先建 volume,再啟動容器:
docker volume create n8n_data
docker run -d --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n -e GENERIC_TIMEZONE="Asia/Taipei" -e TZ="Asia/Taipei" docker.n8n.io/n8nio/n8n:2.38.7
在我的筆電上大約 18 秒就能用了,打開 http://localhost:5678 建立管理員帳號即可。
這個指令裡有幾個參數說明一下:
-v n8n_data:/home/node/.n8n:workflow、憑證、執行紀錄都存在這裡。沒掛 volume 的話,容器刪掉資料就一起消失。GENERIC_TIMEZONE:n8n 排程用的時區。沒設的話,Schedule Trigger 會以 UTC 計算。n8n:2.38.7:刻意不用 latest。AI 節點改動快,版本寫死才能確保畫面跟文章一致。小提醒:如果你以前玩過 n8n,電腦裡可能已經有名為 n8n_data 的 volume,上面的指令會直接沿用裡面的資料。我自己的電腦就遇到這個狀況,想從乾淨的環境開始,換一個 volume 名稱就好。
n8n 會用一把金鑰加密所有憑證。之後搬機器或還原備份,少了這把金鑰,憑證就得全部重建。容器第一次啟動後可以這樣查看:
docker exec n8n cat /home/node/.n8n/config
輸出是一段 JSON,裡面的 encryptionKey 請存進密碼管理器,不要進版控,也不要出現在截圖裡。
這是最多人卡關的地方。n8n 跑在容器裡,Ollama 跑在你的電腦上,而容器內的 localhost 指的是容器自己,不是你的電腦。
在 n8n 新增 Ollama 憑證時,Base URL 要填:
http://host.docker.internal:11434

host.docker.internal 是 Docker Desktop 提供的特殊主機名稱,會指向宿主機。我在 Windows 上實測,就算 Ollama 只監聽 127.0.0.1,容器用這個網址也連得到。在 Linux 上直接用 Docker Engine 的話,要在 docker run 加上 --add-host=host.docker.internal:host-gateway(這個情況我沒有實測)。
在畫布新增 AI Agent 節點,節點下方會出現幾個連接點,n8n 稱為子節點(sub-node)。

Chat Model 是唯一必填的插槽,決定這個 Agent 用哪個模型。每個 Agent 可以接不同的模型,這一點在 Day 26 談成本時會很重要。
Memory 決定 Agent 記不記得之前的對話。不接的話,每次執行都是全新開始。測試階段用 Simple Memory 就夠了,Session ID 怎麼設是個學問,Day 05 會專門討論。
Tool 可以接很多個。接的是 Data table Tool 這類資料存取工具,就是昨天說的型態 B;接的是 AI Agent Tool,或指向另一個 workflow 的 Call n8n Workflow Tool,就是型態 C。工具參數欄位可以寫 {{ $fromAI('order_id', '訂單編號', 'string') }},意思是這個參數交給模型填,n8n 會把它轉成工具的參數定義交給模型。
還有一個預設看不到的插槽:把 AI Agent 的「Require Specific Output Format」打開,才會多出 Output Parser。接上 Structured Output Parser 並給一份 JSON Schema,Agent 就會輸出結構化 JSON。Agent 之間要交換資料全靠它,Day 14 會詳細說。
Ollama Chat Model 節點的 Options 裡,有 Context Length 和 Enable Thinking 兩個選項。一開始我以為「預設就是 2048、預設就開 Thinking」,實際翻了節點原始碼並測試後,發現要分兩種情況看。
n8n 只會把你「有加進 Options」的選項送給 Ollama。沒加的話,就用 Ollama 伺服器自己的預設值。
我用一份約 2,100 tokens 的 system prompt(主管的 prompt 加上 FAQ),問本機的 qwen3.5:0.8b「prompt 最開頭提到的公司名稱是什麼」:
| Context Length 的設定 | 模型實際讀到的 tokens | 回答 |
|---|---|---|
| 沒加這個選項,用 Ollama 預設(我這台是 4096) | 2,146 | 好豆選物(對) |
| 有加選項,保留欄位帶出的 2048 | 1,026 | 出貨(錯) |
| 有加選項,改成 16384 | 2,146 | 好豆選物(對) |
中間那一列是最危險的情況。prompt 超過長度時,Ollama 會直接截掉前面的內容,而 system prompt 的規則正好都寫在最前面。模型照樣回答,n8n 也不會出現任何錯誤訊息。
所以要嘛不加這個選項,並確認你的 prompt 加上對話紀錄不會超過 Ollama 的預設長度;要嘛加了就調到夠大。這個系列的主管 prompt 加上 FAQ、信件內文、工具回傳的資料,很容易超過 4096,所以我一律加上 Context Length 並設為 16384。
Enable Thinking 的情況類似。沒加這個選項時,n8n 不會送 think 參數,gemma4:cloud 實測不會進入思考模式。加了選項、保留預設的開啟狀態,差異就很明顯:
| 設定 | 耗時 | 輸出 tokens | 分類結果 |
|---|---|---|---|
| Enable Thinking 關閉 | 1.6 秒 | 208 | order_status |
| Enable Thinking 開啟 | 7.0 秒 | 1,137 | order_status |
答案一樣,時間多了 4 倍。本機小模型更誇張:在沒有顯卡的筆電上,qwen3.5:0.8b 關閉 Thinking 回答一題約 16 秒,開啟之後超過 5 分鐘都沒回應,請求直接逾時。分類、查單這類任務用不到長篇推理,所以本系列的 Chat Model 一律關閉 Thinking,Sampling Temperature 設 0.2。
用 5 分鐘做一個最小的 Agent:
你是好豆選物的客服助理。請用繁體中文、禮貌但簡潔地回答。
不確定的事情,直接說「這部分我需要確認」,不要猜。
我這邊的測試結果:
| 對話 | 問題 | 回答重點 |
|---|---|---|
| 同一個對話 | 你們的豆子怎麼保存? | 避光、陰涼、密封,不建議放冰箱 |
| 同一個對話 | 那要放多久? | 全豆建議烘焙後 1 個月內、咖啡粉 2 週內 |
| 新開一個對話 | 那要放多久? | 請提供產品名稱 |
同一個對話裡,它知道「那」指的是豆子;換一個新對話就不知道了,代表 Memory 正常運作。
另外有個小插曲:它說「不建議放冰箱」,但好豆選物的 FAQ 寫的是「開封後放陰涼處或冷藏」。模型用它自己的常識回答,剛好跟公司規定打架。之後需要一位專門查 FAQ 的知識專員,這就是很直接的理由。
環境重點:Docker 記得掛 volume、設時區、寫死版本、備份加密金鑰;容器連本機 Ollama 用 host.docker.internal。比較容易踩到的是 Ollama 節點的 Options,有加才會送出,而 Context Length 欄位帶出的 2048 會讓長 prompt 被無聲截斷。
明天把訂單資料放進 Data table,做出第一版會讀信、會查單、會回信的單兵 Agent。