Android圖片處理避坑指南:讓Bitmap不再拖垮你的APP
LangChain4j 和 Spring AI 是 Java 生態(tài)中實現(xiàn)大模型應(yīng)用開發(fā)的兩個最重要的框架,但二者的區(qū)別是啥?生產(chǎn)級別又該使用哪種框架?令很多人犯了難,所以本文就來淺聊一下,希望給大家在技術(shù)選型時有一個簡單的參考。
一、功能對比
LangChain4j 和 Spring AI 的功能是比較類似的,甚至兩者可以配合使用,例如使用 Spring AI 實現(xiàn) MCP 服務(wù)器端,再使用 LangChain4j 實現(xiàn) MCP 客戶端調(diào)用 Spring AI,二者可以無縫對接。那二者的區(qū)別是啥呢?
總體來說,LangChain4j 提供的功能更多,例如實現(xiàn) RAG 功能時,LangChain4j 提供了三種模式:
- 簡單模式
- 原生模式
- 高級模式
在后兩種模式實現(xiàn)時提供了:
- 文本加載器。
- 文檔解析器,可以實現(xiàn)多種文本格式的自動解析,例如PDF、DOC、TXT、MD、HTML 等格式的自動解析。
- 文本轉(zhuǎn)換器
- 文本分割器
每個細節(jié)和模塊的職責(zé)都定義的很清楚,所以實現(xiàn)復(fù)雜功能和生產(chǎn)級別業(yè)務(wù)時更推薦使用 LangChain4j。
二、使用和學(xué)習(xí)成本
LangChain4j 的使用和學(xué)習(xí)成本比 Spring AI 高很多,舉個例子,例如 Spring AI 要實現(xiàn)流式對話,只需要一行代碼就搞定了:
@RequestMapping(value = "/streamChat", produces = "text/event-stream")
public Flux<String> streamChat(@RequestParam(value = "msg") String msg) {
return chatModel.stream(msg);
}
而 LangChain4j 實現(xiàn)步驟如下:
- 添加 langchain4j-reactor 依賴。
- 設(shè)置配置文件,配置 streaming-chat-model api-key 和 model-name。
- 創(chuàng)建 AI Service 并返回 Flux 對象。
- 調(diào)用 Ai Service 才能實現(xiàn)流式輸出。
具體實現(xiàn)這里就不列舉了,大家可以看出來 LangChain4j 的實現(xiàn)復(fù)雜度了吧?
類似的場景還有很多,例如 Spring AI 實現(xiàn) MCP Client 只需要添加依賴,設(shè)置配置信息,然后一行 defaultTools 或 tools 設(shè)置就可以實現(xiàn)了,如下代碼:
ChatClient.builder(chatModel)
.defaultTools(tools.getToolCallbacks())
.build();
但 LangChain4j 的實現(xiàn)就非常復(fù)雜了,除了添加依賴之后,你還需要:
- 創(chuàng)建傳輸協(xié)議 McpTransport。
- 創(chuàng)建 MCP 客戶端 McpClient。
- 創(chuàng)建 Tools(提供者)對象 ToolProvider。
- 構(gòu)建 AiService。
- 執(zhí)行 MCP Server 調(diào)用。
具體實現(xiàn)代碼如下:
@RequestMapping("/chat")
public String chat(@RequestParam String question) {
// 1.創(chuàng)建傳輸協(xié)議
McpTransport transport = new HttpMcpTransport.Builder()
.sseUrl("http://localhost:8686/sse")
.logRequests(true) // if you want to see the traffic in the log
.logResponses(true)
.build();
// 2.創(chuàng)建 MCP 客戶端
McpClient mcpClient = new DefaultMcpClient.Builder()
.transport(transport)
.build();
// 3.創(chuàng)建 Tools(提供者)對象
ToolProvider toolProvider = McpToolProvider.builder()
.mcpClients(List.of(mcpClient))
.build();
// 4.構(gòu)建 AiService
ToolsAiService aiService = AiServices.builder(ToolsAiService.class)
.chatLanguageModel(chatModel)
.toolProvider(toolProvider)
.build();
// 5.調(diào)用 MCP Server
return aiService.chat(question);
}
小結(jié)
除了 LangChain4j 的使用復(fù)雜之外,LangChain4j 的文檔也不全,要么是沒有關(guān)鍵實現(xiàn)代碼案例、要么是干脆文檔寫的都是錯的,LangChain4j 的坑比較多,最后只能通過看最新的源碼才能解決和使用相關(guān)功能,所以 LangChain4j 學(xué)習(xí)和使用成本是非常高的。
三、Spring 生態(tài)支持性
Spring AI 是由 Spring 官方提供的,所以它對于整個 Spring 生態(tài)的支持是更好的,而且穩(wěn)定性更好;而 LangChain4j 除了支持 Spring 之外還支持 Java 原生寫法,以及 Quarkus 框架。
但 LangChain4j 整體對于 Spring 生態(tài)的支持就要差一些了,例如它里面的 ImageModel 都沒有提供 Spring Boot 自動裝配的實現(xiàn),還有一些大模型例如智普 AI 根本沒有提供 Spring Boot 的支持等。
小結(jié)
如果是簡單功能、開發(fā)周期又緊可以使用 Spring AI;如果功能復(fù)雜,且定制型要求比較多,可以使用功能和靈活度更高的 LangChain4j。但使用 LangChain4j 這就意味著你需要忍受 LangChain4j 不夠簡潔的寫法,以及學(xué)習(xí)和使用成本比較高的問題。