子类化CustomLLM时无法通过__init__创建实例变量的原因咨询
LlamaIndex CustomLLM子类化报错原因解析
问题情况
子类化CustomLLM时,用__init__方法创建实例变量,运行到给self.access_token赋值的代码时,抛出错误:ValueError: "Advgpt" object has no field "access_token"。
报错代码:
from llama_index.core.llms import CustomLLM class Advgpt(CustomLLM): def __init__(self,access_token, engagementCode): super().__init__() self.access_token = access_token self.engagementCode = engagementCode # 其余代码
但改成类变量加类型注解的方式定义,代码就能正常运行,而且可以通过self调用这些变量:
from llama_index.core.llms import CustomLLM class Advgpt(CustomLLM): access_token : str engagementCode : str # 其余代码
使用版本:llama-index==0.12.15
核心原因
LlamaIndex的CustomLLM底层基于Pydantic v2实现,Pydantic对模型字段有硬性要求:
- 所有需要被框架验证、序列化的字段,必须在类层级显式声明(要么加类型注解,要么用
Field定义),不能只在__init__里动态给self添加属性。 - 当你在
__init__里直接赋值self.access_token时,Pydantic不会把这个属性当成模型的合法字段。后续LLM框架执行流程中,会对实例做字段验证或序列化,这时候就会抛出“无此字段”的错误。 - 用类变量+类型注解定义时,Pydantic会自动把这些识别成模型的字段,初始化时会自动处理赋值,后续的验证、序列化流程也能正常走通。
如果一定要用__init__处理初始化逻辑,正确的写法是先在类里声明字段,再调用父类的__init__传参,比如:
from llama_index.core.llms import CustomLLM class Advgpt(CustomLLM): access_token : str engagementCode : str def __init__(self, access_token: str, engagementCode: str): super().__init__(access_token=access_token, engagementCode=engagementCode) # 这里可以加额外的初始化逻辑
总结
LlamaIndex的核心组件靠Pydantic管理字段和做验证,必须遵守Pydantic的规则:要让框架识别的字段,必须在类里明确声明,不能只在__init__里动态添加属性,否则就会触发字段验证错误。
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

