我们最近在做一个多模态大模型应用的比赛项目,核心任务是构建一个支持离线部署、支持多模态输入(文本、图像等)的 RAG 系统,用于用户信息抽取与表单自动填写。因为检索部分要求兼顾语义理解能力和关键词命中率,我在 Milvus 上实现了一个“稠密向量 + 稀疏 BM25 向量”的混合检索方案。
具体来说,稠密向量用的是我们自己训练的 Qwen3 embedding 模型,稀疏向量通过 Milvus 的 function function(FunctionType.BM25)从 token 字段生成 sparse_vec,两者统一存储在一个 Collection 中。向量检索用 L2 距离,稀疏检索用 IP,Milvus 原生支持这两种索引的融合查询,我通过 PyMilvus ORM 写了封装类,包括 schema 管理、异步向量插入、BM25 搜索、向量搜索以及 hybrid 混合搜索等完整流程,代码支持 async/aw智算t,后续可以直接对接 FastAPI 做服务化。
这种结构在 RAG 场景下表现很好,特别适合文本较长、结构复杂或者用户搜索词比较短的时候,能显著提升召回的精度和多样性。后续还计划引入 Ollama 的 Qwen3 reranker 来做打分重排。整体方案算是比较落地的一个实践,如果大家也在做相关任务,推荐试试这个“稀疏 + 稠密”的组合方案。效果比单一向量要强不少。