Spaces:
Runtime error
Runtime error
File size: 2,370 Bytes
105b369 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
from typing import List, Optional, Callable, Any
from phi.document import Document
from phi.knowledge.base import AssistantKnowledge
from phi.utils.log import logger
class LangChainKnowledgeBase(AssistantKnowledge):
loader: Optional[Callable] = None
vectorstore: Optional[Any] = None
search_kwargs: Optional[dict] = None
retriever: Optional[Any] = None
def search(self, query: str, num_documents: Optional[int] = None) -> List[Document]:
"""Returns relevant documents matching the query"""
try:
from langchain_core.vectorstores import VectorStoreRetriever
from langchain_core.documents import Document as LangChainDocument
except ImportError:
raise ImportError(
"The `langchain` package is not installed. Please install it via `pip install langchain`."
)
if self.vectorstore is not None and self.retriever is None:
logger.debug("Creating retriever")
if self.search_kwargs is None:
self.search_kwargs = {"k": self.num_documents}
self.retriever = self.vectorstore.as_retriever(search_kwargs=self.search_kwargs)
if self.retriever is None:
logger.error("No retriever provided")
return []
if not isinstance(self.retriever, VectorStoreRetriever):
raise ValueError(f"Retriever is not of type VectorStoreRetriever: {self.retriever}")
_num_documents = num_documents or self.num_documents
logger.debug(f"Getting {_num_documents} relevant documents for query: {query}")
lc_documents: List[LangChainDocument] = self.retriever.invoke(input=query)
documents = []
for lc_doc in lc_documents:
documents.append(
Document(
content=lc_doc.page_content,
meta_data=lc_doc.metadata,
)
)
return documents
def load(self, recreate: bool = False, upsert: bool = True, skip_existing: bool = True) -> None:
if self.loader is None:
logger.error("No loader provided for LangChainKnowledgeBase")
return
self.loader()
def exists(self) -> bool:
logger.warning("LangChainKnowledgeBase.exists() not supported - please check the vectorstore manually.")
return True
|