From 120a1b01e357456792d64cde7cb1d9f321e060f2 Mon Sep 17 00:00:00 2001 From: John Trengrove Date: Tue, 23 Jun 2026 14:23:10 +1000 Subject: [PATCH 1/2] Add hybrid diversity support --- .../test_collection_diversity_hybrid.py | 149 ++++++++++++++++++ test/collection/test_hybrid_diversity.py | 63 ++++++++ weaviate/collections/classes/grpc.py | 10 ++ weaviate/collections/grpc/shared.py | 10 ++ 4 files changed, 232 insertions(+) create mode 100644 integration/test_collection_diversity_hybrid.py create mode 100644 test/collection/test_hybrid_diversity.py diff --git a/integration/test_collection_diversity_hybrid.py b/integration/test_collection_diversity_hybrid.py new file mode 100644 index 000000000..ef0ae7b08 --- /dev/null +++ b/integration/test_collection_diversity_hybrid.py @@ -0,0 +1,149 @@ +"""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. + +The equivalent ``near_vector`` behaviour is covered in +``test_collection_diversity.py``. +""" + +import pytest + +from integration.conftest import CollectionFactory +from weaviate.classes.query import Diversity, HybridVector +from weaviate.collections.classes.config import Configure, DataType, Property +from weaviate.collections.classes.data import DataObject + +MIN_VERSION = (1, 39, 0) + + +def _skip_if_unsupported(collection) -> None: + if collection._connection._weaviate_version.is_lower_than(*MIN_VERSION): + pytest.skip("Hybrid diversity selection requires Weaviate >= 1.39.0") + + +def _create_clustered_collection(collection_factory: CollectionFactory): + """Create a collection with 3 tight clusters (a, b, c) of vectors in 3D.""" + collection = collection_factory( + properties=[Property(name="text", data_type=DataType.TEXT)], + vectorizer_config=Configure.Vectorizer.none(), + ) + _skip_if_unsupported(collection) + collection.data.insert_many( + [ + DataObject(properties={"text": "a1"}, vector=[1.0, 0.0, 0.0]), + DataObject(properties={"text": "a2"}, vector=[0.95, 0.05, 0.0]), + DataObject(properties={"text": "a3"}, vector=[0.9, 0.1, 0.0]), + DataObject(properties={"text": "b1"}, vector=[0.0, 1.0, 0.0]), + DataObject(properties={"text": "b2"}, vector=[0.05, 0.95, 0.0]), + DataObject(properties={"text": "c1"}, vector=[0.0, 0.0, 1.0]), + ] + ) + return collection + + +def _create_large_collection(collection_factory: CollectionFactory, n_items: int = 50): + """Create a collection with enough items (>25) that a small mmr.limit is distinguishable from the server's default limit.""" + collection = collection_factory( + properties=[Property(name="text", data_type=DataType.TEXT)], + vectorizer_config=Configure.Vectorizer.none(), + ) + _skip_if_unsupported(collection) + collection.data.insert_many( + [ + DataObject(properties={"text": f"t{i}"}, vector=[1.0 - 0.001 * i, 0.0, 0.0]) + for i in range(n_items) + ] + ) + return collection + + +def test_hybrid_near_vector_balance_0_differs_from_balance_1( + collection_factory: CollectionFactory, +) -> None: + """Hybrid near-vector: balance=0 (diversity) must reorder vs balance=1 (relevance).""" + 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), + ), + 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), + ), + limit=3, + ).objects + assert [o.uuid for o in balance_0] != [o.uuid for o in balance_1] + + +def test_hybrid_near_vector_balance_1_matches_baseline( + collection_factory: CollectionFactory, +) -> None: + """Hybrid near-vector with MMR balance=1 (pure relevance) matches the plain baseline.""" + collection = _create_clustered_collection(collection_factory) + baseline = collection.query.hybrid( + query=None, + vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]), + limit=3, + ).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), + ), + limit=3, + ).objects + assert [o.uuid for o in baseline] == [o.uuid for o in mmr_balance_1] + + +def test_hybrid_alpha_1_balance_0_differs_from_balance_1( + collection_factory: CollectionFactory, +) -> None: + """Hybrid with explicit alpha=1.0 (pure vector) applies MMR like near_vector.""" + collection = _create_clustered_collection(collection_factory) + 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), + ), + 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), + ), + limit=3, + ).objects + assert [o.uuid for o in balance_0] != [o.uuid for o in balance_1] + + +def test_hybrid_respects_mmr_limit( + collection_factory: CollectionFactory, +) -> None: + """Hybrid respects mmr.limit as the result-count cap when no outer limit is set.""" + mmr_limit = 5 + collection = _create_large_collection(collection_factory, n_items=50) + + 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), + ), + ).objects + assert len(result) == mmr_limit diff --git a/test/collection/test_hybrid_diversity.py b/test/collection/test_hybrid_diversity.py new file mode 100644 index 000000000..679324081 --- /dev/null +++ b/test/collection/test_hybrid_diversity.py @@ -0,0 +1,63 @@ +"""Unit tests: hybrid search wires diversity_selection into the gRPC request. + +Hybrid diversity is a post-fusion, hybrid-level operation, so the +``HybridVector.near_vector`` / ``HybridVector.near_text`` ``diversity_selection`` +argument must populate the top-level ``Hybrid.selection.mmr`` in the +SearchRequest proto (not the nested ``near_vector`` / ``near_text`` selection). +""" + +from weaviate.collections.grpc.query import _QueryGRPC +from weaviate.classes.query import Diversity, HybridVector +from weaviate.util import _ServerVersion + + +def _builder() -> _QueryGRPC: + return _QueryGRPC( + weaviate_version=_ServerVersion(1, 39, 0), + name="Dummy", + tenant=None, + consistency_level=None, + validate_arguments=True, + uses_125_api=True, + uses_127_api=True, + ) + + +def test_hybrid_near_vector_sets_top_level_selection() -> None: + req = _builder().hybrid( + query=None, + vector=HybridVector.near_vector( + vector=[1.0, 0.0, 0.0], + diversity_selection=Diversity.mmr(limit=7, balance=0.0), + ), + limit=7, + ) + # Canonical location: top-level Hybrid.selection, not the nested near_vector. + mmr = req.hybrid_search.selection.mmr + assert mmr.limit == 7 + assert mmr.balance == 0.0 + assert not req.hybrid_search.near_vector.HasField("selection") + + +def test_hybrid_near_text_sets_top_level_selection() -> None: + req = _builder().hybrid( + query=None, + vector=HybridVector.near_text( + query="cats", + diversity_selection=Diversity.mmr(limit=3, balance=0.5), + ), + limit=3, + ) + mmr = req.hybrid_search.selection.mmr + assert mmr.limit == 3 + assert mmr.balance == 0.5 + assert not req.hybrid_search.near_text.HasField("selection") + + +def test_hybrid_without_selection_leaves_it_unset() -> None: + req = _builder().hybrid( + query=None, + vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]), + limit=5, + ) + assert not req.hybrid_search.HasField("selection") diff --git a/weaviate/collections/classes/grpc.py b/weaviate/collections/classes/grpc.py index aeca327a7..8cebd0960 100644 --- a/weaviate/collections/classes/grpc.py +++ b/weaviate/collections/classes/grpc.py @@ -760,6 +760,7 @@ class _HybridNearBase(_WeaviateInput): distance: Optional[float] = None certainty: Optional[float] = None + diversity_selection: Optional[MMR] = None class _HybridNearText(_HybridNearBase): @@ -772,6 +773,7 @@ class _HybridNearVector: # can't be a Pydantic model because of validation issu vector: NearVectorInputType distance: Optional[float] certainty: Optional[float] + diversity_selection: Optional[MMR] def __init__( self, @@ -779,10 +781,12 @@ def __init__( vector: NearVectorInputType, distance: Optional[float] = None, certainty: Optional[float] = None, + diversity_selection: Optional[MMR] = None, ) -> None: self.vector = vector self.distance = distance self.certainty = certainty + self.diversity_selection = diversity_selection HybridVectorType = Union[NearVectorInputType, _HybridNearText, _HybridNearVector] @@ -897,6 +901,7 @@ def near_text( distance: Optional[float] = None, move_to: Optional[Move] = None, move_away: Optional[Move] = None, + diversity_selection: Optional[MMR] = None, ) -> _HybridNearText: """Define a near text search to be used within a hybrid query. @@ -906,6 +911,7 @@ def near_text( distance: The maximum distance to search. If not specified, the default distance specified by the server is used. move_to: Define the concepts that should be moved towards in the vector space during the search. move_away: Define the concepts that should be moved away from in the vector space during the search. + diversity_selection: Apply diversity selection (e.g. MMR) to the hybrid results. Requires Weaviate >= 1.39.0. Returns: A `_HybridNearText` object to be used in the `vector` parameter of the `query.hybrid` and `generate.hybrid` search methods. @@ -916,6 +922,7 @@ def near_text( certainty=certainty, move_to=move_to, move_away=move_away, + diversity_selection=diversity_selection, ) @staticmethod @@ -924,12 +931,14 @@ def near_vector( *, certainty: Optional[float] = None, distance: Optional[float] = None, + diversity_selection: Optional[MMR] = None, ) -> _HybridNearVector: """Define a near vector search to be used within a hybrid query. Args: certainty: The minimum similarity score to return. If not specified, the default certainty specified by the server is used. distance: The maximum distance to search. If not specified, the default distance specified by the server is used. + diversity_selection: Apply diversity selection (e.g. MMR) to the hybrid results. Requires Weaviate >= 1.39.0. Returns: A `_HybridNearVector` object to be used in the `vector` parameter of the `query.hybrid` and `generate.hybrid` search methods. @@ -938,6 +947,7 @@ def near_vector( vector=vector, distance=distance, certainty=certainty, + diversity_selection=diversity_selection, ) diff --git a/weaviate/collections/grpc/shared.py b/weaviate/collections/grpc/shared.py index f13e5c4b1..a4f3214e9 100644 --- a/weaviate/collections/grpc/shared.py +++ b/weaviate/collections/grpc/shared.py @@ -639,6 +639,15 @@ def _parse_hybrid( near_text, near_vector, vector_bytes, vectors = None, None, None, None + # Hybrid diversity selection is a post-fusion, hybrid-level operation, so + # it is carried on the top-level Hybrid.selection field rather than on the + # near_text / near_vector sub-query. + hybrid_selection = ( + vector.diversity_selection + if isinstance(vector, (_HybridNearText, _HybridNearVector)) + else None + ) + if vector is None: pass elif isinstance(vector, list) and len(vector) > 0 and isinstance(vector[0], float): @@ -739,6 +748,7 @@ def _parse_hybrid( vector_bytes=vector_bytes, vector_distance=distance, vectors=vectors, + selection=self._diversity_selection_to_grpc(hybrid_selection), bm25_search_operator=base_search_pb2.SearchOperatorOptions( operator=bm25_operator.operator, minimum_or_tokens_match=bm25_operator.minimum_should_match From 48c78a8bc99b961d649de0437fe8dd00aaeca8b7 Mon Sep 17 00:00:00 2001 From: John Trengrove Date: Tue, 30 Jun 2026 15:18:22 +1000 Subject: [PATCH 2/2] Add top level Hybrid diversity --- test/collection/test_hybrid_diversity.py | 27 +++++++++---------- weaviate/collections/classes/grpc.py | 10 ------- weaviate/collections/grpc/query.py | 2 ++ weaviate/collections/grpc/shared.py | 12 ++------- .../queries/hybrid/generate/async_.pyi | 14 ++++++++++ .../queries/hybrid/generate/executor.py | 17 ++++++++++++ .../queries/hybrid/generate/sync.pyi | 14 ++++++++++ .../queries/hybrid/query/async_.pyi | 14 ++++++++++ .../queries/hybrid/query/executor.py | 17 ++++++++++++ .../collections/queries/hybrid/query/sync.pyi | 14 ++++++++++ 10 files changed, 107 insertions(+), 34 deletions(-) diff --git a/test/collection/test_hybrid_diversity.py b/test/collection/test_hybrid_diversity.py index 679324081..510b4df23 100644 --- a/test/collection/test_hybrid_diversity.py +++ b/test/collection/test_hybrid_diversity.py @@ -1,9 +1,9 @@ """Unit tests: hybrid search wires diversity_selection into the gRPC request. -Hybrid diversity is a post-fusion, hybrid-level operation, so the -``HybridVector.near_vector`` / ``HybridVector.near_text`` ``diversity_selection`` -argument must populate the top-level ``Hybrid.selection.mmr`` in the -SearchRequest proto (not the nested ``near_vector`` / ``near_text`` selection). +Hybrid diversity is a post-fusion, hybrid-level operation, so the top-level +``query.hybrid`` / ``generate.hybrid`` ``diversity_selection`` argument must +populate the top-level ``Hybrid.selection.mmr`` in the SearchRequest proto (not +the nested ``near_vector`` / ``near_text`` selection). """ from weaviate.collections.grpc.query import _QueryGRPC @@ -11,9 +11,12 @@ from weaviate.util import _ServerVersion -def _builder() -> _QueryGRPC: +_DEFAULT_VERSION = _ServerVersion(1, 38, 0) + + +def _builder(version: _ServerVersion = _DEFAULT_VERSION) -> _QueryGRPC: return _QueryGRPC( - weaviate_version=_ServerVersion(1, 39, 0), + weaviate_version=version, name="Dummy", tenant=None, consistency_level=None, @@ -26,10 +29,8 @@ def _builder() -> _QueryGRPC: def test_hybrid_near_vector_sets_top_level_selection() -> None: req = _builder().hybrid( query=None, - vector=HybridVector.near_vector( - vector=[1.0, 0.0, 0.0], - diversity_selection=Diversity.mmr(limit=7, balance=0.0), - ), + vector=HybridVector.near_vector(vector=[1.0, 0.0, 0.0]), + diversity_selection=Diversity.mmr(limit=7, balance=0.0), limit=7, ) # Canonical location: top-level Hybrid.selection, not the nested near_vector. @@ -42,10 +43,8 @@ def test_hybrid_near_vector_sets_top_level_selection() -> None: def test_hybrid_near_text_sets_top_level_selection() -> None: req = _builder().hybrid( query=None, - vector=HybridVector.near_text( - query="cats", - diversity_selection=Diversity.mmr(limit=3, balance=0.5), - ), + vector=HybridVector.near_text(query="cats"), + diversity_selection=Diversity.mmr(limit=3, balance=0.5), limit=3, ) mmr = req.hybrid_search.selection.mmr diff --git a/weaviate/collections/classes/grpc.py b/weaviate/collections/classes/grpc.py index 8cebd0960..aeca327a7 100644 --- a/weaviate/collections/classes/grpc.py +++ b/weaviate/collections/classes/grpc.py @@ -760,7 +760,6 @@ class _HybridNearBase(_WeaviateInput): distance: Optional[float] = None certainty: Optional[float] = None - diversity_selection: Optional[MMR] = None class _HybridNearText(_HybridNearBase): @@ -773,7 +772,6 @@ class _HybridNearVector: # can't be a Pydantic model because of validation issu vector: NearVectorInputType distance: Optional[float] certainty: Optional[float] - diversity_selection: Optional[MMR] def __init__( self, @@ -781,12 +779,10 @@ def __init__( vector: NearVectorInputType, distance: Optional[float] = None, certainty: Optional[float] = None, - diversity_selection: Optional[MMR] = None, ) -> None: self.vector = vector self.distance = distance self.certainty = certainty - self.diversity_selection = diversity_selection HybridVectorType = Union[NearVectorInputType, _HybridNearText, _HybridNearVector] @@ -901,7 +897,6 @@ def near_text( distance: Optional[float] = None, move_to: Optional[Move] = None, move_away: Optional[Move] = None, - diversity_selection: Optional[MMR] = None, ) -> _HybridNearText: """Define a near text search to be used within a hybrid query. @@ -911,7 +906,6 @@ def near_text( distance: The maximum distance to search. If not specified, the default distance specified by the server is used. move_to: Define the concepts that should be moved towards in the vector space during the search. move_away: Define the concepts that should be moved away from in the vector space during the search. - diversity_selection: Apply diversity selection (e.g. MMR) to the hybrid results. Requires Weaviate >= 1.39.0. Returns: A `_HybridNearText` object to be used in the `vector` parameter of the `query.hybrid` and `generate.hybrid` search methods. @@ -922,7 +916,6 @@ def near_text( certainty=certainty, move_to=move_to, move_away=move_away, - diversity_selection=diversity_selection, ) @staticmethod @@ -931,14 +924,12 @@ def near_vector( *, certainty: Optional[float] = None, distance: Optional[float] = None, - diversity_selection: Optional[MMR] = None, ) -> _HybridNearVector: """Define a near vector search to be used within a hybrid query. Args: certainty: The minimum similarity score to return. If not specified, the default certainty specified by the server is used. distance: The maximum distance to search. If not specified, the default distance specified by the server is used. - diversity_selection: Apply diversity selection (e.g. MMR) to the hybrid results. Requires Weaviate >= 1.39.0. Returns: A `_HybridNearVector` object to be used in the `vector` parameter of the `query.hybrid` and `generate.hybrid` search methods. @@ -947,7 +938,6 @@ def near_vector( vector=vector, distance=distance, certainty=certainty, - diversity_selection=diversity_selection, ) diff --git a/weaviate/collections/grpc/query.py b/weaviate/collections/grpc/query.py index 2896ac464..46593da10 100644 --- a/weaviate/collections/grpc/query.py +++ b/weaviate/collections/grpc/query.py @@ -173,6 +173,7 @@ def hybrid( generative: Optional[_Generative] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, ) -> search_get_pb2.SearchRequest: return self.__create_request( @@ -196,6 +197,7 @@ def hybrid( fusion_type, distance, target_vector, + diversity_selection, ), ) diff --git a/weaviate/collections/grpc/shared.py b/weaviate/collections/grpc/shared.py index a4f3214e9..51e2a65c7 100644 --- a/weaviate/collections/grpc/shared.py +++ b/weaviate/collections/grpc/shared.py @@ -600,6 +600,7 @@ def _parse_hybrid( fusion_type: Optional[HybridFusion], distance: Optional[NUMBER], target_vector: Optional[TargetVectorJoinType], + diversity_selection: Optional[MMR] = None, ) -> Union[base_search_pb2.Hybrid, None]: if self._validate_arguments: _validate_input( @@ -639,15 +640,6 @@ def _parse_hybrid( near_text, near_vector, vector_bytes, vectors = None, None, None, None - # Hybrid diversity selection is a post-fusion, hybrid-level operation, so - # it is carried on the top-level Hybrid.selection field rather than on the - # near_text / near_vector sub-query. - hybrid_selection = ( - vector.diversity_selection - if isinstance(vector, (_HybridNearText, _HybridNearVector)) - else None - ) - if vector is None: pass elif isinstance(vector, list) and len(vector) > 0 and isinstance(vector[0], float): @@ -748,7 +740,7 @@ def _parse_hybrid( vector_bytes=vector_bytes, vector_distance=distance, vectors=vectors, - selection=self._diversity_selection_to_grpc(hybrid_selection), + selection=self._diversity_selection_to_grpc(diversity_selection), bm25_search_operator=base_search_pb2.SearchOperatorOptions( operator=bm25_operator.operator, minimum_or_tokens_match=bm25_operator.minimum_should_match diff --git a/weaviate/collections/queries/hybrid/generate/async_.pyi b/weaviate/collections/queries/hybrid/generate/async_.pyi index eafac01c9..0bf1064d0 100644 --- a/weaviate/collections/queries/hybrid/generate/async_.pyi +++ b/weaviate/collections/queries/hybrid/generate/async_.pyi @@ -3,6 +3,7 @@ from typing import Generic, List, Literal, Optional, Type, Union, overload from weaviate.collections.classes.filters import FilterReturn from weaviate.collections.classes.grpc import ( METADATA, + MMR, PROPERTIES, REFERENCES, BM25OperatorOptions, @@ -56,6 +57,7 @@ class _HybridGenerateAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -84,6 +86,7 @@ class _HybridGenerateAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -112,6 +115,7 @@ class _HybridGenerateAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -140,6 +144,7 @@ class _HybridGenerateAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -168,6 +173,7 @@ class _HybridGenerateAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -196,6 +202,7 @@ class _HybridGenerateAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -224,6 +231,7 @@ class _HybridGenerateAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -252,6 +260,7 @@ class _HybridGenerateAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -280,6 +289,7 @@ class _HybridGenerateAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -308,6 +318,7 @@ class _HybridGenerateAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -336,6 +347,7 @@ class _HybridGenerateAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -364,6 +376,7 @@ class _HybridGenerateAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -392,6 +405,7 @@ class _HybridGenerateAsync( group_by: Optional[GroupBy] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, diff --git a/weaviate/collections/queries/hybrid/generate/executor.py b/weaviate/collections/queries/hybrid/generate/executor.py index fa301ee8a..222c6fa94 100644 --- a/weaviate/collections/queries/hybrid/generate/executor.py +++ b/weaviate/collections/queries/hybrid/generate/executor.py @@ -5,6 +5,7 @@ ) from weaviate.collections.classes.grpc import ( METADATA, + MMR, PROPERTIES, REFERENCES, BM25OperatorOptions, @@ -67,6 +68,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -96,6 +98,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -125,6 +128,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -154,6 +158,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -183,6 +188,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -212,6 +218,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -243,6 +250,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -272,6 +280,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -301,6 +310,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -330,6 +340,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -359,6 +370,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -388,6 +400,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -418,6 +431,7 @@ def hybrid( group_by: Optional[GroupBy] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -448,6 +462,7 @@ def hybrid( group_by: Optional[GroupBy] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -476,6 +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. 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`. @@ -530,6 +546,7 @@ def resp( group_by=_GroupBy.from_input(group_by), rerank=rerank, boost=boost, + diversity_selection=diversity_selection, target_vector=target_vector, return_metadata=self._parse_return_metadata(return_metadata, include_vector), return_properties=self._parse_return_properties(return_properties), diff --git a/weaviate/collections/queries/hybrid/generate/sync.pyi b/weaviate/collections/queries/hybrid/generate/sync.pyi index e4192ac05..270564066 100644 --- a/weaviate/collections/queries/hybrid/generate/sync.pyi +++ b/weaviate/collections/queries/hybrid/generate/sync.pyi @@ -3,6 +3,7 @@ from typing import Generic, List, Literal, Optional, Type, Union, overload from weaviate.collections.classes.filters import FilterReturn from weaviate.collections.classes.grpc import ( METADATA, + MMR, PROPERTIES, REFERENCES, BM25OperatorOptions, @@ -55,6 +56,7 @@ class _HybridGenerate( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -83,6 +85,7 @@ class _HybridGenerate( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -111,6 +114,7 @@ class _HybridGenerate( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -139,6 +143,7 @@ class _HybridGenerate( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -167,6 +172,7 @@ class _HybridGenerate( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -195,6 +201,7 @@ class _HybridGenerate( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -223,6 +230,7 @@ class _HybridGenerate( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -251,6 +259,7 @@ class _HybridGenerate( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -279,6 +288,7 @@ class _HybridGenerate( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -307,6 +317,7 @@ class _HybridGenerate( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -335,6 +346,7 @@ class _HybridGenerate( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -363,6 +375,7 @@ class _HybridGenerate( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -391,6 +404,7 @@ class _HybridGenerate( group_by: Optional[GroupBy] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, diff --git a/weaviate/collections/queries/hybrid/query/async_.pyi b/weaviate/collections/queries/hybrid/query/async_.pyi index 9e700051b..af6c5602e 100644 --- a/weaviate/collections/queries/hybrid/query/async_.pyi +++ b/weaviate/collections/queries/hybrid/query/async_.pyi @@ -3,6 +3,7 @@ from typing import Generic, List, Literal, Optional, Type, Union, overload from weaviate.collections.classes.filters import FilterReturn from weaviate.collections.classes.grpc import ( METADATA, + MMR, PROPERTIES, REFERENCES, BM25OperatorOptions, @@ -48,6 +49,7 @@ class _HybridQueryAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -72,6 +74,7 @@ class _HybridQueryAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -96,6 +99,7 @@ class _HybridQueryAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -120,6 +124,7 @@ class _HybridQueryAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -144,6 +149,7 @@ class _HybridQueryAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -168,6 +174,7 @@ class _HybridQueryAsync( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -192,6 +199,7 @@ class _HybridQueryAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -216,6 +224,7 @@ class _HybridQueryAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -240,6 +249,7 @@ class _HybridQueryAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -264,6 +274,7 @@ class _HybridQueryAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -288,6 +299,7 @@ class _HybridQueryAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -312,6 +324,7 @@ class _HybridQueryAsync( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -336,6 +349,7 @@ class _HybridQueryAsync( group_by: Optional[GroupBy] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, diff --git a/weaviate/collections/queries/hybrid/query/executor.py b/weaviate/collections/queries/hybrid/query/executor.py index d8a5a74b1..44c6238c0 100644 --- a/weaviate/collections/queries/hybrid/query/executor.py +++ b/weaviate/collections/queries/hybrid/query/executor.py @@ -5,6 +5,7 @@ ) from weaviate.collections.classes.grpc import ( METADATA, + MMR, PROPERTIES, REFERENCES, BM25OperatorOptions, @@ -59,6 +60,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -84,6 +86,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -109,6 +112,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -134,6 +138,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -159,6 +164,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -184,6 +190,7 @@ def hybrid( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -211,6 +218,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -236,6 +244,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -261,6 +270,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -286,6 +296,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -311,6 +322,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -336,6 +348,7 @@ def hybrid( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -362,6 +375,7 @@ def hybrid( group_by: Optional[GroupBy] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -388,6 +402,7 @@ def hybrid( group_by: Optional[GroupBy] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -412,6 +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. 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`. @@ -466,6 +482,7 @@ def resp( group_by=_GroupBy.from_input(group_by), rerank=rerank, boost=boost, + diversity_selection=diversity_selection, target_vector=target_vector, return_metadata=self._parse_return_metadata(return_metadata, include_vector), return_properties=self._parse_return_properties(return_properties), diff --git a/weaviate/collections/queries/hybrid/query/sync.pyi b/weaviate/collections/queries/hybrid/query/sync.pyi index 20d884276..92ef6b810 100644 --- a/weaviate/collections/queries/hybrid/query/sync.pyi +++ b/weaviate/collections/queries/hybrid/query/sync.pyi @@ -3,6 +3,7 @@ from typing import Generic, List, Literal, Optional, Type, Union, overload from weaviate.collections.classes.filters import FilterReturn from weaviate.collections.classes.grpc import ( METADATA, + MMR, PROPERTIES, REFERENCES, BM25OperatorOptions, @@ -48,6 +49,7 @@ class _HybridQuery( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -72,6 +74,7 @@ class _HybridQuery( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -96,6 +99,7 @@ class _HybridQuery( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -120,6 +124,7 @@ class _HybridQuery( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -144,6 +149,7 @@ class _HybridQuery( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -168,6 +174,7 @@ class _HybridQuery( group_by: Literal[None] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -192,6 +199,7 @@ class _HybridQuery( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -216,6 +224,7 @@ class _HybridQuery( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -240,6 +249,7 @@ class _HybridQuery( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -264,6 +274,7 @@ class _HybridQuery( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -288,6 +299,7 @@ class _HybridQuery( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -312,6 +324,7 @@ class _HybridQuery( group_by: GroupBy, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None, @@ -336,6 +349,7 @@ class _HybridQuery( group_by: Optional[GroupBy] = None, rerank: Optional[Rerank] = None, boost: Optional[_Boost] = None, + diversity_selection: Optional[MMR] = None, target_vector: Optional[TargetVectorJoinType] = None, include_vector: INCLUDE_VECTOR = False, return_metadata: Optional[METADATA] = None,