qdrant-haystack 7.0.0__tar.gz → 8.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/CHANGELOG.md +7 -8
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/PKG-INFO +2 -2
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/components/retrievers/qdrant/__init__.py +1 -1
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/document_stores/qdrant/converters.py +17 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/test_converters.py +44 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/test_filters.py +0 -6
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/.gitignore +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/LICENSE.txt +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/README.md +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/examples/embedding_retrieval.py +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/pydoc/config.yml +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/pyproject.toml +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/components/retrievers/qdrant/retriever.py +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/document_stores/qdrant/__init__.py +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/document_stores/qdrant/document_store.py +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/document_stores/qdrant/filters.py +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/src/haystack_integrations/document_stores/qdrant/migrate_to_sparse.py +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/__init__.py +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/conftest.py +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/test_dict_converters.py +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/test_document_store.py +0 -0
- {qdrant_haystack-7.0.0 → qdrant_haystack-8.0.0}/tests/test_retriever.py +0 -0
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [integrations/qdrant-v7.0.0] - 2024-10-29
|
|
4
|
+
|
|
5
|
+
### ⚙️ Miscellaneous Tasks
|
|
6
|
+
|
|
7
|
+
- Update ruff linting scripts and settings (#1105)
|
|
8
|
+
- Adopt uv as installer (#1142)
|
|
9
|
+
|
|
3
10
|
## [integrations/qdrant-v6.0.0] - 2024-09-13
|
|
4
11
|
|
|
5
12
|
## [integrations/qdrant-v5.1.0] - 2024-09-12
|
|
@@ -105,8 +112,6 @@
|
|
|
105
112
|
|
|
106
113
|
- Fix haystack-ai pin (#649)
|
|
107
114
|
|
|
108
|
-
|
|
109
|
-
|
|
110
115
|
## [integrations/qdrant-v3.2.0] - 2024-03-27
|
|
111
116
|
|
|
112
117
|
### 🚀 Features
|
|
@@ -117,15 +122,11 @@
|
|
|
117
122
|
### 🐛 Bug Fixes
|
|
118
123
|
|
|
119
124
|
- Fix linter errors (#282)
|
|
120
|
-
|
|
121
|
-
|
|
122
125
|
- Fix order of API docs (#447)
|
|
123
126
|
|
|
124
127
|
This PR will also push the docs to Readme
|
|
125
128
|
- Fixes (#518)
|
|
126
129
|
|
|
127
|
-
|
|
128
|
-
|
|
129
130
|
### 🚜 Refactor
|
|
130
131
|
|
|
131
132
|
- [**breaking**] Qdrant - update secret management (#405)
|
|
@@ -156,8 +157,6 @@ This PR will also push the docs to Readme
|
|
|
156
157
|
|
|
157
158
|
- Fix import paths for beta5 (#237)
|
|
158
159
|
|
|
159
|
-
|
|
160
|
-
|
|
161
160
|
### 🚜 Refactor
|
|
162
161
|
|
|
163
162
|
- Use `hatch_vcs` to manage integrations versioning (#103)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: qdrant-haystack
|
|
3
|
-
Version:
|
|
3
|
+
Version: 8.0.0
|
|
4
4
|
Summary: An integration of Qdrant ANN vector database backend with Haystack
|
|
5
5
|
Project-URL: Source, https://github.com/deepset-ai/haystack-core-integrations
|
|
6
6
|
Project-URL: Documentation, https://github.com/deepset-ai/haystack-core-integrations/blob/main/integrations/qdrant/README.md
|
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
|
|
5
5
|
from .retriever import QdrantEmbeddingRetriever, QdrantHybridRetriever, QdrantSparseEmbeddingRetriever
|
|
6
6
|
|
|
7
|
-
__all__ = ("QdrantEmbeddingRetriever", "
|
|
7
|
+
__all__ = ("QdrantEmbeddingRetriever", "QdrantHybridRetriever", "QdrantSparseEmbeddingRetriever")
|
|
@@ -22,6 +22,15 @@ def convert_haystack_documents_to_qdrant_points(
|
|
|
22
22
|
points = []
|
|
23
23
|
for document in documents:
|
|
24
24
|
payload = document.to_dict(flatten=False)
|
|
25
|
+
|
|
26
|
+
if payload.pop("dataframe", None):
|
|
27
|
+
logger.warning(
|
|
28
|
+
"Document %s has the `dataframe` field set,"
|
|
29
|
+
"QdrantDocumentStore no longer supports dataframes and this field will be ignored. "
|
|
30
|
+
"The `dataframe` field will soon be removed from Haystack Document.",
|
|
31
|
+
document.id,
|
|
32
|
+
)
|
|
33
|
+
|
|
25
34
|
if use_sparse_embeddings:
|
|
26
35
|
vector = {}
|
|
27
36
|
|
|
@@ -64,6 +73,14 @@ def convert_qdrant_point_to_haystack_document(point: QdrantPoint, use_sparse_emb
|
|
|
64
73
|
payload = {**point.payload}
|
|
65
74
|
payload["score"] = point.score if hasattr(point, "score") else None
|
|
66
75
|
|
|
76
|
+
if payload.pop("dataframe", None):
|
|
77
|
+
logger.warning(
|
|
78
|
+
"Document %s has the `dataframe` field set,"
|
|
79
|
+
"QdrantDocumentStore no longer supports dataframes and this field will be ignored. "
|
|
80
|
+
"The `dataframe` field will soon be removed from Haystack Document.",
|
|
81
|
+
payload["id"],
|
|
82
|
+
)
|
|
83
|
+
|
|
67
84
|
if not use_sparse_embeddings:
|
|
68
85
|
payload["embedding"] = point.vector if hasattr(point, "vector") else None
|
|
69
86
|
elif hasattr(point, "vector") and point.vector is not None:
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import numpy as np
|
|
2
|
+
from haystack import Document
|
|
3
|
+
from pandas import DataFrame
|
|
2
4
|
from qdrant_client.http import models as rest
|
|
3
5
|
|
|
4
6
|
from haystack_integrations.document_stores.qdrant.converters import (
|
|
7
|
+
convert_haystack_documents_to_qdrant_points,
|
|
5
8
|
convert_id,
|
|
6
9
|
convert_qdrant_point_to_haystack_document,
|
|
7
10
|
)
|
|
@@ -62,3 +65,44 @@ def test_point_to_document_reverts_proper_structure_from_record_without_sparse()
|
|
|
62
65
|
assert document.sparse_embedding is None
|
|
63
66
|
assert {"test_field": 1} == document.meta
|
|
64
67
|
assert 0.0 == np.sum(np.array([1.0, 0.0, 0.0, 0.0]) - document.embedding)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_point_to_document_skips_dataframe():
|
|
71
|
+
|
|
72
|
+
point = rest.Record(
|
|
73
|
+
id="c7c62e8e-02b9-4ec6-9f88-46bd97b628b7",
|
|
74
|
+
payload={
|
|
75
|
+
"id": "my-id",
|
|
76
|
+
"content": "Lorem ipsum",
|
|
77
|
+
"content_type": "text",
|
|
78
|
+
"meta": {
|
|
79
|
+
"test_field": 1,
|
|
80
|
+
},
|
|
81
|
+
"dataframe": {"a": [1, 2, 3]},
|
|
82
|
+
},
|
|
83
|
+
vector=[1.0, 0.0, 0.0, 0.0],
|
|
84
|
+
)
|
|
85
|
+
document = convert_qdrant_point_to_haystack_document(point, use_sparse_embeddings=False)
|
|
86
|
+
assert "my-id" == document.id
|
|
87
|
+
assert "Lorem ipsum" == document.content
|
|
88
|
+
assert "text" == document.content_type
|
|
89
|
+
assert {"test_field": 1} == document.meta
|
|
90
|
+
assert 0.0 == np.sum(np.array([1.0, 0.0, 0.0, 0.0]) - document.embedding)
|
|
91
|
+
assert not hasattr(document, "dataframe") or document.dataframe is None
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def test_documents_to_points_skips_dataframe():
|
|
95
|
+
doc = Document(
|
|
96
|
+
id="my-id",
|
|
97
|
+
content="Lorem ipsum",
|
|
98
|
+
embedding=[1.0, 0.0, 0.0, 0.0],
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
doc.dataframe = DataFrame([[1, 2], [3, 4]])
|
|
102
|
+
|
|
103
|
+
points = convert_haystack_documents_to_qdrant_points([doc], use_sparse_embeddings=False)
|
|
104
|
+
assert len(points) == 1
|
|
105
|
+
|
|
106
|
+
assert points[0].payload["content"] == "Lorem ipsum"
|
|
107
|
+
assert points[0].vector == [1.0, 0.0, 0.0, 0.0]
|
|
108
|
+
assert "dataframe" not in points[0].payload
|
|
@@ -208,11 +208,5 @@ class TestQdrantStoreBaseTests(FilterDocumentsTest):
|
|
|
208
208
|
|
|
209
209
|
# ======== ========================== ========
|
|
210
210
|
|
|
211
|
-
@pytest.mark.skip(reason="Qdrant doesn't support comparision with dataframe")
|
|
212
|
-
def test_comparison_equal_with_dataframe(self, document_store, filterable_docs): ...
|
|
213
|
-
|
|
214
|
-
@pytest.mark.skip(reason="Qdrant doesn't support comparision with dataframe")
|
|
215
|
-
def test_comparison_not_equal_with_dataframe(self, document_store, filterable_docs): ...
|
|
216
|
-
|
|
217
211
|
@pytest.mark.skip(reason="Cannot distinguish errors yet")
|
|
218
212
|
def test_missing_top_level_operator_key(self, document_store, filterable_docs): ...
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|