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密钥的安全存储
  • 请求限流和错误重试
  • 响应超时处理
  • 模型参数优化
  • 成本控制
相关推荐
San813_LDD6 小时前
[C语言]《Dev-C++ 报错解决手册(Day0607 精华版)》
java·前端·javascript
Anastasiozzzz7 小时前
从有限状态机到智能体图:传统 FSM 与 Agent Graph的演进
java·人工智能·python·ai
wang090713 小时前
自己动手写一个spring之IOC_2
java·后端·spring
来杯@Java13 小时前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
不知名的老吴14 小时前
线程的生命周期之线程“插队“
java·开发语言·python
ANnianStriver14 小时前
PetLumina-02-后端开发与前后端联调
java·ai·sa-token
杨了个杨898215 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
马士兵教育17 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
snow@li17 小时前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java