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 自动帮退订订单。

相关推荐
无限大62 小时前
为什么"云计算"能改变世界?——从本地计算到云端服务
后端
哈哈老师啊2 小时前
Springboot校园订餐管理系统k2pr7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
喵叔哟2 小时前
10.消息队列集成
后端·服务发现
残花月伴2 小时前
天机学堂-day4(高并发优化方案)
java·spring boot·后端
tonydf3 小时前
在Blazor项目里构造一个覆盖面广泛的权限组件
后端
阿杰AJie3 小时前
Docker 常用镜像启动参数对照表
后端
码上研社3 小时前
Maven配置阿里云镜像
java·后端
资源站shanxueit或com3 小时前
基于C#的通信过程与协议实操需要
后端