SpringBoot整合DeepSeek技术指南(2025版)

环境准备
<dependency>
<groupId>com.deepseek</groupId>
<artifactId>deepseek-java-sdk</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
配置中心设置
deepseek:
api:
base-url: https://api.deepseek.com/v2
token: ${DEEPSEEK_API_KEY}
timeout: 10000
retry:
max-attempts: 3
backoff: 2000
核心服务类实现
@Service
@Slf4j
public class DeepseekService {
@Value("${deepseek.api.base-url}")
private String baseUrl;
@Value("${deepseek.api.token}")
private String apiToken;
private final WebClient webClient;
public DeepseekService(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl(baseUrl)
.defaultHeader("Authorization", "Bearer " + apiToken)
.build();
}
public Mono<String> generateContent(DeepseekRequest request) {
return webClient.post()
.uri("/generate")
.bodyValue(request)
.retrieve()
.bodyToMono(DeepseekResponse.class)
.timeout(Duration.ofMillis(10000))
.retryWhen(Retry.backoff(3, Duration.ofSeconds(2)))
.map(response -> {
if (response.getCode() != 200) {
throw new DeepseekException(response.getMsg());
}
return response.getData().getText();
});
}
}
异常处理增强
@RestControllerAdvice
public class DeepseekExceptionHandler {
@ExceptionHandler(DeepseekException.class)
public ResponseEntity<ErrorResult> handleDeepseekException(DeepseekException ex) {
ErrorResult error = new ErrorResult("DEEPSEEK_ERROR",
"AI服务异常: " + ex.getMessage());
return ResponseEntity.status(502).body(error);
}
@ExceptionHandler(WebClientResponseException.class)
public ResponseEntity<ErrorResult> handleWebClientException(WebClientResponseException ex) {
ErrorResult error = new ErrorResult("NETWORK_ERROR",
"接口通信失败: " + ex.getStatusCode());
return ResponseEntity.status(503).body(error);
}
}
实际应用场景
场景1:自动生成文章草稿
@PostMapping("/generate-article")
public Mono<ResponseEntity<String>> generateArticle(@RequestBody ArticleRequest request) {
String prompt = String.format("生成一篇关于%s的技术文章,包含以下要素:%s",
request.getTopic(),
String.join(",", request.getKeywords()));
DeepseekRequest deepseekRequest = new DeepseekRequest(
prompt,
"technical_writing",
0.7,
1024
);
return deepseekService.generateContent(deepseekRequest)
.map(content -> {
String formatted = ContentFormatter.formatMarkdown(content);
return ResponseEntity.ok(formatted);
});
}
场景2:智能内容优化
@PostMapping("/optimize-content")
public Mono<ResponseEntity<ContentOptimization>> optimizeContent(
@RequestBody String rawContent) {
String optimizationPrompt = "优化以下内容使其更符合新媒体传播:\n" + rawContent;
return deepseekService.generateContent(
new DeepseekRequest(optimizationPrompt, "content_optimization", 0.5, 512))
.zipWith(deepseekService.generateContent(
new DeepseekRequest("生成5个爆款标题", "title_generation", 0.9, 128)))
.map(tuple -> {
ContentOptimization result = new ContentOptimization();
result.setOptimizedContent(tuple.getT1());
result.setTitles(Arrays.asList(tuple.getT2().split("\n")));
return ResponseEntity.ok(result);
});
}
测试方案
@SpringBootTest
class DeepseekServiceTest {
@Autowired
private DeepseekService deepseekService;
@Test
void testTechnicalWriting() {
DeepseekRequest request = new DeepseekRequest(
"用Java解释量子计算基础",
"technical_writing",
0.6,
800
);
StepVerifier.create(deepseekService.generateContent(request))
.assertNext(content -> {
assertTrue(content.contains("量子比特"));
assertTrue(content.length() > 500);
})
.verifyComplete();
}
}
性能优化建议
- 使用
@Cacheable
对重复请求进行缓存
- 配置Hystrix熔断机制(QPS超过50时建议启用)
- 批量请求使用Deepseek的Batch API
- 异步日志记录采用Disruptor模式