冰河技术
导读
♻学习路线
  • 面试必问系列

    • 面试必问
  • 架构与模式

    • Java极简设计模式
    • 实战高并发设计模式
  • Java核心技术

    • Java8新特性
    • IOC核心技术
    • JVM调优技术
  • 容器化核心技术

    • Dockek核心技术
  • 分布式存储

    • Mycat核心技术
  • 数据库核心技术

    • MySQL基础篇
  • 服务器核心技术

    • Nginx核心技术
  • 渗透核心技术

    • 渗透实战技术
  • 底层技术
  • 源码分析
  • 基础案例
  • 实战案例
  • 面试
  • 系统架构
  • Spring6核心技术
  • 分布式事务

    • 分布式事务系列视频
  • SpringBoot
  • SpringCloudAlibaba
  • 🔥AI大模型项目

    • 多轮智能对话系统
    • 一站式AI智能平台
    • AI智能客服系统
    • AI智能问答系统
    • 实战AI大模型
    • 实战AI综合项目
  • 中间件项目

    • 手写高性能Redis组件
    • 手写高性能脱敏组件
    • 手写线程池项目
    • 手写高性能SQL引擎
    • 手写高性能Polaris网关
    • 手写高性能RPC项目
  • 高并发项目

    • 分布式IM即时通讯系统(新)
    • 分布式Seckill秒杀系统
    • 实战高并发设计模式
  • 微服务项目

    • 简易电商脚手架项目
  • 手撕源码

    • 手撕Spring6源码
🌍知识星球
  • 总览

    • 《书籍汇总》
  • 出版图书

    • 《深入理解高并发编程:核心原理与案例实战》
    • 《深入理解高并发编程:JDK核心技术》
    • 《深入高平行開發:深度原理&專案實戰》
    • 《深入理解分布式事务:原理与实战》
    • 《MySQL技术大全:开发、优化与运维实战》
    • 《海量数据处理与大数据技术实战》
  • 电子书籍

    • 《实战高并发设计模式》
    • 《深入理解高并发编程(第2版)》
    • 《深入理解高并发编程(第1版)》
    • 《从零开始手写RPC框架(基础篇)》
    • 《SpringCloud Alibaba实战》
    • 《冰河的渗透实战笔记》
    • 《MySQL核心知识手册》
    • 《Spring IOC核心技术》
  • 关于自己
  • 关于学习
  • 关于职场
B站
Github
导读
♻学习路线
  • 面试必问系列

    • 面试必问
  • 架构与模式

    • Java极简设计模式
    • 实战高并发设计模式
  • Java核心技术

    • Java8新特性
    • IOC核心技术
    • JVM调优技术
  • 容器化核心技术

    • Dockek核心技术
  • 分布式存储

    • Mycat核心技术
  • 数据库核心技术

    • MySQL基础篇
  • 服务器核心技术

    • Nginx核心技术
  • 渗透核心技术

    • 渗透实战技术
  • 底层技术
  • 源码分析
  • 基础案例
  • 实战案例
  • 面试
  • 系统架构
  • Spring6核心技术
  • 分布式事务

    • 分布式事务系列视频
  • SpringBoot
  • SpringCloudAlibaba
  • 🔥AI大模型项目

    • 多轮智能对话系统
    • 一站式AI智能平台
    • AI智能客服系统
    • AI智能问答系统
    • 实战AI大模型
    • 实战AI综合项目
  • 中间件项目

    • 手写高性能Redis组件
    • 手写高性能脱敏组件
    • 手写线程池项目
    • 手写高性能SQL引擎
    • 手写高性能Polaris网关
    • 手写高性能RPC项目
  • 高并发项目

    • 分布式IM即时通讯系统(新)
    • 分布式Seckill秒杀系统
    • 实战高并发设计模式
  • 微服务项目

    • 简易电商脚手架项目
  • 手撕源码

    • 手撕Spring6源码
🌍知识星球
  • 总览

    • 《书籍汇总》
  • 出版图书

    • 《深入理解高并发编程:核心原理与案例实战》
    • 《深入理解高并发编程:JDK核心技术》
    • 《深入高平行開發:深度原理&專案實戰》
    • 《深入理解分布式事务:原理与实战》
    • 《MySQL技术大全:开发、优化与运维实战》
    • 《海量数据处理与大数据技术实战》
  • 电子书籍

    • 《实战高并发设计模式》
    • 《深入理解高并发编程(第2版)》
    • 《深入理解高并发编程(第1版)》
    • 《从零开始手写RPC框架(基础篇)》
    • 《SpringCloud Alibaba实战》
    • 《冰河的渗透实战笔记》
    • 《MySQL核心知识手册》
    • 《Spring IOC核心技术》
  • 关于自己
  • 关于学习
  • 关于职场
