首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >让AI不再失忆

让AI不再失忆

作者头像
程序员NEO
发布2026-04-29 19:28:23
发布2026-04-29 19:28:23
1240
举报
LangChain4j 系列文章
  1. 1. LangChain4j - LangChain4j快速入门实战
  2. 2. LangChain4j - 多模态开发踩坑实录
  3. 3. LangChain4j - 系统提示词稳住AI
  4. 4. LangChain4j - 注解式AI服务实战

会话记忆是指让 AI 能够记住用户之前的对话内容,并保持上下文连贯性,这是实现 A⁢I 应用的核心特性。

怎么实现对话记忆?最传统的方式是自己维护消息列表,不仅要手动添加消息,消息多了还要考虑淘汰、不同用户⁢的消息还要隔离,想想都头疼!

代码语言:javascript
复制
// 自己实现会话记忆
Map<String, List<Message>> conversationHistory = new HashMap<>();

public String chat(String message, String userId) {
    // 获取用户历史记录
    List<Message> history = conversationHistory.getOrDefault(userId, new ArrayList<>());
    
    // 添加用户新消息
    Message userMessage = new Message("user", message);
    history.add(userMessage);
    
    // 构建完整历史上下文
    StringBuilder contextBuilder = new StringBuilder();
    for (Message msg : history) {
        contextBuilder.append(msg.getRole()).append(": ").append(msg.getContent()).append("\n");
    }
    
    // 调用 AI API
    String response = callAiApi(contextBuilder.toString());
    
    // 保存 AI 回复到历史
    Message aiMessage = new Message("assistant", response);
    history.add(aiMessage);
    conversationHistory.put(userId, history);
    
    return response;
}

使用会话记忆

LangChain4j 为我们提供了开箱即用的 MessageWindowChatMemory 会话记忆,最多保存 N 条消息,多余的会自动淘汰。

创建会话记忆后,在构造 AI Service 设置 chatMemory:

代码语言:javascript
复制
/**
 * AI 代码助手服务工厂
 *
 * @author BNTang
 */
@Configuration
public class AiCodeHelperServiceFactory {

    @Resource
    private ChatModel qwenChatModel;

    /**
     * 创建 AI 代码助手服务实例
     *
     * @return AI 代码助手服务
     */
    @Bean
    public AiCodeHelperService aiCodeHelperService() {
        // 设置聊天记忆,最多保留最近 10 条消息
        ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages();
        return AiServices.builder(AiCodeHelperService.class)
                .chatModel(qwenChatModel)
                .chatMemory(chatMemory)
                .build();
    }
} 

编写单元测试,测试会话记忆是否生效:

代码语言:javascript
复制
@Test
void chatWithMemory() {
    String result = aiCodeHelperService.chat("你好,我是程序员NEO");
    System.out.println(result);
    result = aiCodeHelperService.chat("你好,我是谁来着?");
    System.out.println(result);
}

Debug 运行单元测试,可以看到会话记忆存储的消息列表:

查看输出结果,会话记忆生效:

进阶用法

会话记忆默认是存储在内存的,重启后会丢失,可以通过自定义 ChatMemoryStore[1] 接口的实现类,将消息保存到 MySQL 等其他数据源中。

如果有多个用户,希望每个用户之间的消息隔离,可以通过给对话方法增加 memoryId 参数和注解,在调用对话时传入 memoryId 即⁢可(类似聊天室的房间号):

代码语言:javascript
复制
String chat(@MemoryId int memoryId, @UserMessage String userMessage);

构造 AI Service 时,可以通过 chatMemoryProvider 来指定 每个 memoryId 单独创建会话记忆:

代码语言:javascript
复制
// 构造 AI Service
AiCodeHelperService aiCodeHelperService = AiServices.builder(AiCodeHelperService.class)
        .chatModel(qwenChatModel)
        .chatMemoryProvider(memoryId -> MessageWindowChatMemory.withMaxMessages())
        .build();
引用链接

[1] ChatMemoryStore: https://docs.langchain4j.dev/tutorials/chat-memory/#persistence

如果这篇文章帮到了你,不妨点个分享给同样需要的朋友吧! 你的每一次支持,都是我持续创作的动力!💪

往期推荐:

序号

文章标题

链接

1

MCP协议爆火揭秘

查看详情

2

轻松配置Cursor玩转MCP

查看详情

3

Browser-Tool 前端开发神器

查看详情

4

AI编码焕新:用Context7

查看详情

5

NotebookLM:靠谱知识库

查看详情

6

Spring AI 玩转多轮对话

查看详情

7

Cursor生成UI,加一步封神

查看详情

8

神器!免费替代Postman

查看详情

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员NEO 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用会话记忆
  • 进阶用法
    • 引用链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档