《多轮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 扫二维码,或者去公众号 冰河技术 回复 星球 扫二维码加入星球。
好了,今天就到这儿吧,我是冰河,我们下期见~~
