1. Java AI 框架选型:LangChain4j vs Spring AI 深度解析
作为一名在Java领域深耕多年的开发者,我深刻理解在面对大模型浪潮时,Java开发者面临的困境和选择。两年前,我们可能会简单地认为"用HTTP调OpenAI的API就够了",但随着AI应用复杂度的提升,这种简单粗暴的方式很快就会遇到瓶颈。
1.1 为什么Java开发者需要专业AI框架
当你的项目需要:
- 对接多个模型供应商(OpenAI、通义千问、DeepSeek、本地Ollama)
- 实现RAG(检索增强生成)将企业知识库与大模型结合
- 使用Function Calling让模型调用业务系统
- 构建Agent让模型自主规划、分步执行任务
手写HTTP调用的代码会迅速膨胀成难以维护的"意大利面条式代码"。而无代码平台虽然降低了门槛,但在复杂业务场景中缺乏灵活性。专业AI框架的价值,就是在这些复杂度面前提供一个经过验证的架构。
1.2 主流Java AI框架全景对比
我们先来看三大主流Java AI框架的核心对比:
| 维度 | Spring AI | LangChain4j | Semantic Kernel Java |
|---|---|---|---|
| 出品方 | Broadcom/Spring官方团队 | 社区驱动 | 微软 |
| Spring Boot兼容性 | 3.5.x(原生集成) | 3.x(通过langchain4j-spring) | 无原生集成 |
| 模型提供商 | OpenAI、Anthropic、Google等 | 20+家包括国内主流模型 | OpenAI、Azure OpenAI等 |
| Vector Store支持 | 14种 | 主流数据库支持 | 需自行集成 |
| RAG支持 | ✅(Advisors模式) | ✅✅(最完整) | ✅(基础支持) |
| Agent能力 | 中等 | 较强 | Java版实现不完整 |
| 声明式API | ❌ | ✅(AI Services注解) | ❌ |
| 国内模型支持 | 好 | 最好 | 弱 |
| 学习曲线 | 低(Spring用户) | 中 | 高 |
| 社区活跃度 | 高 | 高 | 中低 |
| 版本状态 | 正式发布 | 正式发布 | RC1(候选版本) |
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Spring AI深度解析
2.1 架构设计哲学
Spring AI延续了Spring生态的设计哲学:"约定优于配置,抽象优于实现"。它定义了一套统一的ChatModel、EmbeddingModel、VectorStore接口,各个模型提供商通过starter提供实现。开发者只需在application.yml里切换配置,代码一行不改。
2.2 核心特性与代码实现
2.2.1 基础对话实现
java复制@RestController
class MyController {
private final ChatClient chatClient;
public MyController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder
.defaultSystem("你是一个专业的Java技术顾问")
.build();
}
@GetMapping("/ai")
String generation(String userInput) {
return this.chatClient.prompt()
.user(userInput)
.call()
.content();
}
}
2.2.2 多模型切换
java复制@Configuration
public class ChatClientConfig {
@Bean
public ChatClient openAiChatClient(OpenAiChatModel chatModel) {
return ChatClient.create(chatModel);
}
@Bean
public ChatClient anthropicChatClient(AnthropicChatModel chatModel) {
return ChatClient.create(chatModel);
}
}
2.2.3 RAG实现
java复制@Configuration
public class RagConfig {
@Bean
public VectorStore vectorStore(JdbcTemplate jdbcTemplate,
EmbeddingModel embeddingModel) {
return new PgVectorStore(jdbcTemplate, embeddingModel);
}
}
@RestController
public class RagController {
private final ChatClient chatClient;
public RagController(ChatClient.Builder builder, VectorStore vectorStore) {
this.chatClient = builder
.defaultAdvisors(
QuestionAnswerAdvisor.builder(vectorStore).build()
)
.build();
}
@GetMapping("/rag")
public String rag(@RequestParam String question) {
return chatClient.prompt()
.user(question)
.call()
.content();
}
}
2.3 Spring AI的优势与局限
优势:
- 与Spring生态无缝集成
- VectorStore抽象层设计优秀
- 结构化输出支持
- MCP支持(1.1.x新增)
局限:
Agent编排能力仍弱于LangChain4j,Advisors机制本质上是拦截器模式,而非Agent模式。
3. LangChain4j深度解析
3.1 架构设计哲学
LangChain4j的设计理念是覆盖AI应用开发的全生命周期,提供标准化API,支持20+主流大模型提供商和嵌入存储。
3.2 核心特性与代码实现
3.2.1 声明式AI Service
java复制public interface TechAssistant {
@SystemMessage("""
你是一个资深Java技术顾问。
回答要简洁、准确,给出代码示例时用Java语言。
如果不确定,明确告知用户。
""")
String ask(@UserMessage String question);
@SystemMessage("根据以下参考资料回答问题")
String ragAsk(
@UserMessage String question,
@V("context") String context
);
}
使用方式:
java复制ChatLanguageModel model = OpenAiChatModel.builder()
.apiKey("sk-xxx")
.modelName("gpt-4o")
.temperature(0.3)
.build();
TechAssistant assistant = AiServices.create(TechAssistant.class, model);
String answer = assistant.ask("Java 21 的虚拟线程适合什么场景?");
3.2.2 完整RAG流程
java复制// 文档加载
Document document = FileSystemDocumentLoader.loadDocument("docs/architecture.pdf");
// 文档分割
DocumentSplitter splitter = DocumentSplitters.recursive(300, 30);
List<TextSegment> segments = splitter.split(document);
// 向量化+存储
EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
.apiKey("sk-xxx")
.modelName("text-embedding-3-small")
.build();
EmbeddingStore<TextSegment> store = PgVectorEmbeddingStore.builder()
.host("localhost")
.port(5432)
.database("ai_db")
.table("knowledge")
.dimension(1536)
.build();
EmbeddingStoreIngestor.builder()
.embeddingModel(embeddingModel)
.embeddingStore(store)
.build()
.ingest(segments);
// 检索+生成
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(store)
.embeddingModel(embeddingModel)
.maxResults(5)
.minScore(0.75)
.build();
TechAssistant assistant = AiServices.builder(TechAssistant.class)
.chatLanguageModel(model)
.contentRetriever(retriever)
.build();
String answer = assistant.ask("Spring Boot 3.x 的 GraalVM 原生镜像支持怎么样?");
3.2.3 Tool工具调用
java复制public class DatabaseTool {
@Tool("查询用户订单信息,当用户询问订单状态、物流信息时调用")
public String queryOrder(
@P("用户ID") String userId,
@P("订单号,可选") String orderId
) {
// 实现查询逻辑
}
}
// 使用
TechAssistant assistant = AiServices.builder(TechAssistant.class)
.chatLanguageModel(model)
.tools(new DatabaseTool())
.build();
String answer = assistant.ask("我订单20240315001到哪了?");
3.3 LangChain4j的优势与局限
优势:
- 声明式API设计优雅
- 国内模型支持最全面
- Agent和Tool系统成熟度高
- 社区活跃度高
局限:
- Spring集成需要额外工作
- 学习曲线较高
4. 生产环境选型建议
4.1 首选:LangChain4j
适用场景: 绝大多数Java AI应用开发
理由:
- 声明式API面向未来
- 功能完整度最高
- 国内模型支持最好
- 社区活跃度高
4.2 次选:Spring AI
适用场景: 已有Spring Boot项目,需要快速、轻量接入大模型能力
理由:
- Spring生态无缝集成
- VectorStore抽象层优秀
- 核心短板已补齐
- 但多步Agent编排仍是瓶颈
4.3 不推荐:Semantic Kernel Java
原因:
- Java版本是C#版本的二等公民
- API设计不符合Java习惯
- 国内模型支持几乎为零
- 社区生态差距大
5. 最佳实践技术栈
对于新启动的Java AI项目,推荐技术栈:
xml复制<!-- Spring Boot基础 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.6</version>
</parent>
<!-- LangChain4j BOM -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-bom</artifactId>
<version>1.12.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- LangChain4j Spring Boot集成 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
</dependency>
<!-- 模型提供商(按需选择) -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
</dependency>
<!-- 国内:通义千问/DashScope -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
</dependency>
<!-- 向量数据库 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-pgvector</artifactId>
</dependency>
<!-- 文档解析 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-document-parser-apache-pdfbox</artifactId>
</dependency>
配置示例:
yaml复制langchain4j:
open-ai:
chat-model:
api-key: ${OPENAI_API_KEY}
model-name: gpt-4o
temperature: 0.3
max-tokens: 2048
embedding-model:
api-key: ${OPENAI_API_KEY}
model-name: text-embedding-3-small
6. 实战经验与避坑指南
6.1 性能优化技巧
- 批量处理文档:当需要处理大量文档时,使用批量接口而非单条处理
java复制// 不推荐:单条处理
for (Document doc : documents) {
embeddingStore.add(embeddingModel.embed(doc).content());
}
// 推荐:批量处理
List<TextSegment> segments = // 所有文档分割后的片段
List<Embedding> embeddings = embeddingModel.embedAll(segments).content();
embeddingStore.addAll(embeddings, segments);
- 合理设置分块大小:根据模型和内容类型调整分块策略
java复制// 技术文档适合较大分块
DocumentSplitter techDocSplitter = DocumentSplitters.recursive(1000, 200);
// 对话记录适合较小分块
DocumentSplitter chatLogSplitter = DocumentSplitters.recursive(300, 50);
6.2 常见问题排查
-
模型响应慢:
- 检查是否使用了合适的模型尺寸(如gpt-4比gpt-4-turbo慢)
- 确认网络延迟,特别是使用海外模型时
- 考虑实现本地缓存高频问题答案
-
RAG效果不佳:
- 检查分块策略是否合适
- 调整相似度阈值(通常0.7-0.8较佳)
- 考虑添加元数据过滤(如文档类型、更新时间等)
-
工具调用失败:
- 确认工具方法参数命名清晰
- 检查工具描述是否准确表达功能
- 验证模型是否有足够上下文理解何时调用工具
6.3 安全注意事项
-
敏感信息处理:
- 避免将敏感数据直接传入模型
- 实现数据脱敏层处理用户输入和模型输出
-
权限控制:
- 为不同工具设置不同权限级别
- 实现调用审计日志
-
速率限制:
- 为模型API调用实现限流
- 考虑失败重试和退避机制
7. 未来展望与升级建议
随着Java AI生态的快速发展,建议关注以下方向:
- Spring AI 2.0:预计将强化Agent能力,缩小与LangChain4j的差距
- 本地模型支持:随着Llama.cpp等本地推理引擎成熟,考虑混合部署方案
- 多模态扩展:准备支持图像、音频等多模态处理能力
- 性能监控:完善AI特定指标的监控体系(如token使用、响应时间分布等)
在实际项目中,建议从简单场景入手,逐步引入复杂功能。初期可以先用Spring AI快速验证想法,当业务复杂度提升到需要多步Agent时,再平滑迁移到LangChain4j。保持架构的灵活性,因为Java AI框架的格局仍在快速演变中。
