# 引言
Pydantic v2 于2023年6月发布,为开发者提供了一些重要的功能增强和改进。然而,随着这些变化的到来,这也意味着我们需要适应一些破坏性变化。LangChain,即一个用于构建AI应用的强大工具链,也在逐步过渡到支持Pydantic v2。本文将为您介绍如何在使用LangChain时,高效地管理和应用不同版本的Pydantic。
# 主要内容
## 1. LangChain对Pydantic版本的兼容性
LangChain自版本0.0.267起,支持用户安装Pydantic v1或v2。然而,由于Pydantic不支持同时混用 `.v1` 和 `.v2` 对象,因此用户需要特别关注与LangChain API的兼容性。
### 1.1 API支持情况
大多数LangChain的API都已更新以支持Pydantic v1或v2对象。以下是一些可以接受这两种版本对象的API示例:
- `BaseChatModel.bind_tools`
- `BaseChatModel.with_structured_output`
- `Tool.from_function`
- `StructuredTool.from_function`
### 1.2 合作伙伴包支持
多个LangChain合作伙伴包也更新以支持Pydantic v2对象,例如:
- langchain-mistralai
- langchain-anthropic
- langchain-openai
## 2. 使用Pydantic对象
在Pydantic v2和LangChain更好兼容之前,建议开发者继续使用Pydantic v1对象以避免不必要的错误。
### 2.1 使用Pydantic对象的示例
以下示例展示了在不同版本的LangChain中,如何使用Pydantic对象:
```python
# 请注意,这里使用了v1的命名空间
from langchain_openai import ChatOpenAI
from pydantic.v1 import BaseModel # 使用 API 代理服务提高访问稳定性
class Person(BaseModel):
"""个人信息"""
name: str
model = ChatOpenAI()
model = model.with_structured_output(Person)
model.invoke('Bob is a person.')
在LangChain版本>=0.2.23后,您可以选择使用Pydantic v1或v2对象。
3. 子类化LangChain模型
由于LangChain内部继续使用Pydantic v1,因此子类化LangChain模型时,您应使用Pydantic v1的原语。
from pydantic.v1 import validator
from langchain_core.tools import BaseTool
class CustomTool(BaseTool): # BaseTool是v1代码
x: int = Field(default=1)
def _run(*args, **kwargs):
return "hello"
@validator('x') # v1代码
@classmethod
def validate_x(cls, x: int) -> int:
return 1
CustomTool(
name='custom_tool',
description="hello",
x=1,
)
常见问题和解决方案
1. 禁用运行时验证
在Pydantic v2模型中使用LangChain对象时,您可以通过 SkipValidation 来禁用运行时验证。
from typing import Annotated
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, SkipValidation
class Foo(BaseModel): # BaseModel是来自Pydantic v2
model: Annotated[ChatOpenAI, SkipValidation()]
Foo(model=ChatOpenAI(api_key="hello"))
2. LangServe的OpenAPI文档生成问题
如果您希望使用LangServe生成OpenAPI文档而又在使用Pydantic 2,可以考虑安装Pydantic 1或手动创建API路由。
总结和进一步学习资源
适应不同版本的Pydantic与LangChain的兼容性需要一定的努力,但通过本文提供的指南和示例,您应该能够更轻松地过渡并应用这些工具。有关进一步学习的资源,请参考:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---