《 Redis已正式接入AI 》
一、先记住这张能力地图
Redis 面向 AI 的能力可以归纳为四层:
| 能力 | 解决的问题 | 典型入口 |
|---|---|---|
| 向量检索 | 从语义上找相似内容 | Query Engine、Hash/JSON、向量索引 |
| Vector Sets | 以原生向量类型做轻量相似检索 | VADD、VSIM |
| 语义缓存 | 避免重复调用大模型 | LangCache |
| Agent 上下文引擎 | 让 Agent 跨会话、跨系统记忆和取数 | Redis Iris |
一句话理解:Redis 不只是"给 AI 加一个向量字段",而是把低延迟存储、检索、缓存、事件和记忆组合成了一条数据服务链。
二、为什么 Redis 适合 AI 场景
传统业务更在意精确读写和稳定低延迟,AI 应用则增加了三类需求:
- 把文本、图片或行为编码成向量,并按相似度检索。
- 维护对话历史、用户偏好、Agent 的工作状态和长期记忆。
- 缓存模型推理结果,减少 Token 消耗、网络等待和重复推理。
这些需求与 Redis 的基础特性高度匹配:
- 内存优先,常规访问可以达到亚毫秒级延迟。
- String、Hash、JSON、Sorted Set、Stream 等数据结构可以承载不同状态。
- 既能做精确过滤,也能做向量相似度查询。
- 大量 Java 团队已经使用 Redis,接入 AI 时可以复用运维、监控和客户端经验。
因此,Redis 接入 AI 的核心逻辑不是追热点,而是用熟悉的实时数据能力解决 AI 系统的上下文和响应速度问题。
三、能力一:向量检索
3.1 从关键词匹配升级为语义匹配
文本经过 Embedding 模型后会变成一个高维向量。语义相近的文本,在向量空间中的距离也更近。例如"如何办理退货"和"退货流程是什么"字面不同,但通常应该命中同一批知识。
Redis Query Engine(原 RediSearch)可以把向量存储在 Hash 或 JSON 中,再建立向量索引。常见算法和取舍如下:
- FLAT:逐条精确计算,结果准确但随着数据量增长而变慢,适合小规模数据。
- HNSW:近似最近邻索引,查询速度和召回率较平衡,适合多数生产场景。
- SVS-VAMANA:Redis 8.4 引入的面向大规模数据优化的算法,需要结合版本和基准测试评估。
距离度量通常有余弦相似度、欧氏距离和内积。文本 Embedding 最常见的是余弦相似度,但最终应以 Embedding 模型的训练方式和业务验证结果为准。
3.2 混合查询是 Redis 的业务优势
真实业务往往不是"只找相似",而是"在满足条件的数据里找相似"。Redis 支持把标签、租户、时间、权限等条件与 KNN 查询组合起来。
less
FT.SEARCH doc_idx
"(@category:{database})=>[KNN 5 @embedding $query_vec AS score]"
PARAMS 2 query_vec <查询向量>
SORTBY score
DIALECT 2
例如推荐商品时先限定类目和可售状态,再按向量相似度排序;企业知识库问答时先过滤租户和权限,避免召回其他组织的数据。
3.3 Java 接入思路
Spring AI 提供 RedisVectorStore,可以把文档切分、Embedding、写入和相似搜索接到统一接口上:
scss
RedisVectorStore vectorStore =
RedisVectorStore.builder(jedisPooled, embeddingModel)
.indexName("doc_idx")
.prefix("doc:")
.build();
vectorStore.add(documents);
List<Document> results = vectorStore.similaritySearch(
SearchRequest.builder()
.query("Redis 向量搜索")
.topK(5)
.build()
);
工程上需要额外处理文档分块、Embedding 模型版本、元数据过滤、相似度阈值和索引重建,不能只把 add 和 search 当成全部工作。
四、能力二:Vector Sets
Vector Sets 是 Redis 8 提供的原生向量数据类型,适合直接管理一组向量和其相似关系。核心命令是:
- VADD:向 Vector Set 添加向量及元素。
- VSIM:查找与目标向量最相似的元素。
它和 Query Engine 的差异可以这样记:
| 对比维度 | Query Engine | Vector Sets |
|---|---|---|
| 数据形态 | 在 Hash/JSON 上建索引 | 原生向量类型 |
| 使用方式 | 先创建索引,再组合查询 | 直接使用 VSIM |
| 适用场景 | 需要过滤、全文和结构化条件 | 纯相似度检索、模型原型 |
| 版本 | Redis 7.x 及以上能力持续演进 | Redis 8.0 及以上 |
选择原则很简单:需要复杂混合条件时优先 Query Engine;只需要快速做一组向量相似检索时可以考虑 Vector Sets。Redis 8.8 对向量精度和存储效率做了优化,文章提到最高可节省约 92% 内存,但具体收益必须用自己的维度、数据量和召回率基准验证。
五、能力三:语义缓存
普通缓存按字符串 Key 精确命中,语义缓存则把"问题"也向量化,用相似度判断是否可以复用历史回答。
一次请求的大致流程:
- 对用户问题生成 Embedding。
- 在缓存中检索相似问题。
- 相似度超过阈值时直接返回已缓存的模型响应。
- 未命中时调用 LLM,并把问题向量、回答、模型版本等信息写回缓存。
LangCache 的价值主要有两点:
- 降低重复 LLM 调用,文章给出的数据是最高约 70% 的成本节省。
- 缓存命中时绕过推理,响应速度可达到约 15 倍提升。
语义缓存必须设置边界:
- 相似度阈值不能拍脑袋,应按"误命中成本"和"漏命中成本"压测。
- 订单、库存、价格、权限等强时效信息不应直接长期复用。
- 缓存 Key 要隔离租户、用户权限和语言环境。
- 模型、系统提示词、知识库版本变化时要能失效旧缓存。
- 记录命中率、误命中反馈、平均节省 Token,才能证明缓存真的有效。
六、能力四:Redis Iris 与 Agent 记忆
Agent 的问题很多时候不是模型不够聪明,而是上下文不完整。一个长流程 Agent 可能要同时读取客户资料、知识库、实时事件和历史对话;如果每一步都重新拼接上下文,成本高且容易丢状态。
Redis Iris 可以理解为位于 Agent 和数据源之间的上下文引擎,文章将其拆成五个工具:
- Redis Context Retriever:让外部数据可被 Agent 检索。
- Redis Agent Memory:管理跨工作流、跨会话记忆。
- Redis Data Integration:接入实时数据。
- Redis LangCache:复用相似推理结果。
- Redis Search:提供全文、标签和向量搜索。
Agent Memory 采用短期记忆与长期记忆的双层结构:
| 层级 | 保存内容 | 典型实现 |
|---|---|---|
| 短期记忆 | 当前会话、临时状态、最近消息 | Hash、List、带 TTL 的 JSON |
| 长期记忆 | 用户偏好、历史事实、知识图谱 | JSON、向量索引、持久化文档 |
Stream 适合记录事件日志和工作流轨迹。一个可落地的设计是:当前任务状态放 Hash,结构化长期事实放 JSON,长期事实的 Embedding 建向量索引,所有状态变更写入 Stream,方便审计和重放。
七、把 Redis 放进完整 AI 链路
可以用下面的链路理解各组件的协作:
用户问题
→ 语义缓存检查
→ 生成查询向量
→ 向量检索 + 租户/权限/标签过滤
→ 组装短期上下文和长期记忆
→ Agent 决定调用工具或 LLM
→ 返回结果
→ 写入语义缓存、会话记忆和事件流
这里有三个关键原则:
- 检索层负责"找什么",上下文层负责"带什么",模型层负责"怎么回答"。
- Redis 负责实时状态和热数据,原始文档、冷数据不一定都要放在内存里。
- 每一个写入都应带上租户、版本、时间和来源等元数据,方便失效、审计和回滚。
八、性能数据应该怎样看
文章列出的官方指标包括:
| 场景 | 文章给出的指标 |
|---|---|
| HNSW 向量插入 | 约 66,000 次/秒,95% 精度 |
| 十亿级向量检索 | 中位延迟约 200ms,90% 精度 |
| JSON 向量存储 | 最高约 92% 内存节省 |
| Streams 吞吐 | 提升约 83% |
| Sorted Sets | 提升约 74% |
| 语义缓存命中 | 最高约 15 倍响应加速 |
这些数字是特定硬件、数据维度、索引参数和精度目标下的结果,不应直接当成 SLA。上线前至少要测:P50/P95/P99 延迟、召回率、索引构建时间、内存占用、节点故障恢复、冷热数据比例和缓存命中率。
九、优点、边界与技术选型
优点
- 性能和延迟优势明显,适合对实时性敏感的 AI 应用。
- 向量检索、混合过滤、语义缓存、Agent 记忆可以在一个技术体系内协作。
- 已使用 Redis 的团队不必立刻引入全新的运维栈。
- Spring AI、RedisVL for Java、LangChain/LangGraph 等生态降低了接入门槛。
边界
- Redis 的向量能力并不意味着它在所有场景都优于专用向量数据库。
- 大量向量驻留内存,成本通常高于以磁盘为主的方案。
- 百亿级以上规模、复杂索引策略或强离线分析场景,应评估 Milvus、pgvector、Elasticsearch 等替代方案。
- Redis Stack 到 Redis 8 的能力整合会带来版本升级、索引迁移和兼容性工作。
选型建议
- RAG、推荐、实时搜索、语义缓存、Agent 记忆:优先做 Redis 方案验证。
- 已有 Redis 且规模中等:优先复用现有集群,减少系统数量。
- 超大规模向量、低成本冷数据或复杂向量分析:采用专用向量数据库,Redis 负责缓存和实时状态。
- 混合架构通常比"所有数据都放 Redis"更稳妥:热数据放 Redis,原始数据和冷向量放对象存储或专用检索系统。
十、Java 团队的落地检查清单
- 先确定 Redis 版本、客户端和 Spring AI 版本,确认向量索引能力可用。
- 统一 Embedding 模型、维度、归一化方式和模型版本字段。
- 设计文档分块策略,给每个 Chunk 写入来源、租户、权限、更新时间。
- 用 Query Engine 实现向量检索和结构化过滤,先做小规模基准。
- 给语义缓存配置阈值、TTL、版本失效和敏感场景白名单。
- 为 Agent 区分短期状态、长期事实和事件流,明确谁负责写入和清理。
- 建立内存、延迟、命中率、召回率、错误率和成本指标。
- 通过压测决定副本、分片、持久化和故障恢复策略,而不是只看单机吞吐。
十一、建议的动手路线
第一步:完成一个最小 RAG
使用 Spring AI RedisVectorStore 写入几十篇 Markdown 文档,实现 Top-K 检索和回答引用。验收标准是:同义问题能够召回同一知识片段,且结果带有来源和分数。
第二步:加入混合过滤
给文档增加 category、tenantId、updatedAt 等元数据,验证"权限过滤后再做 KNN"与"只做向量搜索"的结果差异。
第三步:加入语义缓存
记录命中率、平均响应时间和 Token 节省。刻意构造相似但答案不同的问题,调节阈值,观察误命中。
第四步:加入 Agent 记忆
短期记忆保存当前对话,长期记忆保存明确的用户偏好,并为长期事实建立向量索引。实现记忆过期、纠错和删除。
第五步:做一次真实基准
至少准备 1 万、10 万和 100 万条向量,分别测试 FLAT、HNSW 以及不同维度和精度设置,记录延迟、召回率和内存成本,再决定是否需要专用向量数据库。
十二、自测问题
1. Redis 向量检索和传统 Key 查询有什么本质区别?
传统查询依赖精确 Key;向量检索先把内容映射到向量空间,再按距离返回语义相近结果。
2. 什么时候用 Query Engine,什么时候用 Vector Sets?
需要标签、全文、租户等复杂过滤时用 Query Engine;纯相似度检索、结构简单时可用 Vector Sets。
3. 语义缓存为什么比普通缓存更难?
它要处理相似度阈值、误命中、时效性、权限隔离和模型版本失效,正确性不能只靠 Key 命中保证。
4. Agent 为什么需要短期记忆和长期记忆?
短期记忆服务当前任务,长期记忆服务跨会话连续性;两者的保留时间、写入条件和检索策略不同。
5. 为什么不能只看文章中的吞吐数字?
吞吐会受到硬件、向量维度、索引参数、精度目标和数据分布影响,必须用业务数据做端到端压测。
6. Redis 是否会取代所有向量数据库?
不会。Redis 更适合低延迟、实时状态和已有 Redis 体系的场景;超大规模、低成本冷存储和复杂分析仍需专用方案。
十三、最后的学习结论
这篇文章最值得记住的不是某个命令,而是一种架构思路:AI 应用的瓶颈不仅在模型,也在上下文获取、状态管理、重复调用和实时数据同步。
Redis 通过向量检索解决"找得到",通过语义缓存解决"少调用",通过 Agent Memory 和 Redis Iris 解决"记得住",再用内存数据结构和 Stream 把这些能力串成实时链路。
对 Java 团队来说,合理的下一步不是立刻重构全部系统,而是选一个 RAG、客服问答或 Agent 记忆的小场景,建立可测量的基准,再根据延迟、召回率、成本和数据规模逐步扩大。