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

遇到的问题

跨域问题

注意配置跨域。

相关推荐
马良神笔39 分钟前
2026 年Rag最近技术前沿总结
后端·python·django
程序猿DD39 分钟前
同样10美元,OpenDesign和Command Code的DeepSeek V4.1 Flash额度到底有多少?
后端
福兮说1 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
高频因子挖掘机1 小时前
A股量化从日线升级到5分钟线:数据量增加后最先暴露哪些工程问题?
后端·github·api
高频因子挖掘机2 小时前
历史行情返回顺序变了,为什么按行号计算指标很危险?
后端·github·api
紧跟先前的步伐2 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
const_qiu3 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog3 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
团子哒哒3 小时前
数组、切片和Map
后端
Promising_GEO3 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析