[docs]classMergerRetriever(BaseRetriever):"""Retriever that merges the results of multiple retrievers."""retrievers:List[BaseRetriever]"""A list of retrievers to merge."""def_get_relevant_documents(self,query:str,*,run_manager:CallbackManagerForRetrieverRun,)->List[Document]:""" Get the relevant documents for a given query. Args: query: The query to search for. Returns: A list of relevant documents. """# Merge the results of the retrievers.merged_documents=self.merge_documents(query,run_manager)returnmerged_documentsasyncdef_aget_relevant_documents(self,query:str,*,run_manager:AsyncCallbackManagerForRetrieverRun,)->List[Document]:""" Asynchronously get the relevant documents for a given query. Args: query: The query to search for. Returns: A list of relevant documents. """# Merge the results of the retrievers.merged_documents=awaitself.amerge_documents(query,run_manager)returnmerged_documents
[docs]defmerge_documents(self,query:str,run_manager:CallbackManagerForRetrieverRun)->List[Document]:""" Merge the results of the retrievers. Args: query: The query to search for. Returns: A list of merged documents. """# Get the results of all retrievers.retriever_docs=[retriever.invoke(query,config={"callbacks":run_manager.get_child("retriever_{}".format(i+1))},)fori,retrieverinenumerate(self.retrievers)]# Merge the results of the retrievers.merged_documents=[]max_docs=max(map(len,retriever_docs),default=0)foriinrange(max_docs):forretriever,docinzip(self.retrievers,retriever_docs):ifi<len(doc):merged_documents.append(doc[i])returnmerged_documents
[docs]asyncdefamerge_documents(self,query:str,run_manager:AsyncCallbackManagerForRetrieverRun)->List[Document]:""" Asynchronously merge the results of the retrievers. Args: query: The query to search for. Returns: A list of merged documents. """# Get the results of all retrievers.retriever_docs=awaitasyncio.gather(*(retriever.ainvoke(query,config={"callbacks":run_manager.get_child("retriever_{}".format(i+1))},)fori,retrieverinenumerate(self.retrievers)))# Merge the results of the retrievers.merged_documents=[]max_docs=max(map(len,retriever_docs),default=0)foriinrange(max_docs):forretriever,docinzip(self.retrievers,retriever_docs):ifi<len(doc):merged_documents.append(doc[i])returnmerged_documents