Skip to content

Commit 39fb2d1

Browse files
authored
feat(qdrant): Use Qdrant's built-in MMR search (#32302)
1 parent db7f2db commit 39fb2d1

File tree

4 files changed

+12
-21
lines changed

4 files changed

+12
-21
lines changed

β€Žlibs/partners/qdrant/langchain_qdrant/qdrant.pyβ€Ž

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,11 @@
1010
Any,
1111
)
1212

13-
import numpy as np
1413
from langchain_core.documents import Document
1514
from langchain_core.embeddings import Embeddings
1615
from langchain_core.vectorstores import VectorStore
1716
from qdrant_client import QdrantClient, models
1817

19-
from langchain_qdrant._utils import maximal_marginal_relevance
20-
2118
if TYPE_CHECKING:
2219
from collections.abc import Generator, Iterable, Sequence
2320

@@ -828,10 +825,13 @@ def max_marginal_relevance_search_with_score_by_vector(
828825
"""
829826
results = self.client.query_points(
830827
collection_name=self.collection_name,
831-
query=embedding,
828+
query=models.NearestQuery(
829+
nearest=embedding,
830+
mmr=models.Mmr(diversity=lambda_mult, candidates_limit=fetch_k),
831+
),
832832
query_filter=filter,
833833
search_params=search_params,
834-
limit=fetch_k,
834+
limit=k,
835835
with_payload=True,
836836
with_vectors=True,
837837
score_threshold=score_threshold,
@@ -840,26 +840,17 @@ def max_marginal_relevance_search_with_score_by_vector(
840840
**kwargs,
841841
).points
842842

843-
embeddings = [
844-
result.vector
845-
if isinstance(result.vector, list)
846-
else result.vector.get(self.vector_name) # type: ignore[union-attr]
847-
for result in results
848-
]
849-
mmr_selected = maximal_marginal_relevance(
850-
np.array(embedding), embeddings, k=k, lambda_mult=lambda_mult
851-
)
852843
return [
853844
(
854845
self._document_from_point(
855-
results[i],
846+
result,
856847
self.collection_name,
857848
self.content_payload_key,
858849
self.metadata_payload_key,
859850
),
860-
results[i].score,
851+
result.score,
861852
)
862-
for i in mmr_selected
853+
for result in results
863854
]
864855

865856
def delete( # type: ignore[override]

β€Žlibs/partners/qdrant/pyproject.tomlβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ authors = []
77
license = { text = "MIT" }
88
requires-python = ">=3.10.0,<4.0.0"
99
dependencies = [
10-
"qdrant-client>=1.10.1,<2.0.0",
10+
"qdrant-client>=1.15.1,<2.0.0",
1111
"pydantic>=2.7.4,<3.0.0",
1212
"langchain-core>=1.0.0,<2.0.0",
1313
]

β€Žlibs/partners/qdrant/tests/integration_tests/qdrant_vector_store/test_mmr.pyβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def test_qdrant_mmr_search(
6363
output,
6464
[
6565
Document(page_content="foo", metadata={"page": 0}),
66-
Document(page_content="baz", metadata={"page": 2}),
66+
Document(page_content="bar", metadata={"page": 1}),
6767
],
6868
)
6969

β€Žlibs/partners/qdrant/uv.lockβ€Ž

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
Β (0)