巧用LangChain:应对不同Pydantic版本的实用指南

229 阅读2分钟
# 巧用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---