最近在深度体验和使用 Spring AI 和 LangChain4j,从开始的满怀期待五五开,但最后极具痛苦的使用 LangChain4j,让我真正体验到了正规军和草台班子的区别。

Spring AI VS LangChain4j

  • Spring AI:使用简单、写法优雅、但功能提供的较少、成熟度稍高;
  • LangChain4j:作为移植大模型著名框架 LangChain 功能稍多、灵活度高、使用复杂、满是 BUG。还有根本找不到关键内容的官方文档,该有的重要内容是一点都不介绍啊,使用和学习成本很高。

1.SDK 问题折腾到半夜

举个例子,我昨天下午到晚上 11 点半都在研究 LangChain4j 将连续对话保存到 MySQL,首先官方并没有提供文档和代码示例,其次网上的资源很少,我按照经验和摸索终于写了一版实现,但从晚上 8 点调试到 11 点半,各种查文档、看源码都没有完全调好,第二次对话时总是莫名其妙报错,且数据库存储的数据量远超于实际执行次数。

然后就是各种尝试、各种折腾,把流式输出换成全量输出;保存数据之前先删除再添加等等。

最终您猜怎么着?原来这个问题竟然和模型 SDK 有关,我把模型从阿里百炼换成 OpenAI 之后,全部问题竟然解决了,害得我折腾到半夜,竟然是源码 BUG。

而且就这还有 BUG,在后期连续对话时,按照 SDK 会把之前聊天的角色从 AI 改完 User,虽然不影响执行结果,但本质上还是有 BUG,这肯定也是源码问题,不纠结了,反正最新的版本也是 beta 版,就先这样吧。

2.错误的官方文档

还有在对接阿里百炼平台时,官方给到文档是这么写的:

其实官方文档中间是少一个“chat-model”,你如果按照他的配置方法,根本没办法完成大模型的自动注入,网上资料千篇一律全是手动创建,但显然不够优雅,无维护性可言。

最后看了源码才发现,如果想自动装配,需要配置一个“chat-model”,源码如下:

官方文档也是无敌了。

3.蹩脚的用法

LangChain4j 的使用也是比较麻烦,在 Spring AI 中使用 ChatModel 就可以操作大模型了,但 LangChain4j 要写成 ChatLanguageModel。

这多不算啥,关于流式输出更有意思,Spring AI 中调用 call 方法是全量输出,调用 stream 就是流式输出,实现相当优雅和简单。

但你猜 LangChain4j 要怎么用,首先要在配置文件中添加 streaming-chat-model 并且配置 api-key 和 model-name 等信息,并且不能使用 ChatLanguageModel 来进行流式输出,还要添加 langchain4j-reactor 依赖,并且使用新对象 StreamingChatLanguageModel 才能操作,真是麻了。

小结

世界是一个巨大的草台班子,所有的优秀背后都是居大的付出和努力。AI 相关技术才刚刚起步,还有很大的发展空间,我们需要宽容一些、给他一点时间。把一切交给时间,只管默默努力和时间一起增值就好。

本文已收录到我的技术小站 www.javacn.site,其中包含的内容有:Spring AI、大模型应用开发各种技术、MCP、Function Call、RAG、向量数据库、Prompt、多模态、向量数据库、嵌入模型等内容。

