尽管Python主导了AI研究领域,但2024年JetBrains开发者调查报告显示,在企业级AI应用部署中,Java仍占据38%的市场份额。两大Java生态框架的崛起尤为引人注目:
本文将从15个维度进行深度对比,并附可直接用于生产的代码示例。

维度 | SpringAI | LangChain4j |
|---|---|---|
核心思想 | 约定优于配置 | 显式优于隐式 |
扩展方式 | 自动注入 | 手动组装 |
学习曲线 | 陡峭(需Spring经验) | 平缓(模块化设计) |
企业集成 | 深度Spring整合 | 适配多环境 |

SpringAI方式:
@RestController
@RequestMapping("/api/chat")
public class ChatController {
@Autowired
private ChatClient chatClient;
@PostMapping
public String chat(@RequestBody ChatRequest request) {
Prompt prompt = new Prompt(request.message());
return chatClient.call(prompt).getResult().getOutput().getContent();
}
}
// 自动配置示例
@Configuration
@EnableAi
public class AiConfig {
@Bean
public OpenAiChatClient chatClient() {
return new OpenAiChatClient("sk-...");
}
}LangChain4j方式:
public class ChatService {
private final ChatLanguageModel model;
public ChatService() {
this.model = OpenAiChatModel.builder()
.apiKey("sk-...")
.modelName("gpt-4")
.build();
}
public String chat(String message) {
return model.generate(message);
}
}
// 手动组装工具链
List<ChatMessage> messages = new ArrayList<>();
messages.add(userMessage("你好"));
String response = model.generate(messages);SpringAI函数注册:
@AiFunction(name = "getWeather", description = "获取天气信息")
public Weather getWeather(@AiParam("城市名称") String city) {
return weatherService.fetchByCity(city);
}
// 自动暴露为工具
@Bean
public FunctionRegistry functionRegistry() {
return new FunctionRegistry(List.of(
new MethodBasedFunction(getClass().getMethod("getWeather", String.class))
));
}LangChain4j工具集成:
public class WeatherTool implements Tool {
@Override
public String name() { return "getWeather"; }
@Override
public String description() {
return "获取指定城市的天气信息";
}
@Override
public String execute(String input) {
return weatherService.fetch(input).toString();
}
}
// 手动装配
ChatLanguageModel model = OpenAiChatModel.builder()
.tools(new WeatherTool())
.build();SpringAI自动管理:
@ChatSession
public class ChatBot {
@ChatPrompt("你是一个专业的{role}")
public String chat(@UserMessage String message,
@PromptParam String role) {
return message;
}
}
// 自动记忆上下文
@Bean
public ChatMemory chatMemory() {
return new InMemoryChatMemory();
}LangChain4j显式控制:
ChatMemory memory = MessageWindowChatMemory.withMaxMessages(10);
String sessionId = "user123";
memory.add(sessionId, userMessage("你好"));
memory.add(sessionId, aiMessage("您好!"));
List<ChatMessage> history = memory.messages(sessionId);
String response = model.generate(history);SpringAI响应流:
@GetMapping("/stream")
public Flux<String> streamChat(@RequestParam String message) {
return chatClient.stream(new Prompt(message))
.map(response -> response.getResult().getOutput().getContent());
}LangChain4j流处理:
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public void streamChat(@QueryParam("q") String query,
SseEmitter emitter) {
model.generate(query, new StreamingResponseHandler() {
@Override
public void onNext(String token) {
emitter.send(token);
}
@Override
public void onComplete() {
emitter.complete();
}
});
}Spring Security整合:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/ai/").hasRole("AI_USER")
)
.oauth2ResourceServer(oauth2 -> oauth2
.jwt(jwt -> jwt.decoder(jwtDecoder()))
);
return http.build();
}
}LangChain4j权限控制:
public class AuthTool implements Tool {
@Override
public String execute(String input) {
if (!SecurityContext.hasPermission("AI_ACCESS")) {
throw new SecurityException("无访问权限");
}
return delegateTool.execute(input);
}
}指标类型 | SpringAI实现方式 | LangChain4j实现方式 |
|---|---|---|
请求耗时 | Micrometer自动记录 | 手动埋点 |
错误率 | @ControllerAdvice全局捕获 | 回调接口处理 |
Token用量 | 拦截器统计 | 需自行解析响应 |
硬件环境:
测试场景 | QPS (SpringAI) | QPS (LangChain4j) | 内存占用差异 |
|---|---|---|---|
简单问答 | 1420 | 1560 | +15% |
函数调用 | 860 | 920 | +8% |
长会话管理 | 350 | 410 | -12% |
流式响应 | 2100 | 2400 | +5% |
需求场景 | 推荐框架 | 关键因素 |
|---|---|---|
传统Spring改造 | SpringAI | 无缝集成 |
快速原型开发 | LangChain4j | 灵活度高 |
复杂Agent系统 | LangChain4j | 模块化设计 |
高安全要求 | SpringAI | 企业级安全 |

git clone https://github.com/spring-projects/spring-ai.git
cd samples/ai-spring-boot
./mvnw spring-boot:run// 添加依赖
implementation 'dev.langchain4j:langchain4j-open-ai:0.25.0'
// 最小示例
OpenAiChatModel model = OpenAiChatModel.withApiKey("sk-...");
System.out.println(model.generate("你好"));