(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 的接口抽象)。
  • 未来优化:向量库数据量的增长监控、异步向量化链路的引入。
相关推荐
霸道流氓气质4 分钟前
SpringAIAlibaba整合百炼平台实现多MCP Server调用示例及指定某MCP Server调用示例
数据库
2301_7693406711 分钟前
怎样导出用于负载测试的样本数据_LIMIT限制数据量提取
jvm·数据库·python
2401_8504916531 分钟前
c++如何通过文件映射mmap在多进程间实现高性能数据共享【进阶】
jvm·数据库·python
iuvtsrt32 分钟前
PHP 中高效查找 CSV 行并获取前后指定偏移行的数据
jvm·数据库·python
m0_4636722032 分钟前
MySQL从库出现大量锁等待怎么办_分析从库执行计划与锁日志
jvm·数据库·python
2301_8092047035 分钟前
为 Go 语言 WaitGroup.Wait() 添加超时机制的实用方案
jvm·数据库·python
是桃萌萌鸭~1 小时前
oracle的隐藏虚拟列详解
运维·数据库·oracle
2301_779622411 小时前
SQL分组聚合优化_GROUP BY索引与优化方案
jvm·数据库·python
m0_740796361 小时前
golang如何使用sync.WaitGroup_golang sync.WaitGroup并发等待使用方法
jvm·数据库·python
DianSan_ERP1 小时前
抖店订单接口同步中如何解决订单漏单与数据一致性难题?
数据库