原则上是这样的。
RAGFlow 更换Embedding(向量)模型 之后,之前已经入库的文档通常不能继续正常检索 ,原因不是 RAGFlow 的限制,而是所有 RAG 系统(LangChain、LlamaIndex、Milvus、FAISS、pgvector 等)共同的原理决定的。
为什么不能继续使用?
RAG 检索流程大致如下:
文档
│
├── Embedding模型A
│ │
│ ▼
│ 向量(1024维)
│
▼
向量数据库
用户提问时:
问题
│
├── Embedding模型A
│ │
│ ▼
│ 向量(1024维)
│
▼
与数据库中的文档向量计算相似度
只有文档 和问题 使用的是同一个 Embedding 模型,它们才位于同一个向量空间。
例如:
文档 ---- bge-m3 ------> 向量A
问题 ---- bge-m3 ------> 向量B
A 与 B 才有意义
如果换了 Embedding 模型
例如:
原来:
文档 ---- bge-m3 ----> 向量
后来改成:
问题 ---- jina-embeddings-v4 ----> 新向量
这时候:
旧文档向量
×
新问题向量
即使两者维度一样,也没有可比性。
举个例子:
苹果
bge-m3
→ [0.12,0.35,......]
jina-v4
→ [0.81,-0.21,......]
两个模型学习出来的坐标系完全不同。
就像:
- 一个地图使用北京坐标系
- 一个地图使用GPS坐标系
直接计算距离毫无意义。
即使维度一样也不能混用
很多人误以为:
模型A:1024维
模型B:1024维
就可以继续使用。
实际上:
维度相同 ≠ 向量空间相同
例如:
bge-m3 1024维
Qwen3-Embedding 1024维
jina-v4 1024维
gte-Qwen2 1024维
虽然都是1024维,但不能混用。
RAGFlow 为什么要求重新解析?
RAGFlow 在解析文档时实际上做了几件事情:
PDF
↓
OCR
↓
Chunk切分
↓
Embedding
↓
写入向量数据库
真正耗时间的是最后一步:
Chunk
↓
Embedding模型
↓
向量数据库
因此:
换 Embedding 模型后,需要重新计算所有 Chunk 的向量(Re-embedding),然后更新向量数据库。
更换哪些模型需要重新解析?
① 更换 Embedding 模型(必须)
例如:
bge-m3
↓
jina-embeddings-v4
必须重新生成向量。
② 升级同一个 Embedding 模型版本(通常也建议)
例如:
bge-m3 v1
↓
bge-m3 v2
如果模型参数发生变化,最好重新生成向量。
③ 更换 LLM(不用)
例如:
Qwen3-32B
↓
Qwen3.6-35B-A3B
或者
DeepSeek-R1
↓
Qwen3
不需要重新解析文档。
因为:
Embedding负责检索
LLM负责生成答案
两者是独立的。
因此:
Embedding不变
LLM随便换
数据库都可以继续使用。
是否可以保留旧数据库?
可以,但建议按 Embedding 模型隔离管理。
例如:
Knowledge Base A
Embedding:bge-m3
Vector DB:collection_bge
Knowledge Base B
Embedding:jina-v4
Vector DB:collection_jina
不要在同一个向量集合(Collection)中混合不同 Embedding 模型生成的向量。
如果文档很多,重新解析太耗时怎么办?
如果有几百万个 Chunk,全部重新解析确实耗时。通常有几种方案:
- 后台批量重建向量库(推荐):保留旧向量库提供服务,同时使用新 Embedding 模型重新计算所有文档向量,完成后切换到新的向量库,业务几乎无中断。
- 双库并行:旧知识库继续使用旧 Embedding,新知识库使用新 Embedding,逐步迁移。
- 增量重建:优先重建访问频率高或最近更新的文档,其余文档按计划逐步重新生成向量。
结合你的部署场景
根据我们之前的交流,你是在离线部署 RAGFlow,并且会频繁切换不同的大模型进行测试。如果后续还会尝试不同的 Embedding 模型,我建议:
- LLM(Qwen、DeepSeek 等)可以自由切换,无需重建知识库。
- Embedding 模型尽量固定,不要频繁更换。
- 如果确实需要评测不同 Embedding 模型,为每个模型维护独立的知识库或向量集合,避免反复重建和相互影响。
这样既能保证检索效果,也能避免因为更换 Embedding 模型而导致已有向量失效。