AI Agent白手起家38: 输出解析器的容错机制与自定义实战
纲要容错机制自动重试解析器RetryOutputParser修复解析器OutputFixingParser自定义解析器案例一纳美星语转换解析器基于正则案例二布尔值解析器继承BaseOutputParser完整可运行代码模拟错误场景展示容错修复与自定义解析全流程引言在前几篇文章中我们学习了如何用 LangChain 的输出解析器将大模型的自然语言输出转换为结构化的 Python 对象。但在实际应用中模型输出的随机性受 temperature 等参数影响会导致解析失败比如缺少字段、JSON 格式错误等。LangChain 为此提供了两种容错机制自动重试和修复。此外当内置解析器不满足需求时开发者还可以通过自定义解析器实现任意格式的转换。本文将结合可运行代码深入介绍这两项实用技能。输出解析器的容错机制自动重试RetryOutputParser当解析失败时自动重试解析器会将原始提示词、错误输出以及错误信息一起重新交给大模型让模型再次生成符合格式的回答。其核心思想是将解析错误作为反馈信号引导模型修正输出。修复解析器OutputFixingParser与重试不同修复解析器会直接调用另一个大模型尝试将错误的输出修正为目标格式不依赖原始提示词。它更适用于那些输出已经“离正确格式不远”的情况例如 JSON 中少了一个花括号。两种容错方式的对比特性RetryOutputParserOutputFixingParser输入原始提示词 错误输出 错误信息错误输出 原解析器依赖模型需要可用任意模型需要通常更轻量适用场景格式完全错误需要重新理解任务小范围格式瑕疵快速修补自定义解析器实战纳美星语解析器我们基于电影《阿凡达》中的纳美星语Na’vi构造一个趣味解析器将英文问候语转换为带有纳美语特征的正则替换结果。该解析器不依赖模型完全由正则规则驱动并可直接作为链的一环。布尔值解析器通过继承BaseOutputParser实现一个简洁的布尔值解析器将常见的“yes/no”、“true/false”等自然语言表达统一转换为 Python 的True或False并支持自定义真值映射。完整可运行代码以下代码整合了容错机制与两种自定义解析器的完整示例使用FakeListChatModel模拟大模型响应因此无需任何 API Key 即可直接运行。安装依赖pipinstalllangchain langchain-core langchain-community pydantic代码实现fromtypingimportAny,Dict,ListfrompydanticimportBaseModel,Fieldfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimport(BaseOutputParser,PydanticOutputParser,OutputFixingParser,)fromlangchain_core.language_modelsimportBaseChatModelfromlangchain_community.chat_models.fakeimportFakeListChatModelfromlangchain.output_parsers.retryimportRetryOutputParserfromlangchain_core.messagesimportAIMessage# 1. 定义数据模型 classAction(BaseModel):action:strField(description下一步行动名称)action_input:strField(description行动所需的输入)# 2. 模拟错误的模型响应 # 正确的 JSONcorrect_json{action: search, action_input: 北京天气}# 错误响应缺少 action_input 字段bad_json{action: search}# 用于容错机制的假模型第一次返回错误第二次返回正确fix_modelFakeListChatModel(responses[correct_json])# 用于重试的假模型同样返回正确结果retry_modelFakeListChatModel(responses[correct_json])# 用于原始解析的模型返回错误响应base_modelFakeListChatModel(responses[bad_json])# 3. 构建解析器与提示词 parserPydanticOutputParser(pydantic_objectAction)format_instructionsparser.get_format_instructions()promptChatPromptTemplate.from_template(根据用户的问题制定下一步计划。\n{format_instructions}\n问题{question})promptprompt.partial(format_instructionsformat_instructions)# 4. 演示解析失败 print( 1. 无容错的原始解析预期失败 )try:bad_chainprompt|base_model|parser resultbad_chain.invoke({question:今天北京天气怎么样})print(解析成功:,result)exceptExceptionase:print(解析失败错误信息:,str(e)[:100],...)# 5. 使用 OutputFixingParser 修复 print(\n 2. OutputFixingParser 修复示例 )fixing_parserOutputFixingParser.from_llm(parserparser,llmfix_model,max_retries1)# 手动构造一个 AIMessage 模拟错误输出bad_messageAIMessage(contentbad_json)try:fixed_resultfixing_parser.parse(bad_message.content)print(修复后解析成功:,fixed_result)exceptExceptionase:print(修复失败:,e)# 6. 使用 RetryOutputParser 重试 print(\n 3. RetryOutputParser 重示例 )retry_parserRetryOutputParser.from_llm(parserparser,llmretry_model,max_retries2)# 需要提供原始提示词值和错误的输出prompt_valueprompt.invoke({question:今天北京天气怎么样})try:retry_resultretry_parser.parse_with_prompt(bad_message.content,prompt_value)print(重试后解析成功:,retry_result)exceptExceptionase:print(重试失败:,e)# 7. 自定义解析器纳美星语转换 importredefnavi_transformer(text:str)-str:将英文转换为带有纳美语特征的文本# 常见问候替换textre.sub(r\bhello\b,Kaltxì,text,flagsre.IGNORECASE)textre.sub(r\bthank you\b,Irayo,text,flagsre.IGNORECASE)# 形容词加前缀 le-textre.sub(r\b(beautiful|pretty|great)\b,rle-\1,text,flagsre.IGNORECASE)# 动词加语气后缀textre.sub(r\b(go|come|see|help)\b,r\1-ti,text,flagsre.IGNORECASE)# 句首添加特征前缀ifnottext.startswith(Tsa\u):textTsa\u textreturntextclassNaviOutputParser(BaseOutputParser[str]):自定义纳美星语解析器defparse(self,text:str)-str:# 假设模型输出纯文本returnnavi_transformer(text)defget_format_instructions(self)-str:return请输出一段简短的英文问候或陈述。propertydef_type(self)-str:returnnavi_parserprint(\n 4. 纳美星语解析器 )navi_parserNaviOutputParser()# 模拟模型的英文输出english_responseHello, how can I help you? You are beautiful.navi_responsenavi_parser.parse(english_response)print(英文输入:,english_response)print(纳美语输出:,navi_response)# 8. 自定义布尔值解析器 classBooleanOutputParser(BaseOutputParser[bool]):将自然语言 yes/no 转换为布尔值true_values:List[str][yes,true,ok,1]false_values:List[str][no,false,nok,0]defparse(self,text:str)-bool:cleantext.strip().lower()ifcleaninself.true_values:returnTrueelifcleaninself.false_values:returnFalseelse:raiseValueError(f无法识别的布尔值:{text}仅支持{self.true_valuesself.false_values})defget_format_instructions(self)-str:returnf请仅返回以下单词之一{, .join(self.true_valuesself.false_values)}propertydef_type(self)-str:returnboolean_parserprint(\n 5. 布尔值解析器 )bool_parserBooleanOutputParser()print(输入 yes -,bool_parser.parse(yes))print(输入 No -,bool_parser.parse(No))# 自定义真值映射custom_bool_parserBooleanOutputParser(true_values[go],false_values[stop])print(输入 go -,custom_bool_parser.parse(go))try:custom_bool_parser.parse(maybe)exceptValueErrorase:print(输入 maybe 触发错误:,e)运行结果解读无容错解析直接抛出ValidationError因为模型输出缺少action_input字段。修复解析OutputFixingParser使用另一个模型模拟为FakeListChatModel将{action: search}补全为{action: search, action_input: 北京天气}成功解析。重试解析RetryOutputParser将错误输出和原始提示词一同交给模型重新生成符合格式的结果。纳美星语解析器通过正则替换实现趣味转换完全不依赖外部服务。布尔值解析器简洁地完成了自然语言到布尔值的映射并支持自定义参数错误输入会触发异常。最佳实践与注意事项容错机制会额外消耗模型调用次数生产环境中需合理设置max_retries。修复解析器适合“小修小补”如果输出与目标格式相差甚远优先使用重试。自定义解析器时建议同时实现get_format_instructions()方法以便在提示词中注入格式要求。布尔值解析器可通过配置文件动态注入真假映射方便国际化。总结本文介绍了 LangChain 输出解析器的容错方案重试与修复并通过两个实战案例展示了如何构建自定义解析器。这些工具让 LLM 应用在面对不可预测的模型输出时更加强健也为特殊业务逻辑提供了灵活的解析能力。掌握它们你就能在构建 AI Agent 时游刃有余地处理各种结构化输出需求。

