LangChain4j vs Spring AI——Java 工程师怎么选
LangChain4j vs Spring AI——Java 工程师怎么选
适读人群:Java 开发者,正在选型 AI 框架 | 阅读时长:约 14 分钟 | 核心价值:不是功能列表对比,是真实使用体验,有老张的明确推荐
有同事问我:"LangChain4j 和 Spring AI,你选哪个?"
我直接告诉他:"看项目规模,小项目用 LangChain4j,大项目用 Spring AI,但两个我都踩过坑,说都不好也不对。"
他说:"网上的对比文章基本上都是列功能清单,没有说清楚实际用起来的感受。"
这篇文章就是为了解决这个问题。我在生产环境里同时用过这两个框架,有些坑是在客户项目上踩的,教训很具体。
两个框架的基本定位
先把两个框架的出发点说清楚,这决定了它们的设计哲学不同。
LangChain4j:Python LangChain 的 Java 移植版,目标是让 Java 工程师也能用上 LangChain 的生态。设计风格更 Python,注重灵活性。
Spring AI:Spring 官方出品,目标是把 AI 能力无缝集成进 Spring 生态。设计风格更 Java/Spring,注重标准化和与 Spring Boot 的整合。
这个出发点的差异,决定了两者几乎所有的优缺点。
上手体验
LangChain4j 的上手感受
LangChain4j 的文档比较友好,入门教程很完整,每个功能点都有可运行的示例。
一个基础的 RAG 示例,五十行以内能跑起来:
// LangChain4j 风格
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.service.AiServices;
// 定义 AI 服务接口——这是 LangChain4j 的特色
interface CustomerSupportAgent {
@SystemMessage("你是一个客服助手,只根据提供的文档回答问题。")
String chat(String userMessage);
}
// 组装
OpenAiChatModel chatModel = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o-mini")
.build();
EmbeddingStore<TextSegment> embeddingStore = /* 初始化向量存储 */;
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
.maxResults(5)
.minScore(0.7)
.build();
CustomerSupportAgent agent = AiServices.builder(CustomerSupportAgent.class)
.chatLanguageModel(chatModel)
.contentRetriever(retriever)
.build();
String response = agent.chat("退款怎么申请?");LangChain4j 的 AiServices 接口定义方式特别好用,用注解声明 AI 能力,代码意图非常清晰。这个设计我觉得比 Spring AI 的 advisor 模式更直观。
Spring AI 的上手感受
Spring AI 的上手门槛稍高。如果你没有 Spring Boot 经验,配置项很多,starter 的依赖关系也比较复杂,文档里很多地方依赖读者有 Spring 背景知识。
但如果你本来就是 Spring 工程师,上手反而很自然——自动配置、@Bean 注册、application.yml 配置,全是熟悉的味道。
// Spring AI 风格
@Service
public class CustomerSupportService {
private final ChatClient chatClient;
public CustomerSupportService(
ChatClient.Builder builder,
VectorStore vectorStore) {
this.chatClient = builder
.defaultSystem("你是一个客服助手,只根据提供的文档回答问题。")
.build();
this.vectorStore = vectorStore;
}
private final VectorStore vectorStore;
public String chat(String userMessage) {
return chatClient.prompt()
.user(userMessage)
.advisors(new QuestionAnswerAdvisor(
vectorStore,
SearchRequest.builder().topK(5).build()
))
.call()
.content();
}
}文档质量——这是真正拉开差距的地方
坦白说,这是我认为两者差距最大的维度。
LangChain4j 的文档:内容相对全面,示例代码可运行,API 变更有 migration guide,社区问答质量不错。遇到问题基本上搜一下能找到。
Spring AI 的文档:参差不齐。核心功能(ChatClient、VectorStore)文档还可以,但一旦涉及到细节,比如特定向量数据库的配置参数、ETL pipeline 的高级用法,文档要么缺失要么过时。
我在做 Spring AI pgvector 集成的时候,文档里某个配置项的描述和实际行为不一致,我去看源码才搞清楚。这种情况在 Spring AI 里出现过好几次。
M 版本期间这个问题更严重,文档跟不上 API 变化速度,经常是文档里写的和实际可用的代码不匹配。1.0 正式版好一些,但还是有坑。
工具调用(Function Calling)的实现对比
这个功能两个框架都支持,但实现体验差异很大。
LangChain4j 的工具调用
// LangChain4j:用注解定义工具,非常直观
public class WeatherTools {
@Tool("查询指定城市的当前天气")
public WeatherInfo getCurrentWeather(
@P("城市名称,如:北京、上海") String city) {
// 实际调用天气 API
return weatherApiClient.getWeather(city);
}
@Tool("查询指定城市未来7天的天气预报")
public List<ForecastInfo> getWeatherForecast(
@P("城市名称") String city,
@P("天数,1-7") int days) {
return weatherApiClient.getForecast(city, days);
}
}
// 注入工具
ChatAssistant assistant = AiServices.builder(ChatAssistant.class)
.chatLanguageModel(chatModel)
.tools(new WeatherTools())
.build();Spring AI 的工具调用
// Spring AI 1.0:需要定义 Function Bean
@Configuration
public class WeatherFunctionConfig {
@Bean
@Description("查询指定城市的当前天气")
public Function<WeatherRequest, WeatherInfo> getCurrentWeather() {
return request -> weatherApiClient.getWeather(request.city());
}
@Bean
@Description("查询天气预报")
public Function<ForecastRequest, List<ForecastInfo>> getWeatherForecast() {
return request -> weatherApiClient.getForecast(request.city(), request.days());
}
}
// 使用时指定要用的 function
chatClient.prompt()
.user(userMessage)
.functions("getCurrentWeather", "getWeatherForecast")
.call()
.content();LangChain4j 的注解方式明显更简洁。Spring AI 的方式是 Spring 风格(Bean 定义),如果你习惯 Spring,不会觉得别扭,但代码量确实多一点。
对话记忆的实现
LangChain4j:内置多种 ChatMemory 实现,配置简单:
ChatMemory memory = MessageWindowChatMemory.withMaxMessages(20);
ChatAssistant assistant = AiServices.builder(ChatAssistant.class)
.chatLanguageModel(chatModel)
.chatMemory(memory) // 一行配置
.build();Spring AI:需要通过 advisor 实现,配置稍繁琐:
// Spring AI 的对话记忆
chatClient.prompt()
.user(userMessage)
.advisors(new MessageChatMemoryAdvisor(
new InMemoryChatMemory(),
conversationId,
20 // max messages
))
.call()
.content();Spring AI 的 advisor 模式更灵活,可以组合多个 advisor,但在简单场景下写起来比 LangChain4j 啰嗦。
与 Spring 生态的整合
这是 Spring AI 碾压 LangChain4j 的地方。
Spring AI 天然支持:
- Spring Security:基于注解的 AI 接口权限控制
- Spring Data:向量存储的 Repository 模式
- Spring Actuator:AI 调用的健康检查和指标暴露
- Spring Retry:AI 调用的自动重试(网络抖动时很有用)
- Spring Cache:Embedding 结果缓存
- Spring Batch:大批量文档处理
如果你的项目已经是 Spring 生态,用 Spring AI 能直接复用这些能力,不需要额外集成。
LangChain4j 也能和 Spring 一起用(有专门的 langchain4j-spring-boot-starter),但整合深度不如 Spring AI,很多 Spring 特性需要自己手动接入。
支持的模型和向量数据库
| LangChain4j | Spring AI | |
|---|---|---|
| OpenAI | ✓ | ✓ |
| Azure OpenAI | ✓ | ✓ |
| Anthropic | ✓ | ✓ |
| Google Gemini | ✓ | ✓ |
| Ollama | ✓ | ✓ |
| 国产模型(通义、文心等) | 社区维护,覆盖不全 | 官方支持较少,需第三方适配 |
| pgvector | ✓ | ✓ |
| Qdrant | ✓ | ✓ |
| Weaviate | ✓ | ✓ |
| Chroma | ✓ | ✓ |
| Milvus | ✓ | ✓ |
两者在主流模型和向量数据库的支持上差距不大。国产模型支持两边都不好,但这是整个 Java AI 生态的问题,不是单个框架的问题。
我的明确推荐
不废话,直接给结论:
选 LangChain4j 的场景:
- 项目不是纯 Spring 项目,或者是新项目没有历史包袱
- 团队对 Spring 的依赖注入和 Bean 管理不熟悉
- 功能相对简单(聊天、基础 RAG、工具调用),不需要复杂的 Spring 生态整合
- 需要快速原型开发,文档清晰度很重要
选 Spring AI 的场景:
- 项目是 Spring Boot 项目,需要深度整合 Spring Security、Spring Batch 等
- 团队是成熟的 Spring 开发团队,对 Spring 生态熟悉
- 需要企业级特性:健康检查、指标监控、统一的异常处理
- 项目规模大,需要框架提供更多标准化约束
我自己的项目选择:
- 单独的 AI 微服务(不和现有系统深度耦合)→ LangChain4j
- 在现有 Spring Boot 系统里加 AI 能力 → Spring AI
两个都是好框架,不存在"哪个完全更好"。关键是看你的具体情况。
