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/8/7 0:48:41 阅读更多 →
如何选择优质的网站建设招标方案以打造高转化率数字化营销入口并避开隐形陷阱

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

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

2026/8/7 0:46:40 阅读更多 →
炉石传说HsMod插件:5大核心功能彻底改变你的游戏体验

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

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

2026/8/7 0:46:40 阅读更多 →

最新新闻

Flutter 本地存储完整教程

Flutter 本地存储完整教程

Flutter 四大存储核心对比 SP / 文件 / Hive / SQLite-Drift对比与使用 一、四种存储方案总览对比存储方案底层实现存储数据类型性能支持对象加密适用场景SharedPreferences安卓 SP /iOS NSUserDefaults基础类型:String/int/bool/List一般❌ 需要 Json 序列化❌登录…

2026/8/7 1:29:00 阅读更多 →
如何用Zotero Style插件提升文献管理效率:从混乱到有序的终极指南

如何用Zotero Style插件提升文献管理效率:从混乱到有序的终极指南

如何用Zotero Style插件提升文献管理效率:从混乱到有序的终极指南 【免费下载链接】zotero-style Ethereal Style for Zotero 项目地址: https://gitcode.com/GitHub_Trending/zo/zotero-style 你是否曾为Zotero文献管理软件的单调界面感到厌倦?是…

2026/8/7 1:29:00 阅读更多 →
Bell首架用于亚太地区空中巡逻任务的505型直升机正式投入运营

Bell首架用于亚太地区空中巡逻任务的505型直升机正式投入运营

Textron Inc.(NYSE::TXT)旗下子公司Bell Textron Inc.宣布,爱知县警察局已正式启用Bell 505直升机开展空中警务行动,这是亚太地区航空界的重要里程碑。在日本名古屋的小牧机场举行了一场庆祝仪式,以纪念这一…

2026/8/7 1:29:00 阅读更多 →
Linux RPM包管理:解决Google Chrome安装NOKEY错误与GPG密钥安全导入

Linux RPM包管理:解决Google Chrome安装NOKEY错误与GPG密钥安全导入

1. 项目概述:一个看似简单的报错,背后是Linux包管理的信任基石如果你在Linux系统上,特别是像Fedora、CentOS、RHEL或者openSUSE这类使用RPM包管理器的发行版上,尝试安装或更新Google Chrome时,大概率会遇到这个拦路虎&…

2026/8/7 1:29:00 阅读更多 →
gpx.studio:浏览器中的专业GPX编辑器,让GPS轨迹编辑变得简单

gpx.studio:浏览器中的专业GPX编辑器,让GPS轨迹编辑变得简单

gpx.studio:浏览器中的专业GPX编辑器,让GPS轨迹编辑变得简单 【免费下载链接】gpxstudio.github.io The online GPX file editor 项目地址: https://gitcode.com/gh_mirrors/gp/gpxstudio.github.io gpx.studio是一款功能强大的在线GPX文件编辑器…

2026/8/7 1:29:00 阅读更多 →
Onekey Steam清单下载器:终极免费工具完整使用指南

Onekey Steam清单下载器:终极免费工具完整使用指南

Onekey Steam清单下载器:终极免费工具完整使用指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 你是否曾经想要备份Steam游戏文件却苦于找不到合适的工具?或者需要在不…

2026/8/7 1:27:59 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →