(7)为 RAG 系统接入 Redis Stack 实现向量持久化

目录


🥀引言

  • 现状回顾:之前的系统使用 InMemoryEmbeddingStore 实现了 RAG 的基本功能。
  • 痛点暴露:在开发环境下,Spring Boot 的热重启(DevTools)或手动重启会导致内存中的向量数据瞬间清空,必须频繁调用初始化接口。
  • 目标:引入持久化存储,让 AI 拥有"永久记忆",即便服务器重启也能秒级恢复知识库。

🥀一、技术选型:为什么是 Redis Stack?

  • 向量库对比:
    • Milvus/Zilliz:专业、强大,但对于中型项目运维成本较高。
    • Elasticsearch:支持向量搜索,但内存占用极大。
    • Redis Stack:在原有 Redis 基础上增加 RediSearch 模块,支持向量相似度算法。
  • 选型理由:
    • 低延迟:基于内存的读写速度极快。
    • 架构简化:项目中已使用 Redis 处理点赞等功能,无需引入额外中间件,降低系统复杂度。

🥀二、安装Docker

  • 使用Docker原因:
    • 环境对齐:通过 Docker 解决了 Redis 向量检索插件(RediSearch)在 Windows 上难以编译安装的问题。
    • 在自己电脑上装 Windows Redis 费时费力,且以后部署到云服务器时还得重来一遍。Docker 镜像里已经把复杂的插件全部配置好了。

https://docs.docker.com/desktop/setup/install/windows-install/

  1. 安装完后,启动 Redis Stack 容器
    打开powershell输入以下命令:
bash 复制代码
docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest

参数解释:

  1. 验证 Redis 模块是否加载成功

我们要确认这个 Redis 是否真的支持"向量"。在终端输入:

bash 复制代码
docker exec -it redis-stack redis-cli MODULE LIST

如果列表中出现了名为 search 或 Search 的项,说明一切正常!

🥀三、项目文件修改

1. 添加依赖

在 pom.xml 中引入 LangChain4j 的 Redis 适配器:

java 复制代码
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-redis</artifactId>
    <version>${langchain4j.version}</version>
</dependency>

2. 修改AI配置类(AiConfig.java)

将原本的 InMemoryEmbeddingStore 替换为 RedisEmbeddingStore

java 复制代码
@Configuration
public class AiConfig {

    @Bean
    public EmbeddingStore<TextSegment> embeddingStore() {
        return RedisEmbeddingStore.builder()
                .host("127.0.0.1")
                .port(6379)
                .dimension(384) // ⭐ 必须!AllMiniLmL6V2 模型的维度是 384
                .indexName("article-index") // 索引名称
                .prefix("article:") // Redis Key 的前缀
                .build();
    }
}

为什么是 384?

因为 AllMiniLmL6V2EmbeddingModel 会把文字转成一个 384 维的数字数组。向量数据库必须预先知道这个"长度"才能创建索引。

🥀四、避坑

  • 现象:
    SpringBoot启动时报 ERR unknown command 'FT._LIST'
  • 原因:
    1.普通版 Redis 不支持搜索指令。
    2.Windows 本地残留的旧版 Redis 服务占用了 6379 端口,导致 Docker 映射失败。
  • 解决:
    关闭 Windows 原生服务,利用 docker exec -it redis-stack redis-cli MODULE LIST 验证模块加载。

    然后重新启动 Redis Stack。

🥀五、效果验证

  • 持久化测试:存入数据(init) → 停掉后端 → 重启后端 → 直接提问成功(ask)。
  • 可视化展示:访问http://localhost:8001,可以看到通过init接口存入的数据。

🥀六、总结

  • 现在的架构是:MySQL 存文字,Redis 存向量。这是一种标准的 "双路写" 架构。
  • 未来我可以轻松地把 Redis 换成 Milvus 或 Pinecone 等更专业的向量库,而业务代码几乎不需要改动(因为用了 LangChain4j 的接口抽象)。
  • 未来优化:向量库数据量的增长监控、异步向量化链路的引入。
相关推荐
AskHarries4 分钟前
Redis 应该什么时候上
redis
桑榆肖物15 分钟前
在 .NET MAUI 里接入 PP-OCRv6 文本检测实现查找并点击
数据库·redis·.net·maui
KaMeidebaby33 分钟前
卡梅德生物技术快报|兔单克隆抗体:噬菌体 Fab 免疫文库搭建实操:兔单克隆抗体重组构建完整参数
前端·网络·数据库·人工智能·算法
复园电子4 小时前
企业级PDF批量盖章方案选型指南
数据库·pdf
ffqws_9 小时前
Redis 分布式锁:基于 Redisson 的实现与面试高频问答
redis·分布式·面试
AI-好学者10 小时前
阶段一-图数据库基础与PropertyGraph模型
数据库·rag·knowledge graph·graphrag
其实防守也摸鱼12 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚12 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
龙仔72512 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)
数据库·sql·oracle
霁月的小屋12 小时前
生产环境中的事务实践——银行系统上线记(四)
数据库