如何在不同版本的Pydantic中使用LangChain:从v1到v2的迁移指南

279 阅读3分钟
# 引言

在人工智能和编程的快速发展中,使用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---