我正在尝试编写如下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 有关,但我不确定。而且我不知道如何解决。请帮忙。
在类
__slots__
上定义了一个 OpenAILLM
属性(由 Pydantic 定义,我不熟悉)。
请参阅 https://docs.python.org/3/reference/datamodel.html#slots 了解
__slots__
的工作原理。
简单地说,如果在类上定义了
__slots__
,则其成员是一成不变的,您不能向其 direct 实例添加其他成员。我相信 ChatOpenAI
并不意味着要被子类化,所以只要避免这种用法即可。