浅尝Pydantic | 豆包MarsCode AI刷题

114 阅读4分钟

Field 函数

在 Pydantic 中,Field 函数用于为模型的字段提供额外的元数据和验证。Field 函数是可选的,但它可以增强模型的功能性和灵活性。以下是 Field 函数的一些常见用途:

  1. 提供描述Field 允许你为模型的字段添加描述(description),这有助于文档生成和理解模型字段的用途。

    class User(BaseModel):
        name: str = Field(description="用户的名字")
    
  2. 默认值: 你可以为字段指定一个默认值(default),如果创建模型实例时没有提供该字段的值,则使用默认值。

    class User(BaseModel):
        name: str = Field(default="Guest")
    
  3. 别名: 使用 alias 参数为字段指定一个在数据中使用的别名,这在处理数据库或API响应时非常有用,因为它们可能使用不同的命名约定。

    class User(BaseModel):
        user_name: str = Field(alias="username")
    
  4. 验证器Field 允许你为字段指定一个或多个验证器(validatorsvalidator),这些验证器可以在字段值被赋值之前对其进行额外的检查。

    from pydantic import validator
    class User(BaseModel):
        age: int = Field(..., validators=[validator(lambda v: v > 0, "必须大于0")])
    
  5. 预处理Field 还允许你指定一个预处理函数(pre),在字段值被赋值之前对其进行转换。

    class User(BaseModel):
        name: str = Field(pre=lambda v: v.strip())
    
  6. 排除和包含: 你可以使用 excludeinclude 参数来控制字段在模型的 .dict() 方法调用时是否被包含或排除。

    class User(BaseModel):
        name: str
        _password: str = Field(exclude=True)  # 这个字段将不会被包含在.dict()输出中
    
  7. 根验证器Field 还可以用来定义根验证器(root_validators),这些验证器可以在模型级别上运行,而不是仅仅针对单个字段。

    from pydantic import root_validator
    class User(BaseModel):
        name: str
        age: int
        @root_validator(pre=True)
        def check_age(cls, values):
            if values['age'] < 18:
                raise ValueError("年龄必须大于等于18")
            return values
    
  8. 额外的验证Field 允许你添加额外的验证逻辑,比如检查字段值是否符合特定的格式或范围。

    class User(BaseModel):
        email: str = Field(..., regex=r"^.+@\w+\.\w+$")
    

Field 函数十分强大,它提供了一种灵活的方式来定义模型字段的行为,包括验证、转换和文档化。

思考题

为什么大模型能够返回JSON格式的数据?

大模型能够返回JSON格式的数据主要是因为开发者可以通过特定的提示(prompt)工程和API调用参数来指导模型按照预定的格式输出。如:

  1. 提示工程(Prompt Engineering):通过精心设计的提示,可以引导大模型按照特定的格式(如JSON)返回结果。例如,在提示中明确要求模型以JSON格式返回数据,模型往往会遵循这一指令。

  2. API调用参数:一些大模型平台(如OpenAI)提供了API参数,允许用户指定期望的输出格式。例如,OpenAI在其官方接口中增加了return_format参数,通过设置{"type":"json_object"},可以让模型以JSON格式输出。

输出解析器用了什么“魔法”让大模型做到了这一点?

输出解析器并没有使用“魔法”,而是利用了以下技术和策略:

  1. JSON Schema:通过定义JSON Schema,开发者可以指定期望的输出结构和数据类型。大模型在接收到包含JSON Schema的提示后,会尝试按照这个模式生成输出。

  2. 格式化提示:在提示中明确要求模型以特定格式(如JSON)返回结果,并且可能提供示例或模式,帮助模型理解预期的输出格式。

  3. 解析器工具:如LangChain提供的PydanticOutputParser,它利用Pydantic模型来验证和解析输出,确保输出符合预定义的JSON结构。

LangChain在调用大模型之前如何设计“提示”?

LangChain通过以下步骤设计提示:

  1. 定义输出类:使用Pydantic定义一个输出类,该类描述了期望的输出结构,包括字段和数据类型。

  2. 生成JSON Schema:利用Pydantic模型的model_json_schema()方法生成对应的JSON Schema,这个Schema描述了输出数据的结构。

  3. 构建提示模板:使用PromptTemplate类构建提示模板,模板中包含问题描述和JSON Schema,指导模型按照指定格式输出。

重试解析器的原理是什么?它主要实现了解析器类的哪个可选方法?

重试解析器的原理是在解析失败时自动重试解析过程。它主要实现了解析器类的parse方法的可选重试逻辑。具体来说,当解析器首次解析失败时,它会捕获错误,并根据错误类型和配置决定是否重试解析。如果决定重试,它会再次尝试解析,直到成功或达到重试次数限制。这种机制特别适用于处理暂时性的错误或不稳定的网络条件。