Output Parsers:结构化输出
把模型的自由文本变成 JSON、Pydantic 对象等结构化数据,掌握 JsonOutputParser 与 with_structured_output。
为什么需要解析器
应用代码无法直接消费一段自然语言。Output Parser 负责"文本 → 结构":
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from pydantic import BaseModel, Field
class Book(BaseModel):
title: str = Field(description="书名")
author: str = Field(description="作者")
year: int = Field(description="出版年份")
parser = JsonOutputParser(pydantic_object=Book)
prompt = ChatPromptTemplate.from_messages([
("system", "提取图书信息,输出 JSON。{format_instructions}"),
("human", "{text}"),
]).partial(format_instructions=parser.get_format_instructions())
chain = prompt | llm | parser
result = chain.invoke({"text": "《三体》是刘慈欣 2008 年出版的科幻小说"})
print(result) # {'title': '三体', 'author': '刘慈欣', 'year': 2008}
推荐做法:with_structured_output
现代模型支持"工具调用式"的结构化输出,比纯提示词更可靠:
structured_llm = llm.with_structured_output(Book)
book: Book = structured_llm.invoke("介绍一下《三体》")
print(book.title, book.author)
解析失败怎么办
- 使用
OutputFixingParser:解析失败时把错误喂回模型自动修复; - 提示词中明确"只输出 JSON,不要附加任何解释";
- temperature 设为 0。
📝 课后练习
quiz-1 相比纯提示词约束,with_structured_output 更可靠的原因是?