B站
Github
  • 开篇:专栏介绍

    • 开篇:轮智能对话系统正式开撸
  • 第01部分:需求设计

    • 第01节:总体需求与方案设计
  • 第02部分:整体实现

    • 第01节:项目搭建与基础功能设计与实现
    • 第02节:发送消息核心接口功能的设计与实现
    • 第03节:上下文记忆管理功能的设计与实现
    • 第04节:历史会话与健康检查功能的设计与实现
    • 第05节:前端页面功能的设计与实现
  • 第03部分:专栏总结

    • 总结:多轮AI智能对话系统整体专栏总结

《多轮AI智能对话系统》整体实现-第03节:上下文记忆管理功能的设计与实现

作者:冰河
星球:http://m6z.cn/6aeFbs
博客:https://binghe.gitcode.host
文章汇总:https://binghe.gitcode.host/md/all/all.html
源码获取地址:https://t.zsxq.com/0dhvFs5oR

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:对多轮AI智能对话系统的上下文记忆管理功能进行设计和实现,从全局角度掌握多轮AI智能对话系统的整体项目结构和整体功能设计思路。重点掌握多轮AI智能对话系统的通用设计思路和设计方法,并能够将其灵活应用到自身实际项目中。

大家好,我是冰河~~

上下文记忆管理和会话管理功能是多轮AI智能对话系统中重点实现的两大功能。上下文记忆管理功能让多轮AI智能对话系统调用AI大模型时,传递的消息带有当前会话的上下文消息内容,能够让AI大模型回复的消息更加准确。会话管理功能则能够让多轮AI智能对话系统同时支持多人与AI大模型之间进行对话,并且每人与AI大模型的对话内容隔离,互不影响,使得多轮AI智能对话系统具备了同时多人在线使用的能力。

一、前言

截止到目前,我们已经简单明确了多轮AI智能对话系统的需求和流程,对多轮AI智能对话系统的执行流程进行了简单的设计,完成了项目的搭建和基础功能的设计与实现。并且,对多轮AI智能对话系统发送消息的核心接口进行设计和实现。接下来,我们就对多轮AI智能对话系统中的上下文记忆管理功能进行设计与实现。

二、本节诉求

对多轮AI智能对话系统的上下文记忆管理功能进行设计和实现,从全局角度掌握多轮AI智能对话系统的整体项目结构和整体功能设计思路。重点掌握多轮AI智能对话系统的通用设计思路和设计方法,并能够将其灵活应用到自身实际项目中。

三、核心类设计

注意:本节只给大家展示多轮AI智能对话系统上下文记忆管理功能的类实现关系,其他代码的实现细节,大家可以自行到本节对应的源码分支进行查看,这里不再赘述。

多轮AI智能对话系统上下文记忆管理功能的核心类设计如图3-1所示。


核心类关系总体比较简单,这里不再赘述,接下来,我们直接编码实现各个类的功能。

四、编码实现

本节只给大家展示多轮AI智能对话系统上下文记忆管理功能的核心类编码实现,其他代码的实现细节,大家可以自行到本节对应的源码分支进行查看,这里不再赘述。

(1)实现AIChatContextService接口

AIChatContextService接口是多轮智能AI系统中上下文记忆功能的Service接口,主要提供对上下文消息的增删查功能。

源码详见:io.binghe.ai.chat.service.AIChatContextService。

public interface AIChatContextService {

    /**
     * 将某个用户的消息保存到上下文
     */
    void saveContextMessage(String userId, AIMessage message);

    /**
     * 获取某个用户的上下文消息
     */
    List<AIMessage> getContextMessage(String userId);

    /**
     * 清除某个用户的上下文消息
     */
    void clearContextMessage(String userId);

    /**
     * 获取某个用户的上下文消息大小
     */
    long getContextMessageSize(String userId);

    default String getContextMessageKey(String userId) {
        if (!StringUtils.hasLength(userId)){
            userId = AIConstants.ROLE_USER;
        }
        return AIConstants.AI_CHAT_CONTEXT.concat(userId);
    }
}

