Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 16 additions & 29 deletions integration/test_collection_diversity_hybrid.py
Original file line number Diff line number Diff line change
@@ -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``.
Expand Down Expand Up @@ -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]
Expand All @@ -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]
Expand All @@ -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]
Expand All @@ -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
16 changes: 12 additions & 4 deletions weaviate/collections/classes/grpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion weaviate/collections/queries/hybrid/generate/executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
2 changes: 1 addition & 1 deletion weaviate/collections/queries/hybrid/query/executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
Loading