在大模型(LLM)应用开发中,输出解析(Output Parsing)和结构化(Structuring)是将模型生成的“自由文本”转化为程序可处理的“可靠数据”的关键环节。这不仅仅是格式转换,更是可靠性工程。

为什么需要结构化?

大模型本质上是概率性的文本生成器,直接输出往往存在以下问题:

  • 格式不稳定:有时带 Markdown ( json ),有时不带;有时多一句“好的,这是结果…”。
  • 类型不安全:数字可能变成字符串,列表可能变成文本描述。
  • 逻辑幻觉:可能编造字段或遗漏关键信息。

结构化输出的目标

  • 确定性:保证输出永远符合预定义的 Schema(如 JSON Schema, Pydantic Model)。
  • 类型安全:直接在代码中获得 Typed Object(如 Python Class 实例)。
  • 可组合性:结构化数据可以直接作为下一个 LLM 调用或传统函数的输入。

三种结构化输出方式

1、with_structured_output:

最高级封装。自动选择最佳策略(通常是 bind_tools 或原生 JSON Mode),直接返回 Pydantic 对象。(首选推荐

from pydantic import BaseModel
from connect_llm import qw_llm

class User(BaseModel):
    name: str
    age: int

# 一行代码,自动处理所有底层细节
structured_llm = qw_llm.with_structured_output(User)

result = structured_llm.invoke("小明今年25岁")
# result 是 User 对象,不是字典,也不是字符串
print(result)

在这里插入图片描述

2、bind_tools:

底层原语。将 Pydantic 模型转换为“工具(Function/Tool)”定义绑定到模型上。模型会返回一个“工具调用请求”,你需要手动解析这个请求。(灵活控制)

from pydantic import Field, BaseModel

from connect_llm import qw_llm


class ResponseFormater(BaseModel):
    """
    返回结果结构类
    """
    answer: str = Field(description="对用户问题的回答")
    followup_question: str = Field(description="用户可能提出的后续问题")


runnable = qw_llm.bind_tools([ResponseFormater])
resp = runnable.invoke("细胞的动力源是什么?")
print(resp)

resp.pretty_print()

在这里插入图片描述

3、SimpleJsonOutputParser:

后处理解析。模型自由输出文本,解析器尝试用正则/JSON 库去“清洗”和“解析”文本。(兼容旧模型/兜底方案)

from langchain_core.output_parsers import SimpleJsonOutputParser
from langchain_core.prompts import ChatPromptTemplate

from connect_llm import qw_llm

prompt_template = ChatPromptTemplate.from_template(
    "{topic}"
    '你必须始终输出一个包含"answer"和"followup_question"键的 json 对象,其中"answer"代表:对用户问题的回答,"followup_question"代表:用户可能提出的后续问题'
)

chain = prompt_template | qw_llm | SimpleJsonOutputParser()
resp = chain.invoke({"topic": "细胞的动力源是什么?"})
print(resp)

在这里插入图片描述
完整项目源码:

更多推荐