AI Agent白手起家37: LangChain 输出解析器实战:文本、JSON、XML 与 Pydantic
内容纲要输出解析器核心作用将大模型自然语言输出转换为结构化数据常用解析器类型StrOutputParser提取纯文本无需格式指令PydanticOutputParser基于 Pydantic 数据模型精确控制字段和验证JsonOutputParser自由 JSON 或结合 Pydantic 生成严格 JSONXMLOutputParser输出字典可指定标签约束关键技术点格式指令注入get_format_instructions()必须嵌入提示词Pydantic v2 版本变化及验证器用法流式输出中的 JSON 完整性保护完整可运行代码使用模拟模型演示四种解析器无需外部 API Key引言大模型输出的本质是自然语言文本但实际应用需要结构化数据如 JSON 对象、表格、特定字段传递给下游服务。早期做法是用正则表达式从文本中抽取信息但模型输出的随机性常导致匹配失败。LangChain 的输出解析器Output Parsers提供了一个标准化方案通过将格式要求预先注入提示词并结合解析器自动转换可稳定获得结构化的 Python 对象。本文通过可运行代码演示文本、JSON、Pydantic 和 XML 四种常见解析器的用法。输出解析器在 IO 管道中的定位LangChain 的核心数据流由三部分组成提示词模板、大模型、输出解析器它们通过 LCEL 管道串联用户输入提示词模板大模型输出解析器结构化数据下游应用解析器的作用是将模型输出的自由文本转换为机器易处理的格式同时保证与 LangChain 生态的其他组件无缝对接。四种解析器一览解析器输出类型是否需格式指令典型场景StrOutputParser字符串否简单问答、文本摘要PydanticOutputParserPydantic BaseModel 实例是精准字段控制、数据验证JsonOutputParser字典 (dict)是通用 JSON 数据交互XMLOutputParser字典 (dict)是兼容 XML 的老系统使用结构化解析器时务必通过get_format_instructions()获取格式指令并嵌入提示词否则模型可能不遵守格式约定。环境准备安装依赖pipinstalllangchain langchain-core langchain-community pydantic以下代码使用FakeListChatModel模拟模型输出因此无需任何 API Key 即可运行。如果希望接入真实模型如 OpenAI、DeepSeek只需替换模型初始化部分。完整可运行代码fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimport(StrOutputParser,JsonOutputParser,PydanticOutputParser,XMLOutputParser,)fromlangchain_community.chat_models.fakeimportFakeListChatModelfrompydanticimportBaseModel,Field,model_validator# 1. 文本解析器 # 模型预设回复str_modelFakeListChatModel(responses[ LangChain 是一个用于构建大语言模型应用的开源框架。])str_promptChatPromptTemplate.from_template(用一句话介绍{subject})str_chainstr_prompt|str_model|StrOutputParser()result_strstr_chain.invoke({subject:LangChain})print(StrOutputParser 结果:,result_str)print()# 2. Pydantic 解析器 classJoke(BaseModel):setup:strField(description笑话的铺垫必须以问号结尾)punchline:strField(description笑话的包袱回答铺垫问题)model_validator(modebefore)classmethoddefcheck_setup_ends_with_question(cls,values:dict)-dict:setupvalues.get(setup,)ifnotsetup.endswith(?):raiseValueError(fsetup 必须以问号结尾当前为:{setup})returnvalues# 模拟模型返回严格符合 Pydantic 的 JSON 字符串pyd_model_response{setup: 为什么鸡不能过马路, punchline: 因为它会被机动车撞到。}pyd_modelFakeListChatModel(responses[pyd_model_response])pyd_parserPydanticOutputParser(pydantic_objectJoke)format_instructionspyd_parser.get_format_instructions()pyd_promptChatPromptTemplate.from_template(回答用户的查询\n{format_instructions}\n用户输入{query})pyd_promptpyd_prompt.partial(format_instructionsformat_instructions)pyd_chainpyd_prompt|pyd_model|pyd_parser joke_objpyd_chain.invoke({query:给我讲一个笑话})print(PydanticOutputParser 结果:,joke_obj)print(字段 setup:,joke_obj.setup)print(字段 punchline:,joke_obj.punchline)print()# 3. JSON 解析器自由格式 json_model_response{joke: 为什么鸡不能过马路因为它会被机动车撞到。}json_modelFakeListChatModel(responses[json_model_response])json_parserJsonOutputParser()json_formatjson_parser.get_format_instructions()json_promptChatPromptTemplate.from_template(请以 JSON 格式返回一个笑话\n{format_instructions}\n用户输入{input})json_promptjson_prompt.partial(format_instructionsjson_format)json_chainjson_prompt|json_model|json_parser json_resultjson_chain.invoke({input:讲个笑话})print(JsonOutputParser 结果:,json_result)print(类型:,type(json_result))print()# 4. XML 解析器指定标签 xml_model_responsemovies movie title阿甘正传/title year1994/year actor汤姆·汉克斯/actor /movie movie title荒岛余生/title year2000/year actor汤姆·汉克斯/actor /movie /moviesxml_modelFakeListChatModel(responses[xml_model_response])# 指定顶层标签和内部字段xml_parserXMLOutputParser(tags[movies,movie,title,year,actor])xml_formatxml_parser.get_format_instructions()xml_promptChatPromptTemplate.from_template(根据用户查询生成 XML 列表\n{format_instructions}\n{query})xml_promptxml_prompt.partial(format_instructionsxml_format)xml_chainxml_prompt|xml_model|xml_parser xml_resultxml_chain.invoke({query:列出汤姆·汉克斯的电影})print(XMLOutputParser 结果 (字典):,xml_result)print(第一标题:,xml_result[movies][0][movie][0][title][0])print()# 5. 流式 JSON 演示模拟 # 为演示流式解析使用一个分段返回的模拟模型# 由于 FakeListChatModel 不支持 streaming此处仅给出概念说明。# 在实际应用中可使用支持流式的模型替换解析器会自动处理部分 JSON。print(流式 JSON 解析概念解析器在接收到不完整的 JSON 片段时会等待字段完整再输出。)结果解读StrOutputParser直接返回去除多余空白的纯文本。PydanticOutputParser将模型返回的 JSON 反序列化为Joke对象并执行验证器检查setup是否以问号结尾失败则抛出异常。JsonOutputParser返回普通字典适合无需强类型校验的场景若结合 Pydantic可生成更严格的 JSON。XMLOutputParser默认将 XML 转为多层嵌套字典通过tags参数可约束输出结构避免无关字段。Pydantic 版本注意事项LangChain 在不同版本中使用的 Pydantic 版本不同v0.1 之前同时兼容 Pydantic v1/v2v0.2 起默认 v2v0.3 完全弃用 v1。代码示例基于 Pydantic v2语法与 v1 差异较大如model_validator替代root_validator若使用旧版 LangChain 需调整导入和验证器写法。最佳实践始终将get_format_instructions()注入提示词否则模型可能自由发挥。需要严格字段验证时首选PydanticOutputParser其错误处理机制能与 LangChain 的OutputFixingParser结合自动修复。处理 XML 时注意解析结果是嵌套字典访问路径较深可编写辅助函数提取。流式场景下JsonOutputParser能保证任意截断时刻的 JSON 仍为合法片段便于前端实时渲染。总结输出解析器是 LangChain 从模型“模糊输出”到“精确数据”的关键桥梁。文本解析器简单直接Pydantic 提供强类型保障JSON 和 XML 覆盖了主流数据交换格式。使用框架封装好的解析器不仅能减少重复造轮子还能充分利用其与模型、提示词模板的深度集成大幅提升 LLM 应用的工程化水平。

