前言

在 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来进行流式响应

<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 模型

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

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

如果想和笔者使用同样的,可以跳转:https://cloud.siliconflow.cn/i/5I4ebAG9,使用免费的即可。
在这里插入图片描述

实现第一个 AI 对话

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

@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,前端可以通过EventSourceAPI轻松监听这个接口。每当收到一个新的数据块,就会触发onmessage事件,从而实现内容的实时追加显示,创造出类似打字机的效果。

@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 将改用该存储库。

@Autowired
ChatMemory chatMemory;

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

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

序章

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