Spring AI+DeepSeek快速构建AI智能机器人

引言 在AI技术蓬勃发展的当下,Spring生态推出了Spring AI项目,为Java开发者提供了便捷的AI集成方案。本文将演示如何用Spring AI+DeepSeek V3 快速搭建一个具备自然语言处理能力的智能对话机器人。

一、环境准备

JDK 17+ Spring Boot 3.4

Maven/Gradle构建工具

DeepSeek API Key

由于各种原因官网的开放平台目前关闭了,我这里使用的是硅基流动+华为云推出的DeepSeek-V3/R1服务。

二、项目创建

快速创建Spring AI项目 本项目使用的环境是:本文使用的开发工具IDEA+Spring Boot 3.4+Spring AI 1.0.0-SNAPSHOT+Maven+硅基流动提供的DeepSeek API服务,接口需要付费,默认注册送14块钱,官网。注册成功后创建密钥,如下图所示:

SiliconCloud

在application.properties添加如下配置:

server:
  port: 8088
spring:
  ai:
    openai:
      base-url: https://api.siliconflow.cn/
      api-key: sk-tcvgtouoplzomypwpdlgzndigmbmshpwcqwwzepbiukegdon
      chat:
        options:
          model: deepseek-ai/DeepSeek-V3


logging.level.org.springframework.ai.chat.client.advisor: DEBUG

pom.xml添加openai starter,因为接口是兼容openai api规范的。

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

三、核心实现

1.人设设定

新建Config配置类,设置智能体的人设。

@Configuration
class Config {

    @Bean
    ChatClient chatClient(ChatClient.Builder builder) {
        return builder.defaultSystem("你是一个智能机器人,你的名字叫 Spring AI智能机器人").build();
    }
}

2.流式对话

新建ChatbotController类,因为需要流式传输,后端需要支持流式响应,前端要能逐步接收并显示数据。可能需要使用Server-Sent Events(SSE)或者WebSocket。不过考虑到简单性,SSE可能更容易在Spring中实现,因为它是基于HTTP的,不需要额外的协议。

@RestController
@CrossOrigin("*")
@Slf4j
public class ChatbotController {

    @Qualifier
    private final ChatClient chatClient;

    public ChatbotController(ChatClient chatClient) {
        this.chatClient = chatClient;
    }
    @PostMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ServerSentEvent<String>> streamChat(@RequestBody ChatRequest request) {
        //用户id
        String userId = request.userId();

        return chatClient.prompt(request.message())
                .stream().content().map(content -> ServerSentEvent.builder(content).event("message").build())
                //问题回答结速标识,以便前端消息展示处理
                .concatWithValues(ServerSentEvent.builder("[DONE]").build())
                .onErrorResume(e -> Flux.just(ServerSentEvent.builder("Error: " + e.getMessage()).event("error").build()));
    }
    record ChatRequest(String userId, String message) {

    }
}

主要的技术细节:

使用标准 ServerSentEvent 构建响应 增加结束标识 [DONE] 事件 支持事件类型区分(message/error) 接口测试:http://localhost:8080/chat/stream

{
    "userId":1,
    "message":"马云"
}

3.前端实现

前端技术栈 Vite+Vue3+TS

Vite 是一个现代化的前端构建工具,支持 Vue 3TypeScript

导入前端源码即可

4.对话记忆(多轮对话)

到目前为止对话实现,其实存在一个大问题,用户问问题每次都是新的一次对话,无法做到多轮次,就是常说的对话记忆,如下图所示问题所在:

如上图所示,大模型两次回复是独立的,没有形成对话记忆,要实现这个功能,Spring AI提供了Advisors APIMessageChatMemoryAdvisor主要实现对话记忆,本文基于内存的方式,首先Config类新增内存记忆的Bean

@Configuration
class Config {

    @Bean
    ChatClient chatClient(ChatClient.Builder builder) {
        return builder.defaultSystem("你是一个智能机器人,你的名字叫 Spring AI智能机器人").build();
    }

    @Bean
    InMemoryChatMemory inMemoryChatMemory() {
        return new InMemoryChatMemory();
    }
}

对话接口修改如下:

@RestController
@CrossOrigin
@Slf4j
public class ChatbotController {

    private final ChatClient chatClient;

    private final InMemoryChatMemory inMemoryChatMemory;

    public ChatbotController(ChatClient chatClient, InMemoryChatMemory inMemoryChatMemory) {
        this.chatClient = chatClient;
        this.inMemoryChatMemory = inMemoryChatMemory;
    }

    @PostMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ServerSentEvent<String>> streamChat(@RequestBody ChatRequest request) {
        //用户id
        String userId = request.userId();

        return chatClient.prompt(request.message())
                .advisors(new MessageChatMemoryAdvisor(inMemoryChatMemory, userId, 10), new SimpleLoggerAdvisor())
                .stream().content().map(content -> ServerSentEvent.builder(content).event("message").build())
                //问题回答结速标识,以便前端消息展示处理
                .concatWithValues(ServerSentEvent.builder("[DONE]").build())
                .onErrorResume(e -> Flux.just(ServerSentEvent.builder("Error: " + e.getMessage()).event("error").build()));
    }

    record ChatRequest(String userId, String message) {

    }
}

核心代码分析:

new MessageChatMemoryAdvisor(inMemoryChatMemory, userId, 10)

对话添加一个上下文记忆增强,每个用户数据是隔离的,10表示历史对话数据最多取10条,每次向大模型发送消息,实际上会把用户前面的问题一起组装到Prompt中。 修改后实现的支持对话记忆的功能:

四、总结

本文详细介绍了如何使用 Spring AI 快速搭建一个具备自然语言处理能力的智能对话机器人,并结合 Vue 3 + TypeScript 实现前后端交互。

关注公众号 宝哥搞编程 ,回复 机器人 获取源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值