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

子类化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:18:12