From dab0ced2163012acfb01733b4572df7e43798ef1 Mon Sep 17 00:00:00 2001 From: Dirk Kulawiak Date: Fri, 24 Jul 2026 09:18:06 +0200 Subject: [PATCH 1/2] Fix tests by proper placement of parameter --- .../test_collection_diversity_hybrid.py | 45 +++++++------------ 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/integration/test_collection_diversity_hybrid.py b/integration/test_collection_diversity_hybrid.py index 1a5709430..233adba36 100644 --- a/integration/test_collection_diversity_hybrid.py +++ b/integration/test_collection_diversity_hybrid.py @@ -1,10 +1,9 @@ """Integration tests for hybrid search + MMR diversity selection. -``DiversitySelection`` passed inside ``HybridVector.near_vector`` / -``HybridVector.near_text`` is applied by the server as a post-fusion MMR pass -(Weaviate >= 1.39.0). These tests assert that ``balance=0`` (pure diversity) -produces a different ordering than ``balance=1`` (pure relevance), and that -``mmr.limit`` caps the result count. +``diversity_selection`` is a hybrid-level argument: the server applies it as a +post-fusion MMR pass (Weaviate >= 1.38.6). These tests assert that ``balance=0`` +(pure diversity) produces a different ordering than ``balance=1`` (pure +relevance), and that ``mmr.limit`` caps the result count. The equivalent ``near_vector`` behaviour is covered in ``test_collection_diversity.py``. @@ -68,18 +67,14 @@ def test_hybrid_near_vector_balance_0_differs_from_balance_1( collection = _create_clustered_collection(collection_factory) balance_0 = collection.query.hybrid( query=None, - vector=HybridVector.near_vector( - vector=[1.0, 0.0, 0.0], - diversity_selection=Diversity.mmr(limit=3, balance=0.0), - ), + vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]), + diversity_selection=Diversity.mmr(limit=3, balance=0.0), limit=3, ).objects balance_1 = collection.query.hybrid( query=None, - vector=HybridVector.near_vector( - vector=[1.0, 0.0, 0.0], - diversity_selection=Diversity.mmr(limit=3, balance=1.0), - ), + vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]), + diversity_selection=Diversity.mmr(limit=3, balance=1.0), limit=3, ).objects assert [o.uuid for o in balance_0] != [o.uuid for o in balance_1] @@ -97,10 +92,8 @@ def test_hybrid_near_vector_balance_1_matches_baseline( ).objects mmr_balance_1 = collection.query.hybrid( query=None, - vector=HybridVector.near_vector( - vector=[1.0, 0.0, 0.0], - diversity_selection=Diversity.mmr(limit=3, balance=1.0), - ), + vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]), + diversity_selection=Diversity.mmr(limit=3, balance=1.0), limit=3, ).objects assert [o.uuid for o in baseline] == [o.uuid for o in mmr_balance_1] @@ -114,19 +107,15 @@ def test_hybrid_alpha_1_balance_0_differs_from_balance_1( balance_0 = collection.query.hybrid( query="irrelevant", alpha=1.0, - vector=HybridVector.near_vector( - vector=[1.0, 0.0, 0.0], - diversity_selection=Diversity.mmr(limit=3, balance=0.0), - ), + vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]), + diversity_selection=Diversity.mmr(limit=3, balance=0.0), limit=3, ).objects balance_1 = collection.query.hybrid( query="irrelevant", alpha=1.0, - vector=HybridVector.near_vector( - vector=[1.0, 0.0, 0.0], - diversity_selection=Diversity.mmr(limit=3, balance=1.0), - ), + vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]), + diversity_selection=Diversity.mmr(limit=3, balance=1.0), limit=3, ).objects assert [o.uuid for o in balance_0] != [o.uuid for o in balance_1] @@ -141,9 +130,7 @@ def test_hybrid_respects_mmr_limit( result = collection.query.hybrid( query=None, - vector=HybridVector.near_vector( - vector=[1.0, 0.0, 0.0], - diversity_selection=Diversity.mmr(limit=mmr_limit, balance=0.5), - ), + vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]), + diversity_selection=Diversity.mmr(limit=mmr_limit, balance=0.5), ).objects assert len(result) == mmr_limit From e29038ab94c1e799061f718ca3717b5c19aeb34d Mon Sep 17 00:00:00 2001 From: Dirk Kulawiak Date: Fri, 24 Jul 2026 09:45:34 +0200 Subject: [PATCH 2/2] FIx docstrings --- weaviate/collections/classes/grpc.py | 16 ++++++++++++---- .../queries/hybrid/generate/executor.py | 2 +- .../collections/queries/hybrid/query/executor.py | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/weaviate/collections/classes/grpc.py b/weaviate/collections/classes/grpc.py index aeca327a7..f5c8fe772 100644 --- a/weaviate/collections/classes/grpc.py +++ b/weaviate/collections/classes/grpc.py @@ -617,9 +617,13 @@ def blend( class MMR: """Define MMR (Maximal Marginal Relevance) diversity selection. + Not supported for multi-vector indexes. + Args: - limit: Optional number of candidates to consider for diversification. - balance: Optional MMR lambda in [0.0, 1.0] — 1.0 is pure relevance, 0.0 is pure diversity. + limit: Number of objects to select. The server requires it: it must be at least 1 and + no larger than the query's own `limit` when one is set. + balance: Optional MMR lambda in [0.0, 1.0]. 1.0 ranks purely by relevance to the query, + 0.0 purely by dissimilarity to the objects already selected. """ limit: Optional[int] = None @@ -636,9 +640,13 @@ def __init__(self) -> None: def mmr(limit: Optional[int] = None, balance: Optional[float] = None) -> MMR: """Maximal Marginal Relevance diversity selection. + Not supported for multi-vector indexes. + Args: - limit: Number of candidates to consider for diversification. - balance: MMR lambda in [0.0, 1.0] — 1.0 pure relevance, 0.0 pure diversity. + limit: Number of objects to select. The server requires it: it must be at least 1 + and no larger than the query's own `limit` when one is set. + balance: MMR lambda in [0.0, 1.0]. 1.0 ranks purely by relevance to the query, + 0.0 purely by dissimilarity to the objects already selected. """ return MMR(limit=limit, balance=balance) diff --git a/weaviate/collections/queries/hybrid/generate/executor.py b/weaviate/collections/queries/hybrid/generate/executor.py index 222c6fa94..cbc164113 100644 --- a/weaviate/collections/queries/hybrid/generate/executor.py +++ b/weaviate/collections/queries/hybrid/generate/executor.py @@ -491,7 +491,7 @@ def hybrid( group_by: How the results should be grouped by a specific property. rerank: How the results should be reranked. NOTE: A `rerank-*` module must be enabled for this functionality to work. boost: A `Boost` that re-scores the search candidates to promote or demote objects without removing them. - diversity_selection: An `MMR` selection applied to the fused results to diversify the returned objects. + diversity_selection: An `MMR` selection applied to the fused results to diversify the returned objects. Requires Weaviate >= 1.38.6. target_vector: The name of the vector space to search in for named vector configurations. Required if multiple spaces are configured. include_vector: Whether to include the vector in the results. If not specified, this is set to False. return_metadata: The metadata to return for each object, defaults to `None`. diff --git a/weaviate/collections/queries/hybrid/query/executor.py b/weaviate/collections/queries/hybrid/query/executor.py index 44c6238c0..446f2a6c3 100644 --- a/weaviate/collections/queries/hybrid/query/executor.py +++ b/weaviate/collections/queries/hybrid/query/executor.py @@ -427,7 +427,7 @@ def hybrid( group_by: How the results should be grouped by a specific property. rerank: How the results should be reranked. NOTE: A `rerank-*` module must be enabled for this functionality to work. boost: A `Boost` that re-scores the search candidates to promote or demote objects without removing them. - diversity_selection: An `MMR` selection applied to the fused results to diversify the returned objects. + diversity_selection: An `MMR` selection applied to the fused results to diversify the returned objects. Requires Weaviate >= 1.38.6. target_vector: The name of the vector space to search in for named vector configurations. Required if multiple spaces are configured. include_vector: Whether to include the vector in the results. If not specified, this is set to False. return_metadata: The metadata to return for each object, defaults to `None`.