当前位置: 首页 > news >正文

springboot-ai接入DeepSeek

1、引入pom依赖

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>


 <dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>org.springframework.ai</groupId>
             <artifactId>spring-ai-bom</artifactId>
             <version>1.0.0-SNAPSHOT</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
     </dependencies>
 </dependencyManagement>

2 、 配置LLM

2.1 到deepseek 申请api-key

https://platform.deepseek.com/api_keys 首次注册会送10元 限时额度

2.2 添加springboot-ai配置

spring.ai.openai.base-url=https://api.deepseek.com
spring.ai.openai.api-key=xxxx

3、编写MemoryService 记录历史对话

import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@Service
public class MemoryService {
    HashMap<String, List<Message>> memory = new HashMap<>();
    public List<Message> getMemory(String userId) {
        List<Message> messages = memory.get(userId);
        if (messages == null) {
            return new ArrayList<>();
        }
        return messages;
    }
    public void addMemory(String userId, Message message) {
        List<Message> messages = memory.get(userId);
        if (messages == null) {
            messages = new ArrayList<>();
        }
        messages.add(message);
        memory.put(userId, messages);
    }
    public String buildHisChat(String userId){
        StringBuilder builder = new StringBuilder();
        for (Message message : memory.get(userId)) {
            if (message instanceof UserMessage) {
                builder.append("[user]").append(message.getText()).append("\n");
            } else if (message instanceof AssistantMessage) {
                builder.append("[assistant]").append(message.getText()).append("\n");
                builder.append("===============================================\n");
            }
        }
        return builder.toString();
    }

    public void cleanMemory(String userId) {
        memory.remove(userId);
    }
}

4、编写ChatService 调用LLM

import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.model.Media;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

@Service
public class ChatService {
    private static final String MODEL = "deepseek-chat";
    private final OpenAiChatModel chatModel;
    public ChatService(OpenAiChatModel chatModel) {
        this.chatModel = chatModel;
    }

    public Message buildMessageWithImage(String question, List<MultipartFile> files) {
        if (!CollectionUtils.isEmpty(files)) {
            ArrayList<Media> mediaList = new ArrayList<>();
            for (MultipartFile file : files) {
                mediaList.add(new Media(MimeTypeUtils.IMAGE_PNG, file.getResource()));
            }
            return new UserMessage(question, mediaList);
        } else {
            return new UserMessage(question);
        }
    }
    public String chat(String userId, List<Message> messages) {
        Prompt prompt = new Prompt(messages,
                OpenAiChatOptions.builder()
                        .model(MODEL)
                        .build());
        ChatResponse response = chatModel.call(prompt);
        return response.getResults().get(0).getOutput().getText();
    }
}

5、UI层代码

@RestController
@RequestMapping("/ai/chat")
@Slf4j
public class ChatController {


    private final MemoryService memory;
    private final ChatService chatService;

    @Autowired
    public ChatController(ChatService chatService, MemoryService service) {
        this.chatService = chatService;
        this.memory = service;
    }


    @GetMapping()
    public String chat(String userId, String question) {
        memory.addMemory(userId, new UserMessage(question));
        List<Message> messages = memory.getMemory(userId);
        String text = chatService.chat(userId, messages);
        memory.addMemory(userId, new AssistantMessage(text));
        return memory.buildHisChat(userId);
    }


    @GetMapping("image")
    public String chatWithImage(String userId, String question, String imageType, List<MultipartFile> files) {
        memory.addMemory(userId, chatService.buildMessageWithImage(question,files));
        List<Message> messages = memory.getMemory(userId);
        String text = chatService.chat(userId, messages);
        memory.addMemory(userId, new AssistantMessage(text));
        return memory.buildHisChat(userId);
    }
    @DeleteMapping("memory")
    public String cleanMemory(String userId) {
        memory.cleanMemory(userId);
        return "ok";
    }

6、参考链接

https://spring.io/projects/spring-ai

7、原码:

相关文章:

  • NO.71十六届蓝桥杯备战|搜索算法-递归型枚举与回溯剪枝|枚举子集|组合型枚举|枚举排列|全排列问题(C++)
  • SpringBoot自动装配原理---Spring
  • import cv2 安装失败
  • 语法: value=label_address( label);
  • PyTorch池化层详解:原理、实现与示例
  • ctf-show-micsx
  • 【Kubernetes】StorageClass 的作用是什么?如何实现动态存储供应?
  • TLS 1.2 握手过程,每个阶段如何保证通信安全?​​
  • 古诗词数据集(74602条简体版、繁体版) | 智能体知识库 | AI大模型训练
  • iOS APP集成Python解释器
  • OpenCV 在树莓派上进行实时人脸检测
  • C++ 内存访问模式优化:从架构到实践
  • Redis之布隆过滤器
  • Unity3D仿星露谷物语开发34之单击Drop项目
  • 算法思想之滑动窗口(一)
  • 人脸专注度检测系统(课堂专注度检测、人脸检测、注意力检测系统)
  • 【C++】第九节—string类(中)——详解+代码示例
  • JVM深入原理(六)(一):JVM类加载器
  • 基于51单片机和8X8点阵屏、独立按键的双人弹球小游戏
  • 智能气候:AI Agent结合机器学习与深度学习在全球气候变化驱动因素预测中的应用
  • 期末网站设计做什么网站比较好/网站推广步骤
  • 政府网站集约化建设内容/培训机构哪家最好
  • 海口免费网站建站模板/北京网站建设
  • 简约大气网站/成都关键词优化平台
  • 自己做的网站怎么加入微信支付/aso排名优化
  • 1核做网站/微信营销成功案例8个