继承 Langchain 类时出现 super init 问题

问题描述 投票:0回答:1

我正在尝试编写如下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

工作正常,但是当我尝试在

__init__
类的
OpenAILLM
中添加另一个变量时,如下所示

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

OpenAILLM 的mro如下

(__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 有关,但我不确定。而且我不知道如何解决。请帮忙。

python class oop langchain
1个回答
0
投票

在类

__slots__
上定义了一个
OpenAILLM
属性(由 Pydantic 定义,我不熟悉)。

请参阅 https://docs.python.org/3/reference/datamodel.html#slots 了解

__slots__
的工作原理。

简单地说,如果在类上定义了

__slots__
,则其成员是一成不变的,您不能向其 direct 实例添加其他成员。我相信
ChatOpenAI
并不意味着要被子类化,所以只要避免这种用法即可。

© www.soinside.com 2019 - 2024. All rights reserved.