核心概念 中级

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 更可靠的原因是?