
内容纲要输出解析器核心作用将大模型自然语言输出转换为结构化数据常用解析器类型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 应用的工程化水平。