(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 的接口抽象)。
  • 未来优化:向量库数据量的增长监控、异步向量化链路的引入。
相关推荐
Greyson118 小时前
Layui表格如何使用第三方插件实现树形展示.txt
jvm·数据库·python
2401_8716965218 小时前
mysql行级锁失效的原因排查_检查查询条件与执行计划
jvm·数据库·python
Elastic 中国社区官方博客18 小时前
Elasticsearch:快速近似 ES|QL - 第一部分
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索
Dontla18 小时前
高基数(High Cardinality)问题介绍(Prometheus、高基数字段、低基数字段)
前端·数据库·prometheus
a95114164218 小时前
CSS如何实现元素隐藏不占位_使用display-none完全移除
jvm·数据库·python
SelectDB技术团队19 小时前
SelectDB Enterprise 4.0.5:强化安全与治理,构建企业级实时分析与 AI 数据底座
数据库·人工智能·apache doris
一 乐19 小时前
医院挂号|基于springboot + vue医院挂号管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·医院挂号管理系统
M--Y20 小时前
Redis的主从复制和哨兵
redis·主从复制·哨兵
ego.iblacat20 小时前
Redis 核心概念与部署
数据库·redis·缓存
m0_4939345320 小时前
如何监控AWR数据收集Job_DBA_SCHEDULER_JOBS中的BSLN_MAINTAIN_STATS
jvm·数据库·python