Java AI 完整学习笔记
版本 :v1.0 | 更新时间 :2026年7月 | 适用人群:Java开发者转型AI应用开发
定位:准确、专业、深入的企业级Java AI开发指南,覆盖从入门到生产落地全链路
目录
- 第一部分:基础认知与前置准备
- [第二部分:Java AI生态全景](#第二部分:Java AI生态全景)
- 第三部分:核心框架深度解析
- 第四部分:核心技术专题
- 第五部分:本地模型部署与推理
- 第六部分:企业级工程化实践
- 第七部分:项目实战路线
- 第八部分:性能优化与生产部署
- 第九部分:进阶学习资源
第一部分:基础认知与前置准备
1.1 Java开发者的AI转型优势
作为Java开发者,你在AI应用开发领域具备天然优势:
| 优势领域 | 具体体现 |
|---|---|
| 工程化能力 | 微服务架构、分布式系统、高并发处理经验 |
| 企业集成经验 | 熟悉数据库、消息队列、缓存、监控等中间件 |
| 类型安全 | 强类型系统在AI结构化输出场景下优势明显 |
| 性能调优 | JVM调优、GC优化、线程池管理经验可直接复用 |
| 生态成熟 | Spring Boot生态为AI应用提供完善的基础设施 |
核心认知 :Java开发者的主战场是AI应用层 和工程化层,而非算法研究层。你不需要从零推导反向传播,但必须理解大模型的工作原理和边界。
1.2 必备前置知识
1.2.1 Java核心强化(必须掌握)
java
// 1. 函数式编程与Stream API - AI响应处理大量使用
List<Document> relevantDocs = documents.stream()
.filter(doc -> similarityScore(doc, query) > threshold)
.sorted(Comparator.comparingDouble(this::similarityScore).reversed())
.limit(5)
.toList();
// 2. CompletableFuture异步编程 - 流式响应、并行工具调用
CompletableFuture<String> future = CompletableFuture
.supplyAsync(() -> chatModel.call(prompt), executor)
.thenApply(this::postProcess);
// 3. 注解处理与反射 - @Tool、@AiService等框架核心机制
// 4. 泛型与类型推断 - 结构化输出的核心基础
// 5. 响应式编程(WebFlux) - SSE流式输出必备
1.2.2 AI基础概念快速入门
| 概念 | 通俗解释 | Java类比 |
|---|---|---|
| Token | 大模型处理文本的最小单位(约1个汉字=1-2Token) | 字节码指令 |
| Prompt | 给大模型的指令和上下文 | 方法入参 |
| Completion | 大模型生成的回复 | 方法返回值 |
| Temperature | 控制输出随机性,0=确定性,1=创造性 | 随机数种子 |
| Embedding | 将文本转换为高维向量,用于语义搜索 | 对象序列化 |
| Context Window | 模型能处理的最大Token数(上下文长度) | JVM堆内存大小 |
| Hallucination | 模型编造不存在的事实 | 空指针异常(必须防御) |
1.2.3 数学基础(按需学习,不用深究)
- 必知:向量运算(余弦相似度、点积)、概率分布基础
- 了解:矩阵乘法、梯度下降概念
- 不用:手推反向传播、证明数学定理
第二部分:Java AI生态全景
2.1 框架选型决策矩阵
| 框架 | 定位 | 核心优势 | 适用场景 | 成熟度 |
|---|---|---|---|---|
| Spring AI | Spring官方AI框架 | 无缝Spring生态、企业级特性、可观测性 | Spring技术栈团队、企业级应用 | ★★★★★ |
| LangChain4j | Java版LangChain | 功能最全、模块化、社区活跃、Agent能力强 | 复杂AI工作流、RAG、Agent开发 | ★★★★★ |
| Spring AI Alibaba | 阿里国产大模型适配 | 通义千问深度集成、中文优化、国产化支持 | 国内大模型、阿里云生态 | ★★★★☆ |
| Semantic Kernel | 微软AI编排框架 | Azure生态、多语言支持、规划器强 | 微软技术栈、Azure OpenAI | ★★★★☆ |
| Deeplearning4j | Java深度学习框架 | 分布式训练、支持CNN/RNN | 传统机器学习、图像/NLP处理 | ★★★☆☆ |
| DJL | AWS深度学习库 | 多引擎支持、Python模型Java部署 | 本地模型推理、ONNX部署 | ★★★★☆ |
选型建议:
- 已有Spring Boot项目 → Spring AI
- 需要复杂RAG/Agent能力 → LangChain4j
- 使用国产大模型 → Spring AI Alibaba
- 本地部署模型推理 → DJL + ONNX Runtime
2.2 技术栈全景图
┌─────────────────────────────────────────────────────────┐
│ 应用层 (Application) │
│ 智能客服 │ 知识库问答 │ AI助手 │ 代码生成 │ 数据分析 │
├─────────────────────────────────────────────────────────┤
│ 编排层 (Orchestration) │
│ Prompt模板 │ 对话记忆 │ 工具调用 │ RAG流水线 │ Agent │
├─────────────────────────────────────────────────────────┤
│ 框架层 (Framework) │
│ Spring AI │ LangChain4j │ Semantic Kernel │
├─────────────────────────────────────────────────────────┤
│ 模型层 (Models) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 云端大模型 │ │ 本地大模型 │ │ Embedding模型│ │
│ │ GPT/通义/文心│ │ Ollama/LLaMA │ │ BGE/Text2Vec │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
├─────────────────────────────────────────────────────────┤
│ 存储层 (Storage) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 向量数据库│ │ 关系数据库│ │ 文档存储 │ │ 缓存 │ │
│ │Milvus/PG │ │ MySQL/PG │ │ MinIO/OSS│ │ Redis │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
第三部分:核心框架深度解析
3.1 Spring AI 核心架构
3.1.1 设计理念
Spring AI的核心设计原则是**"可移植的AI抽象"**:
- 一套代码支持20+种AI模型
- 与Spring Boot/Cloud无缝集成
- 提供企业级特性(可观测性、安全性、配置管理)
3.1.2 核心API
java
// 1. ChatClient - 对话客户端(推荐使用,Fluent API)
@RestController
public class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
// 简单调用
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
// 流式响应(SSE)
@GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> chatStream(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.stream()
.content();
}
// 结构化输出(Spring AI 2.0支持自校正)
@GetMapping("/extract")
public CustomerInfo extract(@RequestParam String text) {
return chatClient.prompt()
.user("从以下文本提取客户信息:" + text)
.call()
.entity(CustomerInfo.class);
}
public record CustomerInfo(String name, String phone, String email) {}
}
3.1.3 Advisor机制(AOP思想)
Spring AI使用Advisor实现横切关注点,类似Spring AOP:
java
// 内置Advisor:
// 1. MessageChatMemoryAdvisor - 对话记忆
// 2. QuestionAnswerAdvisor - RAG检索增强
// 3. SafeGuardAdvisor - 内容安全防护
chatClient.prompt()
.user(message)
.advisors(
MessageChatMemoryAdvisor.builder(chatMemory).build(),
QuestionAnswerAdvisor.builder(vectorStore).build(),
new LoggingAdvisor() // 自定义Advisor:日志记录
)
.call()
.content();
3.1.4 工具调用(Function Calling)
java
// 1. 定义工具方法
@Component
public class WeatherTools {
@Tool("获取指定城市的当前天气")
public String getWeather(@ToolParam(description = "城市名称") String city) {
// 调用真实天气API
return city + ":晴,25°C,微风";
}
}
// 2. 注册并使用
@Bean
public ChatClient weatherChatClient(ChatClient.Builder builder, WeatherTools tools) {
return builder
.defaultTools(tools)
.build();
}
// AI会自动决定是否调用天气工具
String response = chatClient.prompt()
.user("北京今天天气怎么样?")
.call()
.content();
// 输出:北京今天天气晴,温度25°C,适合外出。
3.2 LangChain4j 深度解析
3.2.1 核心理念
LangChain4j是Java生态功能最完整的AI应用开发框架,采用声明式AI服务设计:
java
// 声明式AI服务 - 类似Feign的体验
interface CustomerSupportAgent {
@SystemMessage("""
你是专业的电商客服助手。
回答要礼貌、专业、简洁。
如果不知道答案,不要编造,转人工处理。
""")
String chat(@UserMessage String userMessage);
}
// 构建并使用
CustomerSupportAgent agent = AiServices.builder(CustomerSupportAgent.class)
.chatModel(chatModel)
.tools(orderTools, refundTools)
.chatMemory(MessageWindowChatMemory.withMaxMessages(20))
.build();
String answer = agent.chat("我的订单什么时候发货?");
3.2.2 核心模块
| 模块 | 职责 | 核心类 |
|---|---|---|
| Chat Language Model | 大模型统一接口 | ChatModel, StreamingChatModel |
| Chat Memory | 对话记忆管理 | ChatMemory, MessageWindowChatMemory |
| Documents | 文档处理 | DocumentLoader, DocumentSplitter |
| Embeddings | 文本向量化 | EmbeddingModel, InMemoryEmbeddingStore |
| RAG | 检索增强生成 | EmbeddingStoreContentRetriever, DefaultRetrievalAugmentor |
| Tools | 工具调用 | @Tool, ToolSpecification |
| AI Services | 声明式服务 | AiServices, @SystemMessage |
3.2.3 RAG完整流水线
java
// 1. 文档加载
Document document = FileSystemDocumentLoader.loadDocument("manual.pdf");
// 2. 文档分片
DocumentSplitter splitter = DocumentSplitters.recursive(
300, // 每个分片最大Token数
50, // 重叠Token数(保证上下文连贯)
new OpenAiTokenizer()
);
List<TextSegment> segments = splitter.split(document);
// 3. 向量化并存储
EmbeddingModel embeddingModel = new BgeSmallZhEmbeddingModel();
List<Embedding> embeddings = embeddingModel.embedAll(segments).content();
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
embeddingStore.addAll(embeddings, segments);
// 4. 创建检索器
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
.maxResults(5)
.minScore(0.7)
.build();
// 5. 构建RAG增强的AI服务
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(chatModel)
.contentRetriever(retriever)
.build();
3.3 Spring AI Alibaba(国产大模型方案)
3.3.1 快速集成
xml
<!-- pom.xml -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
<version>1.0.0-M6</version>
</dependency>
yaml
# application.yml
spring:
ai:
dashscope:
api-key: ${DASHSCOPE_API_KEY}
chat:
options:
model: qwen-plus # 通义千问Plus
temperature: 0.7
java
@RestController
public class QwenController {
@Autowired
private ChatClient chatClient;
@GetMapping("/qwen")
public String chat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
3.3.2 支持的国产模型
| 模型 | 能力 | 适用场景 | 成本参考 |
|---|---|---|---|
| qwen-turbo | 快速响应 | 简单对话、分类、摘要 | 极低(百万Token≈0.8元) |
| qwen-plus | 平衡性能 | 通用场景、RAG、工具调用 | 低(百万Token≈4元) |
| qwen-max | 最强能力 | 复杂推理、Agent、代码生成 | 中(百万Token≈20元) |
| qwen-vl-max | 多模态 | 图片理解、OCR、图表分析 | 中 |
| text-embedding-v3 | 向量模型 | 中文Embedding、RAG | 极低 |
生产建议:简单任务用qwen-turbo,通用场景用qwen-plus,复杂推理才用qwen-max,成本可降低80%以上。
第四部分:核心技术专题
4.1 Prompt Engineering(提示词工程)
4.1.1 结构化Prompt模板
java
// 好的Prompt结构:角色 + 任务 + 约束 + 输出格式 + 示例
@SystemMessage("""
# 角色
你是资深Java代码审查专家,有10年阿里巴巴Java开发经验。
# 任务
审查用户提供的Java代码,找出潜在问题。
# 约束
1. 严格遵循《阿里巴巴Java开发手册》
2. 重点关注:NPE风险、并发安全、性能问题、SQL注入
3. 每个问题必须给出:位置、问题描述、修复建议、严重级别
4. 不要编造不存在的问题
# 输出格式(JSON)
{
"issues": [
{
"line": 行号,
"severity": "BLOCKER/CRITICAL/MAJOR/MINOR",
"description": "问题描述",
"suggestion": "修复建议",
"codeExample": "修复后的代码示例"
}
],
"summary": "整体评价和改进建议"
}
""")
String reviewCode(@UserMessage String code);
4.1.2 高级技巧
| 技巧 | 用途 | 示例 |
|---|---|---|
| Few-Shot | 给模型几个示例,显著提升输出质量 | 提供2-3个正确的输入输出样例 |
| Chain of Thought | 让模型一步步思考,提升推理准确率 | "请一步步思考,最后给出答案" |
| Self-Consistency | 多次采样取一致结果,降低幻觉 | 温度设为0.7,采样3次取多数 |
| ReAct | 推理+行动循环,Agent核心模式 | Thought → Action → Observation循环 |
4.2 RAG(检索增强生成)
4.2.1 RAG解决的核心问题
- 知识截止:模型训练数据有截止日期,无法获取最新信息
- 幻觉问题:模型会编造看似合理但错误的答案
- 私有数据:企业内部文档、数据无法用于训练公有模型
- 数据安全:敏感数据不能发送给第三方模型训练
4.2.2 RAG完整架构
用户提问 → 查询重写 → 向量检索 → 重排序 → 上下文构建 → LLM生成 → 答案
↓ ↓ ↓
同义词扩展 相似度计算 相关性过滤
意图识别 关键词匹配 去重压缩
4.2.3 关键优化点
1. 文档分片策略
java
// 推荐配置:
// - 通用文档:chunkSize=500, overlap=100
// - 技术文档:chunkSize=800, overlap=150(保留完整代码块)
// - 法律/合同:chunkSize=1000, overlap=200(保留条款完整性)
DocumentSplitter splitter = DocumentSplitters.recursive(
500, 100,
DocumentSplitter.PARAGRAPH_SPLITTERS,
DocumentSplitter.SENTENCE_SPLITTERS
);
2. 检索优化
- 混合检索:向量检索 + 关键词检索(BM25)+ RRF融合
- 重排序(Rerank):使用BGE-Reranker对初筛结果二次排序
- 元数据过滤:按部门、文档类型、时间范围提前过滤
- 多查询扩展:将用户问题重写为多个相似查询,合并结果
3. 高级RAG模式
- Parent-Child Retrieval:检索小块,返回父文档完整上下文
- Hypothetical Questions:为每个文档生成可能的问题,提升召回
- Self-RAG:模型自己判断是否需要检索、检索结果是否相关
- Agentic RAG:Agent自主决定检索策略、多轮检索、调用工具
4.3 Function Calling(工具调用)
4.3.1 工作原理
用户问题 → LLM判断是否需要调用工具 → 生成工具调用JSON → 执行Java方法 → 结果返回LLM → 生成最终答案
4.3.2 最佳实践
java
public class OrderTools {
private final OrderService orderService;
// 1. 工具描述必须清晰准确
@Tool("根据订单号查询订单详细信息,包含订单状态、物流信息、商品明细、金额")
public OrderInfo getOrderDetail(
@P("订单编号,格式为ORD开头加12位数字,例如ORD202607010001") String orderNo) {
// 2. 参数校验在Java层做,不要依赖LLM
if (!orderNo.matches("^ORD\\d{12}$")) {
return OrderInfo.error("订单号格式不正确");
}
// 3. 异常处理必须完善,返回友好信息
try {
return orderService.getById(orderNo);
} catch (Exception e) {
log.error("查询订单失败", e);
return OrderInfo.error("查询订单失败,请稍后重试");
}
}
// 4. 工具粒度要适中:太粗LLM不会用,太细调用次数多
@Tool("查询用户的订单列表,支持按状态筛选")
public List<OrderInfo> getUserOrders(
@P("用户ID") String userId,
@P("订单状态:PENDING_PAYMENT/PAID/SHIPPED/COMPLETED/CANCELLED,可选") String status,
@P("页码,从1开始") int page,
@P("每页数量,最大50") int pageSize) {
// 实现
}
}
4.3.3 常见陷阱
- ❌ 工具描述模糊:LLM不知道什么时候用
- ❌ 参数太复杂:嵌套对象LLM容易传错
- ❌ 没有返回值:LLM不知道调用结果
- ❌ 同步阻塞:工具执行太久导致超时
- ✅ 一个工具只做一件事
- ✅ 参数都是简单类型(String/Integer/Boolean)
- ✅ 返回结构化的错误信息
- ✅ 异步执行+超时控制
4.4 AI Agent(智能体)
4.4.1 Agent核心架构
┌─────────────────────────────────────────┐
│ Agent Core │
│ ┌─────────┐ ┌────────┐ ┌─────────┐ │
│ │ Planner │→│Executor│→│Reflector│ │
│ └─────────┘ └────────┘ └─────────┘ │
│ ↓ ↓ ↑ │
│ ┌─────────────────────────────────┐ │
│ │ Memory │ │
│ │ 短期记忆(对话) │ 长期记忆(知识) │ │
│ └─────────────────────────────────┘ │
└───────────────────┬─────────────────────┘
│
┌───────────────┼───────────────┐
↓ ↓ ↓
┌───────┐ ┌───────┐ ┌───────┐
│ Tools │ │ RAG │ │ Human │
└───────┘ └───────┘ └───────┘
4.4.2 ReAct模式实现
java
// LangChain4j内置ReAct Agent
interface ResearchAgent {
String execute(String task);
}
ResearchAgent agent = AiServices.builder(ResearchAgent.class)
.chatModel(chatModel)
.tools(
new SearchTools(), // 联网搜索
new CalculatorTools(), // 数学计算
new DatabaseTools(), // 数据库查询
new FileTools() // 文件操作
)
.chatMemory(MessageWindowChatMemory.withMaxMessages(50))
.build();
// Agent会自动:思考→搜索→计算→再思考→总结
String result = agent.execute("分析2026年Q2新能源汽车销量TOP3品牌,对比它们的优缺点,给出投资建议");
4.4.3 多Agent协作
java
// 1. 定义 specialized agents
interface Researcher {
String research(String topic);
}
interface Writer {
String write(String outline, String researchData);
}
interface Critic {
String review(String article);
}
// 2. 主编Agent协调
interface EditorInChief {
String writeArticle(String topic);
}
EditorInChief editor = AiServices.builder(EditorInChief.class)
.chatModel(chatModel)
.tools(
// 将其他Agent包装为工具
ToolSpecification.of("research", "调研主题", (String topic) -> researcher.research(topic)),
ToolSpecification.of("write", "撰写文章", (String outline, String data) -> writer.write(outline, data)),
ToolSpecification.of("review", "审核文章", (String article) -> critic.review(article))
)
.build();
4.5 MCP协议(Model Context Protocol)
4.5.1 MCP是什么
MCP是Anthropic提出的模型上下文协议,解决AI工具的标准化问题:
- 一次开发,所有支持MCP的模型/框架都能使用
- 工具可以独立部署、跨语言调用
- 支持动态发现工具能力
4.5.2 Java集成MCP
xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-mcp</artifactId>
<version>1.0.0-beta1</version>
</dependency>
java
// 连接MCP服务器
McpTransport transport = new StdioMcpTransport.Builder()
.command("npx")
.args("-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir")
.build();
McpClient mcpClient = new DefaultMcpClient.Builder()
.transport(transport)
.build();
// 将MCP工具提供给AI服务
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(chatModel)
.tools(mcpClient.tools()) // 自动发现所有MCP工具
.build();
第五部分:本地模型部署与推理
5.1 Ollama本地大模型
5.1.1 快速开始
bash
# 1. 安装Ollama
curl -fsSL https://ollama.com/install.sh | sh
# 2. 拉取模型(推荐中文模型)
ollama pull qwen2.5:7b # 通义千问7B,中文优秀
ollama pull bge-m3 # 中文向量模型
ollama pull nomic-embed-text # 英文向量模型
# 3. 运行
ollama run qwen2.5:7b
5.1.2 Spring AI集成Ollama
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
yaml
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
options:
model: qwen2.5:7b
temperature: 0.7
5.1.3 性能优化
bash
# GPU加速(自动检测,如未生效手动指定)
OLLAMA_LLM_LIBRARY=cuda_v12 ollama serve
# 模型量化选择
# q4_0: 最快,最小,质量损失可接受(推荐)
# q5_0: 平衡
# q8_0: 高质量,内存占用大
# f16: 无损,内存占用最大
# 调整并发数
OLLAMA_NUM_PARALLEL=2 ollama serve
5.2 DJL纯Java模型推理
5.2.1 DJL优势
- 零Python依赖:纯Java,一个Jar包搞定
- 多引擎支持:PyTorch、TensorFlow、ONNX Runtime、MXNet
- 自动GPU加速:自动检测CUDA、ROCm
- 模型自动下载:从HuggingFace自动拉取模型
5.2.2 本地运行Qwen模型
xml
<dependency>
<groupId>ai.djl</groupId>
<artifactId>api</artifactId>
<version>0.28.0</version>
</dependency>
<dependency>
<groupId>ai.djl.onnxruntime</groupId>
<artifactId>onnxruntime-engine</artifactId>
<version>0.28.0</version>
</dependency>
java
// 纯Java加载Qwen-7B ONNX模型进行推理
Criteria<String, String> criteria = Criteria.builder()
.setInputTypes(String.class)
.setOutputTypes(String.class)
.optModelUrls("djl://ai.djl.huggingface.onnxruntime/Qwen/Qwen2.5-7B-Instruct")
.optEngine("OnnxRuntime")
.optOption("quantize", "true") // 启用量化
.optOption("gpuCount", "1") // 使用GPU
.build();
try (ZooModel<String, String> model = criteria.loadModel();
Predictor<String, String> predictor = model.newPredictor()) {
String response = predictor.predict("你好,请介绍一下你自己");
System.out.println(response);
}
5.3 ONNX Runtime Java API
5.3.1 基础使用
java
// 创建ONNX Runtime环境
OrtEnvironment env = OrtEnvironment.getEnvironment();
OrtSession.SessionOptions opts = new OrtSession.SessionOptions();
opts.setIntraOpNumThreads(Runtime.getRuntime().availableProcessors());
opts.setOptimizationLevel(OrtSession.SessionOptions.OptLevel.ALL_OPT);
// GPU加速(如有)
opts.addCUDA(0);
// 加载模型
OrtSession session = env.createSession("model.onnx", opts);
// 准备输入
long[] shape = {1, 128};
long[] inputIds = tokenizer.encode("你好");
OnnxTensor tensor = OnnxTensor.createTensor(env, LongBuffer.wrap(inputIds), shape);
// 推理
Map<String, OnnxTensor> inputs = Map.of("input_ids", tensor);
OrtSession.Result results = session.run(inputs);
// 处理输出
float[][] logits = (float[][]) results.get(0).getValue();
5.3.2 生产环境优化
java
// 1. Session对象池(Session创建昂贵,且线程安全)
private final GenericObjectPool<OrtSession> sessionPool;
// 2. 动态批处理
// 3. 输入输出Tensor复用
// 4. 使用IO Binding减少内存拷贝
第六部分:企业级工程化实践
6.1 从Demo到生产的5道关卡
| 关卡 | 常见坑 | 正确做法 |
|---|---|---|
| ① 模型选型 | 盲目用GPT-4,成本爆炸 | 分级路由:简单任务用小模型,复杂任务才用大模型 |
| ② 错误处理 | 网络异常、限流、超时直接崩 | 重试机制、降级策略、熔断保护 |
| ③ 成本控制 | Token滥用、无缓存 | Token计数、结果缓存、Prompt压缩 |
| ④ 可观测性 | 黑盒调用,出问题无法排查 | 全链路日志、Token统计、延迟监控 |
| ⑤ 安全防护 | Prompt注入、数据泄露 | 输入校验、输出过滤、敏感数据脱敏 |
6.2 可观测性体系
java
// 1. AI调用拦截器
@Component
public class AiObservabilityInterceptor implements Advisor {
private final MeterRegistry meterRegistry;
@Override
public AdvisedResponse advise(AdvisedRequest request, AdvisorChain chain) {
long start = System.currentTimeMillis();
Timer.Sample sample = Timer.start(meterRegistry);
try {
AdvisedResponse response = chain.next(request);
// 记录指标
sample.stop(Timer.builder("ai.request.duration")
.tag("model", request.chatModel().toString())
.tag("status", "success")
.register(meterRegistry));
// 记录Token使用
ChatResponseMetadata metadata = response.response().getMetadata();
meterRegistry.counter("ai.token.usage",
"type", "prompt",
"model", request.chatModel().toString()
).increment(metadata.getUsage().getPromptTokens());
// 记录完整对话日志(脱敏后)
log.info("AI Request: {} | Response: {} | Tokens: {}",
脱敏(request.userText()),
脱敏(response.content()),
metadata.getUsage().getTotalTokens());
return response;
} catch (Exception e) {
sample.stop(Timer.builder("ai.request.duration")
.tag("model", request.chatModel().toString())
.tag("status", "error")
.tag("error", e.getClass().getSimpleName())
.register(meterRegistry));
throw e;
}
}
}
6.3 高可用设计
java
// 1. 多模型故障自动切换
@Bean
public ChatModel failoverChatModel(
@Qualifier("qwenChatModel") ChatModel primary,
@Qualifier("deepseekChatModel") ChatModel secondary,
@Qualifier("openAiChatModel") ChatModel tertiary) {
return new FailoverChatModel(primary, secondary, tertiary);
}
// 2. 限流保护
@Bean
public ChatClient rateLimitedChatClient(ChatClient.Builder builder) {
return builder
.defaultAdvisors(
new RateLimiterAdvisor(
RateLimiter.create(10), // QPS限制
Duration.ofSeconds(30) // 超时
)
)
.build();
}
// 3. 结果缓存
@Cacheable(value = "aiResponses", key = "#query", unless = "#result == null")
public String getCachedResponse(String query) {
return chatClient.prompt().user(query).call().content();
}
// 4. 线程池隔离
@Bean("aiThreadPool")
public ThreadPoolTaskExecutor aiThreadPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(50);
executor.setQueueCapacity(100);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setThreadNamePrefix("ai-exec-");
return executor;
}
6.4 安全防护
6.4.1 Prompt注入防御
java
@Component
public class PromptInjectionGuard implements Advisor {
private static final List<String> INJECTION_PATTERNS = List.of(
"忽略之前的指令",
"ignore previous instructions",
"你现在是",
"忘记你是",
"system prompt"
);
@Override
public AdvisedResponse advise(AdvisedRequest request, AdvisorChain chain) {
String userText = request.userText().toLowerCase();
// 1. 简单规则检测
for (String pattern : INJECTION_PATTERNS) {
if (userText.contains(pattern.toLowerCase())) {
throw new SecurityException("检测到潜在的Prompt注入攻击");
}
}
// 2. LLM二次检测(高安全场景)
// 3. 输入长度限制
if (request.userText().length() > 2000) {
throw new IllegalArgumentException("输入过长");
}
return chain.next(request);
}
}
6.4.2 敏感数据处理
java
// 发送给LLM前脱敏
public String desensitize(String text) {
// 手机号脱敏
text = text.replaceAll("(1[3-9]\\d)\\d{4}(\\d{4})", "$1****$2");
// 身份证号脱敏
text = text.replaceAll("(\\d{6})\\d{8}(\\d{4})", "$1********$2");
// 邮箱脱敏
text = text.replaceAll("(\\w{2})\\w+(@\\w+\\.\\w+)", "$1***$2");
// 银行卡号脱敏
return text;
}
第七部分:项目实战路线
7.1 30天入门实战计划
| 阶段 | 时间 | 目标 | 实战内容 |
|---|---|---|---|
| Week 1 | Day 1-7 | 跑通基础对话 | Spring AI + 通义千问实现流式对话接口 |
| Week 2 | Day 8-14 | 掌握核心能力 | Prompt模板 + 对话记忆 + Function Calling |
| Week 3 | Day 15-21 | RAG知识库 | 文档解析 + 向量数据库 + 知识库问答 |
| Week 4 | Day 22-30 | Agent实战 | 多工具调用 + ReAct Agent + 企业系统集成 |
7.2 实战项目梯度
入门级项目:智能客服助手
- 技术栈:Spring Boot + Spring AI + 通义千问
- 核心功能 :
- 多轮对话(带记忆)
- 常见问题自动回答
- 订单查询(Function Calling)
- 转人工逻辑
- 学习点:ChatClient、Prompt模板、工具调用、对话记忆
进阶级项目:企业知识库问答
- 技术栈:LangChain4j + pgvector + Redis + Ollama
- 核心功能 :
- PDF/Word/Markdown文档上传解析
- 自动分片、向量化、存储
- 混合检索 + Rerank重排序
- 溯源引用(回答标注来源文档)
- 对话历史持久化
- 学习点:RAG全流程、向量数据库、文档处理、检索优化
高级项目:AI智能体平台
- 技术栈:Spring AI Alibaba + MCP + Milvus + vLLM
- 核心功能 :
- 多Agent协作(研究员+程序员+审核员)
- MCP工具市场(动态加载工具)
- 工作流编排(可视化拖拽)
- 多模型路由(自动选择最合适的模型)
- 私有化模型部署
- 学习点:Agent架构、MCP协议、工作流编排、多模型管理
7.3 开源项目参考
| 项目 | Stars | 特点 |
|---|---|---|
| spring-ai | 20k+ | Spring官方,必学 |
| langchain4j | 10k+ | Java AI事实标准 |
| spring-ai-alibaba | 5k+ | 国产大模型最佳实践 |
| JChatMind | 2k+ | Java Agent完整项目 |
| chatgpt-java | 10k+ | OpenAI Java SDK |
第八部分:性能优化与生产部署
8.1 Token成本优化
| 优化手段 | 效果 | 实施难度 |
|---|---|---|
| 模型分级 | 成本降低50%-80% | 低 |
| Prompt压缩 | Token减少30%-50% | 低 |
| 结果缓存 | 重复请求成本为0 | 低 |
| 上下文精简 | Token减少20%-40% | 中 |
| RAG精准检索 | 减少无关上下文 | 中 |
| 模型微调 | 小模型达到大模型效果 | 高 |
java
// Prompt压缩:使用LLM总结历史对话
public List<Message> compressHistory(List<Message> history, int maxTokens) {
if (tokenCounter.countTokens(history) <= maxTokens) {
return history;
}
String summary = chatClient.prompt()
.user("总结以下对话,保留关键信息,不超过200字:" + history)
.call()
.content();
return List.of(new SystemMessage("对话摘要:" + summary));
}
8.2 延迟优化
优化方向:
├── 客户端侧
│ ├── 流式输出(首字节延迟降低90%)
│ ├── HTTP连接池复用
│ ├── 本地缓存热点结果
│ └── 并行调用多个工具
├── 服务端侧
│ ├── 选择更近的API端点
│ ├── 使用更小的模型
│ ├── 减少上下文长度
│ └── 模型推理批处理
└── 网络侧
├── API专线/代理
├── HTTP/2多路复用
└── 超时与重试优化
8.3 JVM调优参数
bash
# AI应用推荐JVM参数
java \
-Xms4g -Xmx4g \
-XX:+UseZGC \ # ZGC低延迟
-XX:MaxGCPauseMillis=50 \
-XX:+ZGenerational \
-XX:InitialRAMPercentage=50 \
-XX:MaxRAMPercentage=75 \
-Djava.net.preferIPv4Stack=true \
-Djdk.httpclient.connectionPoolSize=200 \
-Djdk.httpclient.keepalive.timeout=300 \
-jar ai-application.jar
8.4 Docker部署
dockerfile
FROM eclipse-temurin:21-jre-jammy
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY target/*.jar app.jar
# JVM参数环境变量
ENV JAVA_OPTS="\
-XX:+UseZGC \
-XX:MaxRAMPercentage=75 \
-Djava.security.egd=file:/dev/./urandom"
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
第九部分:进阶学习资源
9.1 官方文档
- Spring AI:https://docs.spring.io/spring-ai/reference/
- LangChain4j:https://docs.langchain4j.dev/
- Spring AI Alibaba:https://java2ai.com/docs/intro/
- DJL:https://docs.djl.ai/
- ONNX Runtime:https://onnxruntime.ai/docs/get-started/with-java
9.2 关键技术深度
| 领域 | 学习重点 |
|---|---|
| 大模型原理 | Transformer架构、注意力机制、Tokenizer原理 |
| RAG进阶 | 高级分片策略、混合检索、Rerank、Graph RAG |
| Agent | ReAct、Reflexion、Plan-and-Execute、多Agent协作 |
| 模型部署 | vLLM、TensorRT-LLM、量化技术(GPTQ/AWQ/GGUF) |
| 评估体系 | RAGAS、ARES、LLM-as-Judge、自动化评估 |
9.3 学习建议
- 动手为王:不要只看教程,每学一个知识点就写代码验证
- 从小做起:先做一个能跑的Demo,再逐步优化,不要一开始就追求完美架构
- 关注社区:Java AI发展很快,每周都有新特性,关注GitHub和官方博客
- 阅读源码:Spring AI和LangChain4j的源码质量很高,是最好的学习材料
- 结合业务:用AI解决你工作中的实际问题,这是最快的学习方式
最后提醒:AI技术迭代极快,但核心思想(抽象、编排、工程化)是通用的。掌握框架设计思想,比死记API更重要。Java在AI工程化领域的优势才刚刚显现,这是Java开发者的新机遇。
本笔记持续更新中,建议收藏并定期回顾。如有疑问或建议,欢迎交流。