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

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

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

文章目录

  • 会话记忆
  • 配置cors 跨域
  • 如何实现会话记忆
  • 遇到的问题
    • 跨域问题

会话记忆

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

openAI 请求大模型

assistant 就是大模型回复的消息

配置cors 跨域

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

@ConfigurationpublicclassWebMvcConfigurationimplementsWebMvcConfigurer{@OverridepublicvoidaddCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistryregistry){registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET","POST","PUT","DELETE","OPTIONS").allowedHeaders("*");}}

如何实现会话记忆

  1. 定义会话存储方式

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

  2. 配置会话记忆Advisor

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

启动服务器测试,第一个会话聊天中,AI记住了上文的苹果数量。而后面新开的会话聊天中,显然并不知道分什么,这样就实现了会话记忆和会话的隔离。
这里将前端页面放在了同一个工程,仅是方便demo运行。
访问前端:http://localhost:8080/aichat.html

遇到的问题

跨域问题


注意配置跨域。