SpringAI集成DeepSeek实战

SpringAI集成DeepSeek实战教程

引言

Spring AI作为Spring生态系统中的新成员,为开发者提供了便捷的AI集成方案。本文将详细介绍如何在Spring项目中集成DeepSeek模型,实现智能对话等功能。

环境准备

在开始之前,请确保您的开发环境满足以下要求:

  • JDK 17或更高版本
  • Spring Boot 3.x
  • Maven或Gradle构建工具
  • DeepSeek API密钥

项目配置

首先,在pom.xml中添加Spring AI的依赖:

复制代码
<dependencies>
    <!-- Spring AI 核心依赖 -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-core</artifactId>
        <version>0.8.0</version>
    </dependency>
    
    <!-- DeepSeek 集成依赖 -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-deepseek</artifactId>
        <version>0.8.0</version>
    </dependency>
</dependencies>

基础配置类
创建DeepSeek配置类:

复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ai.deepseek.DeepSeekAiClient;
import org.springframework.ai.deepseek.DeepSeekAiProperties;

@Configuration
public class DeepSeekConfig {
    
    @Bean
    public DeepSeekAiProperties deepSeekAiProperties() {
        // 配置DeepSeek属性
        DeepSeekAiProperties properties = new DeepSeekAiProperties();
        properties.setApiKey("your-api-key-here");
        properties.setModel("deepseek-chat"); // 设置使用的模型
        return properties;
    }
    
    @Bean
    public DeepSeekAiClient deepSeekAiClient(DeepSeekAiProperties properties) {
        // 创建DeepSeek客户端实例
        return new DeepSeekAiClient(properties);
    }
}

服务层实现

创建一个服务类来处理与DeepSeek的交互:

复制代码
import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.stereotype.Service;

@Service
public class ChatService {
    
    private final DeepSeekAiClient aiClient;
    
    public ChatService(DeepSeekAiClient aiClient) {
        this.aiClient = aiClient;
    }
    
    /**
     * 发送单轮对话请求
     * @param message 用户输入的消息
     * @return AI的响应内容
     */
    public String sendMessage(String message) {
        // 创建用户消息
        UserMessage userMessage = new UserMessage(message);
        // 创建prompt对象
        Prompt prompt = new Prompt(userMessage);
        // 获取AI响应
        ChatResponse response = aiClient.generate(prompt);
        return response.getGeneration().getContent();
    }
    
    /**
     * 发送多轮对话请求
     * @param messages 对话历史记录
     * @return AI的响应内容
     */
    public String sendConversation(List<String> messages) {
        List<Message> conversationHistory = new ArrayList<>();
        
        // 构建对话历史
        for (String message : messages) {
            conversationHistory.add(new UserMessage(message));
        }
        
        // 创建带有历史记录的prompt
        Prompt prompt = new Prompt(conversationHistory);
        ChatResponse response = aiClient.generate(prompt);
        return response.getGeneration().getContent();
    }
}

控制器实现
创建REST API接口:

复制代码
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/chat")
public class ChatController {
    
    private final ChatService chatService;
    
    public ChatController(ChatService chatService) {
        this.chatService = chatService;
    }
    
    /**
     * 处理单条消息请求
     * @param message 用户消息
     * @return AI响应
     */
    @PostMapping("/message")
    public ResponseEntity<String> handleMessage(@RequestBody String message) {
        try {
            String response = chatService.sendMessage(message);
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body("处理消息时发生错误:" + e.getMessage());
        }
    }
    
    /**
     * 处理多轮对话请求
     * @param messages 对话历史
     * @return AI响应
     */
    @PostMapping("/conversation")
    public ResponseEntity<String> handleConversation(@RequestBody List<String> messages) {
        try {
            String response = chatService.sendConversation(messages);
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body("处理对话时发生错误:" + e.getMessage());
        }
    }
}

异常处理
添加全局异常处理:

复制代码
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理DeepSeek API相关异常
     */
    @ExceptionHandler(DeepSeekApiException.class)
    public ResponseEntity<String> handleDeepSeekApiException(DeepSeekApiException e) {
        // 记录错误日志
        log.error("DeepSeek API错误", e);
        return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)
            .body("AI服务暂时不可用,请稍后重试");
    }
    
    /**
     * 处理其他未预期的异常
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleGeneralException(Exception e) {
        log.error("系统错误", e);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body("系统发生错误,请联系管理员");
    }
}

使用示例
以下是一个简单的使用示例:

复制代码
@SpringBootApplication
public class DeepSeekDemoApplication {
    
    @Autowired
    private ChatService chatService;
    
    public void demonstrateChat() {
        // 发送单条消息
        String response1 = chatService.sendMessage("你好,请介绍一下自己");
        System.out.println("AI响应:" + response1);
        
        // 发送多轮对话
        List<String> conversation = Arrays.asList(
            "你好,我想学习Java",
            "请推荐一些好的学习资源",
            "这些资源适合初学者吗?"
        );
        String response2 = chatService.sendConversation(conversation);
        System.out.println("AI响应:" + response2);
    }
    
    public static void main(String[] args) {
        SpringApplication.run(DeepSeekDemoApplication.class, args);
    }
}

总结

通过本文的介绍,我们详细讲解了如何在Spring项目中集成DeepSeek AI服务。从基础配置到具体实现,再到异常处理,覆盖了实际开发中的主要场景。通过使用Spring AI提供的抽象层,我们可以更加便捷地集成和使用AI能力,而不需要直接处理底层的API调用细节。

需要注意的是,在实际开发中,还需要考虑以下几点:

  • API密钥的安全存储
  • 请求限流和错误重试
  • 响应超时处理
  • 模型参数优化
  • 成本控制
相关推荐
亲爱的非洲野猪3 分钟前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
wfsm6 分钟前
spring事件使用
java·后端·spring
微风粼粼23 分钟前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
缘来是庄27 分钟前
设计模式之中介者模式
java·设计模式·中介者模式
rebel1 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端
代码的余温2 小时前
5种高效解决Maven依赖冲突的方法
java·maven
慕y2742 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习
paishishaba2 小时前
Maven
java·maven
张人玉3 小时前
C# 常量与变量
java·算法·c#
Java技术小馆3 小时前
GitDiagram如何让你的GitHub项目可视化
java·后端·面试