引言
随着Pydantic v2的发布,LangChain即将结束对Pydantic v1的支持,计划在LangChain 0.3版本中迁移到Pydantic 2。同时,LangChain在目前的版本(>=0.0.267)允许用户安装Pydantic v1或v2。这篇文章将探讨如何在不同Pydantic版本下使用LangChain。
主要内容
1. 使用LangChain API
LangChain的大部分API已经更新,可以接受Pydantic v1或v2对象。然而,由于Pydantic不支持混用.v1和.v2对象,我们建议在LangChain 0.3发布前继续使用Pydantic v1对象。
API支持情况:
| API | Pydantic 1 | Pydantic 2 |
|---|---|---|
| BaseChatModel.bind_tools | Yes | langchain-core>=0.2.23 |
| BaseChatModel.with_structured_output | Yes | langchain-core>=0.2.23 |
合作包支持情况:
| 包名 | Pydantic 1 | Pydantic 2 |
|---|---|---|
| langchain-mistralai | Yes | >=0.1.11 |
2. 子类化LangChain模型
由于LangChain内部使用Pydantic v1,如果你正扩展LangChain模型,应该使用Pydantic v1的基础类。
示例
from pydantic.v1 import validator
from langchain_core.tools import BaseTool
class CustomTool(BaseTool):
x: int = 1
def _run(*args, **kwargs):
return "hello"
@validator('x')
@classmethod
def validate_x(cls, x: int) -> int:
return 1
3. 禁用Pydantic v2模型中的运行时验证
如果在Pydantic v2模型中使用LangChain对象,可以禁用运行时验证:
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"))
4. 使用LangServe生成OpenAPI文档
如果你使用Pydantic 2,将无法生成OpenAPI文档。你可以安装Pydantic 1或者手动使用APIHandler创建API路由。
代码示例
以下是如何在Pydantic v1和v2下使用LangChain的简单示例:
# 对于Pydantic version 1
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 version 2
from langchain_openai import ChatOpenAI
from pydantic import BaseModel
class Person(BaseModel):
name: str
model = ChatOpenAI()
model = model.with_structured_output(Person)
model.invoke('Bob is a person.')
常见问题和解决方案
- 混合使用v1和v2对象导致错误: 确保不混合使用Pydantic v1和v2对象。
- 在Pydantic 2下无法生成OpenAPI文档: 使用Pydantic 1或手动创建API路由。
总结和进一步学习资源
LangChain在Pydantic v1和v2的过渡期间提供了一定的灵活性,但开发者应注意避免混用不同版本的对象。等待LangChain 0.3发布将带来更简单的兼容性。
参考资料
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---