SpringBoot集成DeepSeek

前言

在 AI 兴起的时候,面向的是 Python 开发者,而现在有了 Spring AI,作为Java 开发这也能将 AI 集成进我们的企业级项目中,广泛运用于实际业务,比如智能客服、健康饮食推荐、自动退订订单等等。本文将详细的讲解 SpringBoot 如何集成 DeepSeek 大模型服务,来完成聊天功能。

项目集成

截至发稿时间,Spring AI 的最新版本 1.1.2​,要求 Spring Boot 3.4.x 和 3.5.x。

环境准备

  1. JDK:17+
  2. SpringBoot:3.4+

添加依赖

引入 deepseek​模型和 webflux​来进行流式响应

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-model-deepseek</artifactId>
    </dependency>
</dependencies>

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

配置 DeepSeek 模型

可以自己去官网申请,我这里使用的是硅基流动免费的模型。

yaml 复制代码
spring:
  ai:
    deepseek:
      api-key: sk-xxxxx
      base-url: https://api.siliconflow.cn
      chat:
        options:
          model: xxx
          temperature: 0.7

如果想和笔者使用同样的,可以跳转:cloud.siliconflow.cn/i/5I4ebAG9,...

实现第一个 AI 对话

新建控制器,创建/chat/simple​接口,这里的ChatClient​就是通用的聊天客户端,也可以使用 DeepSeek 的 ChatModel​,这里不进行赘述。在这个简单示例中,message​决定了用户消息的内容。该call()​方法向 AI 模型发送请求,然后content()​方法将AI模型的响应作为String​。

kotlin 复制代码
@RestController
@RequestMapping("/chat")
public class ChatBotController {

    private final ChatClient chatClient;

    public ChatBotController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

    @GetMapping(value = "/simple")
    public String simple(String message) {
        return chatClient.prompt()
                .user(message)
                .call()
                .content();
    }
}

调用接口后会一次性响应 AI 的内容。

如果内容比较大,体验感就不是很好,接下来我们可以采用流的方式来逐字进行输出。

流式输出

跟前面的相比较,将call()​改成了stream()​,告诉 AI 生成字符串的Flux​。并且设置响应的类型为text/event-stream​,前端可以通过EventSource​API轻松监听这个接口。每当收到一个新的数据块,就会触发onmessage​事件,从而实现内容的实时追加显示,创造出类似打字机的效果。

typescript 复制代码
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> chatStream(String message) {
    return chatClient.prompt()
            .user(message)
            .stream()
            .content();
}

这里调用后可以明显看得到不是一次性输出的结果。

大型语言模型(LLM)是无状态的,这意味着它们不会保留之前交互的相关信息。即使告诉了AI你叫什么,它依然在下次对话也会忘记。

聊天记忆

Spring AI 会自动配置一个ChatMemory​ 的 bean,您可直接在应用程序中使用。默认情况下,它使用内存存储库来存储消息(InMemoryChatMemoryRepository​)以及MessageWindowChatMemory​来管理对话历史。如果已配置了其他存储库(例如,Cassandra、JDBC 或 Neo4j),Spring AI 将改用该存储库。

less 复制代码
@Autowired
ChatMemory chatMemory;

这里我们就直接使用内存来完成聊天的记忆功能。只需要使用advisors​来配置即可:

scss 复制代码
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> chatStream(String message) {
    return chatClient.prompt()
            .user(message)
            .advisors(MessageChatMemoryAdvisor.builder(chatMemory).build())
            .stream()
            .content();
}

这样我们的 AI 就有了记忆了

思考

  1. 我们怎么给 AI 预置一个角色?比如让它作为一个智能客服或者作为一个营养师。
  2. 如果用户 A 和用户 B 同时对 AI 进行对话,怎么让对话进行隔离?

完整代码

后续我会整理后将代码放在Gitee:lanjii: 开箱即用的 RBAC 权限管理系统。后端基于 Spring Boot3 构建, 集成了 JWT 认证、Spring Security 6、MyBatis-Plus

这是一款 MIT 协议可商用的SpringBoot脚手架,拥有完整的权限控制和常用的基础功能。希望大家给个 Star,后面有新的功能和一些 BUG 的修复也会提交到 Gitee。

小结

这样一个简单的带有记忆的 AI 聊天功能就开发好了。在实际场景中,我们如何将这个AI 结合到我们的业务中呢?比如如何让用户对话让 AI 检索我们自己的知识库,然后针对客户的问题在我们的知识库来进行回答。又或者让 AI 自动帮退订订单。

相关推荐
风象南2 小时前
我把大脑开源给了AI
人工智能·后端
橙序员小站7 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
怒放吧德德7 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆9 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
开心就好202510 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
悟空码字10 小时前
告别“屎山代码”:AI 代码整洁器让老项目重获新生
后端·aigc·ai编程
小码哥_常10 小时前
大厂不宠@Transactional,背后藏着啥秘密?
后端
奋斗小强10 小时前
内存危机突围战:从原理辨析到线上实战,彻底搞懂 OOM 与内存泄漏
后端
小码哥_常11 小时前
Spring Boot接口防抖秘籍:告别“手抖”,守护数据一致性
后端
心之语歌11 小时前
基于注解+拦截器的API动态路由实现方案
java·后端