相关新闻

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

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

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

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 阅读更多 →
如何快速清理C盘空间?Windows Cleaner终极免费优化指南

如何快速清理C盘空间?Windows Cleaner终极免费优化指南

如何快速清理C盘空间?Windows Cleaner终极免费优化指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否经常遇到电脑C盘爆红、系统卡顿的烦恼&a…

2026/10/13 13:30:32 阅读更多 →

最新新闻

多商户外卖小程序实施检查:店铺订单隔离与地址时段用例

多商户外卖小程序实施检查:店铺订单隔离与地址时段用例

做多商户外卖小程序,用户入口之外还需商家后台、配送与运营规则。微订官网列有多商户、骑手抢派单及结算,可按项目版本确认实施范围。 由微订产品内容组整理,产品信息为第一方说明,采购方法需结合实际版本与项目范围验证。 准备…

2026/10/15 14:34:43 阅读更多 →
一文带你了解渗透测试是什么!

一文带你了解渗透测试是什么!

渗透测试是网络安全领域的核心实战技术,常被称为“合法黑客攻击”。但很多人对其存在误解,认为是恶意攻击,实则它是主动防御的关键手段,接下来这篇文章带你了解什么是渗透测试!渗透测试是一种模拟黑客攻击的安全评估方法&#xff…

2026/10/15 14:34:43 阅读更多 →
L1与L2正则化本质区别:稀疏性、鲁棒性与工程选型指南

L1与L2正则化本质区别:稀疏性、鲁棒性与工程选型指南

1. 为什么L1和L2正则化不是“加个公式就完事”的装饰品你翻过机器学习教材,肯定见过这两个式子:$$\text{L1: } \lambda \sum_{i1}^n |w_i| \quad \text{L2: } \frac{\lambda}{2} \sum_{i1}^n w_i^2$$但如果你只把它们当成损失函数里“顺手加上的惩罚项”…

2026/10/15 14:34:43 阅读更多 →
Win32 API实战源码解析:消息循环、GDI绘图与DLL调用

Win32 API实战源码解析:消息循环、GDI绘图与DLL调用

简介:《精通Windows API-函数、接口、编程实例(源码)》是一份面向中高级C开发者的Windows编程实战资料,围绕Win32 API调用与COM接口应用展开,适合需要系统掌握桌面应用开发、系统级程序设计与调试能力的程序员。书中156个实例覆盖窗口管理、消…

2026/10/15 14:34:43 阅读更多 →
Grid Beam Search:打破长度偏差的序列生成解码算法

Grid Beam Search:打破长度偏差的序列生成解码算法

如果你经常跟 seq2seq 模型打交道,一定经历过这种纠结:beam size 设成 5 还是 10?length penalty 的系数 α 到底是 0.6 还是 1.2?为什么 beam search 出来的结果老是往短句偏?这些看起来是调参问题,背后其…

2026/10/15 14:34:43 阅读更多 →
指纹浏览器环境仿真技术与AI风控对抗实战

指纹浏览器环境仿真技术与AI风控对抗实战

1. 项目背景与行业现状指纹浏览器环境仿真技术正在成为数字身份管理领域的重要基础设施。根据最新行业调研数据显示,到2026年全球反欺诈解决方案市场规模预计将达到900亿美元,其中基于浏览器指纹的风控系统占比超过35%。这种技术通过收集用户设备的硬件配…

2026/10/15 14:33:42 阅读更多 →

日新闻

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 阅读更多 →