四、聊天记忆 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());
}

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);
}

其中,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);
}