定位说明:本文不是简单的 ChatGPT API 调用教程,而是一套可直接落地到企业生产环境的 Java AI 应用完整实践方案,涵盖架构设计、工程实现与生产级优化思路。
一、为什么选择这套技术栈
在企业环境中构建 AI 应用,核心诉求从来不是“能不能跑”,而是:
- 是否 长期可维护
- 是否 易于扩展模型与能力
- 是否 满足安全、性能与成本要求
🛠 技术栈选择
| 组件 |
推荐选择 |
说明 |
| Java |
JDK 21 LTS |
虚拟线程(Loom)、长期支持 |
| Spring Boot |
3.x |
新一代 Java 企业框架 |
| LangChain4j |
最新稳定版 |
Java 生态 AI 应用框架 |
| 构建工具 |
Maven |
依赖与版本治理 |
| 大模型 |
GPT-4o-mini |
成本与性能平衡,可替换国产模型 |
| 存储 |
Redis |
对话记忆与缓存 |
核心理念:大模型只是组件之一,AI 应用的核心是 架构与工程能力。
二、项目初始化与依赖管理
2.1 Maven 依赖配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
<version>1.4.0-beta10</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
<version>1.4.0-beta10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-bom</artifactId>
<version>1.4.0-beta10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
建议:始终使用 BOM 管理 LangChain4j 版本,避免 starter 之间不兼容。
三、基础模型配置与快速验证
3.1 application.yml 配置
langchain4j:
open-ai:
chat-model:
api-key: ${OPENAI_API_KEY}
model-name: gpt-4o-mini
temperature: 0.7
timeout: 60s
log-requests: true
log-responses: true
# 国产模型示例(兼容 OpenAI API)
# base-url: https://api.moonshot.cn/v1
spring:
data:
redis:
host: localhost
port: 6379
安全原则:API Key 永远通过环境变量注入,禁止硬编码。
3.2 快速验证接口
@RestController
@RequestMapping("/api/ai")
public class SimpleChatController {
@Autowired
private ChatLanguageModel chatModel;
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatModel.generate(message);
}
}
如果接口能返回模型结果,说明 Spring Boot 与大模型的基础集成已经成功。想了解更多后端与数据库/中间件的实践,可以到云栈社区与开发者们交流。
四、企业级智能对话系统架构设计
4.1 推荐项目结构
com.yourcompany.ai
├── config
│ ├── AssistantConfig.java
│ ├── RedisConfig.java
│ └── PersistentChatMemoryStore.java
├── service
│ ├── StreamingAssistant.java
│ └── ToolService.java
└── controller
└── ChatController.java
这是 AI Agent 架构,而不是简单的“Controller 调模型”。
五、核心实现详解
5.1 AI 助手装配(核心)
@Configuration
public class AssistantConfig {
@Bean
public ChatMemoryStore chatMemoryStore(RedisTemplate<String, Object> redisTemplate) {
return new PersistentChatMemoryStore(redisTemplate);
}
@Bean
public ChatMemoryProvider chatMemoryProvider(ChatMemoryStore store) {
return memoryId -> MessageWindowChatMemory.builder()
.id(memoryId)
.maxMessages(10)
.chatMemoryStore(store)
.build();
}
@Bean
public StreamingAssistant streamingAssistant(
OpenAiStreamingChatModel chatModel,
ChatMemoryProvider memoryProvider,
ToolService toolService) {
return AiServices.builder(StreamingAssistant.class)
.streamingChatModel(chatModel)
.chatMemoryProvider(memoryProvider)
.tools(toolService)
.build();
}
}
架构拆解:
- Model:大模型能力
- Memory:上下文状态
- Tool:外部系统能力
- Assistant:业务智能体
5.2 StreamingAssistant 接口定义
@AiService
public interface StreamingAssistant {
@SystemMessage("你是一个专业的 Java 技术专家,回答需准确清晰。")
Flux<String> streamingChat(@UserMessage String message,
@MemoryId String sessionId);
}
生产建议:
sessionId = userId + ":" + businessContext,避免不同用户或业务间的会话串话。
@Service
public class ToolService {
@Tool("获取指定城市的当前天气")
public String getWeatherAtCity(@P("城市名称") String city) {
return String.format("%s 当前天气:晴,25°C", city);
}
@Tool("计算两个数字的和")
public double addNumbers(@P("数字 A") double a,
@P("数字 B") double b) {
return a + b;
}
}
安全原则:
- Tool 只暴露“语义能力”,定义清晰的功能边界。
- 禁止在 Tool 中直连生产数据库。
- Tool 内部应调用封装好的 Service 或 RPC 接口。
5.4 流式接口(SSE)
@RestController
@RequestMapping("/api/v1/chat")
public class ChatController {
@Autowired
private StreamingAssistant assistant;
@GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String message,
@RequestParam String sessionId) {
return assistant.streamingChat(message, sessionId)
.onErrorResume(e -> Flux.just("系统繁忙,请稍后再试"));
}
}
六、高级能力:RAG(检索增强生成)
6.1 RAG 核心流程
- 文档加载:处理 PDF / Word / Markdown 等格式。
- 文本切分:Chunk Size 建议在 300~800 tokens 之间。
- Embedding 向量化:将文本转换为向量。
- 向量数据库存储:存入 Milvus / Chroma / PGVector 等。
- 相似度检索:基于向量进行 TopK 检索并设置相关性阈值。
- 上下文增强生成:将检索到的上下文注入 Prompt,辅助模型生成。
关键点:合理的 Metadata 设计 + 有效的幻觉(Hallucination)控制。
七、Guardrails(安全防护)
输入防护
- 敏感词过滤:对用户输入进行基础内容安全校验。
- Prompt 注入检测:识别并阻断试图操控系统指令的输入。
- 频率与 Token 限流:防止滥用,控制成本。
输出防护
- 结果合规校验:对模型输出进行二次检查。
- 黑白名单:允许或禁止特定类型的回复。
- 兜底话术:当校验不通过时,返回预设的安全回复。
八、部署与性能优化
8.1 部署建议
- Docker 容器化:保证环境一致性,便于分发。
- Nginx 反向代理:处理静态资源、负载均衡与 SSL。
- K8s 横向扩展:根据负载动态调整应用实例数量。
8.2 监控与成本控制
- Spring Boot Actuator:提供应用健康状态、 metrics 等监控端点。
- Token 消耗监控:实时统计并预警,避免预算超支。
- Redis 缓存高频问题:对常见问答进行缓存,减少模型调用。
- 熔断与限流:在模型服务不稳定或达到调用上限时,启用保护机制。
九、学习与进阶路径
| 阶段 |
目标 |
核心内容 |
| 入门 |
跑通基础对话 |
模型集成 + 简单接口 |
| 进阶 |
实现多轮智能会话 |
Memory(记忆) + Tool(工具) |
| 高级 |
构建企业级应用 |
RAG(检索增强) + Guardrails(安全护栏) + 生产部署 |