# 引言
在人工智能和编程的快速发展中,使用LangChain可以显著提高我们的开发效率。随着Pydantic 2的发布,LangChain也开始支持Pydantic 2的对象。然而,这次更新带来了许多重要变化,开发者需要特别注意。本文将探讨如何在不同版本的Pydantic中使用LangChain,并提供一些实用的代码示例。
# 主要内容
## Pydantic版本的变化
Pydantic 2引入了一些破坏性的更改,这影响了LangChain的API使用。对于LangChain用户来说,了解这些变化非常重要,因为Pydantic 1在2024年6月终止支持,而LangChain将在不久的将来迁移到Pydantic 2。
## LangChain API的兼容性
LangChain自0.0.267版本起,允许用户安装Pydantic V1或V2。尽管如此,内部依赖仍在使用Pydantic V1。开发者需要确保使用正确的版本以避免不兼容问题。
1. **工具绑定和输出结构化**:大多数LangChain的API已经更新以支持Pydantic v1和v2的对象。
2. **通过函数创建工具**:支持两种版本的对象。
3. **合作包**:如`langchain-openai`和`langchain-aws`等,已经更新以支持Pydantic v2。
## 子类化LangChain模型
由于LangChain仍在内部使用Pydantic v1,如果你要子类化LangChain的模型,建议使用Pydantic v1的原语,以避免混用导致的错误。
### 示例:正确的继承方式
```python
from pydantic.v1 import validator
from langchain_core.tools import BaseTool
class CustomTool(BaseTool):
x: int = Field(default=1)
def _run(*args, **kwargs):
return "hello"
@validator('x')
@classmethod
def validate_x(cls, x: int) -> int:
return 1
示例:错误的继承方式
from pydantic import Field, field_validator
from langchain_core.tools import BaseTool
class CustomTool(BaseTool):
x: int = Field(default=1)
def _run(*args, **kwargs):
return "hello"
@field_validator('x')
@classmethod
def validate_x(cls, x: int) -> int:
return 1
禁用运行时验证
对于在Pydantic v2模型内部使用的LangChain对象,可通过SkipValidation禁用运行时验证。
from typing import Annotated
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, SkipValidation
class Foo(BaseModel):
model: Annotated[ChatOpenAI, SkipValidation()]
Foo(model=ChatOpenAI(api_key="hello"))
LangServe与OpenAPI文档生成
使用Pydantic 2时,LangServe无法生成OpenAPI文档。你可以安装Pydantic 1或使用APIHandler手动创建API路由。
代码示例
在下列示例中,我们演示如何使用LangChain与不同版本的Pydantic对象。
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.')
常见问题和解决方案
- 混合使用Pydantic版本:确保API调用时使用一致的Pydantic版本。
- 运行时验证问题:如果遇到验证错误,考虑禁用验证。
总结和进一步学习资源
在使用LangChain时,理解Pydantic版本的兼容性至关重要。本文提供的示例和建议希望能帮助你顺利过渡到新的Pydantic 2环境。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---