魔神公寓
94.55M · 2026-04-07
作为Java老兵,你肯定熟悉Spring Boot那一套:依赖注入、AOP、自动配置。Spring AI就是Spring生态里的AI集成框架,让你用Spring的思维方式接入大模型。
好处显而易见:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
spring:
application:
name: spring-ai-demo
ai:
openai:
api-key: ${OPENAI_API_KEY}
model: gpt-4o
@RestController
@RequestMapping("/ai")
public class AiController {
private final ChatClient chatClient;
public AiController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
访问 你好,看看返回什么?
实际项目中,Prompt往往很复杂,这时候用PromptTemplate更灵活:
@GetMapping("/review")
public String codeReview(@RequestParam String code) {
PromptTemplate template = new PromptTemplate("""
你是一个资深代码审查员。请审查以下Java代码,指出问题:
```java
{code}
```
请从以下维度评审:
1. 代码性能
2. 潜在bug
3. 代码规范
4. 安全性
""");
Prompt prompt = template.create(Map.of("code", code));
return chatClient.prompt(prompt)
.call()
.content();
}
很多场景需要AI返回结构化数据,Spring AI提供了实体映射:
public class CodeReviewResult {
private String performance;
private String bugs;
private String specification;
private String security;
private int score; // 1-10
// getters and setters
}
@GetMapping("/review-json")
public CodeReviewResult codeReviewJson(@RequestParam String code) {
return chatClient.prompt()
.system("你是一个资深代码审查员。返回JSON格式。")
.user(code)
.call()
.entity(CodeReviewResult.class);
}
返回示例:
{
"performance": "建议使用StringBuilder替代字符串拼接",
"bugs": "存在空指针风险,建议增加判空",
"specification": "方法命名不符合驼峰规范",
"security": "未做SQL注入防护",
"score": 6
}
RAG(检索增强生成)是现在最火的AI应用模式,Spring AI也支持:
spring:
ai:
postgres:
vector-store:
distance-type: COSINE_DISTANCE
dimension: 1536
@Service
public class DocumentService {
private final VectorStore vectorStore;
private final ChatClient chatClient;
// 文档入库
public void loadDocuments(String content) {
TextSplitter splitter = new TextSplitter(500, 100);
List<Document> docs = splitter.split(content);
vectorStore.add(docs);
}
// 检索相关文档
public String retrieve(String query) {
List<Document> results = vectorStore.similaritySearch(query);
return results.stream()
.map(Document::getContent)
.collect(Collectors.joining("n"));
}
}
@GetMapping("/rag-chat")
public String ragChat(@RequestParam String question) {
// 1. 检索相关文档
String context = documentService.retrieve(question);
// 2. 构建带上下文的Prompt
PromptTemplate template = new PromptTemplate("""
基于以下资料回答问题。如果资料不够,说"我没有足够信息"。
资料:
{context}
问题:{question}
""");
Prompt prompt = template.create(Map.of(
"context", context,
"question", question
));
// 3. 调用AI
return chatClient.prompt(prompt).call().content();
}
这是Spring AI的杀手级功能——AI可以调用你写好的Java方法!
@Component
public class WeatherService {
@Bean
public ChatClient.ToolContext weatherTool() {
return ChatClient.Builder.getObjectMapper(); // 简化示例
}
@Tool(name = "get_weather", description = "获取城市天气")
public String getWeather(@P("city") String city) {
// 实际项目中这里调天气API
return city + "今天晴天,25度,适宜跑步";
}
}
@GetMapping("/weather-chat")
public String weatherChat(@RequestParam String city) {
return chatClient.prompt()
.system("你是一个天气助手。可以调用工具获取实时天气。")
.user(city + "今天天气怎么样?适合跑步吗?")
.tools(new WeatherService().weatherTool())
.call()
.content();
}
AI会自动判断什么时候该调用get_weather方法!
spring-ai-demo/
├── src/main/java/com/example/ai/
│ ├── controller/
│ │ └── AiController.java
│ ├── service/
│ │ ├── ChatService.java
│ │ └── DocumentService.java
│ ├── tools/
│ │ └── WeatherService.java
│ ├── model/
│ │ └── CodeReviewResult.java
│ └── config/
│ └── AiConfig.java
├── src/main/resources/
│ ├── application.yml
│ └── prompts/
│ └── code-review.st
└── pom.xml
| 坑 | 解决方案 |
|---|---|
| API Key泄露 | 用环境变量 ${OPENAI_API_KEY},别写死在代码里 |
| Token超限 | 限制输入长度,用TextSplitter切分长文本 |
| 响应慢 | 加超时配置,开启流式响应(stream()) |
| 中文乱码 | 确保Prompt和解析编码一致 |
| 费用暴增 | 限制max_tokens,加调用次数限制 |
第一周:跑通官方示例,理解ChatClient基本用法
第二周:Prompt模板、结构化输出
第三周:Embedding + 向量数据库
第四周:Function Calling + RAG实战
Spring AI让Java程序员用熟悉的姿势进入AI时代:
关键是动手做。看完这篇文章,你的第一步应该是:建个项目,跑通第二章的第一个例子。
有问题欢迎留言探讨!我是Java老兵,也是AI小学生,一起进步