【LangChain】 输出解析器(Output Parsers)完全指南

news2026/5/14 18:06:52
LangChain 输出解析器Output Parsers完全指南2026 年最新版 | 覆盖所有内置解析器 完整代码示例一、什么是输出解析器输出解析器是 LangChain 中连接自由文本 LLM与结构化程序的桥梁。LLM 天生输出自然语言但应用程序需要 JSON、列表、日期等结构化数据。解析器负责将原始文本转换为可直接使用的 Python 对象 。二、解析器全景图类别 解析器 用途 复杂度基础文本StrOutputParser提取纯文本内容 ⭐列表CommaSeparatedListOutputParser逗号分隔列表 ⭐NumberedListOutputParser编号列表 ⭐MarkdownListOutputParserMarkdown 列表 ⭐结构化JsonOutputParser解析为 JSON 字典 ⭐⭐PydanticOutputParser解析为 Pydantic 对象类型安全 ⭐⭐⭐专用DatetimeOutputParser日期时间格式 ⭐⭐EnumOutputParser枚举值约束 ⭐⭐XMLOutputParserXML 格式输出 ⭐⭐容错OutputFixingParser自动修复格式错误 ⭐⭐⭐RetryOutputParser/RetryWithErrorOutputParser带上下文的重试修复 ⭐⭐⭐⭐工具调用JsonOutputKeyToolsParser解析 OpenAI 工具调用 ⭐⭐⭐PydanticToolsParserPydantic 工具参数解析 ⭐⭐⭐三、基础解析器详解与示例StrOutputParser — 字符串解析器最基础的解析器从AIMessage中提取纯文本内容。fromlangchain_core.output_parsersimportStrOutputParserfromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplate llmChatOpenAI(modelgpt-4o-mini,temperature0)# 构建链提示 → 模型 → 解析器promptChatPromptTemplate.from_template(用一句话解释{concept})chainprompt|llm|StrOutputParser()resultchain.invoke({concept:神经网络})print(result)# 输出: 神经网络是一种模拟人脑神经元连接方式的机器学习模型...print(type(result))# class str特点去除了AIMessage包装直接返回字符串适合简单问答场景 。CommaSeparatedListOutputParser — CSV 列表解析器要求模型输出逗号分隔的内容自动转为 Python 列表。fromlangchain_core.output_parsersimportCommaSeparatedListOutputParserfromlangchain_core.promptsimportChatPromptTemplate parserCommaSeparatedListOutputParser()promptChatPromptTemplate.from_messages([(system,你是一个分类助手。{format_instructions}),(human,列出{topic}的主要类型不要编号用逗号分隔)]).partial(format_instructionsparser.get_format_instructions())chainprompt|llm|parser resultchain.invoke({topic:Python Web 框架})print(result)# 输出: [Django, Flask, FastAPI, Tornado, Bottle]print(type(result))# class listget_format_instructions()自动生成提示告诉模型你的输出应该是一个逗号分隔的列表 。NumberedListOutputParser — 编号列表解析器解析带编号的列表如1. xxx 2. xxx。fromlangchain_core.output_parsersimportNumberedListOutputParser parserNumberedListOutputParser()promptChatPromptTemplate.from_template( 列出{topic}的5个优点使用编号格式。 {format_instructions} )chainprompt.partial(format_instructionsparser.get_format_instructions())|llm|parser resultchain.invoke({topic:微服务架构})print(result)# 输出: [独立部署, 技术栈灵活, 扩展性强, 故障隔离, 团队自治]MarkdownListOutputParser — Markdown 列表解析器解析 Markdown 格式的无序列表- item或* item。fromlangchain_core.output_parsersimportMarkdownListOutputParser parserMarkdownListOutputParser()promptChatPromptTemplate.from_template( 用 Markdown 列表格式列出{topic}的核心特性。 {format_instructions} )chainprompt.partial(format_instructionsparser.get_format_instructions())|llm|parser resultchain.invoke({topic:Docker})print(result)# 输出: [容器化, 轻量级, 可移植, 版本控制, 资源隔离]四、结构化解析器详解与示例JsonOutputParser — JSON 解析器将 LLM 输出解析为 Python 字典。可配合 Pydantic 模型生成格式说明 。fromlangchain_core.output_parsersimportJsonOutputParserfrompydanticimportBaseModel,Field# 方式一无 Schema直接解析为 dictparserJsonOutputParser()promptChatPromptTemplate.from_messages([(system,提取信息并以 JSON 返回。{format_instructions}),(human,介绍一下日本包含名称、人口、大洲)]).partial(format_instructionsparser.get_format_instructions())chainprompt|llm|parser resultchain.invoke({})print(result)# 输出: {name: Japan, population: 125000000, continent: Asia}print(type(result))# class dict# 方式二带 Pydantic Schema仅生成格式说明返回仍是 dictclassCountryInfo(BaseModel):name:strField(description国家名称)population:intField(description人口数量)continent:strField(description所在大洲)parser_with_schemaJsonOutputParser(pydantic_objectCountryInfo)# 生成的格式说明更详细但返回仍是 dict 而非 CountryInfo 对象PydanticOutputParser — Pydantic 解析器强烈推荐最强大、最安全的解析器。将输出直接转为类型安全的 Pydantic 对象自动校验字段类型和必填项 。frompydanticimportBaseModel,FieldfromtypingimportList,Optionalfromlangchain_core.output_parsersimportPydanticOutputParser# 定义数据结构classActionItem(BaseModel):task:strField(description任务描述)assignee:strField(description负责人)classMeetingSummary(BaseModel):title:strField(description会议标题)key_decisions:List[str]Field(description关键决策)action_items:List[ActionItem]Field(description行动项)parserPydanticOutputParser(pydantic_objectMeetingSummary)promptChatPromptTemplate.from_messages([(system,你是会议纪要助手。从会议记录中提取结构化信息。 {format_instructions}),(human,{transcript})]).partial(format_instructionsparser.get_format_instructions())chainprompt|llm|parser meeting_notes 3月10日站会。出席Alice, Bob, Carol。 Alice 说数据管道已完成待审查。 Bob 提到生产环境 API 速率限制有问题。 决定API 调用实现指数退避。 Carol 周五前完成重试逻辑代码。 Bob 下周二前搭建监控面板。 Alice 审查 Carol 的 PR。 summarychain.invoke({transcript:meeting_notes})print(type(summary))# class __main__.MeetingSummaryprint(f标题:{summary.title})print(f决策:{summary.key_decisions})foriteminsummary.action_items:print(f 任务:{item.task}- 负责人:{item.assignee})输出标题: 3月10日团队站会 决策: [API调用实现指数退避] 任务: 完成重试逻辑代码 - 负责人: Carol 任务: 搭建监控面板 - 负责人: Bob 任务: 审查Carol的PR - 负责人: AlicePydantic 的优势自动类型转换如字符串125000000→ 整数125000000必填字段校验缺少字段会报错字段约束如ge1, le5限制评分范围DatetimeOutputParser — 日期时间解析器将 LLM 输出解析为 Pythondatetime对象 。fromlangchain.output_parsersimportDatetimeOutputParserfromlangchain_core.promptsimportChatPromptTemplate parserDatetimeOutputParser()promptChatPromptTemplate.from_messages([(system,提取日期时间信息。{format_instructions}),(human,会议定在下周三下午三点)]).partial(format_instructionsparser.get_format_instructions())chainprompt|llm|parser resultchain.invoke({})print(result)# 输出: 2026-05-20 15:00:00print(type(result))# class datetime.datetimeEnumOutputParser — 枚举解析器强制输出必须是预定义枚举值之一 。fromlangchain.output_parsersimportEnumOutputParserfromenumimportEnumclassSentiment(str,Enum):POSITIVEpositiveNEGATIVEnegativeNEUTRALneutralparserEnumOutputParser(enumSentiment)promptChatPromptTemplate.from_template( 分析以下评论的情感倾向。只能从 positive/negative/neutral 中选择。 评论{review} )chainprompt|llm|parser resultchain.invoke({review:产品质量非常好物流也很快})print(result)# Sentiment.POSITIVEprint(type(result))# enum Sentimentprint(result.value)# positiveXMLOutputParser — XML 解析器解析 XML 格式的输出 。fromlangchain_core.output_parsersimportXMLOutputParser parserXMLOutputParser()promptChatPromptTemplate.from_messages([(system,以 XML 格式返回结果。{format_instructions}),(human,提取以下信息书名《三体》作者刘慈欣年份2008)]).partial(format_instructionsparser.get_format_instructions())chainprompt|llm|parser resultchain.invoke({})print(result)# 输出: {book: {title: 三体, author: 刘慈欣, year: 2008}}五、容错解析器生产环境必备LLM 有时会输出格式错误的 JSON缺少逗号、多余注释等。容错解析器自动修复这些问题 。OutputFixingParser — 自动修复解析器当主解析器失败时调用另一个 LLM 来修复格式。fromlangchain.output_parsersimportOutputFixingParserfromlangchain_core.output_parsersimportPydanticOutputParserfrompydanticimportBaseModel,FieldclassRecipe(BaseModel):name:strField(description菜品名称)ingredients:List[str]Field(description食材列表)prep_time:intField(description准备时间分钟)base_parserPydanticOutputParser(pydantic_objectRecipe)# 用修复解析器包装基础解析器fixing_parserOutputFixingParser.from_llm(parserbase_parser,llmChatOpenAI(modelgpt-4o-mini),# 用于修复的 LLM)# 模拟一个格式错误的输出bad_output{name: 宫保鸡丁, ingredients: [鸡肉, 花生, 辣椒] prep_time: 30}# 注意缺少逗号try:resultfixing_parser.parse(bad_output)print(f修复成功:{result})exceptExceptionase:print(f修复失败:{e})工作原理修复解析器收到错误输出后将其发送给 LLM 并附加指令请修正这个 JSON 的语法错误 。RetryOutputParser / RetryWithErrorOutputParser — 重试解析器比OutputFixingParser更强大不仅发送错误输出还附带原始提示和错误信息让 LLM 在完整上下文中重新生成 。fromlangchain_core.output_parsersimport(PydanticOutputParser,RetryWithErrorOutputParser)fromlangchain_core.promptsimportPromptTemplateclassProductReview(BaseModel):product_name:strField(description产品名称)rating:intField(description评分 1-5,ge1,le5)summary:strField(description简短总结)llmChatOpenAI(modelgpt-4o-mini,temperature0)main_parserPydanticOutputParser(pydantic_objectProductReview)# 用重试解析器包装retry_parserRetryWithErrorOutputParser.from_llm(parsermain_parser,llmllm,max_retries2# 最多重试 2 次)prompt_template 分析以下产品评论并提取信息。 {format_instructions} 评论文本 {review_text} promptPromptTemplate(templateprompt_template,input_variables[review_text],partial_variables{format_instructions:main_parser.get_format_instructions()})# 使用 parse_with_prompt 方法传入提示对象review不错的手机4星。相机很好。希望存储空间更大。prompt_valueprompt.format_prompt(review_textreview)llm_outputllm.invoke(prompt_value)try:resultretry_parser.parse_with_prompt(llm_output.content,prompt_value)print(f产品:{result.product_name})print(f评分:{result.rating})exceptExceptionase:print(f重试后仍失败:{e})RetryWithErrorOutputParservsOutputFixingParserOutputFixingParser只给 LLM 错误输出让它猜着修RetryWithErrorOutputParser给 LLM 原始提示 错误输出 错误信息在完整上下文中重新生成成功率更高 。六、工具调用解析器用于解析支持 Function Calling 的模型如 OpenAI、Claude的工具调用结果 。JsonOutputKeyToolsParserfromlangchain_core.output_parsers.openai_toolsimportJsonOutputKeyToolsParser# 当模型返回 tool_calls 时提取指定工具的参数parserJsonOutputKeyToolsParser(key_nameget_weather)# 通常配合 with_structured_output 使用PydanticToolsParserfromlangchain_core.output_parsers.openai_toolsimportPydanticToolsParser# 将工具调用参数直接解析为 Pydantic 对象七、现代推荐做法with_structured_output()2026 年最新趋势对于支持原生结构化输出的模型GPT-4o、Claude 3、Gemini优先使用.with_structured_output()而非传统的 Output Parser 。fromlangchain_openaiimportChatOpenAIfrompydanticimportBaseModel,FieldclassMovieReview(BaseModel):title:strField(description电影标题)rating:floatField(description评分 0-10)summary:strField(description一句话总结)recommended:boolField(description是否推荐)llmChatOpenAI(modelgpt-4o-mini,temperature0)# 直接绑定结构化输出无需解析器structured_llmllm.with_structured_output(MovieReview)resultstructured_llm.invoke(评价电影《盗梦空间》)print(type(result))# class __main__.MovieReviewprint(result.title)# Inceptionprint(result.rating)# 8.8print(result.recommended)# True优势使用模型原生的 Function Calling / JSON Mode可靠性更高无需在提示中写复杂的格式说明省去解析步骤直接返回 Pydantic 对象何时还用传统 Parser使用不支持结构化输出的模型如本地小模型需要复杂的后处理逻辑如从混合文本中提取 JSON需要容错修复机制八、自定义解析器继承BaseOutputParser实现专属逻辑 。fromlangchain_core.output_parsersimportBaseOutputParserfromtypingimportAnyimportreimportjsonclassMarkdownJsonExtractor(BaseOutputParser):从 Markdown 代码块中提取 JSONdefparse(self,text:str)-Any:# 匹配 json ... 块matchre.search(rjson\s*(.*?)\s*,text,re.DOTALL)ifnotmatch:raiseValueError(f未找到 JSON 代码块:{text[:100]}...)json_strmatch.group(1)try:returnjson.loads(json_str)exceptjson.JSONDecodeErrorase:raiseValueError(fJSON 解析失败:{e})defget_format_instructions(self)-str:return请将 JSON 输出包裹在 json\n...\n代码块中。# 使用custom_parserMarkdownJsonExtractor()llm_output 分析完成以下是结果 json{sentiment:positive,confidence:0.95,keywords:[质量,服务]}如有疑问请告诉我。“”result custom_parser.parse(llm_output)print(result)输出: {‘sentiment’: ‘positive’, ‘confidence’: 0.95, ‘keywords’: [‘质量’, ‘服务’]}--- ## 九、选型指南 | 场景 | 推荐方案 | 理由 | |------|----------|------| | 简单文本问答 | StrOutputParser | 最轻量 | | 逗号分隔标签 | CommaSeparatedListOutputParser | 一行代码搞定 | | 需要类型安全 | PydanticOutputParser | 自动校验 IDE 提示 | | 快速原型 | JsonOutputParser | 无需定义模型 | | 生产环境高可靠 | with_structured_output() RetryWithErrorOutputParser | 双重保障 | | 老旧模型/本地模型 | PydanticOutputParser OutputFixingParser | 容错修复 | | 混合格式提取 | 自定义 BaseOutputParser | 完全可控 | --- ## 十、完整对比总结 | 解析器 | 输入 | 输出 | 自动格式说明 | 容错能力 | 2026 推荐度 | |--------|------|------|-------------|---------|------------| | StrOutputParser | AIMessage | str | ❌ | ❌ | ⭐⭐⭐ | | CommaSeparatedListOutputParser | str | list | ✅ | ❌ | ⭐⭐⭐ | | JsonOutputParser | str | dict | ✅ | ❌ | ⭐⭐ | | PydanticOutputParser | str | Pydantic 对象 | ✅ | ❌ | ⭐⭐⭐⭐ | | DatetimeOutputParser | str | datetime | ✅ | ❌ | ⭐⭐ | | EnumOutputParser | str | Enum | ✅ | ❌ | ⭐⭐ | | XMLOutputParser | str | dict | ✅ | ❌ | ⭐ | | OutputFixingParser | str | 同包装解析器 | 同包装 | ✅ | ⭐⭐⭐⭐ | | RetryWithErrorOutputParser | str prompt | 同包装解析器 | 同包装 | ✅✅ | ⭐⭐⭐⭐⭐ | | with_structured_output() | - | Pydantic 对象 | 原生支持 | 模型级 | ⭐⭐⭐⭐⭐ | --- **核心原则**2026 年的 LangChain 开发**能用 with_structured_output() 就不用传统 Parser**必须用 Parser 时**生产环境务必加一层容错解析器**RetryWithErrorOutputParser[^1^][^2^][^5^]。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2605271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…