SpringAI实现多用户记忆隔离

发布于:2025-08-10 ⋅ 阅读:(14) ⋅ 点赞:(0)

核心需求拆解​

首先得明确什么是 “记忆隔离”。在对话系统里,这意味着:​

  • 用户 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 {


    @Autowired
    private DashScopeChatModel dashScopeChatModel;
    @Autowired
    private ChatMemory chatMemory;

    @GetMapping("/ci")
    public void ConversationIsolation() {
        //假设有两个用户id
        String 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);
    }


}


网站公告

今日签到

点亮在社区的每一天
去签到