从langchain_openai导入OpenAIEmbeddings时遇PydanticUserError求助
问题:导入
OpenAIEmbeddings时的Pydantic兼容错误 问题描述
我在尝试从langchain_openai导入OpenAIEmbeddings时遇到错误,使用的导入语句为:
from langchain_openai import OpenAIEmbeddings
运行代码后出现如下错误:
PydanticUserError: The `__modify_schema__` method is not supported in Pydantic v2. Use `__get_pydantic_json_schema__` instead in class `SecretStr`.
环境信息
- 操作系统:Windows 11
- Python版本:3.12.2
相关依赖版本
langchain 0.2.5 langchain-anthropic 0.3.0 langchain-community 0.2.50 langchain-core 0.3.26 langchain-openai 0.2.12 langchain-text-splitters 0.2.1 langdetect 1.0.9 langgraph 0.2.53 langgraph-checkpoint 2.0.8 langgraph-sdk 0.1.40 langsmith 0.1.147 pydantic 2.9.2 pydantic_core 2.23.4
已尝试的解决方法
- 版本调整:将
pydantic降级至1.10.17、2.0、2.9.2,均未解决问题; - 检查依赖冲突:排查
pydantic与langchain系列包的版本匹配问题,未发现明确冲突; - 查阅文档:了解到Pydantic v2不再支持
__modify_schema__,需改用__get_pydantic_json_schema__,但不清楚如何在langchain_openai中适配。
疑问
- 这是
langchain_openai与pydantic v2.x的已知兼容问题吗? - 我是否需要进一步降级Pydantic或更换
langchain_openai版本? - 是否有特定补丁或临时解决方案可解决该问题?
解答
1. 是否为已知兼容问题?
是,这是langchain_openai与Pydantic v2.x之间的典型兼容问题。根源在于部分依赖包(包括langchain内部组件或其依赖的第三方包)仍在使用Pydantic v1的__modify_schema__方法,而Pydantic v2已移除该方法并替换为__get_pydantic_json_schema__。你的报错中SecretStr类触发了问题,说明该类的定义仍依赖旧的Pydantic v1语法。
2. 是否需要调整版本?
不需要盲目降级Pydantic,更推荐升级langchain-openai和langchain-core到最新兼容版本。你当前使用的langchain-openai 0.2.12和langchain-core 0.3.26存在未修复的Pydantic v2适配问题,建议升级到langchain-openai >= 0.3.0和langchain-core >= 0.4.0版本,这些版本已针对Pydantic v2做了全面适配。
如果升级后仍有异常,可以尝试将Pydantic固定在2.8.2版本,这个版本与多数langchain生态包的兼容性更稳定。
3. 临时解决方案
如果暂时无法升级依赖,可以尝试以下临时修复:
- 手动替换
SecretStr的兼容方法:在导入OpenAIEmbeddings之前,覆盖SecretStr的方法以适配Pydantic v2,示例代码:
from pydantic import SecretStr def __get_pydantic_json_schema__(cls, schema, handler): schema = handler(schema) schema["format"] = "password" return schema SecretStr.__get_pydantic_json_schema__ = classmethod(__get_pydantic_json_schema__) # 之后再执行导入 from langchain_openai import OpenAIEmbeddings
- 启用Pydantic v1兼容模式:在代码开头添加配置,强制Pydantic以兼容模式运行:
import pydantic # 开启v1兼容模式 pydantic.config.ConfigDict.from_attributes = True # 或者直接使用v1版本的SecretStr替换 from pydantic.v1 import SecretStr as V1SecretStr # 若代码中涉及SecretStr的引用,可替换为V1SecretStr
内容的提问来源于stack exchange,提问作者Daniyal Khan
相关产品推荐
相关产品推荐

