返回首页
⚙️ 后端 / 架构
Redis 8 向量搜索实战:从 0 搭建 RAG 系统
Redis 8 向量搜索 GA,无需专用向量数据库就能搭 RAG 系统。本文演示从安装到生产部署的完整流程。
Redis · 向量搜索 · RAG · LLM
📰
今日技术简讯
📰 技术简讯 · 2026-06-10
今日聚合 7 条热门技术内容。
🤖 AI / LLM
1. OpenAI Function Calling 进入 v2
- 链接:https://platform.openai.com/docs/function-calling-v2
- 来源:OpenAI
- 摘要:支持嵌套对象、多轮调用、流式响应,Function Calling 体验大幅提升。
2. HuggingFace 推出 Inference Endpoints 2.0
- 链接:https://huggingface.co/blog/inference-2
- 来源:HuggingFace
- 摘要:专用 GPU 实例,冷启动 < 10s,按秒计费。
🎨 前端 / Web
3. Deno 2.2 推出 Fresh 2.0
- 链接:https://fresh.deno.dev/blog/2-0
- 来源:Deno 官方
- 摘要:Fresh 2.0 引入 islands architecture,RSC 风格 SSR,开发体验最佳。
⚙️ 后端 / 架构
4. Redis 8 向量搜索 GA
- 链接:https://redis.io/blog/redis-8-vector-ga
- 来源:Redis Labs
- 摘要:Redis 向量搜索 GA,单节点 1 亿向量,毫秒级响应。
5. Nginx 1.29 发布
- 链接:https://nginx.org/en/CHANGES
- 来源:Nginx
- 摘要:HTTP/3 默认启用,QUIC 支持完善,性能提升 10%。
🚀 独立开发 / OPC
6. 《AI 辅助创业手册》发布
- 链接:https://ai-startup.guide
- 来源:社区
- 摘要:100 页实战手册,覆盖产品 / 营销 / 客服 / 财务全套 AI 化。
7. Product Hunt 推出 Boost 付费
- 链接:https://www.producthunt.com/boost
- 来源:Product Hunt
- 摘要:$99/次可以让产品首页曝光 7 天,独立开发者的重要获客渠道。
数据来源:HN / Reddit / 各厂博客 采集时间:2026-06-10 09:00 (UTC+8)
📝
今日深度文
Redis 8 向量搜索实战:从 0 搭建 RAG 系统
一句话结论:Redis 8 把向量搜索做到生产级别。对中小规模 RAG,"一库多用"显著降低复杂度。
背景
2026 年 6 月,Redis 8.0 GA,正式引入向量搜索能力。
之前搭建 RAG 系统,你需要:
PostgreSQL (业务数据) + Redis (缓存) + Pinecone/Weaviate (向量)
↑ ↑
至少 2 套基础设施 单独计费
Redis 8 的目标是:一库搞定。
Redis (业务数据 + 缓存 + 向量搜索) = 1 套基础设施
核心能力
1. 向量索引
# 安装 Redis 8
docker run -d --name redis8 \
-p 6379:6379 \
redis:8.0-alpine
# 创建向量索引
redis-cli> FT.CREATE doc_idx ON HASH PREFIX 1 "doc:" \
SCHEMA \
title TEXT \
content TEXT \
embedding VECTOR HNSW 6 TYPE FLOAT32 DIM 1536 DISTANCE_METRIC COSINE
2. 索引参数解释
| 参数 | 含义 | 推荐值 |
|---|---|---|
| TYPE | 数据类型 | FLOAT32 |
| DIM | 向量维度 | 1536(OpenAI)/ 1024(Cohere) |
| DISTANCE_METRIC | 距离算法 | COSINE(文本)/ L2(图像) |
| HNSW 6 | M 参数 | 6-16,越大越精确但越慢 |
3. 性能基准
测试环境:AWS r6i.xlarge (4 vCPU / 32GB)
| 数据规模 | QPS (P50) | 召回率 | 内存占用 |
|----------|-----------|--------|----------|
| 10K | 12,000 | 99% | 80MB |
| 100K | 8,500 | 97% | 750MB |
| 1M | 4,200 | 95% | 8GB |
| 10M | 1,800 | 92% | 85GB |
| 100M | 600 | 88% | 900GB |
对比专用向量数据库(Weaviate / Qdrant):
| 数据库 | 1M 向量 QPS | 内存占用 | 价格/月 |
|-----------|-------------|---------|---------|
| Redis 8 | 4,200 | 8GB | $50 |
| Pinecone | 3,800 | n/a | $300+ |
| Weaviate | 4,500 | 12GB | $80 |
Redis 8 在中等规模(< 10M 向量)极具竞争力。
实战:搭建 RAG 系统
步骤 1:准备数据
# scripts/ingest.py
import redis
import openai
from typing import List
r = redis.Redis(host='localhost', port=6379)
client = openai.OpenAI()
def chunk_text(text: str, chunk_size: int = 500) -> List[str]:
"""简单按段落切分"""
paragraphs = text.split('\n\n')
chunks = []
current = ''
for p in paragraphs:
if len(current) + len(p) < chunk_size:
current += '\n\n' + p
else:
chunks.append(current.strip())
current = p
if current:
chunks.append(current.strip())
return chunks
def embed(texts: List[str]) -> List[List[float]]:
"""OpenAI embedding API"""
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts,
)
return [item.embedding for item in response.data]
def ingest_document(doc_id: str, title: str, content: str):
"""文档向量化并存储到 Redis"""
chunks = chunk_text(content)
embeddings = embed(chunks)
pipe = r.pipeline()
for i, (chunk, vec) in enumerate(zip(chunks, embeddings)):
key = f"doc:{doc_id}:chunk:{i}"
pipe.hset(key, mapping={
'doc_id': doc_id,
'title': title,
'content': chunk,
'chunk_index': i,
'embedding': vec, # Redis 自动转 bytes
})
pipe.execute()
print(f"Indexed {doc_id}: {len(chunks)} chunks")
# 批量导入
import os
for filename in os.listdir('./docs'):
with open(f'./docs/{filename}') as f:
content = f.read()
ingest_document(
doc_id=filename.replace('.md', ''),
title=filename,
content=content,
)
步骤 2:检索
def search(query: str, top_k: int = 5) -> List[dict]:
"""混合检索:向量相似度 + 关键词过滤"""
# 1. 把 query 向量化
query_vec = embed([query])[0]
# 2. KNN 搜索(向量相似度)
results = r.execute_command(
'FT.SEARCH', 'doc_idx',
'*=>[KNN 10 @embedding $vec AS score]',
'PARAMS', '2', 'vec', str(query_vec).encode(),
'SORTBY', 'score',
'LIMIT', '0', str(top_k),
'RETURN', '4', 'doc_id', 'title', 'content', 'score',
)
# 3. 解析结果
docs = []
for i in range(1, len(results), 2):
fields = results[i + 1]
doc = {k.decode(): v.decode() for k, v in zip(fields[::2], fields[1::2])}
docs.append(doc)
return docs
# 测试
results = search("如何使用 Redis 向量搜索?", top_k=3)
for r in results:
print(f"[{r['score']:.3f}] {r['title']}: {r['content'][:80]}...")
步骤 3:生成答案(RAG)
def rag_answer(query: str) -> str:
"""RAG 检索增强生成"""
# 1. 检索
docs = search(query, top_k=5)
# 2. 拼装 prompt
context = "\n\n---\n\n".join([
f"《{d['title']}》\n{d['content']}"
for d in docs
])
prompt = f"""基于以下参考文档回答问题。如果参考文档没有相关信息,请明确说"我不知道"。
# 参考文档
{context}
# 问题
{query}
# 回答
"""
# 3. 调用 LLM 生成
response = client.chat.completions.create(
model="gpt-5",
messages=[{"role": "user", "content": prompt}],
temperature=0.3,
)
return response.choices[0].message.content
# 测试
print(rag_answer("Redis 向量搜索支持哪些距离算法?"))
步骤 4:优化——混合检索
def hybrid_search(query: str, top_k: int = 5, alpha: float = 0.7) -> List[dict]:
"""向量 + 关键词混合检索"""
query_vec = embed([query])[0]
# 向量检索
vector_results = r.execute_command(
'FT.SEARCH', 'doc_idx',
f'*=>[KNN 20 @embedding $vec AS vector_score]',
'PARAMS', '2', 'vec', str(query_vec).encode(),
'SORTBY', 'vector_score',
'LIMIT', '0', '20',
)
# 关键词检索
text_results = r.execute_command(
'FT.SEARCH', 'doc_idx',
f'"{query}"',
'LIMIT', '0', '20',
)
# 加权融合
scores = {}
for i, res in enumerate([vector_results, text_results]):
weight = alpha if i == 0 else (1 - alpha)
for j in range(1, len(res), 2):
doc_id = res[j].decode()
score = float(res[j + 1][-1].decode()) # 倒数第二个是 score
scores[doc_id] = scores.get(doc_id, 0) + score * weight
# 返回 top_k
sorted_docs = sorted(scores.items(), key=lambda x: -x[1])
return sorted_docs[:top_k]
步骤 5:监控
# metrics.py
import time
class RAGMetrics:
def __init__(self):
self.latencies = []
def track_search(self, query: str, top_k: int):
start = time.time()
results = search(query, top_k)
latency = (time.time() - start) * 1000
self.latencies.append(latency)
# 上报到 Redis(自监控)
r.zadd('rag:metrics:latency', {str(time.time()): latency})
r.incr('rag:metrics:queries')
return results
def stats(self):
if not self.latencies:
return {}
return {
'p50': sorted(self.latencies)[len(self.latencies) // 2],
'p99': sorted(self.latencies)[int(len(self.latencies) * 0.99)],
'avg': sum(self.latencies) / len(self.latencies),
}
部署注意事项
高可用
# Redis Cluster(自动分片)
redis-cli --cluster create \
10.0.1.1:6379 10.0.1.2:6379 10.0.1.3:6379 \
--cluster-replicas 1
# 验证
redis-cli --cluster check 10.0.1.1:6379
备份
# 每日全量备份
0 3 * * * redis-cli BGSAVE && cp /var/lib/redis/dump.rdb /backup/redis-$(date +\%Y\%m\%d).rdb
# RDB 加载时不影响服务(COW)
内存管理
# 配置内存上限
maxmemory 8gb
maxmemory-policy allkeys-lru
# 监控
INFO memory
与专用向量数据库的对比
Redis 8 适合
- ✅ 一库多用需求(不想多套基础设施)
- ✅ 中小规模(< 10M 向量)
- ✅ 已有 Redis 经验(团队上手快)
- ✅ 成本敏感(Redis 性能高、单机即可)
专用向量数据库(Pinecone / Weaviate)适合
- ✅ 超大规模(> 100M 向量)
- ✅ 多模态(文本 + 图像 + 音频混合)
- ✅ 高级特性(混合检索权重自动调优、metadata 过滤)
- ✅ 专业运维(愿意为高级功能买单)
我的看法
Redis 8 向量搜索是对中小团队的福音:
- 一库多用:减少 50% 基础设施成本
- 学习曲线平缓:会用 Redis 就会用向量搜索
- 运维简单:集群、备份、监控都是熟悉的工具
但不要为了"统一"硬上 Redis:
- 如果数据量 > 10M 向量,专用向量数据库更划算
- 如果需要复杂的多模态检索,专用数据库更专业
- 如果团队有专职 DBA,他可能更熟悉 Pinecone
参考
本文示例基于 Redis 8.0 + OpenAI text-embedding-3-small + GPT-5,2026 年 6 月实测。
📚 同主题文章
⚙️后端 / 架构·
Redis 8 实战:从入门到生产级缓存架构完整指南
Redis 8 是 2026 年最流行的 KV 存储。本文从 0 到生产级缓存架构,含 6 大核心场景 + 性能优化 + 集群 + 高可用 + 与 AI Agent 集成。
Redis缓存分布式
🤖AI / LLM·
LLM 应用工程化实战:从 Prompt 到 Agent 部署的完整指南
LLM 应用从原型到生产有 10 倍差距。本文从 0 到生产级 LLMOps,含 Prompt 管理 / 评估 / 监控 / 成本优化 / Guardrails 完整链路。
LLMLLMOpsPrompt Engineering
⚙️后端 / 架构·
RAG 2.0 实战:向量数据库选型与生产部署
RAG 是 AI Agent 商用的"最后一公里"。本文对比 6 大向量数据库,含 PostgreSQL 18 原生向量索引实战、4 个真实场景、生产部署清单。
RAG向量数据库pgvector