如何将Pydantic v2模型转换为v1模型适配LangChain?
Pydantic v2模型架构转v1适配LangChain的实现方案
要实现Pydantic v2模型架构向v1的转换,核心思路是借助JSON Schema作为中间层——Pydantic v2和v1都支持基于JSON Schema生成模型类。以下是具体实现方案:
实现步骤
- 从v2模型导出标准的JSON Schema
- 使用Pydantic v1的
create_model方法,结合导出的Schema生成对应的v1模型类 - 可选:同步v2模型中的字段描述、验证器等元信息(如果需要保留这些细节)
完整代码实现
from langchain.chains import create_tagging_chain_pydantic from pydantic import BaseModel as BaseModelV2, Field from pydantic.v1 import BaseModel as BaseModelV1, create_model class TaggingModel(BaseModelV2): """示例标注模型""" entity: str = Field(description="需要识别的实体名称") category: str = Field(description="实体所属的分类") confidence: float = Field(ge=0.0, le=1.0, description="识别置信度") def convert_to_v1(v2_model: type[BaseModelV2]) -> type[BaseModelV1]: # 导出v2模型的JSON Schema v2_schema = v2_model.model_json_schema() # 提取字段定义:适配v1 create_model的参数格式 fields = {} for field_name, field_info in v2_schema["properties"].items(): # 映射JSON Schema类型到Python基础类型 type_map = { "string": str, "number": float, "integer": int, "boolean": bool } py_type = type_map.get(field_info.get("type"), object) # 处理字段默认值 default = field_info.get("default", ...) # 提取字段元信息(描述、数值约束等) field_kwargs = {} if "description" in field_info: field_kwargs["description"] = field_info["description"] if "minimum" in field_info: field_kwargs["ge"] = field_info["minimum"] if "maximum" in field_info: field_kwargs["le"] = field_info["maximum"] fields[field_name] = (py_type, Field(**field_kwargs) if field_kwargs else default) # 生成v1模型类 v1_model = create_model( v2_model.__name__, __doc__=v2_model.__doc__, **fields ) return v1_model # 示例调用 if __name__ == "__main__": # 假设已初始化llm实例(如ChatOpenAI) # llm = ChatOpenAI(temperature=0) chain = create_tagging_chain_pydantic(pydantic_schema=convert_to_v1(TaggingModel), llm=llm)
注意事项
- 上述代码仅处理基础类型和常见验证规则,若v2模型包含嵌套模型、枚举等复杂类型,需扩展转换逻辑
- 若v2模型使用自定义验证器,需手动将验证逻辑迁移到生成的v1模型中
- 测试时需验证转换后的v1模型与原v2模型的字段约束、序列化/反序列化行为一致
内容的提问来源于stack exchange,提问作者KOB
相关产品推荐
相关产品推荐

