Langchain PydanticOutputParser意外字符串验证错误排查求助
PydanticOutputParser与with_structured_output配合报错的原因及解决方案
你遇到的报错核心原因是**with_structured_output和PydanticOutputParser的使用场景冲突**:
with_structured_output(TestSummary)会让ChatOpenAI直接返回字典格式的结构化输出,不需要额外解析PydanticOutputParser的作用是将LLM输出的字符串格式内容(比如带格式的JSON字符串)解析为Pydantic模型,它期望输入是字符串,但实际收到的是字典,因此触发类型验证错误。
方案一:直接用with_structured_output获取Pydantic模型
with_structured_output默认返回字典,只需将字典转换为Pydantic实例即可:
from langchain.prompts import PromptTemplate from langchain_openai import ChatOpenAI from uuid import uuid4 from pydantic import BaseModel, Field class TestSummary(BaseModel): """Represents a summary of the concept""" id: str = Field(default_factory=lambda: str(uuid4()), description="Unique identifier") summary: str = Field(description="Succinct summary") llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0).with_structured_output(TestSummary) prompt = PromptTemplate( template="You are an AI summarizing long texts. TEXT: {stmt}", input_variables=["stmt"] ) runnable = prompt | llm # 先获取字典结果 result_dict = runnable.invoke({"stmt": "This is a really long piece of literature I'm too lazy to read"}) # 转换为Pydantic模型实例 result = TestSummary(**result_dict) print(type(result)) # 输出:<class '__main__.TestSummary'>
方案二:使用PydanticOutputParser(不依赖with_structured_output)
如果要使用PydanticOutputParser,需要去掉with_structured_output,并在提示词中加入解析器要求的格式说明,让LLM输出符合要求的字符串:
from langchain.prompts import PromptTemplate from langchain_openai import ChatOpenAI from langchain.output_parsers import PydanticOutputParser from uuid import uuid4 from pydantic import BaseModel, Field class TestSummary(BaseModel): """Represents a summary of the concept""" id: str = Field(default_factory=lambda: str(uuid4()), description="Unique identifier") summary: str = Field(description="Succinct summary") parser = PydanticOutputParser(pydantic_object=TestSummary) # 提示词必须包含解析器的格式说明,确保LLM输出可被解析的内容 prompt = PromptTemplate( template="You are an AI summarizing long texts. TEXT: {stmt}\n{format_instructions}", input_variables=["stmt"], partial_variables={"format_instructions": parser.get_format_instructions()} ) llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) runnable = prompt | llm | parser result = runnable.invoke({"stmt": "This is a really long piece of literature I'm too lazy to read"}) print(type(result)) # 输出:<class '__main__.TestSummary'>
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

