Spring AI(5) :对话机器人-会话记忆

本章代码已分享至Gitee:https://gitee.com/lengcz/ai-study.git

文章目录

会话记忆

大模型是不具备记忆功能的,要想让大模型记住之前聊天的内容,唯一的办法就是把之前聊天的内容与新的提示词一起发给大模型。

openAI 请求大模型

assistant 就是大模型回复的消息

配置cors 跨域

由于前端网页和后端接口不在同一个域名和端口,所以这里就涉及到跨域问题,需要先配置允许跨域。

java 复制代码
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*");
    }
}

如何实现会话记忆

  1. 定义会话存储方式

    spring AI 为我们定义了存储会话的接口,spring AI 已经提供了一个默认的会话会话记忆InMemoryChatMemory

  2. 配置会话记忆Advisor

java 复制代码
    @Bean
    public ChatMemory chatMemory(){
        return  new InMemoryChatMemory();
    }

    @Bean
    public ChatClient chatClient(OllamaChatModel ollamaChatModel){
        return ChatClient.builder(ollamaChatModel)
                .defaultSystem("你是一个热心的智能助手,你的名字叫小可爱,请以小可爱的名义回答用户的问题。")
                .defaultAdvisors(new SimpleLoggerAdvisor()
                ,new MessageChatMemoryAdvisor(chatMemory())
                ) //环绕增强,SimpleLoggerAdvisor 用于简单日志
                .build();
    }
  1. 添加会话id,让前端传入chatId,不同会话使用不同的chatId,这样就可以区分不同会话的聊天了。
java 复制代码
    @RequestMapping(value = "/stream_chat",produces = "text/html;charset=utf-8;")
    public Flux<String> stream_chat(String prompt,String chatId) {
        return chatClient.prompt()
                .user(prompt)
                .advisors(a->a.param(CHAT_MEMORY_CONVERSATION_ID_KEY,chatId))
                .stream()
                .content(); //stream() 表示流式输出
    }

启动服务器测试,第一个会话聊天中,AI记住了上文的苹果数量。而后面新开的会话聊天中,显然并不知道分什么,这样就实现了会话记忆和会话的隔离。

这里将前端页面放在了同一个工程,仅是方便demo运行。

访问前端:http://localhost:8080/aichat.html

遇到的问题

跨域问题

注意配置跨域。

相关推荐
晴空蓝天几秒前
MDC traceId 全链路日志追踪:Spring Boot 3.5 里把日志串成一条线
java·spring boot·后端·python
泡海椒6 分钟前
JQuick-Excel 项目定位与适用场景:声明式 Java Excel 的边界
java·开发语言·excel
明月_清风8 分钟前
干了 6 年前端,我是怎么一步步转型到 AI 的?
前端·后端·ai编程
AC赳赳老秦9 分钟前
财报附注表格精准提取:OpenClaw 从 PDF 年报附注挖掘隐藏明细,补齐财务分析维度
java·汇编·c++·python·青少年编程·deepseek·openclaw
顽疲12 分钟前
Java vue 养老系统源码详解:楼宇床位 care_space 与房态图 Spring Boot 实践
后端
箓维15 分钟前
线程的优缺点,与进程的关联和差异
java·服务器·笔记
曹牧17 分钟前
Spring MVC:@RequestMapping
java·spring·mvc
Lyy18 分钟前
DevOps平台 — 第十三篇:规划的设计与实现
后端·devops
今天不在线30 分钟前
旧 Java 项目接入 AI 实战系列(一):四层递进,从基础对话到流式输出
后端
卷无止境35 分钟前
WebGIS生态全景丨从浏览器里的地图到背后的空间数据库
后端·python