被LangChain4j坑惨了!的更多相关文章

  1. 实现数组类(C++ 拷贝构造函数、拷贝函数)要判断赋值左右对象不相等,坑惨了

    #include <iostream> using namespace std; class ArrayIndexOutOfBoundsException{ // 异常类 public: ...

  2. 把我坑惨的一个MySQL双引号!

    来源:For DBA www.fordba.com/mysql-double-quotation-marks-accident.html 一.前言 最近经常碰到开发误删除误更新数据,这不,他们又给我找 ...

  3. 一个MySQL双引号把我坑惨了!

    一.前言 最近经常碰到开发误删除误更新数据,这不,他们又给我找了个麻烦,我们来看下整个过程,把我坑得够惨. 二.过程 由于开发需要在生产环节中修复数据,需要执行120条SQL语句,需要将数据进行更新, ...

  4. hdu 1203(01背包)被初始化坑惨了

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. 我这三年被kafka坑惨了

    前言 我的上家公司是做餐饮系统的,每天中午和晚上用餐高峰期,系统的并发量不容小觑.为了保险起见,公司规定各部门都要在吃饭的时间轮流值班,防止出现线上问题时能够及时处理. 我当时在后厨显示系统团队,该系 ...

  6. 被Unity5坑惨了

    各种不明所以的crash,导致crash率从0.5%瞬间暴涨到10%. Unity5还是非常不稳定,慎入慎入...

  7. 把我坑惨的一个update语句

    最近好几次有开发同学在问我,比如下图: 问题归纳起来就是:在MySQL里面update一条记录,语法都正确的,但记录并没有被更新... 刚遇到这个问题的时候,我拿到这条语句直接在测试库里面执行了一把, ...

  8. C语言指针的那些坑

    那些年把我们坑惨的指针 一.引言 当我们使用c语言的时候,不可避免的就得用到指针,然后对于刚刚接触C语言的猿兄们,可能会有点不适应,特别是刚刚从python等离硬件很远的语言转过来的. 下面我为大家总 ...

  9. mybatis关于Criteria的一点小坑。。。

    目录 在用Criteria时,相关代码如下: final RolePermissionExample example = new RolePermissionExample(); example.cr ...

  10. 听说,99% 的 Go 程序员都被 defer 坑过

    原文链接: 听说,99% 的 Go 程序员都被 defer 坑过 先声明:我被坑过. 之前写 Go 专栏时,写过一篇文章:Go 专栏|错误处理:defer,panic 和 recover.有小伙伴留言 ...

随机推荐

  1. oracle11gRAC升级到19C

    升级oracle11g集群到19.3 前述环境检查: [root@qhdb1 ~]# crsctl status res -t ------------------------------------ ...

  2. 魔乐开发者社区正式上线,AI开发者快来撩!

    近日,由天翼云与华为联合打造的魔乐(Modelers)开发者社区,在天翼云中国行·贵州站活动现场上线发布.依托全场景开源模型资源.易用的模型开发套件,以及强大的共建共享生态系统等优势,社区将使能开发者 ...

  3. Linux部署Python项目

    项目部署 项目部署对于操作通常是由运维人员来进行统一管理装配的,但是对于一个开发人员来讲,基础的项目部署还是要会的. 这里我主要讲解python的项目是如何部署的,至于项目哪里来的,这就要看观众如何抉 ...

  4. InfluxDB修改数据存储位置(二进制安装版)

    InfluxDB修改数据存储位置(二进制安装版) 在二进制安装方式下,修改InfluxDB的数据存储位置通常涉及以下几个步骤.以下步骤以InfluxDB 2.x版本为例进行说明,因为InfluxDB ...

  5. 分合之道:最小生成树的 Kruskal 与 Prim 算法

    最小生成树问题 想象你是一位城市规划师,面前摊开一张地图,标记着散落的村庄.你的任务是用最经济的成本,在村庄间铺设道路,让所有村庄互通.这个问题看似简单,却隐藏着一个经典的数学命题:如何在一张&quo ...

  6. 《Vue2 框架第二课:组件结构与模板语法详解》

    写在开头:Vue.js 是一个流行的前端框架,广泛应用于构建用户界面和单页应用(SPA).然而,需要注意的是,Vue2 已经于 2023 年底 正式停止维护.这意味着官方团队将不再为 Vue2 提供功 ...

  7. JavaScript 滚动条滚动到底部才触发按钮是否可用

    应用代码片段: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  8. CentOS安装nginx服务器及配置反向代理

    以下是在CentOS上安装nginx服务器并配置反向代理的步骤: 更新系统软件包: sudo yum update 安装nginx: sudo yum install nginx 启动nginx服务: ...

  9. C/C++跨平台开发1-windows和linux中的类库

    基本概念: 什么是库: 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 静态库:在程序链接的时候使用,链接器会将程序中使 ...

  10. 基于ThreeJs的大屏3D地图(二)——气泡图、渐变柱体与热力图

    前提 上一篇文章中我们完成了地图区块模型的渲染,在此基础之上本篇来讲解气泡图.3D柱形图以及3D热力图的实现方式. 首先,为了更好的关注点分离及与地图渲染模块的解耦,我们可以把所有类型的可视化元素抽象 ...