被LangChain4j坑慘了!
最近在深度體驗(yàn)和使用 Spring AI 和 LangChain4j,從開(kāi)始的滿懷期待五五開(kāi),但最后極具痛苦的使用 LangChain4j,讓我真正體驗(yàn)到了正規(guī)軍和草臺(tái)班子的區(qū)別。
Spring AI VS LangChain4j
- Spring AI:使用簡(jiǎn)單、寫(xiě)法優(yōu)雅、但功能提供的較少、成熟度稍高;
- LangChain4j:作為移植大模型著名框架 LangChain 功能稍多、靈活度高、使用復(fù)雜、滿是 BUG。還有根本找不到關(guān)鍵內(nèi)容的官方文檔,該有的重要內(nèi)容是一點(diǎn)都不介紹啊,使用和學(xué)習(xí)成本很高。
1.SDK 問(wèn)題折騰到半夜
舉個(gè)例子,我昨天下午到晚上 11 點(diǎn)半都在研究 LangChain4j 將連續(xù)對(duì)話保存到 MySQL,首先官方并沒(méi)有提供文檔和代碼示例,其次網(wǎng)上的資源很少,我按照經(jīng)驗(yàn)和摸索終于寫(xiě)了一版實(shí)現(xiàn),但從晚上 8 點(diǎn)調(diào)試到 11 點(diǎn)半,各種查文檔、看源碼都沒(méi)有完全調(diào)好,第二次對(duì)話時(shí)總是莫名其妙報(bào)錯(cuò),且數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)量遠(yuǎn)超于實(shí)際執(zhí)行次數(shù)。
然后就是各種嘗試、各種折騰,把流式輸出換成全量輸出;保存數(shù)據(jù)之前先刪除再添加等等。
最終您猜怎么著?原來(lái)這個(gè)問(wèn)題竟然和模型 SDK 有關(guān),我把模型從阿里百煉換成 OpenAI 之后,全部問(wèn)題竟然解決了,害得我折騰到半夜,竟然是源碼 BUG。
而且就這還有 BUG,在后期連續(xù)對(duì)話時(shí),按照 SDK 會(huì)把之前聊天的角色從 AI 改完 User,雖然不影響執(zhí)行結(jié)果,但本質(zhì)上還是有 BUG,這肯定也是源碼問(wèn)題,不糾結(jié)了,反正最新的版本也是 beta 版,就先這樣吧。
2.錯(cuò)誤的官方文檔
還有在對(duì)接阿里百煉平臺(tái)時(shí),官方給到文檔是這么寫(xiě)的:
圖片
其實(shí)官方文檔中間是少一個(gè)“chat-model”,你如果按照他的配置方法,根本沒(méi)辦法完成大模型的自動(dòng)注入,網(wǎng)上資料千篇一律全是手動(dòng)創(chuàng)建,但顯然不夠優(yōu)雅,無(wú)維護(hù)性可言。
最后看了源碼才發(fā)現(xiàn),如果想自動(dòng)裝配,需要配置一個(gè)“chat-model”,源碼如下:
圖片
官方文檔也是無(wú)敵了。
3.蹩腳的用法
LangChain4j 的使用也是比較麻煩,在 Spring AI 中使用 ChatModel 就可以操作大模型了,但 LangChain4j 要寫(xiě)成 ChatLanguageModel。
這多不算啥,關(guān)于流式輸出更有意思,Spring AI 中調(diào)用 call 方法是全量輸出,調(diào)用 stream 就是流式輸出,實(shí)現(xiàn)相當(dāng)優(yōu)雅和簡(jiǎn)單。
但你猜 LangChain4j 要怎么用,首先要在配置文件中添加 streaming-chat-model 并且配置 api-key 和 model-name 等信息,并且不能使用 ChatLanguageModel 來(lái)進(jìn)行流式輸出,還要添加 langchain4j-reactor 依賴,并且使用新對(duì)象 StreamingChatLanguageModel 才能操作,真是麻了。
小結(jié)
世界是一個(gè)巨大的草臺(tái)班子,所有的優(yōu)秀背后都是居大的付出和努力。AI 相關(guān)技術(shù)才剛剛起步,還有很大的發(fā)展空間,我們需要寬容一些、給他一點(diǎn)時(shí)間。把一切交給時(shí)間,只管默默努力和時(shí)間一起增值就好。