教程|用 turbovec 替代 Pinecone:单节点 1000 万向量的 RAG 索引

这篇教程演示如何用 turbovecGitHub)搭一个本地 RAG 索引。

第 1 步:安装

pip install turbovec numpy

第 2 步:准备数据

用 bge-m3 生成 1024 维向量:

from sentence_transformers import SentenceTransformer
import numpy as np

model = SentenceTransformer("BAAI/bge-m3")
texts = [doc.page_content for doc in documents]  # 你自己的文档
vectors = model.encode(texts, normalize_embeddings=True)
print(vectors.shape)  # (N, 1024)

第 3 步:建索引

import turbovec as tv

index = tv.Index(dimension=1024, precision="3bit")
index.add(vectors.astype("float32"))
index.save("my_index.tvec")

1000 万 1024-d 向量,单机 8 分钟。

第 4 步:查询

index = tv.Index.load("my_index.tvec")
query = model.encode(["什么是持续学习?"], normalize_embeddings=True)
results = index.search(query[0], k=10)
# results: [(score, idx), ...]

p99 < 5ms。

第 5 步:接到 RAG

from openai import OpenAI
client = OpenAI()

def rag(query, k=5):
    q_vec = model.encode([query], normalize_embeddings=True)[0]
    results = index.search(q_vec, k=k)
    context = "
".join([texts[i] for _, i in results])
    resp = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": f"基于以下上下文:
{context}

回答:{query}"}]
    )
    return resp.choices[0].message.content

print(rag("DeepSeek-R1 是不是真正在推理?"))

性能对比

  • Pinecone(云):1000 万向量 $70/月
  • turbovec(本地):免费 + 16GB 内存
  • 延迟:本地 5ms vs 云 30-50ms
  • 数据安全:本地不外传

局限

  • 不支持向量删除(要重建)
  • 不能跨节点扩展(单机)
  • Python GIL 还存在,极致性能要调 Rust
Leave a Comment