SpringAI实现多用户记忆隔离
核心需求拆解
首先得明确什么是 “记忆隔离”。在对话系统里,这意味着:
- 用户 A 的历史对话不能被用户 B 获取
- 同一用户的多轮对话必须保持上下文连贯
技术选型思路
SpringAI 本身提供了对话记忆(ChatMemory),如果不用这个的话就得手动维护一轮对话中上下文内容,会非常麻烦,ChatMemory实际上内部也是封装了一个map,这个map大致就是Map<用户id,List<消息>>这样子的结构,通过这个id进行用户的记忆隔离。本文先用基于内存的方式实现
实现步骤详解
1.导入ChatMemory所用到的包,使用ChatMemoryAutoConfigure配置类
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-autoconfigure-model-chat-memory</artifactId></dependency>
2.在构造出ChatClient加上ChatMemory的配置
ChatClient chatClient = ChatClient.builder(dashScopeChatModel)//chatMemory专门提供存储记录的功能.defaultAdvisors(PromptChatMemoryAdvisor.builder(chatMemory).build()).defaultOptions(ChatOptions.builder().temperature(0.1).build()).build();
3.在Promt设置用户id
String content = chatClient.prompt().user("我是路飞").advisors(pcm -> {pcm.param(ChatMemory.CONVERSATION_ID, userId1);}).call().content();
ChatMemory.CONVERSATION_ID是一个key的标识 通过这个标识来确定是哪个用户
效果展示
完整代码
@RestController
public class IsolationController {@Autowiredprivate DashScopeChatModel dashScopeChatModel;@Autowiredprivate ChatMemory chatMemory;@GetMapping("/ci")public void ConversationIsolation() {//假设有两个用户idString userId1="userId1";String userId2="userId2";ChatClient chatClient = ChatClient.builder(dashScopeChatModel)//chatMemory专门提供存储记录的功能.defaultAdvisors(PromptChatMemoryAdvisor.builder(chatMemory).build()).defaultOptions(ChatOptions.builder().temperature(0.1).build()).build();String content = chatClient.prompt().user("我是路飞").advisors(pcm -> {pcm.param(ChatMemory.CONVERSATION_ID, userId1);}).call().content();System.out.println(content);System.out.println("-------------------------------------------我是分割线---------------------------------------");String content1 = chatClient.prompt().user("我是谁???").advisors(pcm -> {pcm.param(ChatMemory.CONVERSATION_ID, userId1);}).call().content();System.out.println(content1);System.out.println("-------------------------------------------我是分割线---------------------------------------");String content2 = chatClient.prompt().user("我是谁???").advisors(pcm -> {pcm.param(ChatMemory.CONVERSATION_ID, userId2);}).call().content();System.out.println(content2);}}