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
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@
from typing import Any
from unittest.mock import ANY, AsyncMock, Mock

import numpy as np
import pytest

from haystack import Document, Pipeline, component
from haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder
from haystack.components.embedders import MockTextEmbedder, OpenAIDocumentEmbedder, OpenAITextEmbedder
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.query import QueryExpander
from haystack.components.retrievers import InMemoryEmbeddingRetriever, MultiQueryEmbeddingRetriever
Expand All @@ -19,13 +18,6 @@
from haystack.document_stores.types import DuplicatePolicy


@component
class MockQueryEmbedder:
@component.output_types(embedding=list[float])
def run(self, text: str) -> dict[str, list[float]]:
return {"embedding": np.ones(384).tolist()}


class TestMultiQueryEmbeddingRetriever:
@pytest.fixture
def sample_documents(self):
Expand Down Expand Up @@ -74,15 +66,15 @@ def document_store_with_embeddings(self, sample_documents):

def test_init_with_default_parameters(self, in_memory_doc_store):
embedding_retriever = InMemoryEmbeddingRetriever(document_store=in_memory_doc_store)
query_embedder = MockQueryEmbedder()
query_embedder = MockTextEmbedder()
retriever = MultiQueryEmbeddingRetriever(retriever=embedding_retriever, query_embedder=query_embedder)
assert retriever.retriever == embedding_retriever
assert retriever.query_embedder == query_embedder
assert retriever.max_workers == 3

def test_init_with_custom_parameters(self, in_memory_doc_store):
embedding_retriever = InMemoryEmbeddingRetriever(document_store=in_memory_doc_store)
query_embedder = MockQueryEmbedder()
query_embedder = MockTextEmbedder()
retriever = MultiQueryEmbeddingRetriever(
retriever=embedding_retriever, query_embedder=query_embedder, max_workers=2
)
Expand All @@ -92,15 +84,15 @@ def test_init_with_custom_parameters(self, in_memory_doc_store):

def test_run_with_empty_queries(self, in_memory_doc_store):
multi_retriever = MultiQueryEmbeddingRetriever(
retriever=InMemoryEmbeddingRetriever(document_store=in_memory_doc_store), query_embedder=MockQueryEmbedder()
retriever=InMemoryEmbeddingRetriever(document_store=in_memory_doc_store), query_embedder=MockTextEmbedder()
)
result = multi_retriever.run(queries=[])
assert "documents" in result
assert result["documents"] == []

