关键词与语义兼得
内置 BM25 全文检索,与稠密向量在一次混合检索里融合,精确 ID 和换了说法的问题都能命中对的 chunk。
Milvus 是 Apache-2.0 开源的 RAG 向量数据库:关键词、grep 式匹配、语义检索、租户过滤、库内重排和磁盘索引放在一个库里,从笔记本扩到数十亿 chunk。
内置 BM25 全文检索,与稠密向量在一次混合检索里融合,精确 ID 和换了说法的问题都能命中对的 chunk。
过滤表达式(==、in、范围、JSON 路径)与向量检索在一次请求中执行;使用分区键时,每次请求仍需包含正确的租户过滤。
upsert 按主键替换 chunk,delete 直接移除,每个请求可指定一致性级别,决定读到的数据多新。没有第二套索引要同步。
磁盘索引、mmap 和分层存储让大部分知识库数据放在 SSD 或对象存储,而不是全压在内存。
RAG 的问题常常一半是语义、一半是精确字符串:错误码、SKU、条款编号。一次 hybrid_search 完成稠密和 BM25 的多路召回,再用模式过滤收窄。
Milvus 3.0 起,Function Chain 在一次检索请求里跑有序重排流水线:segment 级、QueryNode 级、全局归并后各一层,无需客户端回查再重排。
用相关性标注或点击数据离线训练 XGBoost 排序模型,注册到 Milvus,Function Chain 直接给召回的 chunk 打分。
不是每个 chunk 都得常驻内存:热数据用 HNSW,其余交给磁盘和量化索引,按延迟预算选内存占用。
| 选型要点 | 对 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、一致性级别 |
| 规模、成本、本地部署还是托管 | 原型很小,上生产要到数十亿 chunk | Milvus Lite → Standalone → Distributed,或 Zilliz Cloud;DiskANN、mmap、分层存储 |
存入带 tenant 字段的 chunk,检索某个客户的 top 匹配,再拼进 LLM 的 prompt。
# 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 promptembed() 换成你的 embedding 模型。BM25 + 稠密混合检索和正则过滤见混合检索与模式匹配文档。
RAG 靠语义相似度找 chunk,这是 ANN 索引的活。pgvector 适合语料小且本来就在 PostgreSQL 里的场景;要混合检索、大规模过滤检索、租户隔离和磁盘索引时,专用向量数据库更合适,Milvus Lite 起步同样轻。
知识库是文档和 chunk,知识图谱存实体和关系,向量数据库存向量并检索出相关 chunk;RAG 是“检索 + 大模型生成”整条链路,Milvus 管检索这一半,文档里还有 GraphRAG 教程处理多跳问题。
不需要。Milvus 原生支持 BM25,还有正则、LIKE、TEXT_MATCH 过滤,hybrid_search 一次请求就把关键词和稠密结果多路召回后融合。
分块留在加载端(LangChain、LlamaIndex、Dify)。Embedding 可以进库:Embedding Function(Milvus 2.6+)在写入和查询时调用 OpenAI、Cohere、Voyage AI、Gemini 等模型,存文本、用文本查。
可以。Milvus 3.0+ 的 Function Chain 能在检索请求内用你的 XGBoost 模型打分,也能调用托管重排模型。用标注过的查询测 recall@k 和 NDCG,改前改后各测一次。
大模型知识库搭建的起步:pip 装 Milvus Lite 先做本地知识库,本地部署的 API 与集群一致;接 LangChain 或 Dify,数据量大了、向量数据库要上生产时换 Distributed 或托管的 Zilliz Cloud,代码不改。
先在 notebook 里用 Milvus Lite,接入 LangChain、LlamaIndex 或 Dify,向量数据库这层不用换;再随语料增长加上混合检索、元数据过滤、重排链和磁盘索引。