(2)实现AIChatContextServiceImpl类

AIChatContextServiceImpl类是多轮AI智能对话系统中上下文记忆管理功能的Service实现类,主要实现了AIChatContextService接口中定义的方法。

源码详见:io.binghe.ai.chat.service.impl.AIChatContextServiceImpl。

@Slf4j
@Service
public class AIChatContextServiceImpl implements AIChatContextService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Value("${ai.chat.max-message-size:20}")
    private int maxMessageSize;
    @Value("${ai.chat.expire-seconds:3600}")
    private int expireSeconds;

    @Override
    public void saveContextMessage(String userId, AIMessage message) {
        try{
            if (message == null || !message.isValid()) {
                log.warn("消息无效,用户ID: {}, 消息: {}", userId, message);
                return;
            }
            String key = this.getContextMessageKey(userId);
            ListOperations<String, Object> listOperations = redisTemplate.opsForList();
            // 添加消息
            listOperations.rightPush(key, message);
            // 设置过期时间
            redisTemplate.expire(key, expireSeconds, TimeUnit.SECONDS);

            // 验证添加是否成功
            Long sizeAfterAdd = listOperations.size(key);

            // 如果消息大小超过配置的阈值,则删除最早的消息
            if (sizeAfterAdd != null && sizeAfterAdd > maxMessageSize) {
                long deleteCount = sizeAfterAdd - maxMessageSize;
                for (int i = 0; i < deleteCount; i++) {
                    listOperations.leftPop(key);
                }
            }
            log.info("消息添加成功, 用户id: {}, 消息大小:{}", userId, listOperations.size(key));
        } catch (Exception e) {
            log.error("消息添加失败,用户id: {}, 错误: {}", userId, e.getMessage(), e);
        }
    }

    @Override
    public List<AIMessage> getContextMessage(String userId) {
        try {
            String key = this.getContextMessageKey(userId);
            ListOperations<String, Object> listOperations = redisTemplate.opsForList();
            Long size = listOperations.size(key);

            if (size != null && size > 0) {
                List<Object> objects = listOperations.range(key, 0, size - 1);

                if (objects != null && !objects.isEmpty()) {
                    List<AIMessage> validMessages = new ArrayList<>();

                    for (int i = 0; i < objects.size(); i++) {
                        Object obj = objects.get(i);

                        try {
                            AIMessage message = null;

                            if (obj instanceof AIMessage) {
                                message = (AIMessage) obj;
                            } else if (obj instanceof Map) {

                                Map<?, ?> map = (Map<?, ?>) obj;

                                String role = map.get(AIConstants.ROLE) != null ? map.get(AIConstants.ROLE).toString() : null;
                                String content = map.get(AIConstants.CONTENT) != null ? map.get(AIConstants.CONTENT).toString() : null;

                                if (role != null && content != null) {
                                    message = new AIMessage(role, content);
                                }
                            } else {
                                log.warn("对象类型不符合预期: {}", obj.getClass());
                            }

                            if (message != null && message.isValid()) {
                                validMessages.add(message);
                            }

                        } catch (Exception objEx) {
                            log.error("处理对象出错, 用户ID:{}, index: {},错误信息:{}", userId, i + 1, objEx.getMessage());
                        }
                    }
                    log.info("成功获取到消息,用户ID: {}, 消息条数:{}", userId, validMessages.size());
                    return validMessages;
                }
            }

            return Collections.emptyList();
        } catch (Exception e) {
            log.error("获取上下文消息失败,用户ID: {}, 错误: {}", userId, e.getMessage(), e);
            return Collections.emptyList();
        }
    }

    @Override
    public void clearContextMessage(String userId) {
        try {
            String key = this.getContextMessageKey(userId);
            redisTemplate.delete(key);
            log.info("清空用户上下文消息成功, 用户ID:{}", userId);
        } catch (Exception e) {
            log.error("清空用户上下文失败,用户ID: {}, 错误信息: {}", userId, e.getMessage(), e);
        }
    }

    @Override
    public long getContextMessageSize(String userId) {
        try {
            String key = this.getContextMessageKey(userId);
            ListOperations<String, Object> listOperations = redisTemplate.opsForList();
            Long size = listOperations.size(key);
            return size != null ? size : 0;
        } catch (Exception e) {
            log.error("获取用户上下文大小失败,用户ID: {}, 错误信息: {}", userId, e.getMessage());
            return 0;
        }
    }
}

