LangChain教程:JsonOutputParser JSON输出解析器

介绍

JsonOutputParser 是 LangChain 结构化输出解析器的核心,核心作用是:

  1. 强制模型输出合法的 JSON 字符串(通过提示词引导);
  2. 自动将 JSON 字符串解析为 Python 字典,无需手动调用 json.loads();
  3. 基础格式校验:如果模型输出非合法 JSON,会抛出明确的解析错误,便于排查。

它是连接 “自然语言输出” 和 “结构化数据使用” 的核心工具,比纯文本解析更适配工程化场景(如数据存储、接口返回、逻辑计算)。

使用

创建对象

jop = JsonOutputParser()

串联使用

串联模板、模型、json输出解析器(| 运算符):

chain = few_shot_prompt | model | jop

调用大模型

因为要将结果转成json,所以要获取到全部返回结果才能转换,所以不能用流式输出,否则格式错乱,所以要使用 invoke() 方法

resp = chain.invoke({"name": "iphone11"})

案例

from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.output_parsers import JsonOutputParser
from dotenv import load_dotenv

# 第一步:定义示例模板(告诉 AI 示例的格式)
example_template = """
名称:{name}
屏幕:{screen}
CPU:{cpu}
5G:{5G}
"""

example_prompt = PromptTemplate.from_template(example_template)

# 第二步:准备示例(列表+字典格式,每个字典是一个示例)
examples = [
    {"name": "iPhone 17 Pro Max", "screen": "6.9英寸", "cpu": "A19 Pro(3纳米制程)", "5G": "支持"}
]

# 第三步:1.定义开头的引导语
prefix = "请按照以下格式返回指定手机的配置(参考示例格式):"
# 第三步:2.定义问AI的问题
# ※※※必须明确指出输出格式※※※
suffix = "现在请生成 {name} 的手机配置,必须严格按照指定格式输出JSON:"

# 第四步:组装 FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(
    prefix=prefix,              # 开头的引导语
    example_prompt=example_prompt,  # 示例的格式模板
    examples=examples,          # 要展示给 AI 的示例
    suffix=suffix,              # 问AI的问题(包含动态变量)
    input_variables=["name"],   # 最终要传入的动态变量(这里是城市名)
)

# 加载 .env 文件,并放入到环境变量中
load_dotenv()

# 创建模型对象
model = ChatTongyi(model="qwen-max")

# 创建 json输出解析器
jop = JsonOutputParser()

# 串联模板、模型、json输出解析器(| 运算符)
chain = few_shot_prompt | model | jop

# 因为要将结果转成json,所以要获取到全部返回结果才能转换,所以不能用流式输出,否则格式错乱
resp = chain.invoke({"name": "iphone11"})

print("---------大模型回答--------------------")
print("res类型", type(resp))
print(resp)
关键代码解释

必须明确指出输出格式,否则AI返回的不是 JSON格式,转换会失败

suffix = "现在请生成 {name} 的手机配置,必须严格按照指定格式输出JSON:"
执行结果
---------大模型回答--------------------
res类型 <class 'dict'>
{'名称': 'iPhone 11', '屏幕': '6.1英寸', 'CPU': 'A13 Bionic(7纳米制程)', '5G': '不支持'}

在 Python 中,转成 JSON,实际上是转成 dict字典类型

流式输出

下面是流式输出,输出的格式是错乱的,放在下面:

# 调用链(自动渲染模板 + 调用模型)
resp = chain.stream({"name": "iphone11"})

print("---------大模型回答--------------------")

print("res类型", resp)
print(resp)
for chunk in resp:
    print(chunk, end="", flush=True)
输出内容
{}
{'名称': 'iPhone'}
{'名称': 'iPhone 11'}
{'名称': 'iPhone 11', '屏幕': '6.1'}
{'名称': 'iPhone 11', '屏幕': '6.1英寸'}
{'名称': 'iPhone 11', '屏幕': '6.1英寸', 'CPU': 'A13 Bionic'}
{'名称': 'iPhone 11', '屏幕': '6.1英寸', 'CPU': 'A13 Bionic(7纳米制程'}
{'名称': 'iPhone 11', '屏幕': '6.1英寸', 'CPU': 'A13 Bionic(7纳米制程)'}
{'名称': 'iPhone 11', '屏幕': '6.1英寸', 'CPU': 'A13 Bionic(7纳米制程)', '5G': '不支持'}

常见问题 & 避坑要点

模型输出非JSON导致解析失败

在系统提示中强调“必须输出合法JSON,不能有多余文字”;

中文key/值解析乱码

LangChain 已适配,无需额外处理,确保模型输出的JSON包含中文即可;

输出包含多余文字(如“好的,结果如下:{…}”)

在提示词中明确要求“只输出JSON,不要添加任何额外解释、说明文字”。

总结

  1. 核心作用:JsonOutputParser 把模型输出的 JSON 字符串转为 Python 字典,实现“自然语言→结构化数据”的转换;
  2. 使用关键:必须在提示词中加入 format_instructions,强制模型输出合法 JSON;
  3. 进阶优化:搭配 Pydantic 模型可实现字段类型/描述的强约束,适配生产环境;
  4. 避坑核心:降低模型随机性(temperature=0),明确提示“仅输出JSON,无多余文字”。

JsonOutputParser 是工程化开发中最常用的解析器之一,只要需要将模型输出用于数据处理、接口返回等场景,它都是首选工具。


原文出处:/show_1GW2qlOteOee.html