相关新闻

AI Agent白手起家37: LangChain 输出解析器实战:文本、JSON、XML 与 Pydantic

AI Agent白手起家37: LangChain 输出解析器实战:文本、JSON、XML 与 Pydantic

内容纲要 输出解析器核心作用:将大模型自然语言输出转换为结构化数据常用解析器类型 StrOutputParser:提取纯文本,无需格式指令PydanticOutputParser:基于 Pydantic 数据模型,精确控制字段和验证JsonOutputParser&…

2026/10/14 3:55:30 阅读更多 →
如何选择优质的网站建设招标方案以打造高转化率数字化营销入口并避开隐形陷阱

如何选择优质的网站建设招标方案以打造高转化率数字化营销入口并避开隐形陷阱

说实话,写这篇文章之前,我反复掂量了很久。因为在互联网行业摸爬滚打这么多年,我见过的因为一个错误的“网站建设招标方案”而让整个项目烂尾的案例,简直比过春节返乡堵车时加塞的车还多。很多老板或者是负责项目的同事,拿到招标文件的那一刻,心里想的往往是“赶紧发出去…

2026/10/9 17:25:16 阅读更多 →
炉石传说HsMod插件:5大核心功能彻底改变你的游戏体验

炉石传说HsMod插件:5大核心功能彻底改变你的游戏体验

