RAG混合多向量库,不同业务使用不同向量引擎
一套 RAG 系统如果同时服务合同问答、产品手册、客服知识等多个业务,把所有向量塞进同一个库,不仅召回容易互相干扰,权限和成本也不好控制。
RAG 混合多向量库的做法,就是按业务把数据分发到不同的向量引擎,让每个业务独立建库、独立检索。
下面用 Chroma 和 Qdrant 组合演示,零基础也能跟着操作。
先想清楚:什么时候才需要拆开向量引擎
不是所有 RAG 系统都需要多向量库。
如果你的业务数据只有几万条、检索量不大,一个库就够了。
真正需要拆分的场景主要有三类:
- 业务间有权限隔离要求,比如内部合同和公开手册不能混查。
- 不同业务需要不同的检索策略,比如一个用相似度阈值,一个用关键词过滤。
- 数据量级别差异大,比如一个业务几千万条,另一个只有几千条,混在一起会拖慢小业务的检索速度。
准备环境:装好两个向量库客户端
这里用 Chroma 做本地轻量存储,Qdrant 做独立服务,分别模拟两个业务。
先安装依赖:
pip install chromadb qdrant-client
如果选择 Milvus,还需要装 pymilvus。
注意:每个客户端版本要和向量库服务端匹配,否则连接时会报版本兼容错误。
写一个路由层:按业务分发到对应向量库
核心思路是封装一个 get_client 函数,根据业务标识返回不同的客户端对象:
from chromadb import PersistentClient
from qdrant_client import QdrantClient
def get_client(biz):
if biz == "contract":
return PersistentClient(path="./chroma_contract")
elif biz == "manual":
return QdrantClient(host="localhost", port=6333)
else:
raise ValueError(f"未知业务: {biz}")
写入和查询也走同一个路由入口:
def add_docs(biz, collection, texts, metadatas):
client = get_client(biz)
if biz == "contract":
col = client.get_or_create_collection(collection)
col.add(documents=texts, metadatas=metadatas,
ids=[f"c_{i}" for i in range(len(texts))])
else:
client.create_collection(collection)
client.upsert(collection,
points=[str(i) for i in range(len(texts))],
payloads=metadatas,
vectors=embeddings)
这里的 embeddings 需要预先用同一个模型生成。两个库的向量维度必须一致,否则查询时无法复用同一套 embedding 逻辑。
避坑:维度、连接和集合名最容易出问题
- Embedding 模型要统一。换模型会导致新旧数据向量维度不一致,检索直接报错。
- collection 名称不能混。即使同一个业务,如果向量引擎不同,也不能沿用同名集合,避免误查。
- Qdrant 需要先建集合。和 Chroma 的
get_or_create_collection不同,Qdrant 的upsert前通常要先recreate_collection,或者检查集合是否存在。 - 连接超时不要用默认值。生产环境建议显式设置
timeout=30,否则 Qdrant 服务压力大时容易卡死。 - 每个库单独备份。不同向量库的持久化文件位置不同,备份恢复命令也不同,不能用一个通用脚本处理。
验证:用同一个问题分别查两个库
先给“合同”业务写入一条“违约金上限为合同金额的 30%”,给“产品手册”业务写入一条“设备保修期为一年”。
然后分别查询:
python -c "print(rag_query('contract', '违约金怎么算'))"
python -c "print(rag_query('manual', '保修期多久'))"
确认返回结果来自对应业务,且内容不串库。
如果合同业务返回了保修期内容,说明路由或集合隔离失效,检查 get_client 的匹配逻辑。
RAG 混合多向量库的关键,不是把所有向量引擎都堆上去,而是用清晰的路由层把业务隔离好。
建议先用最小环境跑通 Chroma 和 Qdrant 的读写,再逐步替换成 Milvus、FAISS 等,遇到问题时优先核对维度、连接参数和日志。
更完整的向量库运维细节,可以继续看站内关于备份和批量导入的教程。