第四节 聊天记忆 Chat memory

亮子 | 2026-03-26 15:15:12 | 300 | 0 | 0 | 0

四、聊天记忆 Chat memory

1、测试对话是否有记忆

package com.shenma;

import com.shenma.ai.AiAssistant;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @author 军哥
 * @version 1.0
 * @description: 测试对话是否有记忆
 * @date 2026/3/26 15:47
 */

@SpringBootTest
public class ChatMemoryTest {
    @Autowired
    private AiAssistant assistant;

    @Test
    public void testChatMemory() {

        String answer1 = assistant.chat("我是伍佰");
        System.out.println(answer1);

        String answer2 = assistant.chat("我是谁");
        System.out.println(answer2);
    }
}

很显然,目前的接入方式,大模型是没有记忆的。

  • 运行效果

测试对话是否有记忆

2、聊天记忆的简单实现

可以使用下面的方式实现对话记忆。

@Autowired
private QwenChatModel qwenChatModel;

@Test
public void testChatMemory2() {
    UserMessage userMessage1 = UserMessage.userMessage("我是伍佰");
    ChatResponse chatResponse1 = qwenChatModel.chat(userMessage1);
    AiMessage aiMessage1 = chatResponse1.aiMessage();
    System.out.println(aiMessage1.text());

    UserMessage userMessage2 = UserMessage.userMessage("我是谁");
    ChatResponse chatResponse2= qwenChatModel.chat(Arrays.asList(userMessage1,aiMessage1,userMessage2));
    AiMessage aiMessage2 = chatResponse2.aiMessage();
    System.out.println(aiMessage2.text());
}

image.png

3、使用ChatMemory实现聊天记忆

使用AIService可以封装多轮对话的复杂性,使聊天记忆功能的实现变得简单

@Test
public void testChatMemory3() {

    //创建chatMemory
    MessageWindowChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);

    //创建AIService
    Assistant assistant = AiServices
            .builder(Assistant.class)
            .chatLanguageModel(qwenChatModel)
            .chatMemory(chatMemory)
            .build();
    //调用service的接口
    String answer1 = assistant.chat("我是伍佰");
    System.out.println(answer1);
    System.out.println("========================");
    String answer2 = assistant.chat("我是谁");
    System.out.println(answer2);
}

image.png

其中,Assistant的代码如下:

package com.shenma.ai;

/**
 * @author 军哥
 * @version 1.0
 * @description: TODO
 * @date 2026/3/26 15:26
 */

public interface Assistant {
    String chat(String userMessage);
}

4、使用AIService实现聊天记忆

4.1、创建记忆对话智能体

当AIService由多个组件(大模型,聊天记忆,等)组成的时候,我们就可以称他为智能体

package com.atguigu.java.ai.langchain4j.assistant;

@AiService(
    wiringMode = EXPLICIT,
    chatModel = "qwenChatModel",
    chatMemory = "chatMemory"
)
public interface MemoryChatAssistant {

    String chat(String message);
}

4.2、配置ChatMemory

package com.atguigu.java.ai.langchain4j.config;

@Configuration
public class MemoryChatAssistantConfig {

    @Bean
    ChatMemory chatMemory() {
        //设置聊天记忆记录的message数量
        return MessageWindowChatMemory.withMaxMessages(10);
    }
}

4.3、测试

@Autowired
private MemoryChatAssistant memoryChatAssistant;

@Test
public void testChatMemory4() {
    String answer1 = memoryChatAssistant.chat("我是华仔");
    System.out.println(answer1);
    String answer2 = memoryChatAssistant.chat("我是谁");
    System.out.println(answer2);
}

5、隔离聊天记忆

为每个用户的新聊天或者不同的用户区分聊天记忆

5.1、创建记忆隔离对话智能体

package com.atguigu.java.ai.langchain4j.assistant;

@AiService(
    wiringMode = EXPLICIT, 
    chatModel = "qwenChatModel",
    chatMemoryProvider = "chatMemoryProvider"
)
public interface SeparateChatAssistant {

    /**
     * 分离聊天记录
     * @param memoryId 聊天id
     * @param userMessage 用户消息
     * @return
     */
    String chat(@MemoryId int memoryId, @UserMessage String userMessage);
}

5.2、配置ChatMemoryProvider

package com.atguigu.java.ai.langchain4j.config;

@Configuration
public class SeparateChatAssistantConfig {

    @Bean
    ChatMemoryProvider chatMemoryProvider() {
        return memoryId -> MessageWindowChatMemory.builder()
                .id(memoryId)
            	.maxMessages(10)
                .build();
    }
}

5.3、测试对话助手

用两个不同的memoryId测试聊天记忆的隔离效果

@Autowired
private SeparateChatAssistant separateChatAssistant;

@Test
public void testChatMemory5() {
    String answer1 = separateChatAssistant.chat(1,"我是华仔");
    System.out.println(answer1);
    String answer2 = separateChatAssistant.chat(1,"我是谁");
    System.out.println(answer2);
    String answer3 = separateChatAssistant.chat(2,"我是谁");
    System.out.println(answer3);
}