
草莓熊Lotso个人主页❄️个人专栏:《C知识分享》 《Linux 入门到实践零基础也能懂》✨生活是默默的坚持毅力是永久的享受 博主简介文章目录前言一. 输出解析器核心概念1.1 什么是输出解析器1.2 与 with_structured_output() 的关键区别二. 常用输出解析器实战2.1 StrOutputParser解析文本输出2.2 PydanticOutputParser解析为结构化对象2.3 JsonOutputParser解析为 JSON 格式三. 核心考点与最佳实践3.1 核心考点总结3.2 最佳实践结尾前言在构建大语言模型LLM应用时我们经常会遇到一个核心矛盾大模型最擅长生成自然流畅的文本但程序只能处理结构化的数据。想象一下这个场景你正在开发一个天气查询应用用户问 “北京今天天气怎么样”大模型返回了一段非常友好的回答“北京今天晴转多云最高气温 28℃最低气温 18℃风力 3 级适合外出活动。” 如果没有输出解析器你只能用正则表达式或者字符串匹配来提取这些字段不仅代码复杂易出错而且大模型输出格式稍有变化就会导致程序崩溃。LangChain 的输出解析器Output Parsers正是为了解决这个问题而生的。它提供了一套标准化的接口能够将大模型的非结构化文本输出自动转换为 JSON、Pydantic 对象、列表等机器可读的格式是连接大模型和业务系统的关键桥梁。一. 输出解析器核心概念1.1 什么是输出解析器输出解析器是 LangChain 中的一个功能性组件负责接收大模型的输出通常是AIMessage对象并将其转换为更结构化、更适合下游任务处理的格式。它的核心价值在于标准化提供统一的接口处理不同模型的输出可靠性通过格式指令和类型验证确保输出符合预期易用性无需手动编写复杂的字符串解析代码可扩展性支持自定义解析器满足各种特殊需求1.2 与 with_structured_output() 的关键区别很多初学者会混淆输出解析器和聊天模型的with_structured_output()方法它们虽然都能实现结构化输出但有本质区别维度输出解析器Output Parserswith_structured_output()本质LangChain 的功能性组件聊天模型的内置方法用法支持链式调用promptmodelparser返回一个新的 Runnable 对象灵活性更高可以组合多个解析器相对固定只能返回指定结构适用场景需要复杂的输出处理流程简单的结构化输出需求简单来说如果你想使用 LCELLangChain 表达式语言构建链式流程优先使用输出解析器如果你只是想让模型直接返回结构化对象可以使用**with_structured_output()**。二. 常用输出解析器实战LangChain 提供了多种内置的输出解析器覆盖了绝大多数常见的结构化输出场景。下面我们逐一讲解最常用的三种。2.1 StrOutputParser解析文本输出StrOutputParser是最简单也是最常用的输出解析器它的作用非常纯粹从**AIMessage对象中提取content**字段返回纯文本字符串。虽然看起来简单但它是几乎所有 LangChain 链的标配因为大模型的原始输出是AIMessage对象而我们通常只需要其中的文本内容。完整代码示例fromlangchain_openaiimportChatOpenAIfromlangchain_core.output_parsersimportStrOutputParser# 1. 初始化大模型modelChatOpenAI(modelgpt-4o-mini)# 2. 定义输出解析器parserStrOutputParser()# 3. 构建链模型 - 解析器chainmodel|parser# 4. 调用链并流式输出print(生成一首夏天的诗词)forchunkinchain.stream(写一首夏天的诗词50字以内。):print(chunk,end|)代码解读第 7 行创建StrOutputParser实例无需任何参数第 10 行使用 LCEL 的管道符|将模型和解析器连接成一个链第 14 行调用链的stream()方法进行流式输出每个chunk都是解析后的纯文本字符串输出结果生成一首夏天的诗词 |炎|夏|骄|阳|照|,|绿|树|映|蓝|天|| |蝉|鸣|声|声|烈|,|荷|塘|映|清|鲜| |微|风|拂|面|过|,|凉|意|透|心|间|| |烦|忧|随|汗|去|,|畅|享|此|夏|欢|||如果不使用StrOutputParser你需要手动从AIMessage中提取content字段# 不使用解析器的写法resultmodel.invoke(写一首夏天的诗词50字以内。)print(result.content)# 手动提取文本内容2.2 PydanticOutputParser解析为结构化对象PydanticOutputParser是功能最强大的输出解析器它可以将大模型的输出直接转换为 Pydantic 对象并自动进行类型验证。Pydantic 是 Python 中最流行的数据验证库它允许你定义数据模型指定每个字段的类型、描述和默认值然后自动验证输入数据是否符合模型要求。完整代码示例fromlangchain_openaiimportChatOpenAIfromlangchain_core.output_parsersimportPydanticOutputParserfromlangchain_core.promptsimportPromptTemplatefromtypingimportOptionalfrompydanticimportBaseModel,Field# 1. 初始化大模型modelChatOpenAI(modelgpt-4o-mini)# 2. 定义输出结构Pydantic 类classJoke(BaseModel):给用户讲一个笑话。setup:strField(description这个笑话的开头)punchline:strField(description这个笑话的妙语)rating:Optional[int]Field(defaultNone,description从1到10分给这个笑话评分)# 3. 设置解析器parserPydanticOutputParser(pydantic_objectJoke)# 4. 提示词模板必须包含格式指令promptPromptTemplate(templateAnswer the user query.\n{format_instructions}\n{query}\n,input_variables[query],# partial_variables提前绑定固定的变量无需每次调用都传入partial_variables{format_instructions:parser.get_format_instructions()},)# 5. 构建链提示词 - 模型 - 解析器chainprompt|model|parser# 6. 调用链resultchain.invoke({query:给我讲一个关于唱歌的笑话})print(result)print(f\n笑话开头{result.setup})print(f笑话妙语{result.punchline})print(f笑话评分{result.rating})关键知识点解读Pydantic 模型定义每个字段都使用Field()添加描述大模型会根据这些描述生成正确的输出Optional[int]表示该字段是可选的可以为None类的文档字符串会被解析器用作整体描述**get_format_instructions()**方法这是PydanticOutputParser最重要的方法它会自动生成一段详细的格式指令告诉大模型应该如何输出生成的指令会包含 JSON 格式要求、字段说明和示例必须将这段指令添加到提示词中否则大模型不知道应该按照什么格式输出**partial_variables**参数提示词模板中的format_instructions是固定不变的不需要每次调用链都传入使用partial_variables可以提前将这个变量绑定到模板上简化调用代码输出结果setup为什么歌手总是带着铅笔去演出? punchline因为他们想要不断调整音调! rating7 笑话开头为什么歌手总是带着铅笔去演出? 笑话妙语因为他们想要不断调整音调! 笑话评分7可以看到返回的result是一个Joke对象我们可以直接通过属性访问各个字段非常方便。2.3 JsonOutputParser解析为 JSON 格式JsonOutputParser用于将大模型的输出解析为 Python 字典JSON 格式。它有两种使用方式不带 Pydantic 模型大模型输出自由格式的 JSON带 Pydantic 模型输出严格符合 Pydantic 模型结构的 JSON并进行验证方式一不带 Pydantic 模型fromlangchain_openaiimportChatOpenAIfromlangchain_core.output_parsersimportJsonOutputParserfromlangchain_core.promptsimportPromptTemplate# 1. 初始化大模型modelChatOpenAI(modelgpt-4o-mini)# 2. 设置解析器不带 Pydantic 模型parserJsonOutputParser()# 3. 提示词模板promptPromptTemplate(templateAnswer the user query.\n{format_instructions}\n{query}\n,input_variables[query],partial_variables{format_instructions:parser.get_format_instructions()},)# 4. 构建链chainprompt|model|parser# 5. 调用链resultchain.invoke({query:给我讲一个关于唱歌的笑话})print(result)print(f\n笑话内容{result[joke]})输出结果{joke: 为什么歌手总是带着梯子?\n因为他们想要在音乐会上达到更高的层次!} 笑话内容为什么歌手总是带着梯子? 因为他们想要在音乐会上达到更高的层次!方式二带 Pydantic 模型fromlangchain_openaiimportChatOpenAIfromlangchain_core.output_parsersimportJsonOutputParserfromlangchain_core.promptsimportPromptTemplatefromtypingimportOptionalfrompydanticimportBaseModel,Field# 1. 初始化大模型modelChatOpenAI(modelgpt-4o-mini)# 2. 定义 Pydantic 模型classJoke(BaseModel):给用户讲一个笑话。setup:strField(description这个笑话的开头)punchline:strField(description这个笑话的妙语)rating:Optional[int]Field(defaultNone,description从1到10分给这个笑话评分)# 3. 设置解析器带 Pydantic 模型parserJsonOutputParser(pydantic_objectJoke)# 4. 提示词模板promptPromptTemplate(templateAnswer the user query.\n{format_instructions}\n{query}\n,input_variables[query],partial_variables{format_instructions:parser.get_format_instructions()},)# 5. 构建链chainprompt|model|parser# 6. 调用链resultchain.invoke({query:给我讲一个关于唱歌的笑话})print(result)print(f\n笑话开头{result[setup]})print(f笑话妙语{result[punchline]})print(f笑话评分{result[rating]})输出结果{setup: 为什么歌手从不在森林里唱歌?, punchline: 因为他们会被树木的‘静’止住!, rating: 7} 笑话开头为什么歌手从不在森林里唱歌? 笑话妙语因为他们会被树木的‘静’止住! 笑话评分7不带 Pydantic 模型输出结构灵活但没有类型验证大模型可能会输出不符合预期的字段带 Pydantic 模型输出严格符合 Pydantic 模型结构会自动进行类型验证可靠性更高三. 核心考点与最佳实践3.1 核心考点总结输出解析器的核心作用将大模型的非结构化文本输出转换为机器可读的结构化数据与**with_structured_output()**的区别输出解析器是组件支持链式调用with_structured_output()是模型方法返回 Runnable常用解析器的选择纯文本输出使用StrOutputParser需要强类型验证使用PydanticOutputParser需要 JSON 格式使用JsonOutputParser格式指令的重要性必须将解析器生成的格式指令添加到提示词中否则大模型不知道应该按照什么格式输出Pydantic 模型的设计每个字段都应该添加清晰的描述这直接影响大模型输出的准确性3.2 最佳实践总是使用 Pydantic 进行类型验证即使你只需要 JSON 格式也建议使用带 Pydantic 模型的JsonOutputParser这样可以确保输出的可靠性优化格式指令如果大模型输出的格式不符合预期可以手动修改提示词中的格式指令使其更清晰处理解析错误在生产环境中应该添加异常处理逻辑捕获解析失败的情况并进行重试或降级处理流式输出注意事项PydanticOutputParser和JsonOutputParser的流式输出会返回部分对象直到最后一个 chunk 才会生成完整的对象除了本文介绍的三种常用解析器LangChain 还提供了更多类型的解析器包括XMLOutputParser解析 XML 格式输出YamlOutputParser解析 YAML 格式输出CommaSeparatedListOutputParser解析逗号分隔的列表EnumOutputParser解析枚举类型输出DatetimeOutputParser解析日期时间格式输出结尾 我是草莓熊 Lotso若这篇技术干货帮你打通了学习中的卡点 【关注】跟我一起深耕技术领域从基础到进阶见证每一次成长 ❤️ 【点赞】让优质内容被更多人看见让知识传递更有力量 ⭐ 【收藏】把核心知识点、实战技巧存好需要时直接查、随时用 【评论】分享你的经验或疑问比如曾踩过的技术坑一起交流避坑 ️ 【投票】用你的选择助力社区内容方向告诉大家哪个技术点最该重点拆解 技术之路难免有困惑但同行的人会让前进更有方向愿我们都能在自己专注的领域里一步步靠近心中的技术目标结语输出解析器是 LangChain 应用开发中不可或缺的组件它解决了大模型输出与程序处理之间的格式不匹配问题。你可以根据自己的业务需求选择合适的解析器甚至可以自定义解析器来满足特殊的输出格式要求。在下一篇文章中我们将进入 RAG检索增强生成的世界学习如何使用 LangChain 的文档加载器加载各种类型的文档为构建智能知识库问答系统打下基础。✨把这些内容吃透超牛的放松下吧✨ʕ˘ᴥ˘ʔづきらど