You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:14:53