超實用!Dify調用Java的三種實現方式!
在一些復雜的業務中,我們可能需要使用 Dify 調用外部程序(如 Java 程序),因為這樣才能滿足業務的特殊需求。
例如,當我們使用 Dify 實現“AI 簡歷自動篩選器”的時候,我們首先會使用 AI 篩選出符合招聘要求的簡歷,然后再將簡歷存放到公司的“人才庫”系統中,完成后續流程的招聘需要(預約面試、面試評價、發送 Offer 等操作),這個時候就需要讓 Dify 調用 Java 程序了。
那么問題來了,使用 Dify 調用 Java 程序的實現方式有哪些呢?今天我們就來盤點一下。
1.解決方案概述
Dify 調用 Java 程序的解決方案有以下幾種:
- 通過“HTTP 請求”的方式調用 Java 程序。
- 通過“自定義工具”的方式調用 Java 程序。
- 通過 MCP 的方式調用 Java 程序。
接下來,我們分別來看。
2.HTTP請求
HTTP 請求允許通過 HTTP 協議發送服務器請求,適用于獲取外部數據、webhook、生成圖片、下載文件等情景。它讓你能夠向指定的網絡地址發送定制化的 HTTP 請求,實現與各種外部服務的互聯互通。
它的使用也很簡單,我們只需要在 Dify 的工作流中添加“HTTP 請求”節點即可,如下圖所示:
圖片
它的參數配置包含以下這些:
圖片
當然,我們也可以利用它來發送文件給 Java 程序,并且可以自定義失敗重試配置和錯誤異常配置。
對于被調用方 Java 來說,只需要提供一個 HTTP 接口即可,當然生成環境要考慮添加 APIKey 以保證調用的安全性,這里提供一個簡單的 Java 服務接口:
import com.ai.difyhttpserver.entity.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/it")
public class InterviewController {
@RequestMapping("/add")
public boolean add(User user) {
// 執行數據庫添加操作
System.out.println(user.toString());
return true;
}
}
3.自定義工具
自定義工具的調用方式,需要先把 Java 程序發不成 Dify 中的自定義工具,才能正常調用,如下圖所示:
圖片
配置的 Schema 需要滿足 OpenAPI 協議,配置如下:
{
"openapi": "3.1.0",
"info": {
"title": "html to image tools",
"description": "Generate image files based on HTML code",
"version": "v1.0.0"
},
"servers": [
{
"url": "http://192.168.3.94:8080"
}
],
"paths": {
"/html2img/gen": {
"get": {
"description": "Generate image files based on HTML code",
"operationId": "html2image",
"parameters": [
{
"name": "html",
"in": "query",
"description": "HTML code",
"required": true,
"schema": {
"type": "string"
}
}
],
"deprecated": false
}
}
},
"components": {
"schemas": {
}
}
}
同樣,Java 服務器端只需要提供一個可以使用 HTTP 協議訪問的接口即可。
4.MCP通訊
這種通訊方式實現最麻煩,有點大炮打蚊子的感覺,但也可以實現 Dify 調用 Java 程序,此時要求先試用 Java 程序,例如 Spring AI 實現一個 MCP 服務器端,然后再使用 Dify 添加支持 MCP 調用的 Agent 策略,來調用 Java 的 MCP 服務,如下圖所示:
安裝 Agent 策略(支持 MCP 工具)如下圖所示:
圖片
MCP SSE 選裝,非必須,可以為后續 Agent 提供 MCP 工具列表,方便 LLM 正確理解和調用工具。
配置MCP服務地址
Dify 只支持 HTTP 協議的 MCP 服務調用,它的配置格式如下:
{
"server_name1": {
"transport": "sse",
"url": "http://127.0.0.1:8000/sse",
"headers": {},
"timeout": 50,
"sse_read_timeout": 50
},
"server_name2": {
"transport": "sse",
"url": "http://127.0.0.1:8001/sse"
},
"server_name3": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8002/mcp",
"headers": {},
"timeout": 50
},
"server_name4": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8003/mcp"
}
}
支持配置多個 MCP 服務,或者是以下 JSON 格式也支持:
{
"mcpServers": {
"server_name1": {
"transport": "sse",
"url": "http://127.0.0.1:8000/sse",
"headers": {},
"timeout": 50,
"sse_read_timeout": 50
},
"server_name2": {
"transport": "sse",
"url": "http://127.0.0.1:8001/sse"
},
"server_name3": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8002/mcp",
"headers": {},
"timeout": 50
},
"server_name4": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8003/mcp"
}
}
}
配置Agent
Agent 需要配置的項目比較多,首先是 Agent 策略:
圖片
然后是 LLM,選擇合適的大模型即可,之后配置 MCP 工具和 HTTP 地址,如下圖所示:
圖片
之后配置指令和查詢問題:
圖片
測試MCP調用
我們創建的是一個 ChatFlow,執行效果如下:
圖片
執行符合預期。
Spring AI 實現 MCP 服務器端參考我之前發的文章,這里就不再贅述。
小結
Dify 調用 Java 程序的實現方式有 3 種:HTTP 請求、自定義工具、MCP 通訊方式。其中最簡單、最靈活的實現方式為 HTTP 請求方式;自定義工具適合偏工具性質(而非業務性質)的調用;MCP 適合一次性注入多個工具方法給 Dify 使用的場景。