(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 的接口抽象)。
  • 未来优化:向量库数据量的增长监控、异步向量化链路的引入。
相关推荐
我是一颗柠檬21 小时前
【MySQL全面教学】MySQL面试高频考点汇总Day15(2026年)
数据库·后端·mysql·面试
凯瑟琳.奥古斯特1 天前
高阶子查询题目精炼
开发语言·数据库·python·职场和发展·数据库开发
身如柳絮随风扬1 天前
数据库读写分离:从原理到实战,构建高并发系统
数据库·mysql
小饼干在学嘎瓦1 天前
本地缓存和分布式缓存如何选择?
分布式·缓存
提笔了无痕1 天前
RAG存储策略中.md格式的切片与存储怎么处理
数据库·ai·rag
陳土1 天前
DuckDB精读——基于Getting started with DuckDB
数据库·oracle
凯瑟琳.奥古斯特1 天前
数据库原理选择题精选
数据库·python·职场和发展
曹牧1 天前
C#:主线程能够捕获到子线程中的异常
开发语言·数据库·c#
朝阳5811 天前
MongoDB 副本集从零搭建到生产可用
数据库·mongodb