如何在不同版本的Pydantic中使用LangChain:实用指南

168 阅读3分钟
# 如何在不同版本的Pydantic中使用LangChain:实用指南

## 引言

对于Python开发者来说,LangChain和Pydantic都是强大的工具。然而,随着Pydantic v2的发布以及LangChain计划逐步放弃对Pydantic v1的支持,开发者们在项目中要如何处理这些变化成为了一个重要的话题。本篇文章将深入讨论在不同Pydantic版本中如何有效使用LangChain,并提供实用的代码示例和解决方案。

## 主要内容

### Pydantic版本的重大变化

Pydantic v2于2023年6月发布,引入了一系列断裂性更改。据Pydantic团队提供的[迁移指南](https://docs.pydantic.dev/2.0/migration/),开发者需要对现有代码进行更新以适应新版本。LangChain也计划在其主要版本0.3.x中全面支持Pydantic v2。了解这些变化对于开发者在下一个版本中平稳迁移非常关键。

### LangChain与Pydantic的兼容性

在LangChain的版本>=0.0.267中,用户可以选择安装Pydantic v1或v2。虽然内部使用了Pydantic v1,但一些API已经更新为支持Pydantic v2对象(如`bind_tools``with_structured_output`)。建议在LangChain 0.3发布前继续使用Pydantic v1对象以减少兼容性问题。

### 如何处理Pydantic对象

在使用LangChain的API时,多数工具使用API已经更新为接受Pydantic v1或v2对象。例如,`ChatOpenAI`模型现在支持接收任意一个版本的Pydantic对象:

```python
from langchain_openai import ChatOpenAI
from pydantic import BaseModel

class Person(BaseModel):
    """Personal information"""
    name: str
    
model = ChatOpenAI()
model = model.with_structured_output(Person)

model.invoke('Bob is a person.')  # 使用API代理服务提高访问稳定性

如何进行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(self, *args, **kwargs):
        return "hello"

    @validator('x')
    @classmethod
    def validate_x(cls, x: int) -> int:
        return 1

CustomTool(name='custom_tool', description="hello", x=1)

尝试在Pydantic v1代码中混用Pydantic v2的特性将导致复杂的错误。

常见问题和解决方案

不能生成OpenAPI文档

如果你使用Pydantic 2,将不能通过LangServe生成OpenAPI文档。此时可以选择安装Pydantic 1或使用LangChain的APIHandler手动创建API路由。

嵌套Pydantic模型的验证问题

在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"))

总结和进一步学习资源

了解如何在不同Pydantic版本中使用LangChain对于开发者的日常工作至关重要。建议深入阅读Pydantic的迁移指南LangChain的官方文档,以便能更好地处理版本变更带来的差异。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---