RAG 向量数据库:经得起生产考验的检索

Milvus 是 Apache-2.0 开源的 RAG 向量数据库:关键词、grep 式匹配、语义检索、租户过滤、库内重排和磁盘索引放在一个库里,从笔记本扩到数十亿 chunk。

  • GitHub 40K+ star,Apache-2.0
  • 内置 BM25 全文检索
  • 美团:100 亿+ 向量,覆盖 RAG 到 agent memory
  • Read AI:检索延迟低于 20-50 ms
Milvus 负责 RAG 链路中的检索这一半。
Milvus 负责 RAG 链路中的检索这一半。
Milvus 与 Zilliz Cloud 用户
  • Read.ai
  • OpenEvidence
  • Filevine
  • Notta.ai
  • Airtable
  • Salesforce
  • NVIDIA
  • IBM

RAG 为什么要用向量数据库:它得做好的四件事

关键词与语义兼得

内置 BM25 全文检索,与稠密向量在一次混合检索里融合,精确 ID 和换了说法的问题都能命中对的 chunk。

元数据过滤,按租户检索

过滤表达式(==、in、范围、JSON 路径)与向量检索在一次请求中执行;使用分区键时,每次请求仍需包含正确的租户过滤。

答案不过期

upsert 按主键替换 chunk,delete 直接移除,每个请求可指定一致性级别,决定读到的数据多新。没有第二套索引要同步。

知识库大,账单小

磁盘索引、mmap 和分层存储让大部分知识库数据放在 SSD 或对象存储,而不是全压在内存。

100 亿+美团自建开源 Milvus 承载的向量数,覆盖 100+ 个业务场景查看来源
< 20-50 msRead AI 面向数百万月活用户的检索延迟查看来源

混合检索、RAG 重排序、磁盘索引

混合检索 + grep

RAG 的问题常常一半是语义、一半是精确字符串:错误码、SKU、条款编号。一次 hybrid_search 完成稠密和 BM25 的多路召回,再用模式过滤收窄。

  • 稠密与 BM25 结果用 RRF 或加权 ranker 融合
  • 正则过滤(=~、!~,RE2 语法)支持 VARCHAR、JSON 字符串和数组;LIKE 可用 NGRAM 索引加速
  • TEXT_MATCH、PHRASE_MATCH、TEXT_MATCH_FUZZY 覆盖词项、短语和容错匹配

Function Chain 做 RAG 重排序

Milvus 3.0 起,Function Chain 在一次检索请求里跑有序重排流水线:segment 级、QueryNode 级、全局归并后各一层,无需客户端回查再重排。

  • 把向量分数和时效(decay)、热度(加权组合)揉成一个分数
  • 调用 Cohere、Voyage AI、vLLM、TEI 等重排模型
  • 排序、截断候选;search 和 hybrid search 都能用

Learning to rerank

用相关性标注或点击数据离线训练 XGBoost 排序模型,注册到 Milvus,Function Chain 直接给召回的 chunk 打分。

  • 特征取自标量字段:时效、来源权威度、使用次数
  • XGBoost 原生打分在 QueryNode 上执行,紧挨着数据
  • 也有规则型方案:boost ranker 与 decay ranker

磁盘索引降成本

不是每个 chunk 都得常驻内存:热数据用 HNSW,其余交给磁盘和量化索引,按延迟预算选内存占用。

  • DiskANN 把图和原始向量放 SSD;AISAQ 几乎全部放 SSD
  • mmap 与分层存储按需从磁盘或对象存储加载
  • 量化索引:IVF_RABITQ(最高 1:32 压缩)、IVF_SQ8、IVF_PQ

搭建 RAG 系统,向量数据库怎么选?五条选型清单

