LangChain AI应用开发框架核心组件的使用 - 输出解析器组件的使用 : 输出解析器的三种解析方式 : 文本解析、结构化对象解析、JSON 解析

目录

一、输出解析器 (Output parsers)

概念

[与 with_structured_output() 的区别](#与 with_structured_output() 的区别)

二、解析文本输出

三、解析结构化对象输出

[pydantic 模型是什么?](#pydantic 模型是什么?)

[四、解析 JSON 输出](#四、解析 JSON 输出)


一、输出解析器 (Output parsers)

概念

负责获取模型的输出,并将输出转换为更结构化的格式。当使用 LLM 生成结构化数据或规范化聊天模型和 LLM 的输出时,这很有用。

大型语言模型(LLM)的输出本质上是非结构化的文本。但在构建应用程序时我们通常希望得到结构化的、机器可读的数据,这样可以将其转换为更适合下游任务的格式,比如:

  • JSON 对象
  • Python 字典或列表
  • 一个特定的 Pydantic 模型实例
  • 一个简单的布尔值或字符串枚举

**输出解析器的作用就是架起这座桥梁:它们将 LLM 的非结构化文本输出转换为结构化格式。**这使得与 LLM 的交互从 "模糊的文本对话" 变成了 "精确的数据 API 调用",是构建可靠、高效 LLM 应用不可或缺的组件。


与 with_structured_output() 的区别

它们都实现了相同的功能,但

  • 维度不同:输出解析器是 LangChain 中的一个功能性组件,with_structured_output() 是聊天模型的一个方法。

  • 用法不同:**输出解析器的工作流程可以是链式的,可以将 Prompt、LLM 和 Parser 像管道一样连接起来:**chain = prompt | llm | parser。而 with_structured_output(schema却不行,只能手动调用,返回一个新的、具备了结构化输出能力的 Runnable(可运行对象)。

可以根据自己的使用场景选择,如果想使用链式就选择输出解析器。

  1. 输出解析器 OutputParsers 属于独立组件,可以参与 LCEL 管道链式拼接,写法prompt | llm | parser。大模型原始文本输出交给解析器,解析器完成文本到字典 / Pydantic 对象的转换。它和模型本身解耦,可以灵活替换不同解析器。

  2. with_structured_output() 是 ChatModel 聊天模型自带的方法,调用后直接返回一个全新 Runnable 对象,不能再继续拼接 parser 组件,结构化逻辑封装在模型内部。底层会直接告诉大模型按照指定 schema 输出,在模型侧就约束返回格式。

两者最终目标一样:拿到机器可读结构化数据。区别在于组件层级和是否支持管道链式编排。

二、解析文本输出

其实对于使用 StrOutputParser 输出解析器输出文本,我们已经使用过多次了。对于StrOutputParser,它也实现了标准的 Runnable 接口。示例如下:

代码讲解:

  1. 导入 ChatOpenAI 聊天模型、StrOutputParser 字符串输出解析器。
  2. 实例化大模型对象 model。
  3. 使用 LCEL 管道运算符|构建链,model | StrOutputParser(),模型输出的 AIMessage 对象直接交给字符串解析器。
  4. 使用 chain.stream() 开启流式调用,迭代返回每一块文本分片 chunk。
  5. print 设置end="|",每返回一块分片就打印内容,并且用竖线 | 标记分片边界,可以直观看到流式分片情况。

输出如下:

  1. 每一个 | 代表一次流式返回的数据块。
  2. StrOutputParser 作用:自动提取 AIMessage 内部 content 字段,直接输出字符串,不用手动写 res.content 去拿文本。若是不使用输出解析器,而是直接得到聊天模型返回的 AIMessage,文本内容则需要从消息中的 content字 段获取。

三、解析结构化对象输出

要输出结构化对象,需要用到的输出解析器是 PydanticOutputParser。

类:langchain_core.output_parsers.pydantic.PydanticOutputParser

pydantic 模型是什么?

Pydantic 就是 Python 的一个数据校验工具库。Pydantic 模型就是我们自己定义的一个数据模板、一张格式表单

举个生活例子,好比一张登记表,规定好:姓名必须是字符串、年龄必须是整数、手机号不能是空。别人填过来的表单就必须按照这张表的规则来。

放到代码里,我们写一个继承 BaseModel 的类,这就是一个 Pydantic 模型。

它能干两件核心事:

第一件:规定字段和类型,告诉程序我们要的数据必须有哪些字段,每个字段是什么类型,name 是文字,age 是数字,不能乱。

第二件:自动校验 + 转换。拿到一段 JSON 字符串自动转成 Python 对象;如果大模型返回的数据乱了,比如 age 传了文字,不是数字,它直接抛报错,帮你拦住非法数据。

放到 LangChain 的PydanticOutputParser场景里 : 我们写好这个 Pydantic 模型就等于告诉大模型:输出结果就严格按照我这个表单的字段来输出 JSON。 解析器还会调用get_format_instructions() 自动生成提示词塞给大模型。等大模型返回 JSON 文本后解析器就拿这个 Pydantic 模型去校验,直接给你返回一个已经实例化好的对象。

参数如下:

  • pydantic_object:要解析的 pydantic 模型。

内置方法:

  • invoke():将单个输入转换为输出。
  • get_format_instructions() -> str:重要!!
    • 作用:生成一个指令字符串,这个字符串会被添加到发送给 LLM 的提示 (Prompt) 的末尾。
    • 目的:告诉 LLM 应该以什么样的格式返回它的响应。例如,"请将你的回复封装在 XML 标签中" 或 "请以 JSON 格式输出,包含 'name' 和 'age' 两个字段"。

补充说明 : get_format_instructions() 会自动生成格式提示词,不用手写一大段 JSON 格式要求,直接拼接到 prompt 里发给大模型;模型输出 JSON 字符串后,invoke 方法自动把 json 文本解析、校验,返回 Pydantic 类实例对象。

代码示例如下:

代码讲解:

  1. 导入相关包:聊天模型 ChatOpenAI、PydanticOutputParser 结构化输出解析器、PromptTemplate 提示模板;导入Optional可选类型;从 pydantic 导入 BaseModel、Field。
  2. 实例化聊天大模型 model。
  3. 定义 Pydantic 模型 Joke,继承 BaseModel:
    • setup:字符串,笑话开头;
    • punchline:字符串,笑话包袱 / 妙语;
    • rating:Optionalint 代表整数、可以为空,不强制返回评分;
    • Field(description="xxx") 写字段描述,会给到大模型,告诉模型每个字段代表什么含义。
  4. 创建 PydanticOutputParser 解析器,参数 pydantic_object=Joke,绑定刚才定义好的数据模板。
  5. 构建 PromptTemplate 提示模板:模板里面预留 {format_instructions} 占位符。
  6. partial_variables 传入 format_instructions,调用 parser.get_format_instructions() 自动生成格式约束提示词,不需要自己手写 JSON 格式要求,会自动拼进 prompt 发给 LLM。
  7. 使用 LCEL 管道 prompt | model | parser 串联完整链路:组装提示词→调用大模型→解析模型返回 JSON 文本,输出 Joke 对象。
  8. 使用 chain.stream() 流式执行链,传入用户 query;循环迭代每一块 chunk,打印,用|标记流式分片边界。

结果如下:

  • 这里是结构化流式输出,每一个 | 代表一次流式返回分片。

可以观察到对象字段是逐步填充的:一开始 punchline 为空字符串,随着流返回不断拼接内容,最终完整填充;rating 是可选字段,模型没有输出,保持 None。
**注意:**旧版本 LangChain 对 PydanticOutputParser 的 stream 支持有限,它是一边接收模型返回的 JSON 流,一边逐步实例化 Pydantic 对象。最终完整结束后拿到完整 Joke 实例,可以直接访问 .setup、.punchline 属性,不用手动解析 json。
面试小要点:get_format_instructions() 会自动生成格式指令放到 prompt,告诉模型输出符合 pydantic 模板的 JSON;partial_variables 作用是预填充模板变量,调用 invoke 的时候不用重复传 format_instructions。

四、解析 JSON 输出

要输出 JSON 格式,需要用到的输出解析器是 JsonOutputParser。

类:langchain_core.output_parsers.json.JsonOutputParser 参数如下:

  • pydantic_object:用于验证的 Pydantic 对象。如果为空,则不执行任何验证。

内置方法:

  • invoke():将单个输入转换为输出。
  • get_format_instructions() -> str:重要!!
    • 作用:生成一个指令字符串,这个字符串会被添加到发送给 LLM 的提示(Prompt)的末尾。
    • 目的:告诉 LLM 应该以什么样的格式返回它的响应。例如,"请将你的回复封装在 XML 标签中" 或 "请以 JSON 格式输出,包含 'name' 和 'age' 两个字段"。

代码示例如下,这将提示模型返回 JSON:

代码讲解:

  1. 导入聊天模型、JsonOutputParserJSON 输出解析器、提示模板。
  2. 实例化大模型对象。
  3. 创建 JsonOutputParser(),不传 pydantic_object,只做基础 JSON 字符串转 Python 字典,不做字段校验。
  4. 构建提示模板,通过 partial_variables 预填充 format_instructions,解析器自动生成 JSON 格式约束提示词。
  5. LCEL 管道串联:prompt | model | parser,模型输出 JSON 文本,解析器自动转为 Python 字典。
  6. invoke执行链,打印最终字典结果。

结果如下:

返回普通 Python 字典,没有 Pydantic 对象,只保证返回合法 JSON;不校验字段名、字段类型,模型返回什么键就拿到什么键。

也可以使用带 Pydantic 情况下的 JsonOutputParser,如下所示:

代码讲解:

  1. 定义 Pydantic 模板 Joke,规定笑话各个字段、字段描述。
  2. JsonOutputParser(pydantic_object=Joke) 传入 pydantic 模型,不仅转 JSON 字典,还会用 Pydantic 做字段、类型校验。
  3. 其余模板、LCEL 链式写法和上面保持一致。
  4. invoke 执行,返回 Python 字典;如果模型返回 json 字段不对、类型错误,直接抛出校验异常。

结果如下:

返回 Python 字典,字段严格匹配 Joke 模板;rating是可选字段,模型未输出,取值 None。

区分记忆:

  • PydanticOutputParser:输出 Pydantic 类实例对象,可以 obj.setup 访问属性。
  • JsonOutputParser:输出 Python 字典;传 pydantic_object 时做校验,不传只解析合法 JSON。

除了上面讲的文本、对象、JSON 解析器,其实 LangChain 官方还提供了更多类型的解析器,如:

  • XML 解析器:XMLOutputParser
  • Yaml 解析器:YamlOutputParser
  • CSV 解析器:CommaSeparatedListOutputParser
  • 枚举解析器:EnumOutputParser
  • 日期解析器:DatetimeOutputParser等等,更多类型参考官方文档。

除此之外,LangChain 还支持自定义输出解析器,以将模型输出结构化为自定义格式。

相关推荐
梦影_2 小时前
Langchain简单快速上手教程(五)——聊天模型之流式传输
java·数据库·人工智能·python·langchain
小叶肥辉3 小时前
LangChain链和LangGraph图的学习笔记【六】——提示语模板(3)——Few-Shot Prompting(少样本提示) 模板类
笔记·python·学习·langchain·prompt·aigc
hyunbar7 小时前
LangChain 实战:玩转短期记忆
langchain·agent·harness
带鱼吃猫17 小时前
LangGraph入门:搭建智能快递配送系统AI工作流
人工智能·langchain
小叶肥辉18 小时前
LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型
笔记·python·langchain
OKkankan20 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
Cx330❀1 天前
【Linux网络】网络层 IP 协议:从网段划分到内核源码解析
大数据·linux·服务器·网络·tcp/ip·性能优化·langchain
王国强20091 天前
Deep Agents vs LangChain vs LangGraph
langchain
Boop_wu1 天前
[LangGraph]工作流常见模式
langchain