共计 3696 个字符,预计需要花费 10 分钟才能阅读完成。
技术背景
ChatGPT API 的开放让开发者可以轻松将智能对话能力集成到自己的应用中。典型的应用场景包括:

- 智能客服系统
- 内容生成辅助工具
- 代码自动补全
- 语言翻译服务
SpringBoot 作为 Java 领域最流行的微服务框架,其自动配置特性和丰富的 starter 生态,使得集成第三方 API 变得异常简单。通过合理的模块设计,我们可以实现:
- 快速接入
- 易于维护
- 生产级稳定性
前置准备
1. 获取 OpenAI API Key
- 访问 OpenAI 平台
- 注册 / 登录账号
- 进入 API Keys 页面
- 点击 ”Create new secret key”
- 安全保存生成的密钥
2. 项目依赖配置
在 pom.xml 中添加以下依赖:
<dependencies>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- OpenAI Java Client (可选) -->
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>client</artifactId>
<version>0.12.0</version>
</dependency>
<!-- 如果你选择使用 WebClient -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
</dependencies>
核心实现
基础通信模块
使用 RestTemplate 实现
@Configuration
public class ChatConfig {@Value("${openai.api.key}")
private String apiKey;
@Bean
public RestTemplate restTemplate() {RestTemplate restTemplate = new RestTemplate();
// 添加认证拦截器
restTemplate.getInterceptors().add((request, body, execution) -> {request.getHeaders().add("Authorization", "Bearer" + apiKey);
request.getHeaders().add("Content-Type", "application/json");
return execution.execute(request, body);
});
return restTemplate;
}
}
请求与响应 DTO
@Data
public class ChatRequest {
private String model = "gpt-3.5-turbo";
private List<Message> messages;
private double temperature = 0.7;
@Data
public static class Message {
private String role;
private String content;
}
}
@Data
public class ChatResponse {
private String id;
private String object;
private long created;
private List<Choice> choices;
@Data
public static class Choice {
private int index;
private Message message;
private String finishReason;
}
}
异常处理
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(HttpClientErrorException.class)
public ResponseEntity<String> handleOpenAIException(HttpClientErrorException ex) {
// OpenAI API 错误通常会在响应体中包含详细信息
return ResponseEntity.status(ex.getStatusCode())
.body("OpenAI API 错误:" + ex.getResponseBodyAsString());
}
@ExceptionHandler(ResourceAccessException.class)
public ResponseEntity<String> handleTimeout(ResourceAccessException ex) {return ResponseEntity.status(HttpStatus.GATEWAY_TIMEOUT)
.body("连接 OpenAI 超时:" + ex.getMessage());
}
}
流式响应处理
public Flux<String> streamChatCompletion(ChatRequest request) {
// 设置 stream=true
request.setStream(true);
return WebClient.create("https://api.openai.com")
.post()
.uri("/v1/chat/completions")
.header("Authorization", "Bearer" + apiKey)
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(request)
.retrieve()
.bodyToFlux(String.class)
.timeout(Duration.ofSeconds(30))
.onErrorResume(e -> Flux.just("Error:" + e.getMessage()));
}
生产级优化
连接池配置
# application.yml
spring:
webclient:
exchange:
max-in-memory-size: 10MB
http:
pool:
max-connections: 50
max-idle-time: 30s
超时和重试策略
@Bean
public WebClient webClient(WebClient.Builder builder) {
return builder
.baseUrl("https://api.openai.com")
.clientConnector(new ReactorClientHttpConnector(HttpClient.create()
.responseTimeout(Duration.ofSeconds(30))
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
))
.filter(ExchangeFilterFunctions
.retry(3, retryEx -> retryEx instanceof TimeoutException))
.build();}
敏感信息加密
- 使用 Jasypt 加密 API Key
- 在启动时传入解密密码:
java -jar -Djasypt.encryptor.password=yourpassword app.jar - 配置文件中使用 ENC() 包裹加密值:
openai: api: key: ENC(加密后的 API Key)
避坑指南
Token 计算误区
- 输入和输出都计入 Token 消耗
- 不同模型有不同的 Token 限制(gpt-3.5-turbo 是 4096)
- 中文通常比英文占用更多 Token
解决方案:
// 使用 OpenAI 的 tiktoken 库计算
int tokenCount = encoding.encode(prompt).size();
异步上下文丢失
在异步处理中,ThreadLocal 变量会丢失。解决方案:
// 使用 Reactor 的 Context
Mono.deferContextual(ctx -> {String traceId = ctx.get("traceId");
// 处理请求
});
GDPR 合规要点
- 用户数据不永久存储
- 提供数据删除接口
- API 调用日志去标识化
延伸思考
- 监控集成 :结合 Spring Boot Actuator 暴露 API 调用指标
- 增强链 :集成 LangChain 实现多步推理
- 缓存优化 :对常见问题答案做本地缓存
总结
通过上述步骤,我们快速实现了 SpringBoot 与 ChatGPT API 的集成。关键点包括:
- 选择合适的 HTTP 客户端(RestTemplate/WebClient)
- 完善的异常处理和日志记录
- 生产环境的安全和性能考量
完整示例代码已上传 GitHub,欢迎参考和指正。在实际项目中,建议根据业务需求进一步封装,例如添加对话历史管理、支持多轮对话等高级功能。
正文完
发表至: 技术分享
2026年3月29日