RAG 向量数据库选型清单:查什么、为什么重要、Milvus 怎么答(来源:milvus.io/docs)
选型要点对 RAG 的意义Milvus
混合检索(关键词 + 向量)错误码、SKU、条款编号只靠 embedding 会漏BM25 + 稠密 hybrid_search;正则 / LIKE / TEXT_MATCH 过滤
元数据过滤与多租户每个用户只能查到自己的文档,且在查询时生效ANN 内部的过滤表达式;partition key 承载百万级租户
重排序top-k 的顺序决定 LLM 读到什么RRF / 加权 ranker、模型 ranker、Function Chain、XGBoost 打分
知识更新过期 chunk 会生成自信的错误答案upsert、delete、一致性级别
规模、成本、本地部署还是托管原型很小,上生产要到数十亿 chunkMilvus Lite → Standalone → Distributed,或 Zilliz Cloud;DiskANN、mmap、分层存储

RAG 向量数据库示例:按租户检索

存入带 tenant 字段的 chunk,检索某个客户的 top 匹配,再拼进 LLM 的 prompt。

python
# pip install -U "pymilvus[milvus-lite]"
from pymilvus import MilvusClient

client = MilvusClient("rag_demo.db")  # same code against http://localhost:19530 or Zilliz Cloud
client.create_collection(collection_name="chunks", dimension=768)

# embed() is your embedding model (768 dimensions here)
client.insert(collection_name="chunks", data=[
    {"id": 1, "vector": embed("Rotate API keys under Settings > Security."), "tenant": "acme",
     "text": "Rotate API keys under Settings > Security."},
])

hits = client.search(
    collection_name="chunks",
    data=[embed("How do I rotate API keys?")],
    filter='tenant == "acme"',          # retrieve only this customer's documents
    limit=5,
    output_fields=["text"],
)
context = "\n\n".join(h["entity"]["text"] for h in hits[0])  # put into your LLM prompt

embed() 换成你的 embedding 模型。BM25 + 稠密混合检索和正则过滤见混合检索与模式匹配文档。

常见问题

为什么 RAG 要用向量数据库?其他数据库不行吗?

RAG 靠语义相似度找 chunk,这是 ANN 索引的活。pgvector 适合语料小且本来就在 PostgreSQL 里的场景;要混合检索、大规模过滤检索、租户隔离和磁盘索引时,专用向量数据库更合适,Milvus Lite 起步同样轻。

知识库、知识图谱与向量数据库有什么区别?

知识库是文档和 chunk,知识图谱存实体和关系,向量数据库存向量并检索出相关 chunk;RAG 是“检索 + 大模型生成”整条链路,Milvus 管检索这一半,文档里还有 GraphRAG 教程处理多跳问题。

RAG 混合检索还需要 Elasticsearch 吗?

不需要。Milvus 原生支持 BM25,还有正则、LIKE、TEXT_MATCH 过滤,hybrid_search 一次请求就把关键词和稠密结果多路召回后融合。

分块和 Embedding 由谁来做?

分块留在加载端(LangChain、LlamaIndex、Dify)。Embedding 可以进库:Embedding Function(Milvus 2.6+)在写入和查询时调用 OpenAI、Cohere、Voyage AI、Gemini 等模型,存文本、用文本查。

RAG 重排序能用自己的模型吗?检索效果怎么评估?

可以。Milvus 3.0+ 的 Function Chain 能在检索请求内用你的 XGBoost 模型打分,也能调用托管重排模型。用标注过的查询测 recall@k 和 NDCG,改前改后各测一次。

如何基于大模型搭建自己的知识库?

大模型知识库搭建的起步:pip 装 Milvus Lite 先做本地知识库,本地部署的 API 与集群一致;接 LangChain 或 Dify,数据量大了、向量数据库要上生产时换 Distributed 或托管的 Zilliz Cloud,代码不改。

给大模型知识库配一个生产级的向量检索器

先在 notebook 里用 Milvus Lite,接入 LangChain、LlamaIndex 或 Dify,向量数据库这层不用换;再随语料增长加上混合检索、元数据过滤、重排链和磁盘索引。

资料来源与技术文档 (47)