LangChain教程:JsonOutputParser JSON输出解析器 作者:马育民 • 2026-02-26 21:04 • 阅读:10004 # 介绍 `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类型 {'名称': '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` 是工程化开发中最常用的解析器之一,只要需要将模型输出用于数据处理、接口返回等场景,它都是首选工具。 原文出处:http://malaoshi.top/show_1GW2qlOteOee.html