Comunidad Valkey

用 Valkey 搭 RAG:架构与选型

Valkey 在 RAG 里同时承担向量库、缓存与会话存储,附 ValkeyVectorStore 原生代码与选型对比。

RAG(检索增强生成)的核心是「先检索相关片段,再让 LLM 基于片段作答」。Valkey 把 embedding、chunk 文本和元数据一起放在内存里,提供 KNN top-k 检索。真正的卖点不是单点向量库,而是统一引擎:同一套 Valkey 同时扮演向量库、语义缓存会话存储,省掉跨系统同步。

Valkey 在 RAG 中的位置

                     ┌──────────────────────────┐
   用户提问 ──embed──▶│        Valkey            │
                     │  · 向量索引 (KNN top-k)   │
                     │  · 语义缓存 (命中即返回)  │
                     │  · 会话 / Agent 记忆      │
                     └────────────┬─────────────┘
                          相关 chunk ▼
                     ┌──────────────────────────┐
                     │           LLM            │──▶ 回答
                     └──────────────────────────┘

检索发生在延迟敏感的主链路上——这正是把向量放进内存数据库的理由。

存储:Hash vs JSON

向量存为原始 float32 小端字节流,文本和元数据存为普通字段。最直接,写入开销最低。

import numpy as np, valkey
r = valkey.Valkey()

r.hset("doc:1", mapping={
    "embedding": np.array(vec, dtype=np.float32).tobytes(),
    "text": "Valkey 是 BSD-3 协议的内存数据库……",
    "category": "database",
})

用 valkey-json 把整篇文档(文本 + 元数据 + 向量)放在一个键里。注意向量必须是「带方括号的 JSON 字符串」,不能是原生数组。

import json
r.execute_command("JSON.SET", "doc:1", "$", json.dumps({
    "embedding": "[0.1,0.2,0.3]",  # 字符串,不是数组
    "text": "……",
    "category": "database",
}))

建索引时,Hash 用 ON HASH(默认),JSON 用 ON JSON 加 JSONPath 别名。详见 valkey-search

元数据过滤

RAG 常需要「只在某个类目/某个租户下检索」。把过滤条件前置到 KNN 之前:

FT.SEARCH ragIndex "@category:{database} @lang:{zh}=>[KNN 4 @embedding $q]" PARAMS 2 q "<blob>" DIALECT 2

TAG 用 @f:{a|b},数值范围用 @f:[min max],AND 用空格,OR 用竖线,NOT 用 -@f:{x}

ValkeyVectorStore:LangChain 原生

LangChain 在 langchain-aws 里提供了原生ValkeyVectorStore,底层用 Valkey GLIDE 客户端(不是 redis-py):

from langchain_aws.vectorstores import ValkeyVectorStore
from langchain_openai import OpenAIEmbeddings

docs = [...]  # List[Document]
embeddings = OpenAIEmbeddings()

store = ValkeyVectorStore.from_documents(
    docs,
    embeddings,
    valkey_url="valkey://endpoint:6379",
)

results = store.similarity_search("Valkey 适合做 RAG 吗?", k=4)

优先用 ValkeyVectorStore(langchain-aws),而不是 langchain-redis 的 RedisVectorStore。后者会自动创建一个 TEXT 字段,在低于 1.2.0 的 valkey-search 上会失败。

选型对比

维度Valkey + valkey-searchpgvectorPineconeMilvus
形态内存数据库Postgres 扩展托管 SaaS专用向量库
检索延迟最快档(约 3.9ms)较高中等中等
统一能力缓存 + 向量 + 会话三合一仅向量(在 PG 内)仅向量仅向量
成本模型受 RAM 约束最便宜最贵运维重
规模单节点 1M~100M+,集群更高低于 1000 万较舒适托管弹性十亿级

什么时候选 Valkey

向量检索在延迟敏感的主链路上,并且你希望缓存 / RAG / 会话用同一套系统时,选 Valkey。如果只是离线、低频、对延迟不敏感且向量量不大,pgvector 更省钱;要十亿级向量则考虑 Milvus。

下一步

valkey-search 建好向量索引。
叠加语义缓存进一步降本。
把会话与长期记忆也放进同一套 Valkey,见 Agent 记忆

On this page