继承Langchain类时super初始化问题

0 投票
1 回答
40 浏览
提问于 2025-04-13 16:28

我正在尝试写一个名为 LLM 的类,如下所示:

from langchain_openai import ChatOpenAI

class LLM:
    def __init__(self,model_name):
        super().__init__(model_name=model_name)
        self.model_name = model_name  

class OpenAILLM(LLM,ChatOpenAI):
    def __init__(self,model_name):
        super().__init__(model_name=model_name)
        self.model_name = model_name

这个类运行得很好,但当我尝试在 OpenAILLM 类的 __init__ 方法中添加另一个变量时,如下所示:

from langchain_openai import ChatOpenAI

class LLM:
    def __init__(self,model_name):
        super().__init__(model_name=model_name)
        self.model_name = model_name  

class OpenAILLM(LLM,ChatOpenAI):
    def __init__(self,model_name):
        super().__init__(model_name=model_name)
        self.model_name = model_name
        self.var = 'var'

创建 OpenAILLM 对象时失败,并出现错误 ValueError: "OpenAILLM" object has no field "var"

有没有人能帮我看看怎么添加更多变量呢?

我还尝试了下面定义的 get_var 函数,它可以正常工作,但下面定义的 set_var 函数却出现了和上面一样的错误。

from langchain_openai import ChatOpenAI

class LLM():
    var = 1
    def __init__(self,model_name):
        super().__init__(model_name=model_name)
        self.model_name = model_name  

class OpenAILLM(LLM,ChatOpenAI):
    def __init__(self,model_name):
        super().__init__(model_name=model_name)
        self.model_name = model_name
    def get_var(self):
        return self.var
    def set_var(self, var):
        print('self var',self.var)
        self.var = var
        return True

OpenAILLMmro 如下:

(__main__.OpenAILLM,
 __main__.LLM,
 langchain_openai.chat_models.base.ChatOpenAI,
 langchain_core.language_models.chat_models.BaseChatModel,
 langchain_core.language_models.base.BaseLanguageModel,
 langchain_core.runnables.base.RunnableSerializable,
 langchain_core.load.serializable.Serializable,
 pydantic.v1.main.BaseModel,
 pydantic.v1.utils.Representation,
 langchain_core.runnables.base.Runnable,
 typing.Generic,
 abc.ABC,
 object)

我觉得这可能和 pydantic 有关,但我不太确定。我也不知道该怎么解决。请帮帮我。

1 个回答

1

在类 OpenAILLM 上定义了一个 __slots__ 属性(这个是 Pydantic 的,我不太熟悉)。

你可以查看这个链接了解 __slots__ 是怎么工作的:https://docs.python.org/3/reference/datamodel.html#slots

简单来说,如果一个类定义了 __slots__,那么这个类的成员就固定了,你不能在它的直接实例上添加新的成员。而且我认为 ChatOpenAI 不是为了被继承的,所以最好不要这样使用。

撰写回答