ChatRedisMemory 是一个基于 Redis 的聊天记忆实现,实现了 Spring AI 的 ChatMemory 接口,用于在 Redis 中存储和管理用户的聊天历史记录。它支持用户会话隔离、聊天记录的添加、获取和清除功能,并能正确处理中英文混合内容的解码。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>public class ChatRedisMemory implements ChatMemory {
// Redis 键前缀
private static final String KEY_PREFIX = "chat:history:";
// 最大消息数量限制
private final int maxMessages;
// Redis 操作模板
private final RedisTemplate<String, Object> redisTemplate;
// 默认用户标识
private final String defaultUID;
// 构造方法
public ChatRedisMemory(RedisTemplate<String, Object> redisTemplate, int maxMessages, String defaultUID) { ... }
// 获取当前用户ID
private String getCurrentUID() { ... }
// 核心接口方法实现
@Override public void add(String conversationId, List<Message> messages) { ... }
@Override public List<Message> get(String conversationId) { ... }
@Override public void clear(String conversationId) { ... }
// 中文内容解码方法
private String decodeChineseContent(String content) { ... }
// Builder 模式
public static ChatRedisMemory.Builder builder() { ... }
public static final class Builder { ... }
}- 使用 Redis List 数据结构存储聊天记录,每个会话对应一个独立的 List
- 采用
chat:history:{userId}:{conversationId}格式的键命名规则 - 自动设置记录过期时间
- 通过用户唯一标识(UID)隔离不同用户的聊天记录
- 支持从
UserContextHolder获取当前登录用户信息
- 添加记录:将聊天消息转换为
ChatEntity对象并存储到 Redis - 获取记录:检索用户所有会话的聊天记录,并返回最近的
maxMessages条 - 清除记录:删除用户的所有聊天记录
- 支持解码 Redis 中存储的十六进制转义中文字符(如
\xe5\x8e格式) - 保留英文内容不做修改,确保中英文混合内容能正确显示
ChatRedisMemory 提供了 Builder 模式,用于创建实例:
// 构造一个 advisor, 将 ChatRedisMemory 传到 advisor 中
PromptChatMemoryAdvisor advisor = PromptChatMemoryAdvisor.builder(
ChatRedisMemory.builder()
.redisTemplate(redisTemplate)
.maxMessages(maxMessages)
.uID(uID)
.build()
).build();
// 将 advisor 传到 ChatClient 中
ChatClient chatClient = ChatClient.builder(chatModel)
.defaultSystem(...)
.defaultToolCallbacks(...)
.defaultAdvisors(advisor)
.build();-
用户上下文依赖
- 默认会从
UserContextHolder获取当前登录用户信息
- 默认会从
-
Redis键模式搜索
get和clear方法使用redisTemplate.keys(pattern)命令搜索键- 在大型Redis实例中,此操作可能影响性能,建议在生产环境中谨慎使用
-
内容解码限制
- 目前只支持解码十六进制转义格式的中文字符
- 对于其他格式的转义字符可能无法正确处理
-
消息数量限制
get方法最多返回maxMessages条最新消息- 即使存储了更多消息,也只会返回最近的部分
-
序列化方式
- 使用 Jackson
ObjectMapper进行对象转换 - 确保存储的对象类型可以被正确序列化和反序列化
- 使用 Jackson
通过合理使用 ChatRedisMemory,您可以为应用提供可靠的会话记忆功能,增强 AI 交互体验。无论是在聊天机器人、智能助手还是其他需要上下文感知的 AI 应用中,都能发挥重要作用。