Python TypeError:无法实例化含aget_relevant_documents抽象方法的抽象类
问题原因与解决方案
1. 报错核心原因
你继承的BaseRetriever是抽象类,这类类要求子类必须实现所有标记为抽象方法的接口才能被实例化。BaseRetriever中定义了两个抽象方法:
get_relevant_documents:同步获取相关文档的方法(你已实现)aget_relevant_documents:异步版本的获取方法(你未实现,这就是报错的关键)
2. 概念解释
- 抽象类:一种不能直接实例化的类,它定义了子类必须遵守的方法规范,确保子类具备特定功能。Python中通过
abc.ABC和@abstractmethod机制实现。 - 方法名前的"a":是英文
async(异步)的缩写,这类方法是异步方法,用于支持Python异步编程模式,允许程序在等待IO操作时执行其他任务,提升运行效率。
3. 解决方案
你需要在ChromaProductRetriever类中实现aget_relevant_documents方法,有两种常见实现方式:
方式一:基于同步方法封装异步调用
如果你的vectorstore没有提供异步相似性搜索方法,可通过asyncio将同步方法封装为异步:
import asyncio class ChromaProductRetriever(BaseRetriever, BaseModel): vectorstore: VectorStore class Config: arbitrary_types_allowed = True def combine_metadata(self, doc) -> str: metadata = doc.metadata return ( "Item Name: " + metadata["item_name"] + ". " + "Item Description: " + metadata["bullet_point"] + ". " + "Item Keywords: " + metadata["item_keywords"] + "." ) def get_relevant_documents(self, query): docs = [] for doc in self.vectorstore.similarity_search(query): content = self.combine_metadata(doc) docs.append(Document( page_content=content, metadata=doc.metadata )) return docs async def aget_relevant_documents(self, query): # 使用线程池执行同步方法,转为异步调用 loop = asyncio.get_event_loop() return await loop.run_in_executor(None, self.get_relevant_documents, query)
方式二:直接实现异步逻辑
如果你的vectorstore提供了异步相似性搜索方法(比如asimilarity_search),可直接实现异步逻辑:
class ChromaProductRetriever(BaseRetriever, BaseModel): vectorstore: VectorStore class Config: arbitrary_types_allowed = True def combine_metadata(self, doc) -> str: metadata = doc.metadata return ( "Item Name: " + metadata["item_name"] + ". " + "Item Description: " + metadata["bullet_point"] + ". " + "Item Keywords: " + metadata["item_keywords"] + "." ) def get_relevant_documents(self, query): docs = [] for doc in self.vectorstore.similarity_search(query): content = self.combine_metadata(doc) docs.append(Document( page_content=content, metadata=doc.metadata )) return docs async def aget_relevant_documents(self, query): docs = [] for doc in await self.vectorstore.asimilarity_search(query): content = self.combine_metadata(doc) docs.append(Document( page_content=content, metadata=doc.metadata )) return docs
完成上述修改后,即可正常实例化ChromaProductRetriever类。
内容的提问来源于stack exchange,提问作者user1753640
相关产品推荐
相关产品推荐

