一、环境准备与技术选型
开发环境要求:
- JDK 17+
- Spring Boot 3.2.x
- Maven/Gradle
技术栈组成:
Spring Web → 构建RESTful API
Lombok → 简化代码结构
OkHttp → 处理HTTP请求
Jackson → JSON序列化
二、DeepSeek API快速入门
1. 获取API密钥
- 访问DeepSeek开发者平台
- 创建应用 → 记录
API Key
(如sk-3b5a7d...
)
2. API基础调用
请求示例:
curl https://api.deepseek.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-chat",
"messages": [{"role": "user", "content": "你好"}]
}'
响应结构:
{
"choices": [{
"message": {
"content": "您好!有什么可以帮助您的?"
}
}]
}
三、Spring Boot集成步骤
1. 项目初始化
pom.xml关键依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
2. 配置封装类
@Data
@Configuration
@ConfigurationProperties(prefix = "deepseek")
public class DeepSeekConfig {
private String apiKey;
private String apiUrl = "https://api.deepseek.com/v1/chat/completions";
}
3. 核心服务类实现
@Service
@RequiredArgsConstructor
public class DeepSeekService {
private final DeepSeekConfig config;
private final ObjectMapper objectMapper;
public String generateText(String prompt) throws IOException {
OkHttpClient client = new OkHttpClient();
// 构建请求体
Map<String, Object> body = new HashMap<>();
body.put("model", "deepseek-chat");
body.put("messages", List.of(Map.of(
"role", "user",
"content", prompt
)));
Request request = new Request.Builder()
.url(config.getApiUrl())
.header("Authorization", "Bearer " + config.getApiKey())
.post(RequestBody.create(
objectMapper.writeValueAsString(body),
MediaType.parse("application/json")
))
.build();
// 处理响应
try (Response response = client.newCall(request).execute()) {
JsonNode root = objectMapper.readTree(response.body().string());
return root.path("choices")
.get(0)
.path("message")
.path("content")
.asText();
}
}
}
四、进阶功能实现
1. 流式响应处理
public void streamGenerate(String prompt, OutputStream output) throws IOException {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(config.getApiUrl())
.header("Authorization", "Bearer " + config.getApiKey())
.post(new RequestBody() {
@Override public MediaType contentType() {
return MediaType.parse("application/json");
}
@Override public void writeTo(BufferedSink sink) throws IOException {
String json = objectMapper.writeValueAsString(Map.of(
"model", "deepseek-chat",
"messages", List.of(Map.of("role", "user", "content", prompt)),
"stream", true
));
sink.writeUtf8(json);
}
})
.build();
try (Response response = client.newCall(request).execute()) {
InputStream is = response.body().byteStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null) {
if (line.startsWith("data: ")) {
String data = line.substring(6);
if (data.equals("[DONE]")) break;
JsonNode node = objectMapper.readTree(data);
String content = node.path("choices")
.get(0)
.path("delta")
.path("content")
.asText();
output.write(content.getBytes());
output.flush();
}
}
}
}
2. 异常处理增强
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(IOException.class)
public ResponseEntity<String> handleIOException(IOException ex) {
return ResponseEntity.status(500)
.body("API请求失败: " + ex.getMessage());
}
@ExceptionHandler(DeepSeekException.class)
public ResponseEntity<Map<String, Object>> handleDeepSeekError(DeepSeekException ex) {
return ResponseEntity.status(ex.getStatusCode())
.body(Map.of(
"error", ex.getErrorCode(),
"message", ex.getMessage()
));
}
}
五、最佳实践建议
1. 性能优化方案
-
连接池配置:
OkHttpClient client = new OkHttpClient.Builder() .connectionPool(new ConnectionPool(5, 5, TimeUnit.MINUTES)) .build();
-
请求超时设置:
.connectTimeout(30, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS)
2. 安全防护措施
-
API密钥加密存储:
@ConfigurationProperties(prefix = "deepseek") public class DeepSeekConfig { private String encryptedKey; public String getApiKey() { return DecryptUtil.decrypt(encryptedKey); // 自定义解密方法 } }
-
请求频率限制:
@RateLimiter(name = "deepseekApi", rate = 100) // 使用Resilience4j public String generateText(String prompt) { ... }
六、完整项目结构
src/main/java
├── config
│ └── DeepSeekConfig.java # 配置类
├── controller
│ └── AIController.java # API接口
├── exception
│ └── GlobalExceptionHandler.java # 异常处理
├── service
│ └── DeepSeekService.java # 核心逻辑
└── Application.java # 启动类
GitHub示例代码
七、常见问题解答
Q1:如何处理API返回的429错误?
A:实现指数退避重试机制:
public String generateWithRetry(String prompt) {
int retries = 0;
while (retries < 3) {
try {
return generateText(prompt);
} catch (DeepSeekException ex) {
if (ex.getStatusCode() == 429) {
Thread.sleep((long) Math.pow(2, retries) * 1000);
retries++;
} else throw ex;
}
}
throw new RuntimeException("超出最大重试次数");
}
Q2:如何提升生成内容质量?
A:优化Prompt工程:
String prompt = """
你是一位经验丰富的技术文档工程师,请根据以下要求生成内容:
1. 使用中文技术术语
2. 包含代码示例(语言:Java)
3. 分章节结构输出
主题:%s
""".formatted(topic);
下一步学习建议:
- 阅读DeepSeek官方API文档
- 尝试集成内容审核API
- 探索与Spring AI框架的整合方案