Dify 自架實戰 · 架構補充

自訂工具 / MCP:把你的系統接進 agent,還要驗得穿

Chat、搜尋、RAG 都碰不到你「會變動、能做事」的系統。自訂工具(以及 MCP)才是接你活系統的那座橋。這頁把整條路畫清楚:怎麼用一份 OpenAPI 說明書把系統包成工具、怎麼用三方獨立證據驗證 agent 真的呼叫了它、接真系統會撞到的幾道牆(SSRF、token 過期、弱模型幻覺),以及對「錯不得的資料」為什麼要改用 Chatflow 忠實呈現。全部照一次真實自架實戰整理。

🗺️ agent 的能力邊界:自訂工具是接活系統的橋

flowchart LR
  A(("🤖 Agent")):::a
  A --> C["💬 Chat
模型舊知識"]:::dim A --> S["🔎 搜尋
公開網路"]:::dim A --> R["📄 RAG
靜態文件"]:::dim A ==>|"接活系統"| T["🔌 自訂工具 / MCP"]:::hot T ==> SYS[("🗄️ 你的活系統
ERP · 訂單 · 庫存")]:::sys T -.->|"當使用方"| D1["你的 agent 用別人的系統"]:::d T -.->|"當提供方"| D2["開放給別的 agent 用"]:::d classDef a fill:#dbeafe,stroke:#2563eb,color:#17335e classDef dim fill:#eef2f7,stroke:#94a3b8,color:#475569 classDef hot fill:#fee2e2,stroke:#dc2626,color:#7f1d1d classDef sys fill:#dcfce7,stroke:#16a34a,color:#14532d classDef d fill:#fef3c7,stroke:#d97706,color:#78350f

Chat 只有模型舊知識、搜尋只到公開網路、RAG 只到靜態文件——「這張訂單出貨了嗎」這種即時、會變的答案,只活在你的系統裡。自訂工具 / MCP 就是接它的橋。而 MCP 有兩端:你當使用方(去用別人的),或當提供方(開放給別的 agent 用)。

📋 包成工具 = 給一份 OpenAPI 說明書(只講四件事)

說明書要講的對應為什麼 agent 需要
① 系統在哪servers.url要知道去哪打
② 有什麼動作GET /order這是「查訂單」這個能力
③ 要給什麼參數id(訂單編號)要知道該帶什麼
④ 這動作叫什麼、幹嘛descriptionagent 靠這句判斷「該不該用這工具」——寫含糊就會自己亂編

🔎 鐵律:別信答案,要三方獨立驗證

證據來源看什麼
你系統的存取紀錄請求「真的進來了嗎」——來源 IP 對不對
Dify 資料庫 message_agent_thoughts工具「真的被呼叫了嗎」、observation 拿回什麼
agent 的答案有沒有出現「它編不出來的真資料」(如一組追蹤碼 SF9931002)
為什麼要三方對:模型可能沒呼叫工具就亂編(查 DB 一眼看穿)、也可能有呼叫、有拿到真資料,卻在總結時改寫——後者表面全對,只有把「工具原始回傳」跟「最終答案」擺一起才抓得到。三邊時間、內容都對上,才算真的通。

🚧 接真系統會撞到的牆(以及怎麼解)

現象解法
SSRF 擋內網Dify 預設封鎖對私有 IP 的呼叫;你的 ERP 幾乎都在內網 → 一定撞放行信任的內網位址,或走「有效憑證的公開網域」(HTTPS 443)
非 443 的 HTTPS內部服務跑在 8443 之類的埠,代理只放行 443 的 CONNECT → 連不上用公開網域(443)最順,順帶避開自簽憑證問題
token 會過期真系統要先登入拿 token,貼死一個 → 約一小時後斷找系統的「長效整合金鑰」(不過期),或做一層自動換 token 的代理
工具成功 ≠ 答案正確工具有呼叫、有拿到真資料,弱模型總結時仍改寫——最陰險錯不得的資料改用 Chatflow 忠實呈現(見下)
模型略過工具有些模型收到工具卻不呼叫,直接空答或憑舊知識答換 function-calling 可靠的模型,或改 Chatflow 寫死流程

⚖️ 錯不得的資料:Agent vs Chatflow

flowchart LR
  Q(["🙋 同一個問題"]):::q
  Q --> AT["🔧 工具查到真資料"]:::proc
  Q --> CT["🔧 工具查到真資料
(參數寫死)"]:::proc subgraph AG["Agent:模型自由總結"] AT --> AL["🧠 模型總結"]:::warn --> A1["⚠️ 真資料被改寫
看似正常,其實假的"]:::bad end subgraph CF["Chatflow:忠實呈現"] CT --> CD["📤 直接回覆原文"]:::good --> C1["✅ 一字不差
零改寫 · 零幻覺"]:::good end classDef q fill:#dbeafe,stroke:#2563eb,color:#17335e classDef proc fill:#eef2f7,stroke:#64748b,color:#334155 classDef warn fill:#fff3e0,stroke:#a85a00,color:#7c2d12 classDef bad fill:#fdecea,stroke:#c0392b,color:#7f1d1d classDef good fill:#dcfce7,stroke:#16a34a,color:#14532d
命脈:Chatflow 忠實版只要三個節點 開始 → 工具(參數寫死) → 直接回覆,而且「直接回覆」一定要指向「工具的輸出」,不是模型節點——這是最容易接錯的地方。要排版就再加一個模板轉換節點純格式化,一個字都不改。這樣中間完全沒有模型總結的空間,得到的就是你系統裡的真資料,原封不動。

🧭 什麼時候用哪個

Agent(模型自由呼叫+總結)Chatflow(寫死流程+忠實呈現)
特性彈性大、能對話一字不差、流程固定
風險總結那步可能改寫/幻覺零改寫
適合探索式、容錯、要來回對話財務 / 醫療 / 法遵等「錯不得」的資料
一句話心法:把系統包成工具不難,難在別被漂亮的答案騙了。接得到是第一步,更要驗得穿——用系統紀錄、平台資料庫、還有「模型編不出來的真資料」去確認它是真查還是唬爛。對錯不得的資料,寧可用最笨、最忠實的 Chatflow,也不要一個會改字的聰明 agent。

📚 回課綱總表 →