Skip to content

wxwsir/RedisChatMemory

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ChatRedisMemory 文档

概述

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 { ... }
}

核心功能

1. 聊天记录存储

  • 使用 Redis List 数据结构存储聊天记录,每个会话对应一个独立的 List
  • 采用 chat:history:{userId}:{conversationId} 格式的键命名规则
  • 自动设置记录过期时间

2. 会话隔离

  • 通过用户唯一标识(UID)隔离不同用户的聊天记录
  • 支持从 UserContextHolder 获取当前登录用户信息

3. 聊天记录管理

  • 添加记录:将聊天消息转换为 ChatEntity 对象并存储到 Redis
  • 获取记录:检索用户所有会话的聊天记录,并返回最近的 maxMessages
  • 清除记录:删除用户的所有聊天记录

4. 内容解码

  • 支持解码 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();

注意事项

  1. 用户上下文依赖

    • 默认会从 UserContextHolder 获取当前登录用户信息
  2. Redis键模式搜索

    • getclear 方法使用 redisTemplate.keys(pattern) 命令搜索键
    • 在大型Redis实例中,此操作可能影响性能,建议在生产环境中谨慎使用
  3. 内容解码限制

    • 目前只支持解码十六进制转义格式的中文字符
    • 对于其他格式的转义字符可能无法正确处理
  4. 消息数量限制

    • get 方法最多返回 maxMessages 条最新消息
    • 即使存储了更多消息,也只会返回最近的部分
  5. 序列化方式

    • 使用 Jackson ObjectMapper 进行对象转换
    • 确保存储的对象类型可以被正确序列化和反序列化

通过合理使用 ChatRedisMemory,您可以为应用提供可靠的会话记忆功能,增强 AI 交互体验。无论是在聊天机器人、智能助手还是其他需要上下文感知的 AI 应用中,都能发挥重要作用。

About

RedisChatMemory, based on Redis and ChatMemory(Spring AI)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages