使用PydanticOutputParser时遇BaseModel子类验证错误求助
问题解决:PydanticOutputParser初始化触发ValidationError
问题场景
使用Pydantic 2.5.3版本编写LangChain代码,自定义LineListOutputParser继承PydanticOutputParser,初始化时传入继承自BaseModel的LineList类,却触发ValidationError,提示“subclass of BaseModel expected”。
原代码
from langchain.chains import LLMChain from langchain.output_parsers import PydanticOutputParser from langchain.prompts import PromptTemplate from pydantic import BaseModel, Field query = "Do you offer vegetarian food?" class LineList(BaseModel): lines: list[str] = Field(description="Lines of text") class LineListOutputParser(PydanticOutputParser): def __init__(self) -> None: super().__init__(pydantic_object=LineList) def parse(self, text: str) -> list[str]: lines = text.strip().split("\n") return lines output_parser = LineListOutputParser() QUERY_PROMPT = PromptTemplate( input_variables=["question"], template="""You are an AI language model assistant. Your task is to generate five different versions of the given user question to retrieve relevant documents from a vector database. By generating multiple perspectives on the user question, your goal is to help the user overcome some of the limitations of the distance-based similarity search. Provide these alternative questions separated by newlines. Only provide the query, no numbering. Original question: {question}""", ) llm_chain = LLMChain(llm=llm, prompt=QUERY_PROMPT, output_parser=output_parser) queries = llm_chain.invoke(query)
错误堆栈
--------------------------------------------------------------------------- ValidationError Traceback (most recent call last) Cell In[93], line 20 16 lines = text.strip().split("\n") 17 return lines ---> 20 output_parser = LineListOutputParser() 22 QUERY_PROMPT = PromptTemplate( 23 input_variables=["question"], 24 template="""You are an AI language model assistant. Your task is to generate five (...) 29 Original question: {question}""", 30 ) 32 llm_chain = LLMChain(llm=llm, prompt=QUERY_PROMPT, output_parser=output_parser) Cell In[93], line 13, in LineListOutputParser.__init__(self) 12 def __init__(self) -> None: ---> 13 super().__init__(pydantic_object=LineList) File ~\anaconda3\Lib\site-packages\langchain_core\load\serializable.py:120, in Serializable.__init__(self, **kwargs) 119 def __init__(self, **kwargs: Any) -> None: --> 120 super().__init__(**kwargs) 121 self._lc_kwargs = kwargs File ~\anaconda3\Lib\site-packages\pydantic\v1\main.py:341, in BaseModel.__init__(__pydantic_self__, **data) 339 values, fields_set, validation_error = validate_model(__pydantic_self__.__class__, data) 340 if validation_error: --> 341 raise validation_error 342 try: 343 object_setattr(__pydantic_self__, '__dict__', values) ValidationError: 1 validation error for LineListOutputParser pydantic_object subclass of BaseModel expected (type=type_error.subclass; expected_class=BaseModel)
问题原因
LangChain的PydanticOutputParser底层依赖Pydantic v1的类型校验逻辑,而你使用的是Pydantic v2.x版本,两者的BaseModel类结构不兼容,导致校验时无法识别你定义的LineList是BaseModel的子类。
解决方案
方案1:改用Pydantic v2适配的输出解析器
LangChain针对Pydantic v2提供了PydanticOutputParserV2,修改代码如下:
from langchain.chains import LLMChain from langchain.output_parsers import PydanticOutputParserV2 # 替换为V2版本解析器 from langchain.prompts import PromptTemplate from pydantic import BaseModel, Field query = "Do you offer vegetarian food?" class LineList(BaseModel): lines: list[str] = Field(description="Lines of text") class LineListOutputParser(PydanticOutputParserV2): def __init__(self) -> None: super().__init__(pydantic_schema=LineList) # 参数名改为pydantic_schema def parse(self, text: str) -> list[str]: lines = text.strip().split("\n") return lines output_parser = LineListOutputParser() QUERY_PROMPT = PromptTemplate( input_variables=["question"], template="""You are an AI language model assistant. Your task is to generate five different versions of the given user question to retrieve relevant documents from a vector database. By generating multiple perspectives on the user question, your goal is to help the user overcome some of the limitations of the distance-based similarity search. Provide these alternative questions separated by newlines. Only provide the query, no numbering. Original question: {question}""", ) llm_chain = LLMChain(llm=llm, prompt=QUERY_PROMPT, output_parser=output_parser) queries = llm_chain.invoke(query)
方案2:降级Pydantic到v1版本
若不想修改代码结构,可将Pydantic降级至v1.x系列,执行以下命令:
pip install pydantic==1.10.13
注意:降级后需确保其他依赖库兼容Pydantic v1,避免版本冲突。
内容的提问来源于stack exchange,提问作者Nishant
相关产品推荐
相关产品推荐

