# 巧用LangChain:应对不同Pydantic版本的实用指南
## 引言
随着Pydantic v2的发布,许多开发者在使用LangChain时可能会遇到版本兼容性的问题。LangChain计划在不久的将来全面迁移至Pydantic v2,并停止对v1的支持。本文旨在帮助您理解如何在过渡期间有效使用LangChain,并分享如何解决遇到的常见问题。
## 主要内容
### LangChain与Pydantic版本的兼容性
LangChain已更新大部分API,以支持Pydantic v1和v2对象。对于使用LangChain工具的大多数API,您可以使用Pydantic v1或v2对象。然而,由于LangChain内部仍然使用Pydantic v1,因此建议暂时继续使用v1对象,直到LangChain 0.3版本发布。
### 如何传递Pydantic对象给LangChain API
- Pydantic v1对象:如果安装了pydantic 1,则使用`pydantic.BaseModel`或`pydantic.v1.BaseModel`进行子类化。
- Pydantic v2对象:如果安装了pydantic 2,则直接使用`pydantic.BaseModel`进行子类化。
### API支持情况
| API | Pydantic 1 | Pydantic 2 |
|--------------------------------------|------------|------------|
| BaseChatModel.bind_tools | Yes | Yes |
| BaseChatModel.with_structured_output | Yes | Yes |
| Tool.from_function | Yes | Yes |
| StructuredTool.from_function | Yes | Yes |
### 合作包支持情况
| 包名称 | Pydantic v1 | Pydantic v2 |
|-----------------------|-------------|--------------|
| langchain-mistralai | Yes | >=0.1.11 |
| langchain-anthropic | Yes | >=0.1.21 |
| langchain-robocorp | Yes | >=0.0.10 |
| langchain-openai | Yes | >=0.1.19 |
| langchain-fireworks | Yes | >=0.1.5 |
| langchain-aws | Yes | >=0.1.15 |
## 代码示例
以下示例展示如何在不同版本的LangChain和Pydantic组合使用中传递Pydantic对象:
```python
from langchain_openai import ChatOpenAI
from pydantic.v1 import BaseModel # 使用v1命名空间
class Person(BaseModel):
"""个人信息"""
name: str
model = ChatOpenAI()
model = model.with_structured_output(Person)
model.invoke('Bob is a person.')
from langchain_openai import ChatOpenAI
from pydantic import BaseModel # 使用v2命名空间
class Person(BaseModel):
"""个人信息"""
name: str
model = ChatOpenAI()
model = model.with_structured_output(Person)
model.invoke('Bob is a person.')
常见问题和解决方案
混合使用Pydantic v1和v2对象
避免混合使用Pydantic v1和v2对象,因为这可能会导致难以调试的错误。确保在继承LangChain模型时使用Pydantic v1基本模型。
禁用运行时验证
如果在Pydantic v2模型中使用LangChain对象,考虑禁用这些对象的运行时验证:
from typing import Annotated
from langchain_openai import ChatOpenAI # ChatOpenAI使用pydantic v1
from pydantic import BaseModel, SkipValidation
class Foo(BaseModel): # BaseModel来自Pydantic v2
model: Annotated[ChatOpenAI, SkipValidation()]
Foo(model=ChatOpenAI(api_key="hello"))
生成OpenAPI文档问题
在Pydantic 2下,LangServe无法生成OpenAPI文档。您可以安装Pydantic 1或使用APIHandler对象手动创建API路由。
总结和进一步学习资源
通过适应Pydantic版本的变化,开发者可以继续享受LangChain带来的便利和强大功能。更多信息和更新,建议访问官方文档。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---