一、SpringAI快速入门指南
1.1 三步接入OpenAI
// build.gradle
dependencies {
implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter:0.8.0'
}
// 核心调用代码
@RestController
public class AIController {
@Autowired
private OpenAiChatClient chatClient;
@GetMapping("/ask")
public String ask(String question) {
return chatClient.call(question); // 实际仅需1行代码
}
}
1.2 多模型支持配置
# application.yml
spring:
ai:
openai:
api-key: ${OPENAI_KEY}
qianwen:
access-key: ${QW_ACCESS_KEY}
secret-key: ${QW_SECRET_KEY}
二、企业级Prompt工程模板
2.1 角色预设模板
@Bean
public PromptTemplate rolePrompt() {
String template = """
你是一位资深Java架构师,请用中文回答技术问题。
要求:
1. 使用Markdown格式
2. 包含代码示例
3. 给出适用场景说明
问题:{question}
""";
return new PromptTemplate(template);
}
2.2 结构化输出控制
@GetMapping("/design")
public String systemDesign(String requirement) {
Prompt prompt = new Prompt(new UserMessage(requirement),
new PromptOptions(List.of(
new GenerationOptions.Builder()
.withTemperature(0.3)
.withMaxTokens(1000)
.build()
)));
return chatClient.call(prompt).getResult().getOutput().getContent();
}
三、流式响应实现
3.1 类ChatGPT效果实现
@GetMapping(path = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(String question) {
return Flux.create(sink -> {
chatClient.stream(new Prompt(question))
.subscribe(chatResponse -> {
chatResponse.getResults().forEach(result ->
sink.next(result.getOutput().getContent())
);
}, sink::error, sink::complete);
});
}
3.2 前端对接方案
// React示例
const eventSource = new EventSource('/stream?question=' + question);
eventSource.onmessage = (e) => {
setContent(prev => prev + e.data);
};
四、企业级AI中台架构
4.1 LangChain+本地知识库
4.2 向量数据库集成
// Spring Data ChromaDB示例
@Repository
public interface DocRepository extends ChromaRepository<Document, String> {
List<Document> findByEmbeddingSimilarity(float[] vector, int topK);
}
@Service
public class RetrievalService {
public String query(String question) {
float[] embedding = embeddingClient.embed(question);
return docRepository.findByEmbeddingSimilarity(embedding, 3)
.stream().map(Document::getContent).collect(Collectors.joining("\n"));
}
}
五、成本控制策略
5.1 计费监控看板
指标 | 计算公式 | 报警阈值 |
---|---|---|
单日费用 | ∑(token数 × 单价) | >$50/天 |
平均token/请求 | 总token数 / 请求数 | >2000 |
错误成本 | 失败请求数 × 平均token成本 | >$5/天 |
5.2 分级限流策略
@Configuration
public class RateLimitConfig {
@Bean
public RateLimiter openaiLimiter() {
return RateLimiter.create(100); // 100 QPM
}
@Bean
public RateLimiter qianwenLimiter() {
return RateLimiter.create(500); // 500 QPM
}
}
六、开源替代方案(本地部署)
6.1 Ollama本地部署
# 启动Ollama服务
docker run -d -v /data/ollama:/root/.ollama -p 11434:11434 ollama/ollama
# 下载中文模型
ollama pull qwen:7b-chat
# SpringBoot配置
spring.ai.ollama.base-url=http://localhost:11434
spring.ai.ollama.model=qwen:7b-chat
6.2 性能对比
指标 | OpenAI GPT-4 | 通义千问 | Ollama本地 |
---|---|---|---|
响应时间 | 420ms | 380ms | 2100ms |
准确率 | 92% | 88% | 76% |
单次成本 | $0.06 | $0.02 | $0.0 |
最大token | 128k | 10k | 4k |
七、实战选择题
❓ 当需要处理专业领域知识时,最优方案是:
A) 直接调用GPT-4
B) 本地模型微调
C) LangChain+向量检索
D) 人工编写规则引擎
下期预告:
《SpringBoot 3.2虚拟线程压测:Tomcat吞吐量提升800%的奥秘》