炉石传说HsMod插件:5大核心功能彻底改变你的游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 你是否曾经为炉石传说中冗长的开包动画而烦恼?是否羡慕别人的炫…

2026/10/13 14:58:01 阅读更多 →

最新新闻

如何从零构建Helium-linux:Docker容器化编译环境完整教程

如何从零构建Helium-linux:Docker容器化编译环境完整教程

【免费下载链接】helium-linux Helium Browser for Linux 项目地址: https://gitcode.com/gh_mirrors/he/helium-linux 点击查看 免费下载 helium-linux 是 Helium Browser(隐私优先的 Chromium 系浏览器)的 Linux 构建、打包与开发工具仓库…

2026/10/15 14:01:48 阅读更多 →
Ubuntu 20.04 安装 ROS Melodic:跨版本兼容实践与排坑指南

Ubuntu 20.04 安装 ROS Melodic:跨版本兼容实践与排坑指南

年前接了一个老项目的维护工作,代码是基于 ROS Melodic 写的,但手上这台机器装的是 Ubuntu 20.04,官方对口的 ROS 版本是 Noetic。项目里有个自研功能包只适配 Melodic,迁到 Noetic 的改动量不算小,于是我把目光转向了…

2026/10/15 14:01:48 阅读更多 →
MUC18抗体:一种从黑色素瘤标志物到肥胖治疗靶点的多功能研究工具如何发挥作用?

MUC18抗体:一种从黑色素瘤标志物到肥胖治疗靶点的多功能研究工具如何发挥作用?

MUC18(又称CD146)是一种细胞黏附分子,于1987年作为黑色素瘤标志物被发现。近三十余年的研究揭示了其在胚胎发育、免疫应答及肿瘤、炎症等过程中的多重功能。中科院生物物理研究所的最新研究发现,MUC18在脂肪组织中高表达&#xff…

2026/10/15 14:01:48 阅读更多 →
MySQL作业复盘:从建表到索引的SQL实战笔记

MySQL作业复盘:从建表到索引的SQL实战笔记

最近课程正好告一段落,MySQL作业也交到了第二次。说实话,第一次作业大多数人还能靠“照着课件把建表语句抄一遍”混过去,到了第二次就明显分层了:有人半小时写完,有人对着报错刷了一晚上网页。这份作业日期是2025年12月…

2026/10/15 14:01:48 阅读更多 →
CD146配对抗体:一种靶向代谢调控的新型工具如何干预肥胖及其并发症?

CD146配对抗体:一种靶向代谢调控的新型工具如何干预肥胖及其并发症?

CD146(又称MCAM)是一种细胞黏附分子,在黑色素瘤等肿瘤中被发现,近年来其功能研究已拓展至代谢调控领域。研究者揭示,CD146在脂肪组织中高表达,是脂肪细胞因子ANGPTL2的新型受体,通过促进白色脂肪…

2026/10/15 14:01:48 阅读更多 →
权限管理怎么做?从“资格”与“空间”双维度设计一套可落地的权限体系

权限管理怎么做?从“资格”与“空间”双维度设计一套可落地的权限体系

1. 引言 权限管理是几乎所有多用户系统的核心难题。很多团队在初期只做“登录 角色”,上线后才发现:用户 A 能看用户 B 的私有数据、两个部门共用了同一份资源却互相覆盖、离职员工的权限迟迟没有回收……这些问题的根源,往往在于没有把“用…

2026/10/15 14:00:47 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →