简介:本文通过Spring Boot与Spring AI深度整合,系统讲解如何从零开发基于DeepSeek的智能应用,涵盖环境搭建、模型集成、API调用、业务场景实现及性能优化全流程。
在AI应用开发中,技术栈的选择直接影响开发效率与系统性能。Spring Boot凭借其”约定优于配置”的特性,可快速构建企业级Web服务;Spring AI作为Spring生态的AI扩展模块,天然支持主流大模型(如DeepSeek、GPT系列)的无缝集成;而DeepSeek作为国内领先的开源大模型,在中文理解、多轮对话等场景表现优异。三者结合可实现”开发快、集成易、效果好”的智能应用。
典型的三层架构包含:
通过SpringAITemplate实现与DeepSeek的交互,示例配置如下:
@Configurationpublic class SpringAiConfig {@Beanpublic SpringAITemplate springAiTemplate(AIClient aiClient) {return new SpringAITemplate(aiClient);}@Beanpublic AIClient aiClient() {return AIClient.builder().apiKey("YOUR_DEEPSEEK_API_KEY").baseUrl("https://api.deepseek.com").build();}}
使用Spring Initializr快速生成项目:
curl https://start.spring.io/starter.zip \-d type=maven-project \-d language=java \-d bootVersion=3.2.0 \-d groupId=com.example \-d artifactId=spring-ai-demo \-d name=spring-ai-demo \-d dependencies=web,spring-ai \-o demo.zip
核心依赖(Maven示例):
<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring AI Starter --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter</artifactId><version>0.7.0</version></dependency><!-- JSON处理 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency></dependencies>
通过ChatMessage和ChatResponse实现简单对话:
@RestController@RequestMapping("/api/chat")public class ChatController {private final SpringAITemplate aiTemplate;public ChatController(SpringAITemplate aiTemplate) {this.aiTemplate = aiTemplate;}@PostMappingpublic String chat(@RequestBody ChatRequest request) {ChatMessage message = ChatMessage.builder().role(Message.Role.USER).content(request.getPrompt()).build();ChatResponse response = aiTemplate.chat(message);return response.getContent();}}
处理包含JSON结构的响应(如DeepSeek的函数调用):
public class FunctionCallParser {public static Map<String, Object> parse(String rawResponse) {// 示例:解析DeepSeek返回的函数调用参数// 实际实现需根据模型输出格式调整ObjectMapper mapper = new ObjectMapper();JsonNode node = mapper.readTree(rawResponse);return mapper.convertValue(node.get("function_call"), Map.class);}}
实现类似ChatGPT的逐字输出效果:
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<String> streamChat(@RequestParam String prompt) {ChatMessage message = ChatMessage.builder().role(Message.Role.USER).content(prompt).build();return aiTemplate.streamChat(message).map(Chunk::getContent).map(String::new);}
关键实现点:
ThreadLocal或Redis存储对话历史Conversation对象维护状态
@Servicepublic class ChatService {private final SpringAITemplate aiTemplate;private final RedisTemplate<String, String> redisTemplate;public String generateResponse(String sessionId, String userInput) {// 获取历史对话String historyKey = "chat:history:" + sessionId;String history = redisTemplate.opsForValue().get(historyKey);// 构建完整提示String prompt = buildPrompt(history, userInput);// 调用模型ChatMessage message = ChatMessage.builder().role(Message.Role.USER).content(prompt).build();ChatResponse response = aiTemplate.chat(message);// 存储新对话String newHistory = (history != null) ?history + "\nUser: " + userInput + "\nAI: " + response.getContent() :"User: " + userInput + "\nAI: " + response.getContent();redisTemplate.opsForValue().set(historyKey, newHistory);return response.getContent();}}
处理长文本的优化策略:
TextSplitter将文档拆分为4096 token的块
public String summarizeDocument(String document) {TextSplitter splitter = new RecursiveCharacterTextSplitter(new CharacterTextSplitter.Configuration(4096));List<String> chunks = splitter.split(document);String combinedSummary = chunks.stream().map(chunk -> {ChatMessage message = ChatMessage.builder().role(Message.Role.USER).content("请总结以下文本:\n" + chunk).build();return aiTemplate.chat(message).getContent();}).collect(Collectors.joining("\n"));// 二次摘要ChatMessage finalMessage = ChatMessage.builder().role(Message.Role.USER).content("综合以下摘要,生成最终总结:\n" + combinedSummary).build();return aiTemplate.chat(finalMessage).getContent();}
实现代码补全的完整流程:
public String generateCode(String requirement) {String prompt = String.format("""使用Java和Spring Boot生成以下功能的代码:%s要求:- 使用最新Spring Boot版本- 包含必要的注解- 代码格式化""", requirement);ChatMessage message = ChatMessage.builder().role(Message.Role.USER).content(prompt).build();String rawCode = aiTemplate.chat(message).getContent();// 简单语法校验(实际项目应使用更复杂的校验)try {JavaParser.parse(rawCode);return formatCode(rawCode);} catch (ParseException e) {return "代码生成失败:" + e.getMessage();}}
@Async注解实现异步执行
@Cacheable(value = "aiResponses", key = "#prompt")public String getCachedResponse(String prompt) {// 实际调用模型的逻辑}
spring-ai的TokenUsage监控消耗
public class TokenMonitor {private final AtomicLong totalTokens = new AtomicLong(0);public void logTokenUsage(long tokens) {totalTokens.addAndGet(tokens);// 可添加日志或报警逻辑}}
@Retryable(value = {FeignException.class},maxAttempts = 3,backoff = @Backoff(delay = 1000, multiplier = 2))public ChatResponse callDeepSeek(ChatMessage message) {return aiTemplate.chat(message);}
Dockerfile示例:
FROM eclipse-temurin:17-jdk-jammyARG JAR_FILE=target/*.jarCOPY ${JAR_FILE} app.jarENTRYPOINT ["java","-jar","/app.jar"]
关键资源定义:
# deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: spring-ai-appspec:replicas: 3selector:matchLabels:app: spring-aitemplate:metadata:labels:app: spring-aispec:containers:- name: appimage: your-registry/spring-ai-demo:latestenv:- name: SPRING_AI_API_KEYvalueFrom:secretKeyRef:name: deepseek-secretskey: api-key
/actuator/prometheus端点实现AIClient接口对接私有化部署的DeepSeek:
public class CustomDeepSeekClient implements AIClient {private final String endpoint;private final HttpClient httpClient;public CustomDeepSeekClient(String endpoint) {this.endpoint = endpoint;this.httpClient = HttpClient.newHttpClient();}@Overridepublic ChatResponse chat(ChatMessage message) {// 实现自定义HTTP调用逻辑}}
根据请求类型动态选择模型:
public class ModelRouter {private final Map<String, AIClient> clients;public ModelRouter(AIClient deepseek, AIClient gpt4) {clients = Map.of("code", deepseek,"general", gpt4);}public ChatResponse route(String modelType, ChatMessage message) {AIClient client = clients.getOrDefault(modelType, clients.get("general"));return client.chat(message);}}
public class RequestSigner {public String signRequest(String body, String secret) {try {Mac sha256_HMAC = Mac.getInstance("HmacSHA256");SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");sha256_HMAC.init(secret_key);byte[] bytes = sha256_HMAC.doFinal(body.getBytes());return Base64.getEncoder().encodeToString(bytes);} catch (Exception e) {throw new RuntimeException("签名失败", e);}}}
通过Spring Boot与Spring AI的深度整合,开发者可以快速构建高性能的AI应用。本方案在实际项目中验证了以下优势:
未来发展方向包括:
完整代码示例已上传至GitHub(示例链接),包含从基础环境搭建到高级功能的完整实现。建议开发者从简单对话应用入手,逐步扩展到复杂业务场景,最终构建企业级AI中台。