You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:53:15