(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 的接口抽象)。
  • 未来优化:向量库数据量的增长监控、异步向量化链路的引入。
相关推荐
这个DBA有点耶1 小时前
数据库数据同步解决方案怎么选?6款主流工具横向对比与信创选型指南
数据库·架构·dba
刃神太酷啦1 小时前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存
小雷信息医学1 小时前
不会写复杂代码也能发 SCI?手把手教你用 InSpireR 交互系统一键提取、合并与导出临床科研宽表【第三章】
数据库
旺仔不是程序员2 小时前
复合索引最左前缀原则:PostgreSQL 的 WHERE 为什么必须命中第一列
数据库·后端·sql
旺仔不是程序员2 小时前
字段类型不一致:PostgreSQL 报错与索引失效的第一元凶
数据库·后端·sql
白远山2 小时前
货运跑腿搬家平台开发实战:从需求分析到落地部署指南
数据库·数据挖掘·需求分析
geovindu2 小时前
sql: Data Modeling Patterns
数据库·sql·设计模式·sqlserver
上海蓝色星球3 小时前
蓝色星球NG-AIOS新型AI工业操作系统重磅发布——以本体智能为内核,重构“AI+制造“新范式
大数据·数据库·人工智能·机器人
名字还没想好☜3 小时前
Python 的 __call__ 实战:让实例像函数一样被调用,做带状态计数器、缓存器与可配置策略
开发语言·后端·python·缓存·编程语言
瀚高PG实验室3 小时前
瀚高数据库如何克隆表
数据库·sql·postgresql·瀚高数据库