导入langchain.text_splitter时触发Pydantic @root_validator错误求助
LangChain导入触发PydanticUserError的解决方法
问题场景
在MacOS 13.4.1系统的VSCode中运行LangChain相关Python代码时,导入langchain模块触发PydanticUserError,错误提示明确要求:使用默认pre=False的@root_validator必须指定skip_on_failure=True,且该装饰器已废弃,需替换为@model_validator。
运行代码如下:
from dotenv import load_dotenv import os import streamlit as st from PyPDF2 import PdfReader from langchain.text_splitter import CharacterTextSplitter def main(): load_dotenv() # print(os.getenv("OPENAI_API_KEY")) st.set_page_config(page_title="Select the Data PDF") st.header("Load your PDF below: ⚡︎") pdf = st.file_uploader("Upload your PDF", type="pdf") if pdf is not None: pdf_reader = PdfReader(pdf) # the PdfReader reads in chunks of one page each text = "" for page in pdf_reader.pages: text += page.extract_text() st.write(text) # split text into chunks (inside outer if not None) # the CharacterTextSplitter class has properties that need to be set... # so pass in property parameters to the class inititializer text_splitter = CharacterTextSplitter( separator="\n", chunk_size=1000, chunk_overlap=200, length_function=len #python's basic length function ) chunks = text_splitter.split_text(text) st.write(chunks) if __name__ == '__main__' : main()
错误栈信息:
PydanticUserError: If you use `@root_validator` with pre=False (the default) you MUST specify `skip_on_failure=True`. Note that `@root_validator` is deprecated and should be replaced with `@model_validator`. For further information visit https://errors.pydantic.dev/2.0/u/root-validator-pre-skip Traceback: File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 552, in _run_script exec(code, module.__dict__) File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/app.py", line 6, in <module> from langchain.embeddings import ImportError File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/langchain/__init__.py", line 8, in <module> from langchain.agents import MRKLChain, ReActChain, SelfAskWithSearchChain File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/langchain/agents/__init__.py", line 2, in <module> from langchain.agents.agent import Agent File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/langchain/agents/agent.py", line 11, in <module> from langchain.chains.llm import LLMChain File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/langchain/chains/__init__.py", line 2, in <module> from langchain.chains.conversation.base import ConversationChain File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/langchain/chains/conversation/base.py", line 7, in <module> from langchain.chains.conversation.memory import ConversationBufferMemory File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/langchain/chains/conversation/memory.py", line 7, in <module> from langchain.chains.conversation.prompt import SUMMARY_PROMPT File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/langchain/chains/conversation/prompt.py", line 2, in <module> from langchain.prompts.prompt import PromptTemplate File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/langchain/prompts/__init__.py", line 2, in <module> from langchain.prompts.base import BasePromptTemplate File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/langchain/prompts/base.py", line 35, in <module> class BasePromptTemplate(BaseModel, ABC): File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/langchain/prompts/base.py", line 41, in BasePromptTemplate @root_validator() File "/Users/jamesallison/Desktop/Python Apps Temp/LangchainPDF/.venv/lib/python3.8/site-packages/pydantic/deprecated/class_validators.py", line 228, in root_validator raise PydanticUserError(
问题原因
核心原因是LangChain版本与Pydantic版本不兼容:旧版LangChain依赖Pydantic 1.x的@root_validator装饰器,而Pydantic 2.x对该装饰器的使用规则做了强制修改,且标记其为废弃,要求使用新的@model_validator装饰器。
修复方法
方法1:降级Pydantic到1.x兼容版本
激活虚拟环境后执行:
pip install pydantic==1.10.12
此方法无需修改代码,直接让依赖版本匹配,快速解决问题。
方法2:升级LangChain到适配Pydantic 2.x的版本
若想保留Pydantic 2.x,可升级LangChain至最新稳定版:
pip install --upgrade langchain
新版LangChain已全面适配Pydantic 2.x的API,替换了所有旧的@root_validator调用。
额外代码修正
注意代码第6行的from langchain.embeddings import ImportError是错误语句,既未用到该模块,写法也不正确,需删除该行,否则会触发额外的导入错误。
内容的提问来源于stack exchange,提问作者user1974376
相关产品推荐
相关产品推荐

