Java + AI 开发从入门到精通,2025最新实战指南(附源码)
一、为什么 Java 开发者必须拥抱 AI?
2025年,AI 已从"选修课"变为"必修课"。作为一名 Java 开发者,你可能会问:
"AI 不是 Python 的天下吗?Java 能做什么?"
答案是:Java 不仅能用 AI,而且在企业级 AI 应用中具备天然优势。
| 对比维度 | Python | Java |
|---|---|---|
| 模型训练 | ⭐⭐⭐⭐⭐ | ⭐⭐ |
| 企业级集成 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 高并发推理服务 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 微服务生态 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 类型安全 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 现有系统改造 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
核心结论: Python 负责训练模型 → Java 负责将 AI 能力落地到企业业务中。
市场数据(2025年)
Java AI 相关岗位增长: +287% (同比) Spring AI GitHub Star: 18.6k → 45.2k Java AI 教程搜索量: 增长 520% 企业 Java 系统 AI 化改造率: 63.7%
🔥 划重点: 未来3年,能写 AI 的 Java 开发者薪资溢价将达到 40%~80%。
二、2025 Java AI 技术栈全景图
┌────────────────────────────────────────────────────────────┐ │ 应用层 (Application Layer) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ │ │ 智能客服 │ │ AI编程助手│ │ 智能搜索 │ │ 文档智能分析 │ │ │ └──────────┘ └──────────┘ └──────────┘ └───────────────┘ │ ├────────────────────────────────────────────────────────────┤ │ 框架层 (Framework Layer) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ │ │ Spring AI│ │ LangChain4j│ │ MyBatis │ │ Apache Camel │ │ │ │ 1.0.x │ │ 0.36.x │ │ AI Plugin │ │ AI Route │ │ │ └──────────┘ └──────────┘ └──────────┘ └───────────────┘ │ ├────────────────────────────────────────────────────────────┤ │ 模型层 (Model Layer) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ │ │ OpenAI │ │ 通义千问 │ │ 文心一言 │ │ Ollama(Local)│ │ │ │ GPT-4o │ │ Qwen-Max │ │ ERNIE 4.0│ │ Llama3/Qwen2 │ │ │ └──────────┘ └──────────┘ └──────────┘ └───────────────┘ │ ├────────────────────────────────────────────────────────────┤ │ 基础设施层 (Infrastructure) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ │ │ Milvus │ │ Chroma DB│ │ Elastic │ │ Redis │ │ │ │ 向量检索 │ │ 向量存储 │ │ Search │ │ 缓存/会话 │ │ │ └──────────┘ └──────────┘ └──────────┘ └───────────────┘ │ └────────────────────────────────────────────────────────────┘
核心框架选择
| 框架 | 定位 | 推荐场景 |
|---|---|---|
| Spring AI | Spring 官方 AI 框架 | Spring 项目首选,与 Spring 生态无缝集成 |
| LangChain4j | Java 版 LangChain | 需要复杂 AI 工作流编排 |
| DJL (Deep Java Library) | 深度学习推理引擎 | 本地模型推理、模型部署 |
| Tribuo | 传统机器学习 | 分类、回归、聚类等经典 ML 任务 |
三、Spring AI 快速上手(10 分钟跑通第一个 AI 应用)
3.1 环境准备
JDK 17+ | Spring Boot 3.3+ | Maven 3.8+ | IDEA 2024+
3.2 创建项目
<!-- pom.xml 核心依赖 -->
<properties>
<spring-ai.version>1.0.0-M4</spring-ai.version>
</properties>
<dependencies>
<!-- Spring AI OpenAI Starter -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.3 配置 API Key
# application.yml
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY} # 环境变量注入,不要硬编码!
base-url: https://api.openai.com
chat:
options:
model: gpt-4o-mini
temperature: 0.7
3.4 第一个 AI 对话接口
package com.example.ai.controller;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/ai")
public class ChatController {
private final ChatClient chatClient;
// 构造器注入(Spring AI 1.0 自动装配)
public ChatController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
/**
* 简单对话接口
* POST /api/ai/chat
* Body: { "message": "用Java写一个冒泡排序" }
*/
@PostMapping("/chat")
public Map<String, String> chat(@RequestBody ChatRequest request) {
String response = chatClient.prompt()
.user(request.getMessage())
.call()
.content();
return Map.of("reply", response);
}
/**
* 流式对话(SSE)- 打字机效果
* POST /api/ai/chat/stream
*/
@PostMapping(value = "/chat/stream", produces = "text/event-stream")
public Flux<String> chatStream(@RequestBody ChatRequest request) {
return chatClient.prompt()
.user(request.getMessage())
.stream()
.content();
}
record ChatRequest(String message) {}
}
3.5 使用 System Prompt 定制 AI 角色
@RestController
@RequestMapping("/api/ai/assistant")
public class AssistantController {
private final ChatClient codeAssistant;
private final ChatClient sqlAssistant;
private final ChatClient docAssistant;
public AssistantController(ChatClient.Builder builder) {
// 代码助手
this.codeAssistant = builder
.defaultSystem("""
你是一个资深的Java代码审查专家。
请遵循以下规则:
1. 检查代码规范、安全漏洞、性能问题
2. 使用阿里巴巴Java开发手册标准
3. 给出具体的修改建议和示例代码
4. 使用Markdown格式回复
""")
.build();
// SQL优化助手
this.sqlAssistant = builder
.defaultSystem("""
你是一个MySQL性能优化专家。
1. 分析SQL语句的执行计划问题
2. 给出索引优化建议
3. 提供优化后的SQL
4. 预估优化效果
""")
.build();
// 文档助手
this.docAssistant = builder
.defaultSystem("""
你是一个技术文档撰写专家。
1. 自动生成接口文档
2. 遵循OpenAPI 3.0规范
3. 包含请求示例和响应说明
""")
.build();
}
@PostMapping("/code-review")
public String reviewCode(@RequestBody String code) {
return codeAssistant.prompt().user(code).call().content();
}
@PostMapping("/sql-optimize")
public String optimizeSQL(@RequestBody String sql) {
return sqlAssistant.prompt().user(sql).call().content();
}
@PostMapping("/gen-doc")
public String generateDoc(@RequestBody String apiCode) {
return docAssistant.prompt().user(apiCode).call().content();
}
}
✅ 运行结果: 启动项目后访问
http://localhost:8080/api/ai/chat即可体验 AI 对话,10 分钟跑通!
四、RAG 检索增强生成实战
RAG(Retrieval-Augmented Generation)是 2025 年企业 AI 应用最核心的模式,解决 LLM 的幻觉问题。
4.1 RAG 工作流程
用户提问 → 向量化 → 向量数据库检索 → 召回相关文档 ↓ 最终回答 ← LLM 生成 ← 拼接 Prompt(用户提问 + 召回文档)
4.2 完整实战代码
package com.example.ai.rag;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class RAGService {
private final VectorStore vectorStore;
private final EmbeddingModel embeddingModel;
private final ChatClient chatClient;
public RAGService(VectorStore vectorStore,
EmbeddingModel embeddingModel,
ChatClient.Builder chatClientBuilder) {
this.vectorStore = vectorStore;
this.embeddingModel = embeddingModel;
this.chatClient = chatClientBuilder.build();
}
/**
* 上传文档到知识库
* 支持:PDF, Word, TXT, Markdown
*/
public void uploadDocument(MultipartFile file) {
// 1. 解析文档内容
String content = parseDocument(file);
// 2. 文本分割(按段落 + 重叠窗口)
List<Document> chunks = splitText(content, 500, 50);
// 3. 向量化并存入向量数据库
vectorStore.add(chunks);
log.info("文档上传成功: {}, 分块数: {}",
file.getOriginalFilename(), chunks.size());
}
/**
* RAG 问答:基于知识库的智能问答
*/
public String askWithContext(String question) {
// 1. 从向量数据库检索相关文档
List<Document> relevantDocs = vectorStore.similaritySearch(
SearchRequest.query(question)
.withTopK(5) // 返回最相似的5个文档块
.withSimilarityThreshold(0.7) // 相似度阈值
);
if (relevantDocs.isEmpty()) {
return "抱歉,知识库中没有找到相关信息。";
}
// 2. 拼接上下文
String context = relevantDocs.stream()
.map(Document::getContent)
.collect(Collectors.joining("\n\n---\n\n"));
// 3. 构建带上下文的 Prompt
String systemPrompt = """
你是一个基于知识库的智能问答助手。
规则:
1. 仅根据提供的知识库内容回答问题
2. 如果知识库中没有相关信息,请明确告知用户
3. 引用知识库中的具体段落来支持你的回答
4. 使用专业、准确的语言
知识库内容:
%s
""".formatted(context);
// 4. 调用 LLM 生成回答
return chatClient.prompt()
.system(systemPrompt)
.user(question)
.call()
.content();
}
/**
* 文本智能分割
*/
private List<Document> splitText(String content, int chunkSize, int overlap) {
List<Document> chunks = new ArrayList<>();
int start = 0;
while (start < content.length()) {
int end = Math.min(start + chunkSize, content.length());
// 尽量在句号、换行处分割
if (end < content.length()) {
int lastBreak = Math.max(
content.lastIndexOf('。', end),
content.lastIndexOf('\n', end)
);
if (lastBreak > start) {
end = lastBreak + 1;
}
}
chunks.add(new Document(content.substring(start, end)));
start = end - overlap; // 重叠窗口
}
return chunks;
}
private String parseDocument(MultipartFile file) {
// 使用 Apache Tika 或 POI 解析各种文档格式
// 此处省略具体实现...
return "";
}
}
4.3 应用场景举例
// 场景1:企业内部制度问答 // Q: "年假怎么算?" → RAG 检索《员工手册》 → AI 精准回答 // 场景2:技术文档问答 // Q: "Redis 集群如何扩容?" → RAG 检索运维文档 → AI 给出步骤 // 场景3:客服知识库 // Q: "退货流程是什么?" → RAG 检索客服SOP → AI 给出指引
五、Function Calling:让 AI 调用你的业务 API
Function Calling 是 2025 年最🔥的 AI 集成模式,让 LLM 能够自动调用你的 Java 业务接口。
5.1 核心原理
用户说:"帮我查一下北京的天气"
LLM 推理 → 需要调用 getWeather(city="北京")
↓
Java 执行 getWeather 方法 → 返回 {"temp": 25, "weather": "晴"}
↓
LLM 整理回复 → "北京今天晴,气温25°C,适合出行!"
5.2 完整实战代码
package com.example.ai.function;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.model.function.FunctionCallback;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
// ===== 第一步:定义业务函数 =====
@Service
public class OrderQueryService {
/**
* 根据订单号查询订单状态
*/
public OrderInfo getOrderStatus(String orderNo) {
// 实际从数据库查询
return new OrderInfo(orderNo, "SHIPPED", "顺丰快递", "SF1234567890");
}
/**
* 查询用户最近的订单列表
*/
public List<OrderSummary> getUserOrders(Long userId, Integer limit) {
// 实际从数据库查询
return List.of(
new OrderSummary("ORD20250501001", "已签收", "2025-05-01"),
new OrderSummary("ORD20250515002", "运输中", "2025-05-15")
);
}
record OrderInfo(String orderNo, String status, String carrier, String trackingNo) {}
record OrderSummary(String orderNo, String status, String createTime) {}
}
// ===== 第二步:注册为 FunctionCallback =====
@Configuration
public class FunctionCallbackConfig {
@Bean
public FunctionCallback orderStatusCallback(OrderQueryService service) {
return FunctionCallback.builder()
.function("getOrderStatus",
(Function<Map<String, String>, OrderQueryService.OrderInfo>)
params -> service.getOrderStatus(params.get("orderNo")))
.description("查询指定订单号的订单状态和物流信息")
.inputType(Map.class)
.build();
}
@Bean
public FunctionCallback userOrdersCallback(OrderQueryService service) {
return FunctionCallback.builder()
.function("getUserOrders",
(Function<Map<String, Object>, List<OrderQueryService.OrderSummary>>)
params -> service.getUserOrders(
((Number) params.get("userId")).longValue(),
((Number) params.get("limit")).intValue()
))
.description("查询指定用户的最近订单列表,limit为空时默认10条")
.inputType(Map.class)
.build();
}
}
// ===== 第三步:在对话中使用 =====
@RestController
@RequestMapping("/api/ai/order-assistant")
public class OrderAIAssistant {
private final ChatClient chatClient;
private final List<FunctionCallback> functionCallbacks;
public OrderAIAssistant(ChatClient.Builder builder,
List<FunctionCallback> functionCallbacks) {
this.functionCallbacks = functionCallbacks;
this.chatClient = builder
.defaultSystem("""
你是一个订单查询助手,帮助用户查询订单状态和物流信息。
规则:
1. 当用户查询具体订单时,使用 getOrderStatus 函数
2. 查询用户订单列表时,使用 getUserOrders 函数
3. 用友好的语言回复用户
4. 如果用户没有提供足够信息,主动询问
""")
.defaultFunctions(functionCallbacks.toArray(new FunctionCallback[0]))
.build();
}
@PostMapping("/chat")
public String chat(@RequestBody String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
5.3 用户体验
👤 用户:"我的订单 ORD20250501001 到哪了?" 🤖 AI:"您的订单 ORD20250501001 已发货,由顺丰快递承运, 快递单号 SF1234567890,预计明天送达。" 👤 用户:"我最近买了什么?" 🤖 AI:"您最近的订单有: 1. ORD20250501001 - 已签收 (5月1日) 2. ORD20250515002 - 运输中 (5月15日) 需要我帮您查看某个订单的详细信息吗?"
六、向量数据库集成(Milvus / Chroma)
6.1 配置向量数据库
# application.yml - Chroma 配置(轻量级开发首选) spring: ai: vectorstore: chroma: host: http://localhost:8000 collection-name: my-knowledge-base initialize-schema: true --- # application.yml - Milvus 配置(生产环境首选) spring: ai: vectorstore: milvus: host: milvus-standalone port: 19530 database: default collection-name: enterprise-knowledge embedding-dimension: 1536 # OpenAI embedding 维度 index-type: IVF_FLAT metric-type: COSINE # 余弦相似度
6.2 向量化不同内容
@Service
public class EmbeddingService {
private final EmbeddingModel embeddingModel;
/**
* 将文本转为向量
*/
public float[] embedText(String text) {
return embeddingModel.embed(text);
}
/**
* 计算两段文本的语义相似度
*/
public double similarity(String text1, String text2) {
float[] vec1 = embedText(text1);
float[] vec2 = embedText(text2);
return cosineSimilarity(vec1, vec2);
}
private double cosineSimilarity(float[] a, float[] b) {
double dot = 0, normA = 0, normB = 0;
for (int i = 0; i < a.length; i++) {
dot += a[i] * b[i];
normA += a[i] * a[i];
normB += b[i] * b[i];
}
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
}
}
七、多模态 AI:图片、语音识别实战
7.1 图片理解(GPT-4o Vision)
@RestController
@RequestMapping("/api/ai/vision")
public class VisionController {
private final ChatClient chatClient;
public VisionController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
/**
* 图片转文字描述
* POST /api/ai/vision/describe
* multipart/form-data: image=xxx.png
*/
@PostMapping("/describe")
public String describeImage(@RequestParam("image") MultipartFile image) throws IOException {
// 读取图片并转为 Base64
byte[] bytes = image.getBytes();
String base64 = Base64.getEncoder().encodeToString(bytes);
String dataUrl = "data:image/" + getExtension(image) + ";base64," + base64;
return chatClient.prompt()
.user(userSpec -> userSpec
.text("请详细描述这张图片的内容")
.media(Media.Format.IMAGE_PNG, new URL(dataUrl)))
.call()
.content();
}
/**
* 发票 OCR 识别
*/
@PostMapping("/invoice-ocr")
public InvoiceInfo extractInvoice(@RequestParam("image") MultipartFile image) {
String prompt = """
请从发票图片中提取以下信息,以JSON格式返回:
{
"invoiceNo": "发票号码",
"amount": "金额(数字)",
"date": "开票日期",
"seller": "销售方名称",
"buyer": "购买方名称",
"items": ["商品列表"]
}
""";
String response = chatClient.prompt()
.user(userSpec -> userSpec
.text(prompt)
.media(/* image */))
.call()
.content();
// 解析 JSON 返回
return objectMapper.readValue(response, InvoiceInfo.class);
}
}
7.2 语音转文字(集成阿里云/讯飞)
@Service
public class SpeechService {
/**
* 语音转文字(阿里云 ASR)
*/
public String speechToText(MultipartFile audioFile) {
// 1. 上传音频到 OSS
String ossUrl = ossService.upload(audioFile);
// 2. 调用阿里云语音识别
SpeechRecognizer recognizer = new SpeechRecognizer(client,
"https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/asr");
// 3. 获取识别结果
return recognizer.recognize(ossUrl);
}
/**
* 文本转语音(TTS)
*/
public byte[] textToSpeech(String text, String voice) {
return ttsClient.synthesize(text, voice); // 返回 MP3 字节流
}
}
八、生产环境部署与性能优化
8.1 性能优化策略
@Configuration
public class AIOptimizationConfig {
/**
* 1. 连接池配置 - 复用 HTTP 连接
*/
@Bean
public HttpClient httpClient() {
return HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000)
.responseTimeout(Duration.ofSeconds(60))
.poolResources(PoolResources.fixed("ai-pool", 50));
}
/**
* 2. 响应缓存 - Redis 缓存常见问题
*/
@Service
public class CachedChatService {
@Cacheable(value = "ai:chat", key = "#prompt.hashCode()")
public String chat(String prompt) {
return chatClient.prompt().user(prompt).call().content();
}
}
/**
* 3. 限流保护
*/
@Bean
public RateLimiter aiRateLimiter() {
return RateLimiter.create(100.0); // 每秒100个请求
}
}
8.2 监控与告警
# Prometheus + Grafana 监控配置 management: endpoints: web: exposure: include: health,metrics,prometheus metrics: tags: application: ai-service export: prometheus: enabled: true # 自定义指标 spring: ai: metrics: enabled: true # Token 使用量、延迟、成功率
8.3 生产环境 Checklist
| 项目 | 说明 | 状态 |
|---|---|---|
| API Key 安全 | 使用环境变量/密钥管理服务,不硬编码 | ☑ |
| 请求限流 | 防止 API 超额调用 | ☑ |
| 响应缓存 | 相同问题返回缓存结果 | ☑ |
| 超时控制 | 设置合理的超时时间 | ☑ |
| 降级策略 | LLM 不可用时的兜底方案 | ☑ |
| 内容审核 | 输入输出内容安全过滤 | ☑ |
| 日志脱敏 | 敏感信息不打印到日志 | ☑ |
| 成本监控 | Token 用量统计与告警 | ☑ |
九、完整项目源码
项目结构
java-ai-project/ ├── pom.xml ├── src/main/java/com/example/ai/ │ ├── AiApplication.java │ ├── config/ │ │ ├── AiConfig.java # AI 模型配置 │ │ ├── VectorStoreConfig.java # 向量数据库配置 │ │ └── FunctionCallbackConfig.java # Function Calling 注册 │ ├── controller/ │ │ ├── ChatController.java # 对话接口 │ │ ├── RAGController.java # RAG 问答接口 │ │ ├── VisionController.java # 图片识别接口 │ │ └── AdminController.java # 管理后台 │ ├── service/ │ │ ├── RAGService.java # RAG 核心服务 │ │ ├── EmbeddingService.java # 向量化服务 │ │ ├── DocumentParser.java # 文档解析 │ │ ├── SafetyFilter.java # 内容安全过滤 │ │ └── TokenMonitor.java # Token 用量监控 │ └── model/ │ ├── ChatRequest.java │ ├── ChatResponse.java │ └── KnowledgeBase.java ├── src/main/resources/ │ ├── application.yml │ ├── application-prod.yml │ └── prompts/ # Prompt 模板 │ ├── code-review.st │ ├── sql-optimizer.st │ └── customer-service.st └── docker-compose.yml # Chroma + Redis + App
快速启动
# 1. 克隆项目
git clone https://github.com/xxxx/java-ai-project.git
cd java-ai-project
# 2. 启动向量数据库和 Redis
docker-compose up -d chroma redis
# 3. 设置 API Key
export OPENAI_API_KEY=sk-xxxxxxxxxxxxx
# 4. 启动项目
./mvnw spring-boot:run
# 5. 测试
curl -X POST http://localhost:8080/api/ai/chat \
-H "Content-Type: application/json" \
-d '{"message":"用Java写一个单例模式"}'
📦 源码获取方式: 评论区留言「Java AI 666」+ 邮箱,我会在 24 小时内发送完整源码。 或者直接关注公众号「全栈攻城狮」,回复 「JavaAI」 自动获取。
十、总结与展望
2025年 Java AI 开发关键 Takeaways
-
Spring AI 已成熟可用 — 1.0 版本提供了完整的 AI 集成能力
-
RAG 是企业 AI 落地的核心模式 — 解决幻觉、保护数据安全
-
Function Calling 打通 AI 与业务系统 — 让 AI 能操作你的数据库和 API
-
向量数据库是必备基础设施 — Chroma 轻量上手,Milvus 生产部署
-
多模态能力快速增长 — 图片、语音、视频都能处理
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)