Java接入大模型的最佳实践
随着大模型技术逐渐进入企业生产环境,越来越多的 Java 工程师开始参与 AI 应用开发。从最初的 ChatBot,到 RAG 知识库、Agent、工作流编排,Java 技术栈已经能够覆盖绝大多数 AI 应用场景。
本文结合实际项目经验,介绍 Java 接入大模型的主流方案以及企业级最佳实践。
1. OpenAI协议已经成为事实标准
在早期接入 AI 模型时,每家模型厂商都有自己独立的接口规范:
- OpenAI API
- Claude API
- Gemini API
- 文心一言 API
- 通义千问 API
开发者需要针对不同厂商编写不同的适配代码,维护成本极高。
随着 OpenAI 的普及,OpenAI Chat Completion API 逐渐成为行业标准。
目前绝大多数模型服务商都兼容 OpenAI 协议:
- DeepSeek
- 阿里百炼
- 智谱AI
- 月之暗面(Kimi)
- SiliconFlow
- OpenRouter
- Azure OpenAI
典型请求格式:
POST /v1/chat/completions
{
"model":"deepseek-chat",
"messages":[
{
"role":"user",
"content":"你好"
}
]
}
因此对于 Java 工程师来说:
只要支持 OpenAI 协议,理论上就能快速切换底层模型。
这也是为什么目前企业项目都会优先选择支持 OpenAI 协议的 AI 框架。
2. LangChain4j架构解析
在 Java 生态中,目前最流行的大模型框架是 LangChain4j。
它类似于 Spring Data 对数据库的封装。
开发者无需关心底层 HTTP 调用,只需要关注业务逻辑。
核心架构如下:
Application
↓
AiService
↓
ChatModel
↓
LLM Provider
(OpenAI/DeepSeek/Qwen...)
ChatModel
ChatModel 是最基础的模型接口。
类似于同步调用。
ChatModel model = OpenAiChatModel.builder()
.apiKey(apiKey)
.baseUrl(baseUrl)
.modelName("deepseek-chat")
.build();
String answer = model.chat("介绍一下SpringBoot");
特点:
- 简单
- 阻塞调用
- 适合测试场景
StreamingChatModel
用于流式输出。
StreamingChatModel model =
OpenAiStreamingChatModel.builder()
.apiKey(apiKey)
.baseUrl(baseUrl)
.modelName("deepseek-chat")
.build();
可以实现:
- 打字机效果
- 长文本输出
- 实时推送
这是生产环境最常用的模式。
AiService
AiService 是 LangChain4j 最强大的能力。
开发者只需要定义接口:
interface Assistant {
String chat(String message);
}
创建代理:
Assistant assistant =
AiServices.create(
Assistant.class,
model
);
调用:
assistant.chat("你好");
类似于 Spring 的:
@Mapper
@Repository
@FeignClient
底层通过动态代理自动完成提示词拼装。
企业项目中大部分业务Agent都会基于 AiService 实现。
3. SpringBoot整合LangChain4j
Maven依赖:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
</dependency>
配置文件:
ai:
base-url: https://api.deepseek.com
api-key: xxx
model: deepseek-chat
配置Bean:
@Bean
public ChatModel chatModel() {
return OpenAiChatModel.builder()
.apiKey(apiKey)
.baseUrl(baseUrl)
.modelName(model)
.build();
}
业务调用:
@RestController
public class ChatController {
@Autowired
private Assistant assistant;
@GetMapping("/chat")
public String chat(String msg) {
return assistant.chat(msg);
}
}
至此已经完成最基础的大模型接入。
4. 流式输出实现
真实项目中几乎不会使用同步返回。
因为:
- 响应时间长
- 用户体验差
- 无法实时展示生成内容
通常采用 SSE + WebFlux。
SSE
服务端:
@GetMapping(value = "/chat",
produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> chat(String message) {
return aiService.chat(message);
}
前端:
const eventSource =
new EventSource("/chat?message=你好");
eventSource.onmessage = (event) => {
console.log(event.data);
};
浏览器会持续接收 Token。
WebFlux
企业项目推荐:
public Flux<String> chat(String message) {
return Flux.create(emitter -> {
assistant.chat(
message,
token -> emitter.next(token),
emitter::error,
emitter::complete
);
});
}
优势:
- 非阻塞
- 高并发
- 节省线程资源
特别适合 AI Chat 场景。
5. Tool Calling实现
Tool Calling 本质上是:
让大模型调用 Java 方法。
例如:
用户:
北京天气怎么样
模型返回:
{
"tool":"getWeather",
"city":"北京"
}
Java执行:
public class WeatherTool {
@Tool
public String getWeather(String city) {
return weatherService.query(city);
}
}
注册:
Assistant assistant =
AiServices.builder(Assistant.class)
.chatModel(model)
.tools(new WeatherTool())
.build();
执行流程:
User
↓
LLM
↓
Tool Calling
↓
Java Method
↓
Tool Result
↓
LLM
↓
Final Answer
企业项目常见 Tool:
- 商品查询
- 用户信息查询
- 订单查询
- 库存查询
- CRM系统
- OA系统
- ERP系统
本质上都是把已有业务能力开放给大模型。
6. 企业项目中的封装方式
很多团队刚开始接入 AI 时会这样写:
controller
-> service
-> model.chat()
项目稍微复杂后会迅速失控。
推荐分层架构:
Controller
↓
Agent
↓
Workflow
↓
Tools
↓
LLM
第一层:Agent
负责业务入口。
例如:
CustomerServiceAgent
ReviewReplyAgent
KnowledgeAgent
第二层:Workflow
负责流程编排。
例如商品评价回复:
评价内容
↓
情感分析
↓
意图识别
↓
知识库检索
↓
提示词组装
↓
生成回复
这一层可以使用:
- LangGraph4j
- Spring AI Workflow
- Flowable
- 自研工作流
第三层:Tool层
统一封装外部能力:
UserTool
OrderTool
ProductTool
SearchTool
KnowledgeTool
避免业务直接访问数据库。
第四层:模型网关
统一管理:
DeepSeek
GPT-4o
Qwen-Max
Claude
实现:
ChatModelFactory
能力包括:
- 模型路由
- 降级切换
- 重试
- 限流
- 监控
总结
对于 Java 工程师来说,大模型应用开发的核心技术路线已经逐渐清晰:
OpenAI协议
↓
LangChain4j
↓
SpringBoot
↓
SSE/WebFlux
↓
Tool Calling
↓
Workflow
↓
Agent
如果把企业 AI 应用看成一个系统工程,那么大模型只是其中的一环。真正决定项目质量的,往往是工作流编排、工具体系建设、知识库设计以及模型治理能力。