Skip to content

Commit b98d5c6

Browse files
authored
Merge pull request #2103 from weaviate/fix_hybrid_tests
Fix hybrid tests
2 parents b068b42 + e29038a commit b98d5c6

4 files changed

Lines changed: 30 additions & 35 deletions

File tree

integration/test_collection_diversity_hybrid.py

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
"""Integration tests for hybrid search + MMR diversity selection.
22
3-
``DiversitySelection`` passed inside ``HybridVector.near_vector`` /
4-
``HybridVector.near_text`` is applied by the server as a post-fusion MMR pass
5-
(Weaviate >= 1.39.0). These tests assert that ``balance=0`` (pure diversity)
6-
produces a different ordering than ``balance=1`` (pure relevance), and that
7-
``mmr.limit`` caps the result count.
3+
``diversity_selection`` is a hybrid-level argument: the server applies it as a
4+
post-fusion MMR pass (Weaviate >= 1.38.6). These tests assert that ``balance=0``
5+
(pure diversity) produces a different ordering than ``balance=1`` (pure
6+
relevance), and that ``mmr.limit`` caps the result count.
87
98
The equivalent ``near_vector`` behaviour is covered in
109
``test_collection_diversity.py``.
@@ -68,18 +67,14 @@ def test_hybrid_near_vector_balance_0_differs_from_balance_1(
6867
collection = _create_clustered_collection(collection_factory)
6968
balance_0 = collection.query.hybrid(
7069
query=None,
71-
vector=HybridVector.near_vector(
72-
vector=[1.0, 0.0, 0.0],
73-
diversity_selection=Diversity.mmr(limit=3, balance=0.0),
74-
),
70+
vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]),
71+
diversity_selection=Diversity.mmr(limit=3, balance=0.0),
7572
limit=3,
7673
).objects
7774
balance_1 = collection.query.hybrid(
7875
query=None,
79-
vector=HybridVector.near_vector(
80-
vector=[1.0, 0.0, 0.0],
81-
diversity_selection=Diversity.mmr(limit=3, balance=1.0),
82-
),
76+
vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]),
77+
diversity_selection=Diversity.mmr(limit=3, balance=1.0),
8378
limit=3,
8479
).objects
8580
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(
9792
).objects
9893
mmr_balance_1 = collection.query.hybrid(
9994
query=None,
100-
vector=HybridVector.near_vector(
101-
vector=[1.0, 0.0, 0.0],
102-
diversity_selection=Diversity.mmr(limit=3, balance=1.0),
103-
),
95+
vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]),
96+
diversity_selection=Diversity.mmr(limit=3, balance=1.0),
10497
limit=3,
10598
).objects
10699
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(
114107
balance_0 = collection.query.hybrid(
115108
query="irrelevant",
116109
alpha=1.0,
117-
vector=HybridVector.near_vector(
118-
vector=[1.0, 0.0, 0.0],
119-
diversity_selection=Diversity.mmr(limit=3, balance=0.0),
120-
),
110+
vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]),
111+
diversity_selection=Diversity.mmr(limit=3, balance=0.0),
121112
limit=3,
122113
).objects
123114
balance_1 = collection.query.hybrid(
124115
query="irrelevant",
125116
alpha=1.0,
126-
vector=HybridVector.near_vector(
127-
vector=[1.0, 0.0, 0.0],
128-
diversity_selection=Diversity.mmr(limit=3, balance=1.0),
129-
),
117+
vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]),
118+
diversity_selection=Diversity.mmr(limit=3, balance=1.0),
130119
limit=3,
131120
).objects
132121
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(
141130

142131
result = collection.query.hybrid(
143132
query=None,
144-
vector=HybridVector.near_vector(
145-
vector=[1.0, 0.0, 0.0],
146-
diversity_selection=Diversity.mmr(limit=mmr_limit, balance=0.5),
147-
),
133+
vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]),
134+
diversity_selection=Diversity.mmr(limit=mmr_limit, balance=0.5),
148135
).objects
149136
assert len(result) == mmr_limit

weaviate/collections/classes/grpc.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -617,9 +617,13 @@ def blend(
617617
class MMR:
618618
"""Define MMR (Maximal Marginal Relevance) diversity selection.
619619
620+
Not supported for multi-vector indexes.
621+
620622
Args:
621-
limit: Optional number of candidates to consider for diversification.
622-
balance: Optional MMR lambda in [0.0, 1.0] — 1.0 is pure relevance, 0.0 is pure diversity.
623+
limit: Number of objects to select. The server requires it: it must be at least 1 and
624+
no larger than the query's own `limit` when one is set.
625+
balance: Optional MMR lambda in [0.0, 1.0]. 1.0 ranks purely by relevance to the query,
626+
0.0 purely by dissimilarity to the objects already selected.
623627
"""
624628

625629
limit: Optional[int] = None
@@ -636,9 +640,13 @@ def __init__(self) -> None:
636640
def mmr(limit: Optional[int] = None, balance: Optional[float] = None) -> MMR:
637641
"""Maximal Marginal Relevance diversity selection.
638642
643+
Not supported for multi-vector indexes.
644+
639645
Args:
640-
limit: Number of candidates to consider for diversification.
641-
balance: MMR lambda in [0.0, 1.0] — 1.0 pure relevance, 0.0 pure diversity.
646+
limit: Number of objects to select. The server requires it: it must be at least 1
647+
and no larger than the query's own `limit` when one is set.
648+
balance: MMR lambda in [0.0, 1.0]. 1.0 ranks purely by relevance to the query,
649+
0.0 purely by dissimilarity to the objects already selected.
642650
"""
643651
return MMR(limit=limit, balance=balance)
644652

weaviate/collections/queries/hybrid/generate/executor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ def hybrid(
491491
group_by: How the results should be grouped by a specific property.
492492
rerank: How the results should be reranked. NOTE: A `rerank-*` module must be enabled for this functionality to work.
493493
boost: A `Boost` that re-scores the search candidates to promote or demote objects without removing them.
494-
diversity_selection: An `MMR` selection applied to the fused results to diversify the returned objects.
494+
diversity_selection: An `MMR` selection applied to the fused results to diversify the returned objects. Requires Weaviate >= 1.38.6.
495495
target_vector: The name of the vector space to search in for named vector configurations. Required if multiple spaces are configured.
496496
include_vector: Whether to include the vector in the results. If not specified, this is set to False.
497497
return_metadata: The metadata to return for each object, defaults to `None`.

weaviate/collections/queries/hybrid/query/executor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ def hybrid(
427427
group_by: How the results should be grouped by a specific property.
428428
rerank: How the results should be reranked. NOTE: A `rerank-*` module must be enabled for this functionality to work.
429429
boost: A `Boost` that re-scores the search candidates to promote or demote objects without removing them.
430-
diversity_selection: An `MMR` selection applied to the fused results to diversify the returned objects.
430+
diversity_selection: An `MMR` selection applied to the fused results to diversify the returned objects. Requires Weaviate >= 1.38.6.
431431
target_vector: The name of the vector space to search in for named vector configurations. Required if multiple spaces are configured.
432432
include_vector: Whether to include the vector in the results. If not specified, this is set to False.
433433
return_metadata: The metadata to return for each object, defaults to `None`.

0 commit comments

Comments
 (0)