(3)更新AIChatServiceImpl类

AIChatServiceImpl类是多轮AI智能对话系统的业务Service实现类,添加上下文记忆管理功能后,需要对AIChatServiceImpl类的sendMessage()方法进行调整,新增上下文记忆管理功能。

源码详见:io.binghe.ai.chat.service.impl.AIChatServiceImpl#sendMessage。

查看完整文章

加入冰河技术知识星球,解锁完整技术文章、小册、视频与完整代码

写在最后

在冰河技术知识星球, 《AI智能代码审查平台》 已完结,同时,《AI全链路短剧生成平台》、《智能代码审查系统》 已完结, 《多智能体协作与AI工作台》 项目热更中,还有其他二十几个项目,像实战Claude Code、AI知识库系统、智流助手平台、智能成语挑战赛项目、多轮AI智能对话系统、一站式AI智能平台、AI智能客服系统、AI智能问答系统、实战AI大模型、手写高性能敏组件、手写线程池、手写高性能SQL引擎、手写高性能Polaris网关、手写高性能熔断组件、手写通用指标上报组件、手写高性能数据库路由组件、手写分布式IM即时通讯系统、手写Seckill分布式秒杀系统、手写高性能RPC、实战高并发设计模式、简易商城系统等等。

这些项目的需求、方案、架构、落地等均来自互联网真实业务场景,让你真正学到互联网大厂的业务与技术落地方案,并将其有效转化为自己的知识储备。

值得一提的是:冰河自研的Polaris高性能网关比某些开源网关项目性能更高,目前正在热更AI一体化项目,也正在实现MCP,全程带你分析原理和手撸代码。

你还在等啥?不少小伙伴经过星球硬核技术和项目的历练,早已成功跳槽加薪,实现薪资翻倍,而你,还在原地踏步,抱怨大环境不好。抛弃焦虑和抱怨,我们一起塌下心来沉淀硬核技术和项目,让自己的薪资更上一层楼。

🚀PS:目前已开通最大优惠:长按或扫码加入星球立减30,注意:随着项目和专栏的更新,星球也即将涨价!!


目前,领券加入星球就可以跟冰河一起学习《实战Claude Code》、《多轮AI智能对话系统》、《一站式AI智能平台》、《AI智能客服系统》、《AI智能问答系统》、《实战AI大模型》、《手写高性能Redis组件》、《手写高性能脱敏组件》、《手写线程池》、《手写高性能SQL引擎》、《手写高性能Polaris网关》、《手写高性能RPC项目》、《分布式Seckill秒杀系统》、《分布式IM即时通讯系统》《手写高性能通用熔断组件项目》、《手写高性能通用监控指标上报组件》、《手写高性能数据库路由组件》、《手写简易商城脚手架项目》、《Spring6核心技术与源码解析》和《实战高并发设计模式》,从零开始介绍原理、设计架构、手撸代码。

花很少的钱就能学这么多硬核技术、中间件项目和大厂秒杀系统、分布式IM即时通讯系统,AI大模型项目,比其他培训机构不知便宜多少倍,硬核多少倍,如果是我,我会买他个十年!

加入要趁早,后续还会随着项目和加入的人数涨价,而且只会涨,不会降,先加入的小伙伴就是赚到。

另外,还有一个限时福利,邀请一个小伙伴加入,冰河就会给一笔 分享有奖 ,有些小伙伴都邀请了50+人,早就回本了!

其他方式加入星球

  • 链接 :打开链接 http://m6z.cn/6aeFbs 加入星球。
  • 回复 :在公众号 冰河技术 回复 星球 领取优惠券加入星球。

特别提醒: 苹果用户进圈或续费,请加微信 hacker_binghe 扫二维码,或者去公众号 冰河技术 回复 星球 扫二维码加入星球。

好了,今天就到这儿吧,我是冰河,我们下期见~~

在 GitHub 上编辑此页
上次更新: 2026/9/13 07:04
Contributors: binghe001
Prev
第02节:发送消息核心接口功能的设计与实现
Next
第04节:历史会话与健康检查功能的设计与实现
阅读全文
×

扫码或搜索:冰河技术
发送:290992
即可立即永久解锁本站全部文章

星球会员
跳转链接