def test_run_with_empty_results(self, in_memory_doc_store):
multi_retriever = MultiQueryEmbeddingRetriever(
retriever=InMemoryEmbeddingRetriever(document_store=in_memory_doc_store), query_embedder=MockQueryEmbedder()
retriever=InMemoryEmbeddingRetriever(document_store=in_memory_doc_store), query_embedder=MockTextEmbedder()
)
result = multi_retriever.run(queries=["query"])
assert "documents" in result
Expand All @@ -109,7 +101,7 @@ def test_run_with_empty_results(self, in_memory_doc_store):
def test_to_dict(self, in_memory_doc_store):
multi_retriever = MultiQueryEmbeddingRetriever(
retriever=InMemoryEmbeddingRetriever(document_store=in_memory_doc_store),
query_embedder=MockQueryEmbedder(),
query_embedder=MockTextEmbedder(),
max_workers=2,
)
result = multi_retriever.to_dict()
Expand Down Expand Up @@ -139,8 +131,16 @@ def test_to_dict(self, in_memory_doc_store):
},
},
"query_embedder": {
"type": "retrievers.test_multi_query_embedding_retriever.MockQueryEmbedder",
"init_parameters": {},
"type": "haystack.components.embedders.mock_text_embedder.MockTextEmbedder",
"init_parameters": {
"embedding": None,
"embedding_fn": None,
"dimension": 768,
"model": "mock-model",
"meta": {},
"prefix": "",
"suffix": "",
},
},
"max_workers": 2,
},
Expand Down Expand Up @@ -219,7 +219,7 @@ def run(
return {"documents": [doc3, doc2]}

multi_retriever = MultiQueryEmbeddingRetriever(
retriever=MockRetriever(), query_embedder=MockQueryEmbedder(), max_workers=1
retriever=MockRetriever(), query_embedder=MockTextEmbedder(), max_workers=1
)
result = multi_retriever.run(queries=["query1", "query2"])

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,17 @@
import pytest

from haystack import Document, Pipeline, component
from haystack.components.embedders import MockTextEmbedder
from haystack.components.retrievers import InMemoryEmbeddingRetriever, MultiQueryEmbeddingRetriever
from haystack.document_stores.in_memory import InMemoryDocumentStore


@component
class MockQueryEmbedder:
@component.output_types(embedding=list[float])
def run(self, text: str) -> dict[str, list[float]]:
return {"embedding": np.ones(384).tolist()}

@component.output_types(embedding=list[float])
async def run_async(self, text: str) -> dict[str, list[float]]:
return {"embedding": np.ones(384).tolist()}


class TestMultiQueryEmbeddingRetrieverAsync:
@pytest.mark.asyncio
async def test_run_async_with_empty_queries(self):
multi_retriever = MultiQueryEmbeddingRetriever(
retriever=InMemoryEmbeddingRetriever(document_store=InMemoryDocumentStore()),
query_embedder=MockQueryEmbedder(),
query_embedder=MockTextEmbedder(),
)
result = await multi_retriever.run_async(queries=[])
assert "documents" in result
Expand Down Expand Up @@ -62,7 +52,7 @@ async def run_async(
) -> dict[str, list[Document]]:
return {"documents": [doc_low, doc_high, doc_mid]}

multi_retriever = MultiQueryEmbeddingRetriever(retriever=MockRetriever(), query_embedder=MockQueryEmbedder())
multi_retriever = MultiQueryEmbeddingRetriever(retriever=MockRetriever(), query_embedder=MockTextEmbedder())
result = await multi_retriever.run_async(queries=["query1", "query2"])

scores = [doc.score for doc in result["documents"]]
Expand Down Expand Up @@ -96,7 +86,7 @@ async def run_async(
) -> dict[str, list[Document]]:
return {"documents": [doc3, doc2]}

multi_retriever = MultiQueryEmbeddingRetriever(retriever=MockRetriever(), query_embedder=MockQueryEmbedder())
multi_retriever = MultiQueryEmbeddingRetriever(retriever=MockRetriever(), query_embedder=MockTextEmbedder())
result = await multi_retriever.run_async(queries=["query1", "query2"])

assert "documents" in result
Expand Down Expand Up @@ -131,9 +121,7 @@ def run(
) -> dict[str, list[Document]]:
return {"documents": [Document(content="Solar energy", id="doc1", score=0.9)]}

multi_retriever = MultiQueryEmbeddingRetriever(
retriever=SyncOnlyRetriever(), query_embedder=MockQueryEmbedder()
)
multi_retriever = MultiQueryEmbeddingRetriever(retriever=SyncOnlyRetriever(), query_embedder=MockTextEmbedder())
result = await multi_retriever.run_async(queries=["query1", "query2"])
assert "documents" in result
assert len(result["documents"]) == 1
Expand Down Expand Up @@ -188,7 +176,7 @@ async def test_run_async_with_filters(self, document_store_with_categorized_docs
in_memory_retriever = InMemoryEmbeddingRetriever(document_store=document_store_with_categorized_docs)
filters = {"field": "category", "operator": "==", "value": "solar"}
multi_retriever = MultiQueryEmbeddingRetriever(
retriever=in_memory_retriever, query_embedder=MockQueryEmbedder()
retriever=in_memory_retriever, query_embedder=MockTextEmbedder(dimension=384)
)
result = await multi_retriever.run_async(
queries=["energy", "sunlight", "photovoltaic"], retriever_kwargs={"filters": filters}
Expand All @@ -202,7 +190,7 @@ async def test_run_async_with_filters(self, document_store_with_categorized_docs
async def test_run_async_with_pipeline(self):
multi_retriever = MultiQueryEmbeddingRetriever(
retriever=InMemoryEmbeddingRetriever(document_store=InMemoryDocumentStore()),
query_embedder=MockQueryEmbedder(),
query_embedder=MockTextEmbedder(),
)
pipeline = Pipeline()
pipeline.add_component("retriever", multi_retriever)
Expand Down
22 changes: 11 additions & 11 deletions test/components/retrievers/test_text_embedding_retriever.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,16 @@
from typing import Any
from unittest.mock import ANY, AsyncMock, Mock

import numpy as np
import pytest

from haystack import Document, component
from haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder
from haystack.components.embedders import MockTextEmbedder, OpenAIDocumentEmbedder, OpenAITextEmbedder
from haystack.components.retrievers import InMemoryEmbeddingRetriever, TextEmbeddingRetriever
from haystack.components.writers import DocumentWriter
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.document_stores.types import DuplicatePolicy


@component
class MockTextEmbedder:
@component.output_types(embedding=list[float])
def run(self, text: str) -> dict[str, list[float]]:
return {"embedding": np.ones(384).tolist()}


class TestTextEmbeddingRetriever:
@pytest.fixture
def sample_documents(self):
Expand Down Expand Up @@ -113,8 +105,16 @@ def test_to_dict(self):
},
},
"text_embedder": {
"type": "retrievers.test_text_embedding_retriever.MockTextEmbedder",
"init_parameters": {},
"type": "haystack.components.embedders.mock_text_embedder.MockTextEmbedder",
"init_parameters": {
"embedding": None,
"embedding_fn": None,
"dimension": 768,
"model": "mock-model",
"meta": {},
"prefix": "",
"suffix": "",
},
},
},
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,11 @@
import pytest

from haystack import Document, Pipeline, component
from haystack.components.embedders import MockTextEmbedder
from haystack.components.retrievers import InMemoryEmbeddingRetriever, TextEmbeddingRetriever
from haystack.document_stores.in_memory import InMemoryDocumentStore


@component
class MockTextEmbedder:
@component.output_types(embedding=list[float])
def run(self, text: str) -> dict[str, list[float]]:
return {"embedding": np.ones(384).tolist()}

@component.output_types(embedding=list[float])
async def run_async(self, text: str) -> dict[str, list[float]]:
return {"embedding": np.ones(384).tolist()}


class TestTextEmbeddingRetrieverAsync:
@pytest.mark.asyncio
async def test_run_async_with_empty_document_store(self):
Expand Down Expand Up @@ -114,7 +104,7 @@ def document_store_with_categorized_docs(self):
async def test_run_async_with_filters(self, document_store_with_categorized_docs):
retriever = TextEmbeddingRetriever(
retriever=InMemoryEmbeddingRetriever(document_store=document_store_with_categorized_docs),
text_embedder=MockTextEmbedder(),
text_embedder=MockTextEmbedder(dimension=384),
)
filters = {"field": "category", "operator": "==", "value": "solar"}
result = await retriever.run_async(query="energy", filters=filters)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,14 @@
from haystack import Document, Pipeline, component
from haystack.components.builders.answer_builder import AnswerBuilder
from haystack.components.builders.prompt_builder import PromptBuilder
from haystack.components.embedders import MockTextEmbedder
from haystack.components.joiners import DocumentJoiner
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever, InMemoryEmbeddingRetriever
from haystack.core.errors import BreakpointException
from haystack.dataclasses.breakpoints import Breakpoint
from haystack.document_stores.in_memory import InMemoryDocumentStore


@component
class FakeEmbedder:
@component.output_types(documents=list[Document], embedding=list[float])
def run(self, text: str) -> dict[str, list[Document] | list[float]]:
return {"embedding": [random() for _ in range(100)]}


@component
class FakeRanker:
@component.output_types(documents=list[Document])
Expand Down Expand Up @@ -67,7 +61,7 @@ def hybrid_rag_pipeline(self, document_store):

pipeline = Pipeline()
pipeline.add_component("bm25_retriever", InMemoryBM25Retriever(document_store=document_store))
pipeline.add_component("query_embedder", FakeEmbedder())
pipeline.add_component("query_embedder", MockTextEmbedder(dimension=100))
pipeline.add_component("embedding_retriever", InMemoryEmbeddingRetriever(document_store=document_store))
pipeline.add_component("doc_joiner", DocumentJoiner())
pipeline.add_component("ranker", FakeRanker())
Expand Down
16 changes: 8 additions & 8 deletions test/core/pipeline/features/test_run.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
OutputAdapter,
TextFileToDocument,
)
from haystack.components.embedders import MockTextEmbedder
from haystack.components.joiners import AnswerJoiner, BranchJoiner, DocumentJoiner, StringJoiner
from haystack.components.preprocessors import DocumentCleaner, DocumentSplitter
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
Expand Down Expand Up @@ -1701,12 +1702,6 @@ def run(self, query: str) -> dict[str, str]:
return {"INJECTION": query}
return {"LEGIT": query}

