|
from langchain.vectorstores import VectorStore |
|
from typing import Iterable, List, Any |
|
from langchain.docstore.document import Document |
|
from langchain.embeddings.base import Embeddings |
|
from langchain.embeddings.fake import FakeEmbeddings as FakeEmbeddingsBase |
|
from langchain.chat_models.fake import FakeListChatModel |
|
from typing import Optional |
|
|
|
|
|
class FakeChatModel(FakeListChatModel): |
|
def __init__(self, **kwargs): |
|
responses = ["The answer is 42. SOURCES: 1, 2, 3, 4"] |
|
super().__init__(responses=responses, **kwargs) |
|
|
|
|
|
class FakeEmbeddings(FakeEmbeddingsBase): |
|
def __init__(self, **kwargs): |
|
super().__init__(size=4, **kwargs) |
|
|
|
|
|
class FakeVectorStore(VectorStore): |
|
"""Fake vector store for testing purposes.""" |
|
|
|
def __init__(self, texts: List[str]): |
|
self.texts: List[str] = texts |
|
|
|
def add_texts( |
|
self, texts: Iterable[str], metadatas: List[dict] | None = None, **kwargs: Any |
|
) -> List[str]: |
|
self.texts.extend(texts) |
|
return self.texts |
|
|
|
@classmethod |
|
def from_texts( |
|
cls, |
|
texts: List[str], |
|
embedding: Embeddings, |
|
metadatas: Optional[List[dict]] = None, |
|
**kwargs: Any, |
|
) -> "FakeVectorStore": |
|
return cls(texts=list(texts)) |
|
|
|
def similarity_search( |
|
self, query: str, k: int = 4, **kwargs: Any |
|
) -> List[Document]: |
|
return [ |
|
Document(page_content=text, metadata={"source": f"{i+1}-{1}"}) |
|
for i, text in enumerate(self.texts) |
|
] |
|
|