跳至主要内容

如何使用 LangChain 与不同的 Pydantic 版本

langchain>=0.0.267 开始,LangChain 允许用户安装 Pydantic V1 或 V2。

在内部,LangChain 继续通过 Pydantic 2 的 v1 命名空间使用Pydantic V1

由于 Pydantic 不支持混合使用 .v1 和 .v2 对象,因此用户在将 LangChain 与 Pydantic 一起使用时应注意一些问题。

注意

虽然 LangChain 在某些 API 中支持 Pydantic V2 对象(如下所列),但建议用户在发布 LangChain 0.3 之前继续使用 Pydantic V1 对象。

1. 将 Pydantic 对象传递给 LangChain API

大多数用于工具使用的 LangChain API(见下表)已更新为接受 Pydantic v1 或 v2 对象。

  • 如果安装了pydantic 1,则 Pydantic v1 对象对应于pydantic.BaseModel的子类;如果安装了pydantic 2,则对应于pydantic.v1.BaseModel的子类。
  • 如果安装了pydantic 2,则 Pydantic v2 对象对应于pydantic.BaseModel的子类。
APIPydantic 1Pydantic 2
BaseChatModel.bind_toolslangchain-core>=0.2.23,合作伙伴软件包的相应版本
BaseChatModel.with_structured_outputlangchain-core>=0.2.23,合作伙伴软件包的相应版本
Tool.from_functionlangchain-core>=0.2.23
StructuredTool.from_functionlangchain-core>=0.2.23

通过bind_toolswith_structured_output API 接受 pydantic v2 对象的合作伙伴软件包

软件包名称pydantic v1pydantic v2
langchain-mistralai>=0.1.11
langchain-anthropic>=0.1.21
langchain-robocorp>=0.0.10
langchain-openai>=0.1.19
langchain-fireworks>=0.1.5
langchain-aws>=0.1.15

将来,将更新其他合作伙伴软件包以接受 Pydantic v2 对象。

如果您仍然遇到这些 API 或其他接受 Pydantic 对象的 API 的问题,请提交问题,我们会解决它。

示例

langchain-core<0.2.23之前,将 Pydantic v1 对象传递给 LangChain API 时,请使用 Pydantic v1 对象。

from langchain_openai import ChatOpenAI
from pydantic.v1 import BaseModel # <-- Note v1 namespace

class Person(BaseModel):
"""Personal information"""
name: str

model = ChatOpenAI()
model = model.with_structured_output(Person)

model.invoke('Bob is a person.')
API 参考:ChatOpenAI

langchain-core>=0.2.23之后,将 Pydantic v1 或 v2 对象传递给 LangChain API 时,可以使用任一对象。

from langchain_openai import ChatOpenAI
from pydantic import BaseModel

class Person(BaseModel):
"""Personal information"""
name: str


model = ChatOpenAI()
model = model.with_structured_output(Person)

model.invoke('Bob is a person.')
API 参考:ChatOpenAI

2. LangChain 模型的子类化

因为 LangChain 在内部使用 Pydantic v1,所以如果要对 LangChain 模型进行子类化,则应使用 Pydantic v1 原语。

示例 1:通过继承扩展

from pydantic.v1 import validator
from langchain_core.tools import BaseTool

class CustomTool(BaseTool): # BaseTool is v1 code
x: int = Field(default=1)

def _run(*args, **kwargs):
return "hello"

@validator('x') # v1 code
@classmethod
def validate_x(cls, x: int) -> int:
return 1


CustomTool(
name='custom_tool',
description="hello",
x=1,
)
API 参考:BaseTool

混合使用 Pydantic v2 原语和 Pydantic v1 原语可能会引发难以理解的错误。

from pydantic import Field, field_validator # pydantic v2
from langchain_core.tools import BaseTool

class CustomTool(BaseTool): # BaseTool is v1 code
x: int = Field(default=1)

def _run(*args, **kwargs):
return "hello"

@field_validator('x') # v2 code
@classmethod
def validate_x(cls, x: int) -> int:
return 1


CustomTool(
name='custom_tool',
description="hello",
x=1,
)
API 参考:BaseTool

3. 禁用 Pydantic v2 模型内部使用的 LangChain 对象的运行时验证

例如,

from typing import Annotated

from langchain_openai import ChatOpenAI # <-- ChatOpenAI uses pydantic v1
from pydantic import BaseModel, SkipValidation


class Foo(BaseModel): # <-- BaseModel is from Pydantic v2
model: Annotated[ChatOpenAI, SkipValidation()]

Foo(model=ChatOpenAI(api_key="hello"))
API 参考:ChatOpenAI

4:如果运行 Pydantic 2,LangServe 无法生成 OpenAPI 文档

如果您使用的是 Pydantic 2,则无法使用 LangServe 生成 OpenAPI 文档。

如果您需要 OpenAPI 文档,可以选择安装 Pydantic 1

pip install pydantic==1.10.17

或者使用 LangChain 中的APIHandler对象手动创建 API 路由。

参见:https://python.langchain.ac.cn/v0.2/docs/langserve/#pydantic


此页面是否有帮助?


您也可以留下详细的反馈 在 GitHub 上.