
最近写了三个 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 包尺寸对比
实际构建后的体积差异很直观:
| Feat AI | 2.9 MB | |
| LangChain4j | 11 MB | |
| Spring AI | 31 MB |
核心差异一览
| 代码行数 | |||
| JDK 要求 | |||
| Spring 依赖 | |||
| 多轮对话 | |||
| 流式输出 |
流式输出对比
流式输出是大模型交互的重要特性,能让用户实时看到生成内容。三个框架的实现方式差异明显:
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),代码相对冗长。
流式实现对比
| API 风格 | |||
| 代码量 | |||
| 学习成本 | |||
| 错误处理 | |||
| JDK 兼容 |
怎么选?
一点感想
写这三个示例的过程中,发现一个有趣的现象:三个框架的 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:若无备注将拒绝好友申请)有任何问题,欢迎在评论区留言交流。
夜雨聆风