04-对话机器人-会话记忆

04 对话机器人 会话记忆

1. 角色

角色 描述 示例
system 优先于 user 指令之前的指令,也就是给大模型设定角色和任务背景的系统指令 你是一个乐于助人的编程助手,你的名字叫小团团,请以小团团的风格来回答用户的问题
user 终端用户输入的指令(类似于你在 ChatGPT 聊天框中输入的内容) 你好,你是谁?
assistant 由大模型生成的消息,可能是上一轮对话生成的结果 注意,用户可能与大模型产生多轮对话,每轮对话模型都会产生不同的效果。

2. 使用步骤

  1. 定义会话存储方式

    public interface ChatMemory {
        String DEFAULT_CONVERSATION_ID = "default";
        String CONVERSATION_ID = "chat_memory_conversation_id";
    
        default void add(String conversationId, Message message) {
            Assert.hasText(conversationId, "conversationId cannot be null or empty");
            Assert.notNull(message, "message cannot be null");
            this.add(conversationId, List.of(message));
        }
    
        void add(String conversationId, List<Message> messages);
    
        List<Message> get(String conversationId);
    
        void clear(String conversationId);
    }
    

    提供了一个记忆存储的抽象接口:ChatMemoryRepository

    public interface ChatMemoryRepository {
        List<String> findConversationIds();
    
        List<Message> findByConversationId(String conversationId);
    
        void saveAll(String conversationId, List<Message> messages);
    
        void deleteByConversationId(String conversationId);
    }
    

    提供了一个默认的实现:MessageWindowChatMemory

    @Bean
    public ChatMemoryRepository chatMemoryRepository() {
        return new InMemoryChatMemoryRepository();
    }
    
    @Bean
    public ChatMemory chatMemory(ChatMemoryRepository chatMemoryRepository) {
        return MessageWindowChatMemory.builder()
                .chatMemoryRepository(chatMemoryRepository)
                .maxMessages(20)
                .build();
    }
    
  2. 配置会话记忆 Advisor

    @Bean
    public ChatClient chatClient(OllamaChatModel model, ChatMemory chatMemory) {
    	return ChatClient.builder(model)
    			// 默认设定
    			.defaultSystem("你是可爱的助手,名字叫小团团。请以小团团的身份和语气回答问题。")
    			// 默认 Advisor
    			.defaultAdvisors(
    					// 配置日志 Advisor
    					new SimpleLoggerAdvisor(),
    					// 配置会话记录 Advisor
    					MessageChatMemoryAdvisor.builder(chatMemory).build()
    			)
    			// 构建 ChatClient 实例
    			.build();
    }
    
  3. 添加会话 id

    Flux<String> content = chatClient.prompt()
            .user("你好,我叫小明")
            // 将会话 id 添加到 AdvisorContext 上下文中
            .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, chatId))
            .stream()
            .content();
    

3. 配置项目

  1. CommonConfiguration 类中天加如下代码

    @Bean
    public ChatMemoryRepository chatMemoryRepository() {
        return new InMemoryChatMemoryRepository();
    }
    
    @Bean
    public ChatMemory chatMemory(ChatMemoryRepository chatMemoryRepository) {
        return MessageWindowChatMemory.builder()
                .chatMemoryRepository(chatMemoryRepository)
                .maxMessages(20)
                .build();
    }
    
  2. 修改默认工厂

    @Bean
    public ChatClient chatClient(OllamaChatModel model, ChatMemory chatMemory) {
        return ChatClient.builder(model)
                // 默认设定
                .defaultSystem("你是可爱的助手,名字叫小团团。请以小团团的身份和语气回答问题。")
                // 默认 Advisor
                .defaultAdvisors(
                        // 配置日志 Advisor
                        new SimpleLoggerAdvisor(),
                        // 配置会话记录 Advisor
                        MessageChatMemoryAdvisor.builder(chatMemory).build()
                )
                // 构建 ChatClient 实例
                .build();
    }
    
  3. 配置会话 id

    修改 ChatController 使其可以正常获取到 chatId

    @RequestMapping(value = "/chatStream", produces = "text/html;charset=utf-8")
    public Flux<String> chatStream(String prompt, String chatId) {
        return chatClient.prompt()
                .user(prompt)
                .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, chatId))
                .stream()
                .content();
    }
    
  4. 验证

    对话1

    对话3

posted @ 2025-07-23 01:47  DongCha  阅读(20)  评论(0)    收藏  举报