乐于分享
好东西不私藏

Java AI 框架三强对比

Java AI 框架三强对比

最近写了三个 AI 框架的对比示例,发现同样是调用大模型,代码风格差异还挺大的。


先上代码

Feat AI:链式 Lambda

ChatModel chatModel = FeatAI.chatModel(opts ->    opts.model("Qwen3-235B-A22B")        .system("你是一个乐于助人的助手。"));chatModel.chat("你好,请介绍一下 Feat AI 的特点。");

特点:Lambda 配置 + CompletableFuture,代码密度高。


Spring AI:Spring 风格

OpenAiApi openAiApi = new OpenAiApi("https://ai.gitee.com/", apiKey);OpenAiChatOptions options = OpenAiChatOptions.builder()    .withModel("Qwen3-235B-A22B")    .build();ChatModel chatModel = new OpenAiChatModel(openAiApi, options);Prompt prompt = new Prompt("你好,请介绍一下 Spring AI 的特点。");ChatResponse response = chatModel.call(prompt);

特点:显式组件组装,职责分离清晰。


LangChain4j:Builder 模式

ChatLanguageModel model = OpenAiChatModel.builder()    .apiKey(apiKey)    .modelName("Qwen3-235B-A22B")    .baseUrl("https://ai.gitee.com/v1/")    .build();String response = model.generate("你好,请介绍一下 LangChain4j 的特点。");

特点:Builder 配置灵活,同步 API 简单直接。


Fat-Jar 包尺寸对比

实际构建后的体积差异很直观:

框架
Fat-Jar 大小
核心依赖
Feat AI2.9 MB
feat-core + fastjson
LangChain4j11 MB
核心库 + OpenAI 适配器
Spring AI31 MB
Spring Framework + Reactor + Jackson

核心差异一览

维度
Feat AI
Spring AI
LangChain4j
代码行数
最少
中等
较少
JDK 要求
JDK 8+
JDK 17+
JDK 8+
Spring 依赖
无
必需
无
多轮对话
自动保持上下文
手动管理
手动管理消息列表
流式输出
回调监听
Reactor Flux
泛型回调

流式输出对比

流式输出是大模型交互的重要特性,能让用户实时看到生成内容。三个框架的实现方式差异明显:

Feat AI:Consumer 回调

chatModel.chatStream("请写一首关于春天的诗", chunk -> {    System.out.print(chunk.getContent());  // 实时输出每个片段});

特点:简单直接的回调式 API,符合 Java 8 习惯,无需额外学习成本。


Spring AI:Flux 响应式流

Flux<String> stream = chatModel.stream(prompt)    .map(response -> response.getResult().getOutput().getContent());stream.subscribe(System.out::print);  // 响应式订阅

特点:基于 Reactor 的响应式编程,适合已使用 WebFlux 的项目,但增加了学习曲线。


LangChain4j:StreamingResponseHandler

model.generate("请写一首关于春天的诗", new StreamingResponseHandler<>() {    @Override    public void onNext(String token) {        System.out.print(token);  // 处理每个 token    }    @Override    public void onComplete(Response<AiMessage> response) {        System.out.println("\n生成完成");    }    @Override    public void onError(Throwable error) {        error.printStackTrace();    }});

特点:接口回调模式,提供完整的生命周期钩子(onNext/onComplete/onError),代码相对冗长。


流式实现对比

维度
Feat AI
Spring AI
LangChain4j
API 风格
Consumer 函数式
Reactor Flux
接口回调
代码量
最少(1 行)
中等(2-3 行)
较多(需实现接口)
学习成本
低(Java 8 标准)
高(需了解响应式)
中(框架特定接口)
错误处理
异常抛出
响应式错误流
专用 onError 回调
JDK 兼容
JDK 8+
JDK 17+
JDK 8+

怎么选?

场景
推荐
追求极简、JDK 8 项目
Feat AI
已用 Spring Boot + JDK 17+
Spring AI
Spring 项目但 JDK 8/11
Feat AI(Spring AI 要求 JDK 17+)
需要完整 AI 工具链
LangChain4j
Serverless / 边缘计算
Feat AI(包小启动快)

一点感想

写这三个示例的过程中,发现一个有趣的现象:三个框架的 API 设计都遵循"配置与执行分离",但实现路径截然不同。

Feat AI 选择 Lambda 链式,追求的是代码密度——用最少的字符表达最多的意图。这种风格在快速原型和脚本化场景中特别顺手。

Spring AI 坚持显式组装,体现的是设计显式化——每个组件的职责和依赖都清晰可见。这在大型团队协作中更有优势,代码的可维护性更高。

LangChain4j 采用 Builder 模式,平衡了灵活性和可读性——配置可以分步骤进行,也便于后续扩展。

这三种风格没有高下之分,只是不同的取舍。Feat AI 牺牲了部分显式性换取简洁;Spring AI 牺牲了部分简洁换取可维护性;LangChain4j 在两者之间找了个中间点。

这让我想起一个老话题:框架设计是价值观的外化。选择哪个框架,其实是在选择你认同的编程哲学。

但不管选哪个,它们都指向同一个方向——AI 调用应该像调用本地方法一样简单。这是 Java 社区在 AI 时代的共识,也是开发者最大的福音。


关于 Feat

一个轻量级的 Java Web 框架,专注于让开发更简单。Feat AI 模块提供 Chat、Agent、Embedding、MCP 等完整能力。


欢迎关注我们的公众号,获取更多关于 Feat 框架的最新动态和技术分享!
扫描微信二维码备注:feat 可加入 smartboot 社群。(PS:若无备注将拒绝好友申请)

有任何问题,欢迎在评论区留言交流。

相关学习资料