@component
class FakeEmbedder:
@component.output_types(embeddings=list[float])
def run(self, text: str) -> dict[str, list[float]]:
return {"embeddings": [1.0, 2.0, 3.0]}

@component
class FakeRanker:
@component.output_types(documents=list[Document])
Expand All @@ -1728,7 +1723,7 @@ def run(self, query_embedding: list[float]) -> dict[str, list[Document]]:
return {"documents": [doc2]}

pipeline.add_component(name="router", instance=FakeRouter())
pipeline.add_component(name="text_embedder", instance=FakeEmbedder())
pipeline.add_component(name="text_embedder", instance=MockTextEmbedder(embedding=[1.0, 2.0, 3.0]))
pipeline.add_component(name="retriever", instance=FakeEmbeddingRetriever())
pipeline.add_component(name="emptyretriever", instance=FakeRetriever())
pipeline.add_component(name="joinerfinal", instance=DocumentJoiner())
Expand All @@ -1752,7 +1747,12 @@ def run(self, query_embedding: list[float]) -> dict[str, list[Document]]:
[
PipelineRunData(
inputs={"router": {"query": "I'm a legit question"}},
expected_outputs={"joinerfinal": {"documents": [doc1, doc2]}},
expected_outputs={
"text_embedder": {
"meta": {"model": "mock-model", "usage": {"prompt_tokens": 4, "total_tokens": 4}}
},
"joinerfinal": {"documents": [doc1, doc2]},
},
expected_component_calls={
("router", 1): {"query": "I'm a legit question"},
("text_embedder", 1): {"text": "I'm a legit question"},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
#
# SPDX-License-Identifier: Apache-2.0

import numpy as np
import pytest

from haystack import Document, Pipeline
from haystack.components.builders import ChatPromptBuilder
from haystack.components.embedders import MockTextEmbedder
from haystack.components.joiners import DocumentJoiner
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.core.component import component
Expand All @@ -31,14 +31,6 @@ def run(self, query_embedding: list[float]) -> dict[str, list[Document]]:
return 42 # type: ignore[return-value]


@component
class MockTextEmbedder:
@component.output_types(embedding=list[float])
def run(self, text: str) -> dict[str, list[float]]:
embedding = np.ones(384).tolist() # Mock embedding of size 384
return {"embedding": embedding}


class TestPipelineOutputsRaisedInException:
def test_hybrid_rag_pipeline_crash_on_embedding_retriever(self):
document_store = setup_document_store()
Expand Down
Loading