diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 4b399fd3cb..eb580ce225 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -2280,7 +2280,7 @@ QDRANT_HYBRID_SEARCH_ENABLED = os.environ.get('QDRANT_HYBRID_SEARCH_ENABLED', 'f QDRANT_SPARSE_EMBEDDING_MODEL = os.environ.get('QDRANT_SPARSE_EMBEDDING_MODEL', 'Qdrant/bm25') QDRANT_DENSE_VECTOR_NAME = os.environ.get('QDRANT_DENSE_VECTOR_NAME', 'dense') QDRANT_SPARSE_VECTOR_NAME = os.environ.get('QDRANT_SPARSE_VECTOR_NAME', 'sparse') -QDRANT_HYBRID_SEARCH_RRF_K = int(os.environ.get('QDRANT_HYBRID_SEARCH_RRF_K', '60')) +QDRANT_HYBRID_SEARCH_FUSION_TYPE = os.environ.get('QDRANT_HYBRID_SEARCH_FUSION_TYPE', 'rrf').lower() # 'rrf' or 'dbsf' QDRANT_SPARSE_ON_DISK = os.environ.get('QDRANT_SPARSE_ON_DISK', 'false').lower() == 'true' WEAVIATE_HTTP_HOST = os.environ.get('WEAVIATE_HTTP_HOST', '') diff --git a/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py b/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py index c048094379..11641b90f1 100644 --- a/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py +++ b/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py @@ -20,7 +20,7 @@ from open_webui.config import ( QDRANT_SPARSE_EMBEDDING_MODEL, QDRANT_DENSE_VECTOR_NAME, QDRANT_SPARSE_VECTOR_NAME, - QDRANT_HYBRID_SEARCH_RRF_K, + QDRANT_HYBRID_SEARCH_FUSION_TYPE, QDRANT_SPARSE_ON_DISK, ) @@ -71,7 +71,7 @@ class QdrantClient(VectorDBBase): self.QDRANT_SPARSE_EMBEDDING_MODEL = QDRANT_SPARSE_EMBEDDING_MODEL self.QDRANT_DENSE_VECTOR_NAME = QDRANT_DENSE_VECTOR_NAME self.QDRANT_SPARSE_VECTOR_NAME = QDRANT_SPARSE_VECTOR_NAME - self.QDRANT_HYBRID_SEARCH_RRF_K = QDRANT_HYBRID_SEARCH_RRF_K + self.QDRANT_HYBRID_SEARCH_FUSION_TYPE = QDRANT_HYBRID_SEARCH_FUSION_TYPE self.QDRANT_SPARSE_ON_DISK = QDRANT_SPARSE_ON_DISK if not self.QDRANT_URI: @@ -382,12 +382,17 @@ class QdrantClient(VectorDBBase): collection_is_hybrid = self._is_hybrid_collection(mt_collection) - # Hybrid search with RRF fusion + # Hybrid search with server-side fusion (RRF or DBSF) if collection_is_hybrid and self._hybrid_enabled and query: sparse_query = self._encode_sparse_query(query) + fusion = ( + models.Fusion.DBSF + if self.QDRANT_HYBRID_SEARCH_FUSION_TYPE == 'dbsf' + else models.Fusion.RRF + ) query_response = self.client.query_points( collection_name=mt_collection, - query=models.FusionQuery(fusion=models.Fusion.RRF), + query=models.FusionQuery(fusion=fusion), prefetch=[ models.Prefetch( query=vectors[0],